Upgrade version to 4.14 71/301471/1 tizen/4.14.1.1.tizen20230628
authorwangbiao <biao716.wang@samsung.com>
Thu, 16 Nov 2023 09:17:42 +0000 (18:17 +0900)
committerwangbiao <biao716.wang@samsung.com>
Thu, 16 Nov 2023 09:17:42 +0000 (18:17 +0900)
Change-Id: I21bf1a3a7c25cbec43022202cf2e5865b603a309
Signed-off-by: wangbiao <biao716.wang@samsung.com>
451 files changed:
CHANGES [deleted file]
COPYING
CREDITS
INSTALL
Makefile.am
Makefile.maint [deleted file]
README
autodeps/.gitignore [deleted file]
autodeps/aix.prov [deleted file]
autodeps/aix.req [deleted file]
autodeps/aix4.prov [deleted file]
autodeps/aix4.req [deleted file]
autodeps/amigaos.prov [deleted file]
autodeps/amigaos.req [deleted file]
autodeps/darwin.prov [deleted file]
autodeps/darwin.req [deleted file]
autodeps/freebsd.prov [deleted file]
autodeps/freebsd.req [deleted file]
autodeps/freebsdelf.prov [deleted file]
autodeps/freebsdelf.req [deleted file]
autodeps/hpux.prov [deleted file]
autodeps/hpux.req [deleted file]
autodeps/irix6.prov [deleted file]
autodeps/irix6.req [deleted file]
autodeps/linux.prov [deleted file]
autodeps/linux.req [deleted file]
autodeps/mint.prov [deleted file]
autodeps/mint.req [deleted file]
autodeps/none [deleted file]
autodeps/openbsd.prov [deleted file]
autodeps/openbsd.req [deleted file]
autodeps/osf.prov [deleted file]
autodeps/osf.req [deleted file]
autodeps/solaris.prov [deleted file]
autodeps/solaris.req [deleted file]
build/Makefile.am
build/build.c
build/expression.c
build/files.c
build/pack.c
build/parseBuildInstallClean.c
build/parseChangelog.c
build/parseDescription.c
build/parseFiles.c
build/parsePolicies.c
build/parsePreamble.c
build/parsePrep.c
build/parseReqs.c
build/parseScript.c
build/parseSpec.c
build/reqprov.c
build/rpmbuild.h
build/rpmbuild_internal.h
build/rpmbuild_misc.h
build/rpmfc.c
build/rpmfc.h
build/rpmspec.h
build/spec.c
cliutils.c
cliutils.h
compile [new file with mode: 0755]
configure.ac
debian/changelog [deleted file]
debian/compat [deleted file]
debian/control [deleted file]
debian/librpm-tizen.install [deleted file]
debian/rules [deleted file]
doc/Makefile.am
doc/hacking.doxy.in
doc/hacking/Doxyheader [deleted file]
doc/hacking/Doxyheader.h [new file with mode: 0644]
doc/librpm.doxy.in
doc/librpm/Doxyheader [deleted file]
doc/librpm/Doxyheader.h [new file with mode: 0644]
doc/manual/macros
doc/rpm-misc.8 [new file with mode: 0644]
doc/rpm-plugin-systemd-inhibit.8 [new file with mode: 0644]
doc/rpm.8
doc/rpmbuild.8
doc/rpmdeps.8
doc/rpmsign.8
doc/rpmspec.8
fileattrs/Makefile.am
fileattrs/debuginfo.attr
fileattrs/kernel.attr [new file with mode: 0644]
fileattrs/kmp.attr [new file with mode: 0644]
fileattrs/metainfo.attr [new file with mode: 0644]
fileattrs/perllib.attr
installplatform
lib/.gitignore [deleted file]
lib/Makefile.am
lib/backend/db3.c
lib/backend/dbconfig.c
lib/backend/dbi.c [new file with mode: 0644]
lib/backend/dbi.h
lib/backend/dbiset.c [new file with mode: 0644]
lib/backend/dbiset.h [new file with mode: 0644]
lib/backend/lmdb.c [new file with mode: 0644]
lib/backend/ndb/glue.c [new file with mode: 0644]
lib/backend/ndb/rpmidx.c [new file with mode: 0644]
lib/backend/ndb/rpmidx.h [new file with mode: 0644]
lib/backend/ndb/rpmpkg.c [new file with mode: 0644]
lib/backend/ndb/rpmpkg.h [new file with mode: 0644]
lib/backend/ndb/rpmxdb.c [new file with mode: 0644]
lib/backend/ndb/rpmxdb.h [new file with mode: 0644]
lib/cpio.c
lib/cpio.h
lib/depends.c
lib/formats.c
lib/fprint.c
lib/fsm.c
lib/fsm.h
lib/header.c
lib/header.h
lib/header_internal.h
lib/headerfmt.c
lib/headerutil.c
lib/legacy.c [deleted file]
lib/manifest.c
lib/merge.c [deleted file]
lib/misc.h
lib/order.c
lib/package.c
lib/poptALL.c
lib/poptI.c
lib/poptQV.c
lib/psm.c
lib/query.c
lib/relocation.c [new file with mode: 0644]
lib/rpmal.c
lib/rpmal.h
lib/rpmarchive.h [new file with mode: 0644]
lib/rpmcallback.h
lib/rpmchecksig.c
lib/rpmcli.h
lib/rpmdb.c
lib/rpmdb.h
lib/rpmdb_internal.h
lib/rpmds.c
lib/rpmds.h
lib/rpmds_internal.h
lib/rpmfi.c
lib/rpmfi.h
lib/rpmfi_internal.h
lib/rpmfiles.h [new file with mode: 0644]
lib/rpmfs.c
lib/rpmfs.h
lib/rpmgi.c
lib/rpmhash.C
lib/rpminstall.c
lib/rpmlead.c
lib/rpmlead.h
lib/rpmlib.h
lib/rpmlock.c
lib/rpmlock.h
lib/rpmplugin.h [new file with mode: 0644]
lib/rpmplugins.c
lib/rpmplugins.h
lib/rpmprob.h
lib/rpmrc.c
lib/rpmscript.c
lib/rpmscript.h
lib/rpmtag.h
lib/rpmtd.c
lib/rpmtd.h
lib/rpmte.c
lib/rpmte.h
lib/rpmte_internal.h
lib/rpmtriggers.c [new file with mode: 0644]
lib/rpmtriggers.h [new file with mode: 0644]
lib/rpmts.c
lib/rpmts.h
lib/rpmts_internal.h
lib/rpmtypes.h
lib/rpmug.c
lib/rpmug.h
lib/rpmvercmp.c
lib/rpmvf.h
lib/rpmvs.c [new file with mode: 0644]
lib/rpmvs.h [new file with mode: 0644]
lib/signature.c
lib/signature.h
lib/tagexts.c
lib/tagname.c
lib/transaction.c
lib/verify.c
luaext/linit.c [deleted file]
luaext/linit.h [deleted file]
luaext/linit.lch [deleted file]
luaext/lposix.c
luaext/modemuncher.c
macros.debug [new file with mode: 0644]
macros.in
misc/fnmatch.c
misc/fts.c
misc/rpmfts.h
mkinstalldirs
packaging/db-4.8.30-integration.dif [deleted file]
packaging/device-sec-policy [deleted file]
packaging/find-docs.sh [deleted file]
packaging/find-provides.ksyms [deleted file]
packaging/librpm-tizen.changes [deleted file]
packaging/librpm-tizen.spec [deleted file]
packaging/rpm-tizen_macros [deleted file]
packaging/rpm.changes [deleted file]
packaging/rpm.manifest [deleted file]
packaging/rpmconfigcheck [deleted file]
platform.in
plugins/Makefile.am
plugins/exec.c [deleted file]
plugins/ima.c [new file with mode: 0644]
plugins/msm-plugin.c
plugins/msmxattr.c
plugins/prioreset.c [new file with mode: 0644]
plugins/selinux.c [new file with mode: 0644]
plugins/sepolicy.c [deleted file]
plugins/syslog.c [new file with mode: 0644]
plugins/systemd_inhibit.c [new file with mode: 0644]
po/LINGUAS
po/POTFILES.in
po/ar.po [new file with mode: 0644]
po/bn_IN.po [deleted file]
po/br.po
po/ca.po
po/cmn.po [new file with mode: 0644]
po/cs.po
po/cs_CZ.po [deleted file]
po/da.po
po/de.po
po/el.po
po/eo.po
po/es.po
po/fi.po
po/fr.po
po/gu.po [deleted file]
po/id.po
po/is.po
po/it.po
po/ja.po
po/ko.po
po/ms.po
po/nb.po
po/nl.po
po/pl.po
po/pt.po
po/pt_BR.po
po/rpm.pot
po/ru.po
po/sk.po
po/sl.po
po/sr.po
po/sr@latin.po
po/sv.po
po/te.po
po/tr.po
po/uk.po
po/vi.po [new file with mode: 0644]
po/zh_CN.po
po/zh_TW.po
preinstall.am
python/.gitignore [deleted file]
python/MANIFEST.in [deleted file]
python/Makefile.am
python/header-py.c
python/rpm/__init__.py [new file with mode: 0644]
python/rpm/__init__.py.in [deleted file]
python/rpm/transaction.py [new file with mode: 0644]
python/rpm/transaction.py.in [deleted file]
python/rpmarchive-py.c [new file with mode: 0644]
python/rpmarchive-py.h [new file with mode: 0644]
python/rpmds-py.c
python/rpmfd-py.c
python/rpmfi-py.c
python/rpmfiles-py.c [new file with mode: 0644]
python/rpmfiles-py.h [new file with mode: 0644]
python/rpmii-py.c
python/rpmkeyring-py.c
python/rpmmacro-py.c
python/rpmmi-py.c
python/rpmmodule.c
python/rpmps-py.c
python/rpmsmodule.c
python/rpmstrpool-py.c [new file with mode: 0644]
python/rpmstrpool-py.h [new file with mode: 0644]
python/rpmsystem-py.h
python/rpmtd-py.c
python/rpmtd-py.h
python/rpmte-py.c
python/rpmts-py.c
python/setup.py.in
python/spec-py.c
python/spec-py.h
rpm.am
rpm.pc.in
rpm2archive.c [new file with mode: 0644]
rpm2cpio.c
rpmbuild.c
rpmdb.c
rpmio/Makefile.am
rpmio/argv.c
rpmio/argv.h
rpmio/base64.c
rpmio/digest.c
rpmio/digest.h
rpmio/digest_beecrypt.c
rpmio/digest_nss.c
rpmio/digest_openssl.c [new file with mode: 0644]
rpmio/macro.c
rpmio/rpmbase64.h
rpmio/rpmfileutil.c
rpmio/rpmfileutil.h
rpmio/rpmglob.c
rpmio/rpmio.c
rpmio/rpmio.h
rpmio/rpmio_internal.h
rpmio/rpmkeyring.c
rpmio/rpmkeyring.h
rpmio/rpmlog.c
rpmio/rpmlog.h
rpmio/rpmlua.c
rpmio/rpmlua.h
rpmio/rpmmacro.h
rpmio/rpmpgp.c
rpmio/rpmpgp.h
rpmio/rpmsq.c
rpmio/rpmsq.h
rpmio/rpmstrpool.c
rpmio/rpmstrpool.h
rpmio/rpmsw.h
rpmio/rpmurl.h
rpmio/rpmutil.h
rpmio/stubs.c [deleted file]
rpmkeys.c
rpmpopt.in
rpmqv.c
rpmrc.in
rpmsign.c
rpmspec.c
scripts/Makefile.am
scripts/brp-compress
scripts/brp-python-bytecompile
scripts/brp-python-hardlink
scripts/brp-strip
scripts/brp-strip-shared
scripts/check-files
scripts/check-rpaths-worker
scripts/debuginfo.prov [changed mode: 0644->0755]
scripts/desktop-file.prov
scripts/find-debuginfo.sh [changed mode: 0644->0755]
scripts/find-lang.sh
scripts/find-php-provides [deleted file]
scripts/find-php-requires [deleted file]
scripts/find-provides [new file with mode: 0755]
scripts/find-provides.ksyms [new file with mode: 0755]
scripts/find-requires [new file with mode: 0755]
scripts/find-requires.ksyms [new file with mode: 0755]
scripts/gendiff
scripts/libtooldeps.sh
scripts/macros.perl
scripts/macros.php
scripts/macros.python
scripts/metainfo.prov [new file with mode: 0755]
scripts/osgideps.pl [deleted file]
scripts/perl.prov
scripts/perl.req
scripts/perldeps.pl [deleted file]
scripts/pkgconfigdeps.sh
scripts/python-macro-helper [new file with mode: 0755]
scripts/pythondistdeps.py [new file with mode: 0755]
scripts/rpm2cpio.sh
scripts/rpm_fulldb_update [deleted file]
scripts/rpmsync [deleted file]
scripts/sysvinitdeps.sh [new file with mode: 0755]
scripts/tcl.req [deleted file]
scripts/tgpg
scripts/vpkg-provides.sh
sign/Makefile.am
sign/rpmgensig.c
sign/rpmsign.h
sign/rpmsignfiles.c [new file with mode: 0644]
sign/rpmsignfiles.h [new file with mode: 0644]
system.h
tests/Makefile.am
tests/atlocal.in
tests/data/RPMS/hello-2.0-1.i686.rpm
tests/data/RPMS/hello-2.0-1.x86_64-signed.rpm [new file with mode: 0644]
tests/data/RPMS/hello-2.0-1.x86_64.rpm
tests/data/SOURCES/hello.c [new file with mode: 0644]
tests/data/SOURCES/poltest-1.0.tar.bz2 [deleted file]
tests/data/SOURCES/poltest-policy-1.0.tar.bz2 [deleted file]
tests/data/SPECS/attrtest.spec
tests/data/SPECS/configtest.spec
tests/data/SPECS/conflicttest.spec
tests/data/SPECS/deptest.spec
tests/data/SPECS/filedep.spec [new file with mode: 0644]
tests/data/SPECS/filetriggers.spec [new file with mode: 0644]
tests/data/SPECS/flangtest.spec
tests/data/SPECS/hello-attr-buildid.spec [new file with mode: 0644]
tests/data/SPECS/hello-cd.spec [new file with mode: 0644]
tests/data/SPECS/hello-config-buildid.spec [new file with mode: 0644]
tests/data/SPECS/hello-r2.spec [new file with mode: 0644]
tests/data/SPECS/hello-script.spec
tests/data/SPECS/hello2-suid.spec [new file with mode: 0644]
tests/data/SPECS/hello2.spec [new file with mode: 0644]
tests/data/SPECS/hello2cp.spec [new file with mode: 0644]
tests/data/SPECS/hello2ln.spec [new file with mode: 0644]
tests/data/SPECS/hlinktest.spec
tests/data/SPECS/parallel.spec [new file with mode: 0644]
tests/data/SPECS/poltest.spec [deleted file]
tests/data/SPECS/prefixtest.spec [new file with mode: 0644]
tests/data/SPECS/replacetest.spec
tests/data/SPECS/scripts.spec
tests/data/SPECS/sigpipe.spec [new file with mode: 0644]
tests/data/SPECS/test-subpackages-exclude.spec [new file with mode: 0644]
tests/data/SPECS/test-subpackages-pathpostfixes.spec [new file with mode: 0644]
tests/data/SPECS/test-subpackages.spec [new file with mode: 0644]
tests/data/SPECS/testdoc.spec [new file with mode: 0644]
tests/data/SPECS/triggers.spec [new file with mode: 0644]
tests/data/SPECS/vattrtest.spec [new file with mode: 0644]
tests/data/keys/CVE-2021-3521-badbind.asc [new file with mode: 0755]
tests/data/keys/CVE-2021-3521-nosubsig-last.asc [new file with mode: 0755]
tests/data/keys/CVE-2021-3521-nosubsig.asc [new file with mode: 0755]
tests/data/keys/rpm.org-rsa-2048-test.pub [new file with mode: 0644]
tests/data/keys/rpm.org-rsa-2048-test.secret [new file with mode: 0644]
tests/package.m4 [new file with mode: 0644]
tests/rpmbuild.at
tests/rpmbuildid.at [new file with mode: 0644]
tests/rpmconfig.at
tests/rpmconfig2.at
tests/rpmconfig3.at
tests/rpmconflict.at
tests/rpmdb.at
tests/rpmdeps.at
tests/rpmgeneral.at
tests/rpmi.at
tests/rpmio.at [new file with mode: 0644]
tests/rpmmacro.at
tests/rpmorder.at [new file with mode: 0644]
tests/rpmpython.at
tests/rpmquery.at
tests/rpmreplace.at
tests/rpmscript.at
tests/rpmsigdig.at [new file with mode: 0644]
tests/rpmtests [new file with mode: 0755]
tests/rpmtests.at
tests/rpmverify.at
tools/debugedit.c
tools/elfdeps.c
tools/rpmdeps.c
tools/rpmgraph.c
tools/sepdebugcrcfix.c [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
deleted file mode 100644 (file)
index d6365c1..0000000
--- a/CHANGES
+++ /dev/null
@@ -1,2927 +0,0 @@
-4.4.2 -> 4.4.2.1:
-       - remove internal sqlite, zlib, gettext
-       - remove obsolete utilities
-       - remove vendor gpg keys
-       - fix spec parenthesis parsing 
-       - allow building without neon
-       - disable hkp lookup by default
-       - re-enable file-conflicts detection (rhbz#151609)
-       - fix potential segfault in available file provides checking
-       - fix Requires(pre,postun) (rh#155700)
-       - fix db build wrt newer CFLAGS
-       - fix popt CHARSET for various languages (rhbz#172155)
-       - fix install size calculation with excludes in manifest (rhbz#89661)
-       - use full path in the rpm cronjob (rhbz#174211)
-       - filter out incorrect perl(main) provides (rhbz#177960)
-       - fix scriptlet deadlock (rhbz#146549)
-       - fix netshared path comparison (rhbz#52725)
-       - make fcntl lock sensitive to --root (rhbz#151255)
-       - fix rpmvercomp for strings with trailing null segments (rhbz#178798)
-       - fix doxygen generation (rhbz#187714)
-       - fix potential segfault if no rpmlock_path defined (rhbz#231146)
-       - fix for thinko in debugedit on ppc
-       - fix debugedit wrt OOo
-       - fix debugedit with ../../ in paths
-       - fix various other issues in debugedit (rhbz#205339)
-       - allow customisable diff and use -p by default (rhbz#146981)
-       - handle fork failure
-       - fix a typo causing compiler warning (susebz#178055)
-       - fix a %{buildsubdir} typo/thinko
-       - fix uncompress waitpid logic to shut up the compiler (susebz#160434)
-       - add support for %{_docdir} macro (rhbz#125514)
-       - fix segfault on rpmbuild with empty file list
-       - allow --ignoresize for erase operations
-       - don't attempt to execute empty transaction (susebz#43267)
-       - don't segfault if Fileno() is called with NULL
-       - abort build if cwd not determinable
-       - fix --noghost query option (rhbz#103207)
-       - fix off-by-one error in glob 
-       - check rpmtsInitDB() return value
-       - build internal Lua without readline support
-       - make rpmdbSync obey the no_dbsync flag
-       - fix package verification for packages with header+payload RSA but
-         no header-only RSA
-       - drop any s-bits early when deleting files (susebz#50376, rhbz#125517)
-       - fix handling of old packages that use HEADERIMAGE
-       - catch disk-space errors when writing signed packages
-       - fix default verify flags for %doc (rhbz#235353)
-       - fix debugedit for relative paths (rhbz#232222)
-       - add configurable preferable elf colour policy (rhbz#235757)
-       - python: always treat changelog as list
-       - use older perl helper scripts by default
-       - add mono req/provides support
-       - remove SELinux context verification (rhbz#193488)
-       - fix building without Lua support
-       - fix --rebuilddb with --root option
-       - fix --setperms and --setugids with uninstalled packages
-       - don't run pre- and posttrans scripts in test mode
-       - dbmatch keys can be unicode objects also (rhbz#219008)
-       - gendiff: let diff arguments be specified in the environment 
-       - gendiff: emit diff headers (rhbz#237561)
-       - improved error messages in verification of unreadable files
-       - python: raise exception if tsAdd fails
-       - check for supported package payload format (rhbz#140052)
-       - fail build if beecrypt headers not found
-       - build: check unpackaged files even if other errors are present
-       - restore SIGILL handler in machine detection code
-       - add --dupes popt alias for detecting duplicate packages in rpmdb
-       - fix typo in check-prereq (rhbz#203182)
-       - python: fix rpm.te Key() refcount (rhbz#182063)
-       - python: always treat fileverifyflags as list
-       - disable strict aliasing if compiler supports it (type-punning warns)
-       - add zh_TW translation
-       - add support for srcdefattr macro (susebz#48870, rhbz#125515)
-       - detect python 2.5 automatically in configure
-       - python: reference counting for match-iterators (rhbz#241751)
-       - updated fi translation
-       - fix format string errors in de translation
-       - allow characters > 127 that don't fit the current locale in spec
-       - treat null epoch equal to zero epoch in freshen (rhbz#143301)
-       - python: treat null epoch equal to zero labelCompare (rhbz#227860)
-       - permit installing multiple package versions with -i (rhbz#213399)
-       - fix <name>.<arch> query output for non-installed package (rhbz#124016)
-       - updated pl translation
-       - don't read packages with non-verifiable signatures (rhbz#239557)
-       - don't try to open non-existent file twice in query
-       - flush query format buffer before listing files (rhbz#212833)
-       - check all header strings to resize buffer (rhbz#212833)
-       - don't segfault on a header without RPMTAG_NAME (rhbz#239557)
-       - fix file status for replaced files (rhbz#237478)
-       - make %_signature default to gpg instead of none
-       - don't skip directories in fingerprinting (rhbz#140055, 223639, ...)
-       - remove vendor, release specific dependency whitouts 
-       - remove upstream spec files for rpm and popt
-       - don't open temporary databases in rpmdbOpenAll()
-       - open non-temporary db's before chroot (rhbz#103952, 173285)
-       - don't treat provides as implicit obsoletes (rhbz#111071, ...)
-       - fix CVE-2007-1536, CVE-2007-2799 in internal libmagic
-       - support specifying fuzz factor to %patch (rhbz#243720)
-       - enable ordering on erase mode
-       - transaction ordering fixes (rhbz#196590, 202540, 202542, ...)
-       - added IPv4/6 and EPSV support
-       - remove hardcoded /var/log/lastlog kludgery
-       - don't mmap large files (rhbz#139539, 177616)
-       - detect and provide a requirement for DT_GNU_HASH
-       - ARM architecture update 
-       - update popt version for clean upgradability
-       - remove hardcoded libtermcap vs bash kludge
-       - updated Russian man pages (rhbz#185620)
-       - fix a sparse warning in popt.h (rhbz#202005)
-       - disable broken "make check" tests
-       - treat /usr/share/gtk-doc/html/ as a docdir
-       - plug some minor memory leaks
-       - use --wildcards with tar for compatibility with tar >= 1.15.91
-       - fix segfault on errors if neon transport is used (rhbz#220392)
-       - new buildroot sanity checker scripts check-buildroot and check-rpaths
-       - new debugedit option for recomputing build ID
-
-4.4.1 -> 4.4.2:
-       - start 4.4.2 devel.
-       - sqlite3: revert cClose scoping, data is freed in cClose unlike db4.
-       - build against sqlite3-3.1.2.
-       - sqlite3: update encode/decode from sqlite-2.8.16.
-       - add --xml popt alias for query modes.
-       - remove _rpmdb now that python2.[34] are commonly available.
-       - remove remnant -I/opt/local hacks, --prefix=/usr is recommended.
-       - rework configure.ac et al to lose internal library baggage flexibly.
-       - updated sv.po <goeran@uddrborg.se>.
-       - permit gpg to be used for RSA signatures.
-       - permit RSA key sizes larger than 1024 bits.
-       - permit RSA/{sha1,sha256,sha384,sha512} signature verification.
-       - updated de.po (#162756).
-       - added CVSId: tag and SVNId: alias (#162807).
-       - added brp-java-gcjcompile build helper.
-       - fix: java compiled with -O0 confuses debugedit (#161722).
-       - fix: % at end-of-line overflow (#161091).
-       - *_terminate_build macros set per-pkg, not per-invocation (#161081).
-       - use perldeps.pl, phase out perl.{req,prov} (#161921).
-       - fix: make sqlite3 rpmdb endian-neutral (#159425).
-       - fix: permit sqlite3 rpmdb with chroot (#159424).
-       - fix: find-debuginfo.sh not handling set[ug]id ELF files (#100963).
-       - fix: find-debuginfo.sh kernel voo-doo tweaks (#159346).
-       - fix: initialize variables used in debug msg (#160458).
-       - permit zlib in rpm to be built with make -j (#159404).
-       - avoid '?' for zero length file mmap failure doing md5 (#159405).
-       - permit scriptlet includes from builddir for spec files w/o %setup.
-       - upgrade to zlib-1.2.2.4 internal.
-       - macosx: avoid minigzip build failures.
-       - upgrade to file-4.14 internal.
-       - fix: magic_file() closes stdin when given directory path.
-       - use perldeps.pl, phase out perl.{req,prov} (again).
-       - document __vsflags (#147489).
-       - release rpm-4.4.2.
-
-4.4 -> 4.4.1:
-       - force *.py->*.pyo byte code compilation with brp-python-bytecompile.
-       - automagically detect and emit "python(abi) = 2.4" dependencies.
-       - popt 1.10.1 to preserve newer.
-       - use package color as Obsoletes: color.
-       - upgrade to db-4.3.27.
-       - revert MAGIC_COMPRESS, real fix is in libmagic (#143782).
-       - upgrade to file-4.12 internal.
-       - mac os x patches (#131943,#131944,#132924,#132926).
-       - mac os x patches (#133611, #133612, #134637).
-       - build against external/internal neon.
-       - add https://svn.uhulinux.hu/packages/dev/zlib/patches/02-rsync.patch
-       - changes to build on Mac OS X using darwinports neon/beecrypt.
-       - blueprint rpm-4_4 and HEAD to minimize diff spew.
-       - add missing #if defined(ENABLE_NLS) (#146184).
-       - python: force dbMatch() h# key to be 32 bit integer (#146477).
-       - add sqlite internal (build still expects external sqlite3-3.0.8).
-       - sqlite: revert to original narrow scoping of cOpen/cClose.
-       - fix: length of gpg V4 hash seed was incorrect (#146896).
-       - add support for V4 rfc-2440 signatures.
-       - sqlite3: run-time endian test rather than chasing <endian.h> (#146752).
-       - discover and use getmntinfo if present.
-       - perform callbacks as always (#147537).
-       - permit build scriptlet interpreters to be individually overridden.
-       - zlib: uniqify certain symbols to prevent name space pollution.
-       - macosx: include <sys/types.h> so that python sees the u_char typedef.
-       - macosx: change to --prefix=/usr rather than /opt/local.
-       - use waitpid rather than SIGCHLD reaper.
-       - rip out DB_PRIVATE revert if not NPTL, it's not the right thing to do.
-       - don't classify files in /dev (#146623).
-       - don't build with sqlite3 if <sqlite3.h> is missing.
-
-4.3.3 -> 4.4:
-       - pentium3/pentium4 arch support (pluto@PLD).
-       - cpuid() cleanups for PIC/non-PIC and gcc 3.4 (pluto@PLD).
-       - rpmGlob() is now locale independent (wiget@PLD).
-       - conditional build support/unification (jajcus,malekith,qboosh,wiget@PLD).
-       - fix: readelf.c breakage on some non x86 arches (qboosh@PLD).
-       - find-lang.sh: implemented --with-kde (finds KDE help files);
-       - add --all-name option (finds every lang file); drop defattr()
-         from *.lang files (arekm,mkochano,pascalek,wiget@PLD).
-       - add type to tag array.
-       - add Disttag: syntax to spec file parser and header content.
-       - define Suggests:/Enhances: and Priority: tag values.
-       - prevent RPMSENSE_PREREQ from being set or tested.
-       - python: add rpm.ps() object to carry problem set info.
-       - python: permit rpm.ds() analogue to hdr.dsFromHeader() creator.
-       - python: permit rpm.fi() analogue to hdr.fiFromHeader() creator.
-       - silently add default %defattr(-,root,root) for all packages.
-       - fix: don't set handler if SIG_IGN is already set (#134474).
-       - disable expensive header+payload verifies in default config.
-       - adjust digest/signature stats to count #pkgs and bytes.
-       - obsolete Serial:, Copyright:, and RHNPlatform: syntax in spec files.
-       - permit Obsoletes: /path/to/file.
-       - permit Conflicts: /path/to/file.
-       - free rpmrc when looping on --target arches (#127730).
-       - fix: handle non-unique dirnames in rpmalAdd().
-       - integrate rpmgi "generic iterator" with query/verify.
-       - bump popt version to 1.10.
-       - attempt dependency tree breadth, take 1.
-       - use external libneon for http/https transport.
-       - add --delsign to purge packages of digital signatures.
-       - neon used by default for http/https transport.
-       - upgrade to db-4.3.21 final internal.
-       - remove noNeon runtime switch, http through neon only.
-       - remove http put to be able to build against upstream neon.
-       - bump soname into libfoo-4.4.so everywhere.
-       - sparcv8: optflags changed to -mtune=ultrasparc (#140420).
-       - add BuildRequires: neon-devel.
-       - fix: chunked davRead returns 0 is EOF.
-       - python: bleeping keywords broke labelCompare.
-       - add support for automagic pubkey retrieval using HKP.
-       - detect and return errors from neon through Ferror.
-       - use package color as Obsoletes: color.
-
-4.3.2 -> 4.3.3:
-       - bump micro version.
-       - make peace with libtool-1.5.10 and automake-1.9.3.
-       - python: add python 2.4 support.
-       - selinux: use rpm_execcon, not execv, to run scriptlets (#136848).
-       - fix: segfault on --verifydb (#138589).
-       - sparcv8: optflags changed to -mtune=ultrasparc (#140420).
-       - port to internal file-4.10 libmagic rather than libfmagic.
-       - move global /var/lock/rpm/transaction to dbpath.
-       - permit fcntl path to be configured through rpmlock_path macro.
-
-4.3.1 -> 4.3.2:
-       - use /etc/selinux/targeted/contexts/files/file_contexts for now.
-       - disable file contexts into package metadata during build.
-       - fix: "/path/foo.../bar" was losing a dot (#123844).
-       - lua embedded in rpmio.
-       - use lua to identify desired selinux file context regexes.
-       - add 'requires' and 'conflicts' tag aliases.
-       - python: return ds, not tuple, for ds iteration.
-       - python: permit integer keys to ts.dbMatch().
-       - xml: use <foo/> markup for empty tags.
-       - xml: <integer/> instead of <integer>0</integer> markup.
-       - fix: disable fingerprint generation on kernel paths.
-       - add ppc8[25]60 arches.
-       - fix: evaluate rather than default file_contexts path. (#127501).
-       - avoid "can't happen" recursion while retrieving pubkeys.
-       - add ppc32dy4 arch.
-       - make peace with automake 1.9.1.
-       - fix: defattr for rpm-libs (#130461).
-       - print dependency loops as warning iff --anaconda is specified.
-       - fix: mark uninstalled elf32 files in rpmdb to disable -Va checks.
-       - ia64: add autorelocate_dcolor to macros.in.
-       - disable static linking until libc*.a provides symbols.
-       - fix: revert Obsoletes: "fix" (#134497).
-       - fix: work around for dangling symlinks not globbed (#134362).
-       - display caught signals to diagnose #134474 (gonna be SIGPIPE).
-       - display N-V-R.A in dependency failure messages.
-       - selinux: set "rpm_script_t" always, not just for /bin/sh.
-       - honor inherited SIG_IGN when establishing rpmdb signal exit (#134474).
-       - don't add time stamp to compressed man pages (#132526).
-       - python: remove ".A" from creaky ts.check() tuple return (#135008).
-       - python: fix RPMPROB_BADRELOCATE segfault return in ts.check (#137116).
-       - revert selinux patch until fc3 release.
-       - reprise file conflicts yet again, flip/flop/flip/flop ...
-       - fix: buffer overrun displaying ko_KR (#135389).
-
-4.3 -> 4.3.1:
-       - fix: don't add leading space to %* argv expansion (#119059).
-       - scareMem = 0 everywhere, document deprecation phase out.
-       - fix: add u+w to FIXPERMS.
-       - add buildtime to rpmds, methods to retrieve.
-       - python: hide labelCompare() underneath ds.cmp(a,b).
-       - fix: segfault on --recontext if file_contexts unreadable (#117374).
-       - fix: /etc/security/selinux/file_contexts is default path.
-       - fix: no transaction lock if --test was specified (#119783).
-       - perl: skip new-fangled head[34] while generating deps (#118243).
-       - perl: use __perl for perl variable macros (#115156).
-       - make peace with libtool-1.5.6.
-       - fix: follow current is_selinux_enabled() return (#121004).
-       ? fix: exit fail when erasing multiple identical packages (#120519).
-        - add aurora/sparc patches (#124469).
-       - use poll(2) if available, avoid borked aurora/sparc select (#124574).
-
-4.2.3 -> 4.3:
-       - upgrade to zlib-1.2.beta7.
-       - fix: short option help missing string terminator.
-       - permit secondary tag match patterns with RPMQV_ALL.
-       - fix: cut-n-paste error setting nopromote for Conflicts: (#81965).
-       - don't use error string after gzclose (Dmitry V. Levin).
-       - only internal Berkeley db from now on.
-       - revive "make dist".
-       - fix: added index size wrong iff _transaction_color != 0/3 (#103865).
-       - fix: escape '+' in regex patterns through RPMMIRE_DEFAULT (#103851).
-       - RPMMIRE_DEFAULT is overkill, use RPMMIRE_STRCMP instead (#103851).
-       - don't use mktemp if mkstemp is available (#103850).
-       - python: return None for NEVRAO, [] for everything else.
-       - python: throw exception on bad arg to labelCompare (#113661).
-       - re-add --enable-posixmutexes to build.
-       - fix: set fcontext from pkg when file_contexts doesn't exist (#114040).
-       - fix: set fcontext for "mkdir -p" directories not in packages.
-       - fix: setfiles (aka rpmsx.c) dinna handle patterns correctly.
-       - establish rpm_script_t before scriptlet exec.
-       - python: add patch to rpm-4_3 to initialize RE contexts.
-       - fix: only first "mkdir -p" directory had context set.
-       - stable sort for policy specifications, patterns before paths.
-       - set "rpm_script_t" exec type for scriptlets iff /bin/sh, else default.
-       - force FD_CLOEXEC on 1st 100 inherited fdno's.
-       - serialize rpmtsRun() using fcntl on /var/lock/rpm/transaction.
-       - permit globs in macrofiles: directive (#117217).
-       - fix: segfault generating transaction serialization lock path.
-       - use /etc/security/selinux/file_contexts instead.
-       - selinux: ignore ENOTSUP return from lsetfilecon.
-       - add sparcv8 and enable elf32/elf64 Zon sparc64 (#117302).
-       - fix: --querybynumber looped.
-       - fix: ENOTSUP filter from lsetfilecon borkage.
-       - fix: increase file context regex parse buffer to BUFSIZ.
-       - fix: handle elf64 note sections correctly.
-       - fix: grrr, skip notes on non-i386 entirely.
-       - endian neutral rpmdb join keys (finally).
-       - fix: dev package build on s390x hack around.
-
-4.2.2 -> 4.2.3:
-       - bump rpm and popt versions to insure "newer".
-       - change default behavior to resolve file conflicts as LIFO.
-       - add --fileconflicts to recover rpm traditional behavior.
-       - prefer elf64 over elf32 files, everywhere and always (#126853).
-       - ia64: auto-relocate entire, not partial, directory contents (#126905).
-       - ia64: auto-relocate glibc.ix86 interpreter path (#100563).
-       - shared libraries in separate rpm-libs package.
-       - fix: defattr for rpm-libs (#130461).
-       - fix: static glibc/libgcc helpers always installed (#127522).
-       - ia64: make sure that autorelocated file dependencies are satisfied.
-       - ia64: relocate all scriptlet interpreters.
-       - ia64: don't bother trying to preload autorelocated modules.
-       - fix: filesystem package needs mail/lock w/o getgrnam.
-       - fix: do getpwnam/getgrnam to load correct modules before chroot.
-
-4.2.1 -> 4.2.2:
-       - unify signal handling in librpmio, use condvar to deliver signal.
-       - make peace with libtool-1.5, autoconf-2.59, automake-1.8.
-       - build with db-4.2.52 internal.
-       - refresh bsddb.
-       - detect (and remove) dbenv files while upgrading to db-4.2.52.
-       - ensure that librpmdb links against just built, not system, librpmio.
-       - fix: dangling pointer brain fart (#107835).
-       - fix: ds.Single() method needs malloc'd elements (#109919).
-       - convert ja and ko man pages to utf8 (#106050).
-       - man page corrections (#106415).
-       - perl.req typo (#106672).
-       - fix: wrong package count for trigger scriptlet 1st arg (#100509).
-       - fix: don't break header SHA1 if non-existent user/group (#97727).
-       - remove fuids/fgids from rpmfi, easier to lookup fuser/fgroup instead.
-       - merge sensible parts of openpkg rpm.patch.bugfix (#104780).
-       - mark _javadocdir as documentation (#102898).
-       - flush pipe before exit 1 in check-files (#103867).
-       - perl.req: avoid regex misfire on '^use' in "= <<" assign (#109934).
-       - find-debuginfo.sh: permit stripping unwritable by non-root (#112429).
-       - missing build dependency (#111104).
-       - spelling corrections (#112728).
-       - use -fPIC -DPIC on all platforms, not just mandatory (#112713).
-       - popt: pad to display length, not strlen, for i18n popt args (#106240).
-       - python: include Python.h before glibc features.h.
-       - python: return [], not None, accessing header tags (#112794).
-       - python: avoid invoking python to acquire ill-specified parameters.
-       - add ia32e arch.
-       - fix: sq->reaped needs sighold(SIGCHLD)/sigrelease(SIGCHLD) (#117620).
-
-4.2 -> 4.2.1:
-       - fix: nested %if handling, optind initialization posix vs. glibc.
-       - add version check for package with provides and obsoletes.
-       - hack out O_DIRECT support in db4 for now.
-       - build with external beecrypt-3.0.0.
-       - x86_64 -> athlon, ppc64[ip]series -> ppc64 arch compatibility.
-       - treat missing epoch's exactly the same as Epoch: 0.
-       - pass structure pointer, not args, through headerSprintf call chain.
-       - add ":xml" header format modifier.
-       - --queryformat '[%%{*:xml}\n]' to dump header content in XML.
-       - add ".arch" suffix to erase colored packages with identical NEVR.
-       - update ja man pages (#92261).
-       - backport rpmsw stopwatch, insturment rpmts operations.
-       ? toy method to enable --stats through bindings.
-       - fdCLose typo (#97257).
-       - brp-python-bytecompile to automagically bytecode compile python.
-       ? update for fr.po (#97829).
-       - don't attempt to remove dbenv on --rebuilddb.
-       - autorelocate ix86 package file paths on ia64.
-       - resurrect manifests, RPMRC_NOTFOUND returned by readLead().
-       - python: missed tuple refcount in IDTXload/IDTXglob.
-       - fix: IDTXglob should return REMOVETID sorted headers (#89857).
-       - resolve elf32/elf64 file conflicts to prefer elf64.
-       - apply debugedit patch necessary to produce kernel -debuginfo files.
-       ? ia64: autorelocate only colored, not every, file when installing.
-       ? repair find-debuginfo.sh to avoid recursing in /usr/lib/debug.
-       ? fix: ia64: don't attempt autorelocate on .src.rpm's.
-       ? fix: debuginfo: -not -path /usr/lib/debug needed -prune too.
-       ? fix: packages w/o file colors segfault.
-       ? add amd64 as alias for x86_64 (#99553).
-       ? fix: add -n to brp-compress to avoid needless file conflicts.
-       ? fix: ia32 on ia64 segfaults because of automagic file relocations.
-       ? speed up convertdb1 (#103206).
-       ? revert i18n table change to preserve help array size.
-       ? add config directories for ppc64pseries/ppc64iseries.
-       ? filter GLIBC_PRIVATE dependencies.
-       - fix: check added provides against installed conflicts (#110317).
-       - changes for python 2.3
-       - changes for libtool-1.5
-       - changes for automake-1.7.8
-       - changes for db-4.2.42.
-       - splint fiddles.
-
-4.1 -> 4.2:
-       - set cachesize without a dbenv, the default is far too small.
-       - db: don't return EACCES on db->close w/o environment.
-       - unify cachesize configuration, with (or without) a dbenv.
-       - comments regarding unsupported (yet) db-4.1.17 functionality.
-       - update to db-4.1.24 final.
-       - eliminate myftw, use Fts(3) instead.
-       - dump libelf, gulp elfutils, for now.
-       - python: permit headers to be hashed.
-       - use %%{_lib} for libraries.
-       - include file-3.39 (with homebrewed) libfmagic, for now.
-       - add debug sub-package patch.
-       - re-add elfutils/libdwarf (for dwarf.h), eliminate tools/dwarf2.h.
-       - resurrect genhdlist "greased lightning" pathway for now.
-       - elfutils: avoid gcc-3.2 ICE on x86_64 for now.
-       - add /usr/lib/rpm/rpmdeps.
-       - add /usr/lib/rpm/magic.
-       - fix: /dev/initctl has not MD5 segfault (#76718).
-       - rpm.8: gpg uses GNUPGHOME, not GPGPATH (#76691).
-       - add error message on glob failure (#76012).
-       - add _javadir/_javadocdir/_javaclasspath macros.
-       - fix: bash must have functional libtermcap.so.2.
-       - update to elfutils-0.56.
-       - have debug sub-subpackage use external, not internal, elfutils.
-       - apply patches 1-6 to db-4.1.24.
-       - resurrect availablePackages one more time.
-       - fix: option conflict error message (#77373).
-       - add AC_SYS_LARGFILE throughout.
-       - statically link rpmdeps against (internal) libfmagic.
-       - use rpmdeps rather than find-{requires,provides}.
-       - bundle libfmagic into librpmbuild for now.
-       - apply patches 7 and 8 to db-4.1.24.
-       - upgrade to elfutils-0.59.
-       - add -g to all platforms optflags.
-       - build with external elfutils (preferred), if available.
-       - upgrade to elfutils-0.63.
-       - link rpm libraries together, use shared helpers with external -lelf.
-       - move libfmagic to librpmio.
-       - use libtool-1.4.3, autoconf-2.56.
-       - add explicit -L/lib64 -L/usr/lib64 for libtool mode=relink on x86_64.
-       - use usrlib_LTLIBRARIES to install directly in /usr/lib64 instead.
-       - late rpmts reference causes premature free (#78862).
-       - internal automagic dependency generation (disabled for now).
-       - don't generate dependencies unless execute bit is set.
-       - enable internal automagic dependency generation as default.
-       - fix: add rpmlib(VersionedDependencies) if versioned Provides: found.
-       - fix: add %%ifnarch noarch to debug_package macro.
-       - debug_packages "works", but non-noarch w/o %setup has empty payload.
-       - make dependency generation "opt-in" in order to build in distro.
-       - fix: make sure each library has DT_NEEDED for all unresolved syms.
-       - generate Elf provides even if file is not executable.
-       - disable fcntl(2) lock on Packages until glibc+nptl is fixed.
-       - make cdb locks "private" for pthreads compatibility w/o NPTL.
-       - add --enable-posixmutexes to use NPTL.
-       - make dependency generation "opt-out" everywhere.
-       - rebuild against glibc with fcntl fixed in libpthread.
-       - re-enable CDB locking, removing "private" from %%__dbi_cdb macro.
-       - popt aliases for -U et al to achieve dynamic link with nptl.
-       - add --file{class,provide,require} popt aliases and header extensions.
-       - statically link against /usr/lib/nptl/libpthread.a, if present.
-       - remove popt aliases for -U et al.
-       - add -I/usr/include/nptl, Conflicts: kernel < 2.4.20.
-       - dynamically link /bin/rpm, link against good old -lpthread.
-       - test pthread_{mutex,cond}attr_setpshared(), add DB_ENV_PRIVATE if not.
-       - error on exclusive Packages fcntl lock if DB_ENV_PRIVATE is set.
-       - copy compressFilelist to convertdb1.c, remove internal legacy.h.
-       - add --enable-posixmutexes when configuring on linux.
-       - add rpmdb_{deadlock,dump,load,svc,stat,verify} utilities.
-       - include srpm pkgid in binary headers (#71460).
-       - add %check scriptlet to run after %install (#64137).
-       - simplify specfile query linkage loop.
-       - drill rpmts into parseSpec(), carrying Spec along.
-       - fix: remove rpmfi scareMem so that headers can be reloaded on ia64.
-       - fix: set DB_PRIVATE, not DB_ENV_PRIVATE, if unshared posix mutexes.
-       - remove useless kernel/glibc dependencies (#79872).
-       - add matching "config(N) = EVR"  dependencies iff %%config is found.
-       - add %%pubkey attribute to read armored pubkey files into header.
-       - permit both relative/absolute paths, display 'P' when verifying.
-       - resurrect automagic perl(foo) dependency generation.
-       - add BETA-GPG-KEY (but not in headers using %%pubkey yet).
-       - disable perl module magic rule.
-       - ignore ENOENT return from db->close (#80514,#79314).
-       - fix builddir relative inclusion, add %%pubkeys to rpm header.
-       - fix: package relocations were broken (#75057).
-       - error if querying with iterator on different sized arrays.
-       - add rpmfi methods to access color, class, and dependencies.
-       - don't segfault with packages produced by rpm-2.93 (#80618).
-       - python: eliminate hash.[ch] and upgrade.[ch], methods too.
-       - fix :armor query extension, tgpg mktmp handling (#80684).
-       - use rpmfiFClass() underneath --fileclass.
-       - use rpmfiFDepends() underneath --fileprovide and --filerequire.
-       - python: add fi.FColor() and fi.FClass() methods.
-       - calculate dependency color and refernces.
-       - python: add ds.Color() and ds.Refs() methods.
-       - fix: typo in assertion.
-       - add rpmts/rpmte/rpmfi/rpmds element colors.
-       - ignore items not in our rainbow (i.e. colors are functional).
-       - fix: dependency helpers now rate limited at 10ms, not 1s.
-       - add per-arch canonical color, only x86_64 enabled for now.
-       - file: avoid ogg/vorbis file classification problems.
-       - portabilitly: solaris fixes.
-       - for DSO's, provide the file basename if DT_SONAME not found.
-       - add perldeps.pl, start to replace perl.{prov,req}.
-       - file: read elf64 notes correctly.
-       - python: put rpmmodule.so where python expects to find.
-       - add brp-strip-static-archive build root policy helper.
-       - add -lelf to rpm LDFLAGS, not LDADD, since there is no libelf.la now.
-       - fix: obscure corner case(s) with rpmvercmp (#50977).
-       - file: *really* read elf64 notes correctly.
-       - python: restore thread context on errorCB (#80744).
-       - teach rpmquery to return "owning" package(s) in spite of alternatives.
-       - duplicate package checks with arch/os checks if colored.
-       - file conflict checks with colors.
-       - fix: debugedit.c problem.
-       - permit anaconda to choose "presentation order".
-       - fix: more debugedit.c problems.
-       - fix: clean relocation path for --prefix=/.
-       - python: permit stdout/stderr to be remapped to install.log.
-       - pay attention to package color when upgrading identical packages.
-       - fix: trap SIGPIPE, close database(s).
-       - configurable default query output format.
-       - popt: diddle doxygen/splint annotations, corrected doco.
-       - file: fix ogg/vorbis file classification problems.
-       - skip fingerprints in /usr/share/doc and /usr/src/debug.
-       - add file(1) as /usr/lib/rpm/rpmfile.
-       - enable transaction coloring for s390x/ppc64.
-       - file: check size read from elf header (#85297).
-       - fix: memory leak (85522).
-       - build with internal elfutils if not installed.
-
-4.0.4 -> 4.1:
-       - loosely wire beecrypt library into rpm.
-       - drop rpmio/base64.[ch] in favor of beecrypt.
-       - drop lib/md5*.[ch] files in favor of beecrypt.
-       - legacy: drop brokenMD5 support (rpm-2.3.3 to rpm-2.3.8 on sparc).
-       - eliminate DYING code.
-       - bind beecrypt md5/sha1 underneath rpmio.
-       - create RFC-2440 OpenPGP API in rpmio.
-       - proof-of-concept GPG/DSA verification for legacy signatures.
-       - upgrade to beecrypt-2.2.0pre.
-       - proof-of-concept PGP/RSA verification for legacy signatures.
-       - ratchet up to lclint "strict" level.
-       - upgrade to db-4.0.7.
-       - use only header methods, routines are now static.
-       - beecrypt is at least as good as pgp/gpg on verify, pulling the plug.
-       - add :base64 and :armor format extensions, dump binary tags in hex.
-       - proof-of-concept pubkey retrieval from RPM-{PGP,GPG}-KEY.
-       - stupid macros to configure public key file paths.
-       - all symbols but hdrVec are now forward references in linkage.
-       - generate an rpm header on the fly for imported pubkeys.
-       - wire transactions through rpmcli signature modes.
-       - wire transactions through rpmcli query/verify modes.
-       - wire transactions through rpmcli install/erase modes.
-       - legacy signatures always checked (where possible) on package read.
-       - wire transactions through rpmcli build modes.
-       - lazy rpmdb open/close through transaction methods (mostly anyways).
-       - no-brainer refcounts for rpmdb object.
-       - check added header against transaction set, replace if newer.
-       - transaction sets created in cli main.
-       - no-brainer refcounts for ts object.
-       - memory indices for dependency check are typedef'd and abstract'd.
-       - no-brainer refcounts for fi object, debug the mess.
-       - dump the header early in transaction, recreate fi before installing.
-       - start hiding availablePackage data/methods in rpmal.c/rpmal.h.
-       - add some dinky availablePackage methods.
-       - transaction.c: cleanly uncouple availablePackage from TFI_t.
-       - add header refcount annotations throughout.
-       - depends.c: availablePackage is (almost) opaque.
-       - invent some toy transactionElement iterators.
-       - create rpmDepSet constructors/destructors.
-       - create toy rpmDepSet iterators.
-       - rpmRangesOverlap renamed to dsCompare, add dsNotify method as well.
-       - depends.c: rpmDepSet is (almost) opaque, move to rpmds.[ch].
-       - rpmds: create dsProblem(), dsiGetDNEVR() retrieved DNEVR, not N.
-       - depends.h: hack around teIterator() et al from include for now.
-       - rpmds: move trigger dependencies into a rpmDepSet as well.
-       - rpmal: availablePackage is totally opaque, alKey with index replaces.
-       - linear search on added package provides is dumb.
-       - discarding entire signature header when using --addsign is dumb.
-       - rip out rpmDependencyConflict, replace with rpmProblem instead.
-       - no-brainer refcounts for rpmProblemSet object.
-       - header tag sets are per-transactionElement, not per-availablePackage.
-       - no-brainer refcounts for rpmDepSet and rpmFNSet objects.
-       - strip header tags for erased as well as installed transactionElements.
-       - common structure elements for unification of TFI_t and rpmFNSet.
-       - factor per-transactionElement data out of TFI_t through pointer ref.
-       - unify rpmFNSet into TFI_t.
-       - eliminate header reference in rpmtransAddPackage, use TFI_t data.
-       - commit to using rpmDepSet and TFI_t, not header.
-       - lclint rpmio fiddles.
-       - split file info tag sets into rpmfi.c.
-       - create toy TFI_t iterators.
-       - tweak overlapped file fingerprint retrieval for speed.
-       - transaction.c: use wrappers/iterators to access TFI_t.
-       - annotations to make a transactionElement opaque.
-       - use array of pointers rather than contiguous array for ts->order.
-       - methods to complete making transactionElement opaque.
-       - use TR_REMOVED relations as well as TR_ADDED for ordering.
-       - drop requirement that removed packages immediately follow added.
-       - hybrid chainsaw/presentation ordering algorithm.
-       - convert file md5sum's to binary on the fly, reducing memory footprint.
-       - header handling moved to librpmdb to avoid linkage loops.
-       - fix a couple dinky memory leaks.
-       - build with an internal zlib for now.
-       - protect brp-compress against /bin/ls output ambiguity (#56656,#56336).
-       - 3 madvise calls and a 16Mb mmapped buffer == ~5% install speedup. Wow.
-       - use db-4.0.14 final internally.
-       - 1st crack at making zlib rsync friendly.
-       - lclint-3.0.0.19 fiddles.
-       - simple automake wrapper for zlib.
-       - splint fiddles.
-       - make peace with gcc-3.1, remove compiler cruft.
-       - make peace with automake et al in 8.0, ugh.
-       - add payload uncompressed size to signature to avoid rewriting header.
-       - drill header sha1 into signature parallel to header+payload md5.
-       - mandatory "most effective" signature check on query/verify/install.
-       - don't bother adding empty filemd's to index.
-       - add Pubkey index, using signer id as binary key.
-       - display pubkeys in hex when debugging db access.
-       - retrieve pubkey(s) from rpmdb, not from detached signature file.
-       - add header DSA signature.
-       - add header RSA signature (untested, disabled for now).
-`      - don't bother with signing check if 16 bits of hash don't match.
-       - only V3 signatures for now.
-       - wire --nodigest/--nosignature options to checksig/query/verify modes.
-       - splint annotations, signature cleanup.
-       - drill ts/fi through verify mode, add methods to keep fi abstract.
-       - use mmap when calculating file digests on verify, ~20% faster.
-       - permit --dbpath and --root with signature (i.e. --import) modes.
-       - beecrypt: add types.h, eliminate need for config.gnu.h.
-       - rescusitate --rebuild.
-       - use rpmdb-redhat to suggest dependency resolution(s).
-       - merge conflicts into problems, handle as transaction set variable.
-       - use build time to choose one of multiple alternative suggestions.
-       - add --nosuggests to disable suggested resolutions.
-       - attempt to make peace with automake-1.6.1, autoconf-2.53.
-       - rip out two layers of dbN gook, internal Berkeley db is here to stay.
-       - eliminate db1 support.
-       - enable CDB by default.
-       - use DBT_DB_MALLOC to eliminate re-malloc'ing header blobs.
-       - rework most of rpmdb.c prepatory to implementing duplicates.
-       - fix: 2 memory leaks in headerSprintf.
-       - fix: db mire's access out-of-bounds memory.
-       - plug install mode leaks.
-       - opaque (well mostly) rpmTransactionSet using methods.
-       - Grand Renaming of rpm data types.
-       - fix: synthesize unpacking progress callbacks for packages w/o files.
-       - python: add rpmds/rpmfi/rpmts methods.
-       - python: re-enable rpm-python sub-package.
-       - fix: resurrect "()(64bit)" markings using objdump.
-       - python: add rpmal/rpmte/rpmfd methods.
-       - perl: drop cpanflute and cpanflute2, will be in Chip's CPAN package.
-       - python: eliminate legacy db methods, add ts.dbMatch method.
-       - fix: use getgrnam, not getpwnam, to convert gid -> group.
-       - fix: avoid sign extension, use only 16 bits, when verifying rdev.
-       - python: separate {add,del}Macro methods, prepare for macro dictionary.
-       - i18n: copy current production PO files to top-of-stack.
-       - python: include rpmdb module, renamed from bsddb3.
-       - use /etc/rpm/platform (if it exists), rather than uname(2), for arch.
-       - python: portability fiddles (#54350).
-       - check inodes (but not blocks) on FAT file systems (#64256).
-       - add /usr/lib/rpm/redhat/* per-vendor configuration.
-       - remove build mode compatibility aliases, documented and gone.
-       - document digital signature verification in rpm.8.
-       - fix: separate existence and number checks for problems found (#66552).
-       - beecrypt: merge changes from beecrypt-2.3.0.
-       - beecrypt: merge doxygen markup with rpmapi doco.
-       - beecrypt: revert cpu/arch compile option mixup (#66752).
-       - ix86: make sure that rpm can verify prelinked shared libraries.
-       - don't install /usr/lib/rpm/redhat per-vendor configuration anymore.
-       - add translated man pages from PLD.
-       - resurrect libelf with Elf64, prelink verify should work everywhere.
-       - fix: reading macro files can corrupt memory if BUFSIZ is teensy.
-       - fix: assertion failure iff incomplete package install (#66837).
-       - python: link internal libelf (if used) directly into rpmmodule.so.
-       - use rpmdb-redhat for suggestions if/when configured (#67430).
-       - disambiguate failures to import (with error messages, duh).
-       - fix: multiple relocations (#67596).
-       - add --build/--program-prefix, delete libtoolize, from %configure.
-       - find-lang.sh: make sure that mo pattern matches leading '/' (#67368).
-       - disambiguate added/installed dependency failures (#50388).
-       - rescusitate remote ftp globs (#67678).
-       - open rpmdb early RDONLY, reopen later RDWR, avoid signed srpm noise.
-       - turn off annoying gpg secmem warning.
-       - warn only once for each NOKEY/UNTRUSTED key id.
-       - factor common options into table, add rpmcliInit() and rpmcliFini().
-       - add preliminary rpmgraph(8) and rpmcache(8) executables to rpm-devel.
-       - use rpmfi in showQueryPackage(), eliminating headerGetEntry().
-       - fix: forgot lazy open of database on --freshen path (#67907).
-       - proof-of-concept rpmcache functionality.
-       - fix: do lazy open of database in rpmtsInitDB() (#67994).
-       - update rpmcache.8.
-       - fix: permit deletions of added packages (#67108).
-       - placeholders for manifest constants for SuSE patch packages.
-       - fix: repair 2ndary match criteria with rpmdb iterators.
-       - update for sv.po.
-       - display signature details using rpm -qi.
-       - skip signing packages already signed with same key (#62118).
-       - install rpmal.h and rpmhash.h, implicit rpmps.hinclude, for now.
-       - revert headerFree/headerLink/headerUnlink debugging.
-       - popt: mingw32 portability configure check (#67911).
-       - teach gendiff about unreadable files (#42666).
-       - python: sanity check fixes on rpmts/rpmte methods.
-       - have rpmdb-redhat autoconfigure rpm to use %%_solve_dbpath.
-       - popt: parse file into string of options (#56860).
-       - version added to *.la dependency libraries (#69063).
-       - expose digests in rpmio API, but hide internal beecrypt API (#68999).
-       - add methods to make signature handling opaque wrto rpmts.
-       - verify signatures/digests retrieved through rpmdbNextIterator().
-       - imbue %ghost with missingok attribute with --verify (#68933).
-       - fix: segfault if given a text file as 2nd arg to -Uvh (#69508).
-       - python: add ts.hdrCheck(), ts.rebuildDB() methods.
-       - python: iterating on an ts object returns transaction elements now.
-       - add yellowdog as vendor.
-       - python: remove the old initdb/rebuilddb methods, use ts.fooDB().
-       - python: 1st crack at backport to 1.5.2.
-       - popt: fix --usage (#62234).
-       - fix: --repackage repaired (#67217).
-       - fix: rpm2cpio disables signature checks (i.e. same behavior).
-       - popt: display sub-table options only once on --usage.
-       - wire --nosignatures et al as common options, rework CLI options.
-       - python: don't segfault in ts.GetKeys() on erased packages.
-       - update trpm.
-       - factor all mode-specific options into mode-specific tables.
-       - treat an unspecified epoch as Epoch: 0 everywhere.
-       - detect athlon/duron with CMOV (PLD).
-       - prevent stale locks in __db files by closing databases on signals.
-       - make --querytags a common option, fix errant regex (#70135).
-       - db3: increase mpool and cachesize, compile w/o --enable-debug.
-       - configurable (default off) build failure if missing %%doc files (PLD).
-       - configurable (default off) build failure iff unpackaged files (PLD).
-       - change from default off to default on.
-       - python: methods to disable all new features for benchmarking.
-       - preserve rpmdb file attributes across --rebuilddb (#70367).
-       - fix: identify athlon with 3DNOWEXT as "athlon", not "i786" (#70539).
-       - fix: repair --root with --verify (#70527).
-       - fix: signed pubkeys were imported incorrectly (#68291).
-       - include tgpg script to verify signatures using only gpg.
-       - check header blobs on export (i.e. rpmdbAdd()).
-       - enable iterator header blob checks for install/erase modes.
-       - python: _vsflags_up2date macro to configure verify signature flags.
-       - resurrect --rollback.
-       - renumber the callback types to be an orthogonal bit mask.
-       - provide repackage progress callbacks, compression is slow.
-       - fix: don't repackage %%ghost files.
-       - add --predefine to define macros before reading macro configuration.
-       - python: bare bones rollback bindings.
-       - python: enable threads on callbacks and longish rpmlib calls.
-       - python: expose RPMTAG_SOURCEPACKAGE to identify source headers.
-       - python: eliminate rpm.headerFromPackage() tuple return, deprecated.
-       - python: add ts.hdrFromFdno(fdno) method.
-       - fix: check for lead magic, better error message on failure (#69751).
-       - python: the death of rpmdb-py.[ch], use ts.fooDB() methods instead.
-       - python: the death of rpm.headerFromPackage(), use ts.hdrFromFdno().
-       - python: permit direct ts.dbMatch() python iterations.
-       - python: the death of rpm.checksig(), use ts.hdrFromFdno() instead.
-       - add bitmask for precise control of signature/digest verification.
-       - python: bindings to import pubkeys and display openpgp packets.
-       - fix: src.rpm installs need fd pos at payload.
-       - python: add return codes for rollbacks and fooDB methods.
-       - avoid generating fingerprints for locale/zoneinfo sub-directories.
-       - python: add (optional) ts.check() callback.
-       - python: include instance in IDTXload, filename in IDTXglob, return
-       - python: argument to ts.addErase (if integer) deletes that instance.
-       - python: rpmmi methods to return this instance, and number of members.
-       - supply transitive closure for CLI packages from rpmdb-redhat database.
-       - fix: rebuilddb stat'ed target, not source, for rename sanity.
-       - create /var/lib/rpm if non-existent in, say, a chroot.
-       - erased packages are now repackaged into /var/spool/repackage.
-       - fix: rebuilddb stat'ed target, not source, for rename sanity, take 2.
-       - python: explicit method to set transFlags.
-       - python: stuff package name into a string for repackage callbacks.
-       - rollback: re-create empty transaction set for multiple rollbacks.
-       - fix: %%basename typo (Dmitry V. Levin<ldv@altlinux.org>).
-       - fix: queryformat segfaults (Dmitry V. Levin<ldv@altlinux.org>).
-       - add --with-efence to configure, check install/upgrade with efence.
-       - beecrypt: short hex string conversion overflows target buffer.
-       - mark "successors only" packages in transaction.
-       - reap scriptlets with SIGCHLD handler.
-       - rename PSM_t to rpmpsm, add methods and refcounts to manage.
-       - remove %%configure/%%makeinstall from arch-os/macros, default is OK.
-       - don't export MALLOC_CHECK_ to scriptlets.
-       - squeaky clean memory leak checking.
-       - always malloc rpmfi structure, refcounts are correct in rpmtsRun().
-       - skip redundant /sbin/ldconfig scripts on upgrade (if possible).
-       - python: stupid typo broke ts.check().
-       - fix: add epoch to "already installed" check.
-       - check for interrupt during iteration.
-       - python: add ts.setProbFilter() method, remove ts.run() argument.
-       - fix: region trailer offset sanity check wrong (#71996).
-       - fix: don't stop if db1 database is currently in /var/lib/rpm (#72224).
-       - add a macro to create a sub-package with debugging symbols.
-       - merge signature returns into rpmRC.
-       - python: exceptions on NOKEY/NOTTRUSTED.
-       - python: don't remap NOKEY/UNTRUSTED to OK.
-       - beecrypt: change local absolute symbols to defines for prelinking.
-       - update ru.po.
-       - fix: handle NOKEY/NOTTRUSTED returns as if OK, always return header.
-       - portability: carry libelf in src rpm, include signal.h.
-       - fix: segfault with --checksig, plug memory leak (#72455).
-       - rpm-4.1 release candidate.
-       - requirement on libelf >= 0.8.2 to work around incompatible soname (#72792).
-       - fix: common sanity check on headers, prevent segfault (#72590).
-       - limit number of NOKEY/UNTRUSTED keys that will be warned once.
-       - libadd -lelf to rpmdb (#73024).
-       - portability: non-linux is easier, more to do (#72893).
-       - fix: SIGCHLD reaper race (#73134).
-       - fix: don't exit with open cursor, there be a stale lock.
-       - fix: check for signal induced exit more often (#73193).
-       - reinterpret the _unsafe_rollbacks macro as earliest rollback.
-       - fix: always do rpmalMakeIndex.
-       - fix: resurrect --triggers (#73330).
-       - python: typo in NOKEY exception string.
-       - fix: parse pgp packets more carefully.
-       - fix: parse header data more carefully.
-       - fix: register SIGCHLD handler before forking (#73134).
-       - better diagnostics on failed header parsing.
-       - lclint clean.
-       - rpm-4.1 release.
-       - fix: make sure that psm->child pid is set before SIGCHLD is handled.
-       - fix: use size_t consistently, avoid segfault on ia64.
-       - use %%{_lib} for libraries.
-       - fix: permit build with --disable-nls (#76258).
-
-4.0.3 -> 4.0.4:
-       - solaris: translate i86pc to i386 (#57182).
-       - fix: %GNUconfigure breaks with single quotes (#57264).
-       - fix: typo in find-requires.
-       - tru64 compiler message cleanup.
-       - add buildarch lines for hppa (#57728).
-       - sparc: make dbenv per-rpmdb, not per-dbi.
-       - handle lazy db open's in chroot with absolute path, not prefix strip.
-       - Depends should use CDB if configured.
-       - autodetect python 1.5/2.2.
-       - make rpm-perl package self-hosting (#57748).
-       - permit gpg/pgp/pgp5 execs to be reconfigured.
-       - fix: signing multiple times dinna work, discard immutable region.
-       - remove poptmodule.so for separate packaging.
-       - permit subset installs for %lang colored hardlink file sets.
-       - missing key(s) on keyring when verifying a signature is now an error.
-       - remove dependency whiteout.
-       - calculate rpm-4.1 ordering/orientation metrics in rpmdepOrder().
-       - sync popt and rpmio with rpm-4.1, rpmio has OpenPGP API.
-       - sync rpmdb and build with rpm-4.1, lots of splint annotations.
-       - add :armor and :base64 query format qualifiers for binary signatures.
-       - fix: query format qualifiers needed header.c merge.
-       - fix: query format qualifiers needed header.c merge.
-       - ppc64 arch added (#58634,#58636).
-       - turn on auto-generated perl requirements (#58519, #58536, #58537).
-       - fix: %exclude functional (again).
-       - trap SIGILL for ppc64 inline asm voodoo fix from cross-dressed ppc32.
-       - fix: fancy hash fiddles if not a tty.
-       - fix: handle /.../ correctly in rpmCleanPath().
-       - transaction rollback code in rpmRollback().
-       - Red Hat 6.2 portability cruft.
-       - legacy: configurable whiteout for known Red Hat dependency loops.
-       - perl.req: don't mis-generate dependencies like perl(::path/to/foo.pl).
-       - permit args to be hidden within %__find_{requires,provides}.
-       - a couple more perl.{prov,req} fiddles.
-       - macro for %files, always include %defattr(), redhat config only.
-       - fix: drop header region when writing repackaged legacy header.
-       - bail on %files macro.
-       - transaction rollbacks are functional.
-       - generate index for pkgid (aka Sigmd5) tag, query/verify by pkgid.
-       - generate index for hdrid (aka Sha1header) tag, query/verify by hdrid.
-       - generate index for fileid (aka Filemd5s) tag, query/verify by fileid.
-       - query/verify by install transaction id.
-       - rpm-4.0.4 release candidate.
-       - add cpanflute2, another perl.req fiddle.
-       - reapply Berkeley DB patch #4491.
-       - make --addsign and --resign behave exactly the same.
-       - *really* dump signature header immutable region.
-       - speedup large queries by ~50%.
-       - revert to presentation ordering Yet Again (#62158).
-       - non-glibc: on upgrade, mergesort is much faster than quicksort.
-       - fix: queries that evaluated to "" incorrectly returned NULL.
-       - fix: packages produced by rpm-4.0 dinna merge signature tags.
-       - fix: rpmdb iterator memory leak in python bindings.
-       - fix: include <sys/time.h> for 6.2 python modules.
-       - remove vestiges of mipseb arch (#62408).
-
-4.0.2 -> 4.0.3:
-       - update per-interpreter dependency scripts, add sql/tcl (#20295).
-       - fix: rpmvercmp("1.a", "1.") returned -1, not +1 (#21392).
-       - add cpuid asm voodoo to detect athlon processors.
-       - add %exclude support (i.e. "everything but") to %files.
-         (Michael (Micksa) Slade" <micksa@knobbits.org>)
-       - add --with/--without popt glue for conditional builds(Tomasz Kloczko).
-       - python: strip header regions during unload.
-       - add -g to optflags in per-platform config.
-       - permit confgure/compile with db3-3.2.9.
-       - permit manifest files as args to query/verify/install modes.
-       - fix: parameterized macro segfault (Jakub Bogusz <qboosh@pld-linux.org>)
-       - fix: i18n tags in rpm-2.5.x had wrong offset/length (#33478).
-       - fix: AIX has sizeof(uint_16) != sizeof(mode_t) verify cast needed.
-       - fix: zero length hard links unpacked incorrectly (#34211).
-       - fix: --relocate missing trailing slash (#28874,#25876).
-       - fix: --excludedoc shouldn't create empty doc dir (#14531).
-       - fix: %_netsharedpath needs to look at basenames (#26561).
-       - fix: --excludepath was broken (#24434).
-       - fix: s390 (and ppc?) could return CPIOERR_BAD_HEADER (#28645).
-       - fix: Fwrite's are optimized out by aggressive compiler(irix) (#34711).
-       - portability: vsnprintf/snprintf wrappers for those without (#34657).
-       - more info provided by rpmdepOrder() debugging messages.
-       - merge (compatible) changes from top-of-stack into rpmlib.h.
-       - cpio mappings carry dirname/basename, not absolute path.
-       - fix: check waitpid return code.
-       - remove support for v1 src rpm's.
-       - re-position callbacks with ts/fi in cpio payload layer.
-       - state machines for packages (psm.c) and payloads (fsm.c)
-       - add --repackage option to put erased bits back into a package.
-       - fix: (ppc) copy va_list in loop (#36845).
-       - cpanflute perl dependency needs explicit epoch (#37034).
-       - regenerate rpm.8 man page from docbook glop (in max-rpm).
-       - lib/depends.c: diddle debugging messages.
-       - fix: readlink return value clobbered by header write.
-       - fix: ineeded count wrong for overlapped, created files.
-       - globalize _free(3) wrapper in rpmlib.h, consistent usage throughout.
-       - internalize locale insensitive ctype(3) in rpmio.h.
-       - boring lclint annotations and fiddles.
-       - transaction iterator(s) need to run in reverse order on pure erasures.
-       - erasures not yet strict, warn & chug on unlink(2)/rmdir(2) failure.
-       - more boring lclint annotations and fiddles.
-       - yet more boring lclint annotations and fiddles.
-       - still more boring lclint annotations and fiddles.
-       - enough lclint annotations and fiddles already.
-       - fix: specfile queries with BuildArch: (#27589).
-       - fix: debugging message displays header keys (#38454).
-       - use internal db-3.2.9 sources to build by default.
-       - don't build db1 support by default.
-       - create rpmdb.la so that linkage against rpm's db-3.2.9 is possible.
-       - rpm database has rpm.rpm g+w permissions to share db3 mutexes.
-       - expose more db3 macro configuration tokens.
-       - move fprint.[ch] and hash.[ch] to rpmdb directory.
-       - detect and fiddle incompatible mixtures of db3 env/open flags.
-       - add DBI_WRITECURSOR to map to db3 flags with CDB database model.
-       - add rpmdbSetIteratorRewrite to warn of pending lazy (re-)writes.
-       - harden rpmdb iterators from damaged header instance segfaults.
-       - add cron/logrotate scripts to save installed package filenames.
-       - upgrade to db-3.3.4.
-       - fix: filter duplicate package removals (#35828).
-       - add armv3l arch.
-       - fix: i18n strings need 1 on sucess return code (#41313).
-       - fix: skip %ghost files when building packages (#38218).
-       - headerFree() returns NULL, _free is C++ safe.
-       - remove all header region assertion failures, return NULL instead.
-       - perform db->verify when closing db files.
-       - eliminate db-1.85 and db-2.x configuration.
-       - fix: popt arg sanity checks broken, optarg != optArg.
-       - fix: popt range checks on floats/doubles broken.
-       - popt: return POPT_ERROR_ERRNO on config open/read/close failure.
-       - fix: popt exec doesn't add '--', --target et al no longer need '='.
-       - fix: popt consume-next-arg "!#:+" w/o side effect (#41956).
-       - fix: for busted db1, attempt chain reconnection to following record.
-       - return multiple suggested packages
-         (Pawel Kolodziej <pawelk@pld.org.pl>).
-       - fix: return suggested packages when using Depends cache.
-       - merge sparc64/ia64 fiddles back into linux.{req,prov}.
-       - automagically generate perl module dependencies always.
-       - fix: lclint fiddles broke uCache initialization (#43139).
-       - always use db cursors.
-       - permit duplicates for btree indices.
-       - document build modes in rpmbuild.8, rpmbuild is born.
-       - default to dbenv with mpool, --rebuilddb with nofsync is much faster.
-       - fix: QUERY_FOR_LIST file count clobbered.
-       - create top level rpmcli API, factor top level modes into popt tables.
-       - popt: add POPT_BIT_SET/POPT_BIT_CLR to API.
-       - autogen.sh checks for latest libtool-1.4 and automake-1.4-p2.
-       - rpm --verify reports failure(s) if corresponding tag is not in header.
-       - rpm --verify honors %config(missingok), add -v for legacy behavior.
-       - remove dead code frpm popt table reorg.
-       - more CLI typedefs/prototypes moved from rpmlib.h to rpmcli.h.
-       - rpm --verify skips files in non-installed states.
-       - rpm --verify skips content checks for %ghost files.
-       - rpm --verify displays config/doc/gnost/license/readme atrrs for files.
-       - rpm --verify checks immutable header region digest if available.
-       - rpmbuild adds header region digest (SHA1 as string).
-       - use rpmTag* typedefs in new hge/hae/hme/hre header vectors.
-       - remove rpmrc Provides: Yet Again, use virtual packages.
-       - dump cursor debugging wrappers.
-       - rpm --verify can disable rpmFileAttr checks.
-       - add rpmdbSetIteratorRE() for regex matching in database iterators.
-       - permit rpm -qa to take RE args applied to name tag.
-       - permit dbiFindMatches() to use version/release patterns.
-       - eliminate all uses of rpmdbSetIterator{Version,Release}.
-       - fix: db1 end-of-file not detected in legacy compatible way.
-       - fix: remove (harmless) chown error message from %post.
-       - add --target/--host to %configure, add example cross-build/config.site
-         scripts to /usr/lib/rpm <arjanv@redhat.com> (#44581).
-       - rpmdb iterator selectors permit default/strcmp/regex/glob matching.
-       - rpmdb iterator selectors permit negative matches.
-       - alpha: don't add "()(64bit)" dependency markers.
-       - ia64/sparc: <arch>.{req,prov} identical to linux.{req,prov}.
-       - add "rpmlib(ScriptletInterpreterArgs)" to track
-           %post -p "/sbin/ldconfig -n /usr/lib"
-         incompatibilities.
-       - popt: add POPT_ARGFLAG_SHOW_DEFAULT to display initial values(#32558).
-       - popt: add POPT_CONTEXT_ARG_OPTS for all opts to return 1 (#30912).
-       - fix: fsm reads/writes now return error on partial I/O.
-       - fix: Ferror returned spurious error for gzdio/bzdio.
-       - check for API/ABI creep, diddle up some compatibility.
-       - preliminary abstraction to support per-header methods.
-       - finalize per-header methods, accessing headerFoo through vector.
-       - make package ordering loop messages debug, not warning.
-       - remove {ia64,sparc}-linux.{prov,req}, changes merged into linux.*.
-       - fix: partial sets of hardlinked files permitted in payload.
-       - fix: mark rpmdb files with %config to prevent erasure on downgrade.
-       - work around a (possible) compiler problem on ia64.
-       - fix: rpm -qlv link count for directories dinna include '..'.
-       - fix: rpm -qlv size for directories should be zero.
-       - add --noghost to filter non-payload files from rpm -qlv output.
-       - add %{_gnu} macro to append "-gnu" to %{_target_platform} to
-         support --target/--host flavored %configure. Legacy behavior
-         available by undefining %{_gnu}.
-       - propagate %{_gnu} to per-platform configuration.
-       - fix: parameterized macros with massive mumber of options need
-         "optind = 1" "Dmitry V. Levin" <ldv@alt-linux.org>.
-       - add athlon per-platform configuration.
-       - remove executable bit to disable autogenerated perl requires until
-         perl provides can be vetted.
-       - disable per-platform %%configure use of %%_gnu until libtool package
-         stabilizes.
-       - fix: permit partially enumerated hardlink file sets during build.
-       - fix: resurrect rpm signature modes.
-       - fix: sanity checks on #tags (<65K) and offset (<16Mb) in header.
-       - fix: add -r to useradd to prevent /etc/skel glop (#46215).
-       - fix: disambiguate typedef and struct name(s) for kpackage.
-       - update intl dirs to gettext-0.10.38.
-       - fix: sanity check for header size added in headerCopyLoad() (#46469).
-       - fix: redundant entries in file manifests handled correctly (#46914).
-       - map uid/gid from metadata into payload headers.
-       - add removetid to header during --repackage.
-       - expose rpmShowProgress() and rpmVerifyDigest() in rpmcli.h.
-       - portability: avoid st_mtime, gendiff uses basename, etc (#47497).
-       - glibc-2.0.x has not __va_copy().
-       - popthelp.c: don't use stpcpy to avoid portability grief (#47500).
-       - permit alias/exec description/arg text to be set from popt config.
-       - python: rhnLoad/rhnUnload to check header digest.
-       - package version now configureable, default v3.
-       - rename rpm libraries to have version with libtool -release.
-       - fix: -i CLI context broken Yet Again.
-       - unlink all __db.nnn files before 1st db open.
-       - python bindings should not segfault when fed bad data.
-       - fix: adjust arg count for --POPTdesc/--POPTargs deletion.
-       - add linux per-platform macro %_smp_mflags <sopwith@redhat.com>.
-       - document more popt aliases for --help usage.
-       - remove --tarbuild from man page(s), use -t[abpcils] instead (#48666).
-       - fix: scope multi-mode options like --nodeps correctly (#48825).
-       - isolate cdb access configuration (experimental, use at your own risk).
-       - fix: hard fail on locked dbopen if CDB locking not in use.
-       - fix: dbconfig with mp_mmapsize=16Mb/mp_size=1Mb for
-         "everything ENOSPC" failure check.
-       - fix: don't total hard linked file size multiple times (#46286).
-       - add %dev(type,major,minor) directive to permit non-root dev build.
-       - fix: _smp_flags macro broken.
-       - python: bind rhnUnload differently.
-       - fix: rescusitate --querytags.
-       - fix: short aliases broken (#49213).
-       - python: "seal" immutable region for legacy headers in rhnUnload() .
-       - python: add poptmodule.so bindings.
-       - fix: %dev(...) needs to map rdev and mtime from metadata.
-       - resurrect --specedit for i18n.
-       - fix: 4 memory leaks eliminated.
-       - fix: yet another segfault from bad metadata prevented.
-       - add sha1 test vectors, verify on ix86/alpha/sparc.
-       - add (but disable for now) rpm-perl subpackage from Perl-RPM.
-       - python: parameterize with PYVER to handle 1.5 and/or 2.1 builds.
-       - add build dependency on zlib-devel (#49575).
-       - enable rpm-perl subpackage.
-       - add pmac/ppciseries/ppcpseries varieties to ppc arch family.
-       - include tdigest.c tkey.c and trpmio.c to "make dist".
-       - re-enable dependency resolution source from package NVR.
-       - rename pmac to ppcmac.
-       - ia64: revert -O0 compilation.
-       - upgrade to db-3.3.11 final.
-       - fix: don't segfault when presented with rpm-2.4.10 packaging (#49688).
-       - fix: --noscripts is another multimode option.
-       - add tmpdir to configure db3 tmpdir into chroot tree.
-       - permit lazy db opens within chroot.
-       - fix: diddle dbenv path to accomodate backing store reopen in chroot.
-       - add support for mips (#49283).
-       - add __as, _build_arch, and __cxx macros (#36662, #36663, #49280).
-       - detailed build package error messages.
-       - fix: i18n tags not terminated correctly with NUL (#50304).
-       - add explicit casts to work around a s390 compiler problem.
-       - fix: autoconf glob tests (#50845).
-       - portability: some compilers squawk at return ((void) foo()) (#50419).
-       - remove fdFileno() from librpmio, use inline version instead (#50420).
-       - fix: linux find-requires needs quotes around [:blank:].
-       - remove /var/lib/rpm/__db* cache files if %__dbi_cdb is not configured.
-       - python: add hiesenbug patch.
-       - add legacy (compile only) wrappers for fdFileno et al.
-       - add -D_REENTRANT (note rpmlib is still not thread safe).
-       - fix: segfault on headerFree given malicious data.
-       - fix: don't verify hash page nelem.
-       - better error messages for verification failures.
-       - include directory /usr/lib/rpm in rpm package.
-       - always use dl size in regionSwab() return.
-       - ppc: revert ppcmac to ppc.
-       - ppc: autoconf test for va_copy.
-       - python: add exception to detect bad data in hdrUnload.
-       - change dir creation message from warning to debug for now.
-       - verify perms (but not mode) on %ghost files.
-       - headers without RPMTAG_NAME are skipped when retrieved.
-       - within a region, entries sort by address; added drips sort by tag.
-       - fix: error message on failed package installs resurrected.
-       - python: memory leaks in headerLoad/headerunload bindings.
-       - python: retrofit sha1 digest using RPMTAG_SHA1RHN.
-       - python: change rhnUnload bindings.
-       - python: teach rhnLoad about RPMTAG_SHA1RHN as well.
-       - fix: Provides: /path did not work with added packages (#52183).
-       - fix: progress bar scaling did not include source rpm count.
-       - fix: hash page nelem failure to verify.
-       - fix: initialize "verify" transaction stepName with -vv (#53582).
-       - fix: ftp remote globs broken (#46892).
-       - popt: clarify X consortium license in popt.3 man page.
-       - close/discard Depends index after rpmdepCheck() use.
-       - lclint-3.0.0.15 fiddles.
-       - fix: harmless typo in db3 chroot hack.
-       - fix: big-endian's with sizeof(time_t) != sizeof(int_32) mtime broken.
-       - fix: add Korean message catalogs (#54473).
-       - add RPHNPLATFORM and PLATFORM tags.
-
-4.0 -> 4.0.[12]
-       - fix: avoid calling getpass twice as side effect of xstrdup macro
-         (katzj@linuxpower.org) (#17672).
-       - order packages using tsort, clipping Requires:'s in dependency loops.
-       - handle possible db3 dependency on -lpthread more gracefully.
-       - bump popt version to 1.6.1.
-       - fix: more (possible) xstrdup side effects.
-       - fix: rpm2cpio error check wrong on non-libio platforms.
-       - fix: runTriggers was not adding countCorrection.
-       - add rpmGetRpmlibProvides() to retrieve rpmlib(...) provides
-         "Pawel A. Gajda" <mis@k2.net.pl>.
-       - syntax to specify source of Requires: (PreReq: now legacy).
-       - rip out rpm{get,put}text, use getpo.sh and specspo instead.
-       - fine-grained Requires, remove install PreReq's from Requires db.
-       - fix: duplicate headerFree() on instalBinaryPackage() error return.
-       - fix: work around for (mis-compilation?!) segfaults on signature paths.
-       - fix: segfault on exit of "rpm -qp --qf '%{#fsnames}' pkg" (#20595).
-       - hpux w/o -D_OPEN_SOURCE has not h_errno.
-       - verify MD5 sums of payload files when unpacking archive.
-       - hide libio lossage in prototype, not API.
-       - add support for SHA1 as well as MD5 message digests.
-       - don't verify src rpm MD5 sums (yet).
-       - md5 sums are little endian (no swap) so big endian needs the swap.
-       - add doxygen and lclint annotations most everywhere.
-       - consistent return for all signature verification.
-       - use enums for almost all rpmlib #define's.
-       - API: change rpmProblem typedef to pass by reference, not value.
-       - unify rpmError and rpmMessge interfaces through rpmlog.
-       - collect and display rpm build error messages at end of build.
-       - don't trim leading ./ in rpmCleanPath() (#14961).
-       - detect (still need to test) rdonly linux file systems.
-       - check available inodes as well as blocks on mounted file systems.
-       - pass rpmTransactionSet, not elements, to installBinaryPackage et al.
-       - add cscope/ctags (Rodrigo Barbosa<rodrigob@conectiva.com.br>).
-       - remove getMacroBody() from rpmio API.
-       - add support for unzip <rodrigob@conectiva.com.br>
-       - add brp-strip-shared script <rodrigob@conectiva.com.br>.
-       - better item/task progress bars <rodrigob@conectiva.com.br>.
-       - load headers as single contiguous region.
-       - add region marker as RPM_BIN_TYPE in packages and database.
-       - fix: don't headerCopy() relocatable packages if not relocating.
-       - merge signatures into header after reading from package.
-       - RPM_BIN_TYPE malloc'ed when retrieved through headerGetEntry().
-       - add headerFreeData() to free any data malloc'ed during retrieval.
-       - preserve exact image of original header when installing/upgrading.
-       - add missing headerFree for legacy signature header.
-       - fix: removed packages leaked DIRINDEXES tag data.
-       - reload tags added during install when loading header from rpmdb.
-       - avoid brp-compress hang with both compressed/uncompressed man pages.
-       - improved find-{requires,provides} for aix4/hpux/irix6/osf.
-         Tim Mooney<mooney@dogbert.cc.ndsu.NoDak.edu>
-       - portability: remove use of GNU make subst in lib/Makefile (Joe Orton).
-       - python: bind package removal (#21274).
-       - autoconfigure building python bindings.
-       - autoconfigure generating rpm API doco.
-       - fix: don't fdFree in rpmVerifyScript, rpmtransFree does already.
-       - use package version 3 if --nodirtokens is specified.
-       - add package names to problem sets early, don't save removed header.
-       - make sure that replaced tags in region are counted in headerSizeof().
-       - support for dmalloc debugging.
-       - filter region tags in headerNextIterator, exit throut headerReload.
-       - add rpmtransGetKeys() to retrieve transaction keys in tsort'ed order.
-       - python bindings for rpmtransGetKeys().
-       - fix: include alignment in count when swabbing header region.
-       - handle added dirtoken tags (mostly) correctly with header regions.
-       - add FHS doc/man/info dirs, diddle autoconf goo.
-       - fix: headerUnload handles headers w/o regions correctly on rebuilddb.
-       - resurrect rpmrc Provides: as well as implicit dependency on packge
-         info.
-       - change dependency loop message to RPMMESS_WARNING to use stderr, not
-         stdout.
-       - fix: (transaction.c) assume file state normal if tag is missing.
-       - fix: failed signature read headerFree segfault.
-       - fix: revert ALPHA_LOSSAGE, breaks 6.2/i386.
-       - fix: synthesized callbacks for removed packages have not a pkgkey.
-       - identify install scriptlet failures with the name of the scriptlet.
-       - handle install chroot's identically throughout the install process.
-       - add rpmlib(HeaderLoadSortsTags) for tracking header regions
-         "just in case".
-       - create _tmppath on the fly if not present.
-       - remove /etc/rpm/macros.db1 configuration file if db3 rebuilt.
-       - remove overly verbose dbiOpen() error messages, no longer needed.
-       - whiteout mozilla loop for 7.1.
-       - immutable headers, once installed by rpm3, need to lose immutablity.
-       - fix: removed headers from db need a headerCopy().
-       - send query/verify output through rpmlog().
-       - resurrect rpmErrorSetCallback() and rpmErrorString().
-       - use malloc'ed buffer for large queries.
-       - fix: avoid FAT and other brain-dead file systems that have not inodes.
-       - fix: hack around alpha mis-compilation signature problems.
-       - rpmmodule.c(handleDbResult): return empty list when nothing matches.
-       - (non-linux): move stubs.c to rpmio (#21132).
-       - (python): bind initdb (#20988).
-       - (popt): fix float/double handling (#19701).
-       - (popt): non-linux needs <float.h> (#22732).
-       - (popt): add POPT_ARGFLAG_OPTIONAL for long options with optional arg.
-       - (popt): diddle auto-help to include type of arg expected.
-       - use popt autohelp for rpm helper binaries.
-       - fix: avoid locale issues with strcasecmp/strncasecmp (#23199).
-       - remove almost all explicit uses of stderr in rpmlib using rpmError().
-       - fix: pass scriptlet args, as in %post -p "/sbin/ldconfig -n /lib".
-         (Rodrigo Barbosa).
-       - fix: 3 packages from Red Hat 5.2 had bogus %verifyscript tag.
-       - tsorted packages processed in successor count order.
-       - fix: resurrect --excludepath (#19666).
-       - fix: digests on input FD_t dinna work.
-       - fix: remove rebuilddb debugging leakage.
-       - successors from tsort are processed in presentation order.
-       - fix: find-requires.perl needed update (#23450).
-       - fix: don't hang on build error.
-       - fix: remove "error: " prefix from signature verification message.
-       - hack: permit installer to determine package ordering using 1000003 tag.
-       - fix: extra newline in many error messages (#23947).
-       - fix: rpm -Va with db1 needs per-iterator, not per-index, offset.
-       - add install/remove transaction id tags.
-       - tsort prefers presentation order.
-       - 1st crack at Mandrake specific per-platform macros.
-       - fix: insure that %lang scopes over hard links correctly.
-       - fix: rpmCleanPath was nibbling at .. in macrofiles incorrectly.
-       - fix: check waitpid return code.
-       - fix: make a copy of retrieved header before loading.
-       - fix: diddle exit code for attempted installs of non-packages (#26850).
-       - python binding diddles to reduce installer memory footprint by
-         delayed loading of file info.
-       - fix: remove fixed size buffer on output path (#26987,#26332).
-       - resurrect rpmErrorCode in the API for Perl-RPM.
-       - fix: permit packages to differ by 0 or 32 bytes (#26373).
-       - fix: permit HEADER_IMMUTABLE tag queries.
-       - split db configuration into separate file.
-       - portability changes from Joe Orton <jorton@redhat.com> et al.
-       - (alpha): rip out ALPHA_LOSSAGE now that gcc-2.96-76 has fix (#28509).
-       - (popt): use sprintf rather than snprintf for portability.
-       - (sparc) disable MD5 sum checks during install.
-       - (db1) plug largish memory leak in simulated interface for falloc.c.
-       - remove mozilla dependency white out, no longer needed.
-       - fix: adjust for libio breakage in Red Hat 5.x with glibc-2.0.7-29.4.
-       - map i686-like (i.e. w/o CMOV) platforms to better alternatives.
-
-3.0.6 -> 4.0
-       - use DIRNAMES/BASENAMES/DIRINDICES not FILENAMES in packages and db.
-       - API: change dbi to pass by reference, not value.
-       - cram all of db1, db_185, and db2 interfaces into rpmlib.
-       - convert db1 -> db2 on-disk format using --rebuilddb.
-       - add db3 to the pile, isolate all with incremental link and vectors.
-       - prefer db3 as default.
-       - permit db3 configuration using macros.
-       - create dbi from template rather than passed args.
-       - use hashed access for package headers.
-       - db3: save join keys in endian neutral binary format.
-       - treat legacy falloc.c as "special" db[01] index for package headers.
-       - API: pass *SearchIndex() length of key (0 will use strlen(key)).
-       - API: remove rpmdb{First,Next}RecNum routines.
-       - add explcit "Provides: name = [epoch:]version-release" to headers.
-       - fix: cpio.c: pre-, not post-, decrement the link count.
-         (from Fabrice Bellet <Fabrice.Bellet@creatis.insa-lyon.fr>)
-       - make db indices as lightweight as possible, with per-dbi config.
-       - db1.c will never be needed, eliminate.
-       - API: merge rebuilddb.c into rpmdb.c.
-       - API: replace rpmdbUpdateRecord with rpmdbSetIteratorModified.
-       - API: replace rpmdbFindByLabel with RPMDBI_LABEL iteration.
-       - API: replace rpmdbGetRecord with iterators.
-       - API: replace findMatches with iterators.
-       - Filter DB_INCOMPLETE on db->sync, it's usually harmless.
-       - Add per-transaction cache of resolved dependencies (aka Depends).
-       - Do lazy dbi{Open,Close} throughout.
-       - Attempt fine grained dbi cursors throughout.
-       - fix: free iterator *after* loop, not during.
-       - fix: Depends needed keylen in dbiPut, rpmdbFreeIterator after use.
-       - Rename db0.c to db1.c, resurrect db2.c (from db3.c).
-       - simplify --last popt alias, date like -qi (bjerrick@easystreet.com).
-       - fix: alloca'd memory used outside of scope (alpha segfault).
-       - fix: define/eval options assumed sizeof(int) == sizeof(void *).
-       - fix: sparc64 per-platform directory shouldn't be sparc64linux.
-       - fix: (segfault) verify needs rpmdb while query does not.
-       - add calculated nlink field to -qlv output (like ls -al).
-       - detects and builds properly against the new fopencookie API in
-         glibc 2.2.
-       - change popt exec alias in oreder to exec rpm children.
-       - split rpm into 5 pieces along major mode fault lines with popt glue.
-       - turn on new, more complete version of %%configure.
-       - add %%makeinstall analogue of new %%configure for autoconf packages.
-       - mark packaging with version 4 to reflect filename/provide changes.
-       - change next version from 3.1 to 4.0 to reflect package format change.
-       - change %configure, add %makeinstall macros to handle FHS changes.
-       - add optflags for i486 and i586.
-       - fix: segfault with legacy packages missing RPMTAG_FILEINODES.
-       - require db3 in default configuration.
-       - create rpmio directory for librpmio.
-       - make librpmio standalone.
-       - fix: avoid clobbering db cursor in removeBinaryPackage.
-       - expose cursors in dbi interfaces, remove internal cursors.
-       - remove incremental link.
-       - portability: sparc-sun-solaris2.5.1.
-       - fix: don't count removed files if removed packages is empty set.
-       - fix: permit '\0' as special case key (e.g. "/" in Basenames).
-       - require --rebuilddb to convert db1 -> db3, better messages.
-       - fix: open all db indices before performing chroot.
-       - fix: typo in brp-compress caused i18n man pages not to compress.
-       - API: uncouple fadio from rest of rpmio.
-       - API: externalize legacy fdOpen interface for rpmfind et al.
-       - put version on rpmpopt filename to avoid legacy filename collision.
-       - change optflags for i386.
-       - multilib patch, take 1.
-       - add pre-transaction syscall's to handle /etc/init.d change.
-       - don't bother saving '/' as fingerprint subdir.
-       - prefix payload paths with "./", otherwise "/" can't be represented.
-       - fix: compressFilelist broke when fed '/'.
-       - fix: typo in --last popt alias (#12690).
-       - fix: clean file paths before performing -qf (#12493).
-       - remove build mode help from rpm.c, use rpmb instead.
-       - fix: set multilibno on sparc per-platform config.
-       - fix: legacy requires './' payload prefix to be omitted for rpm itself.
-       - fix: remove verbose database +++/--- messages to conform to doco.
-       - add S_ISLNK pre-transaction syscall test.
-       - fix: initialize pretransaction argv (segfault).
-       - fix: check rpmlib features w/o database (and check earlier as well).
-       - rip out pre-transaction syscalls, more design is needed.
-       - remove (dead) dependency checks on implicitly provided package names.
-       - remove (dead) rpmdb API code in python bindings.
-       - fix: make set of replaced file headers unique.
-       - fix: don't attempt dbiOpen with anything but requested dbN.
-       - create rpmbuild/rpmquery/rpmverify/rpmsign symlinks.
-       - fix: look for any/all dbapi when rebuilding.
-       - link rpm2cpio dynamically since cpio is linked dynamically.
-       - fix: uniqify dependency problems when printing (#14034).
-       - fix: segfault on erase if filestates is missing in header (#14679).
-       - fix: popt POST callbacks typo.
-       - fix: -Va broken, make db cursors per-iterator, not per-dbi.
-       - fix: segfault when globbing on "" (#15593).
-       - fix: rebuild db1 -> db3 ate 1st header (#16263).
-       - translate rpm.8 man page (Peter Ivanyi <ivanyi@internet.sk>).
-
-3.0.6 -> 3.0.7
-
-3.0.5 -> 3.0.6
-       - python bindings to query and verify signatures.
-       - add callbacks on package erasure.
-       - fix: preserve cpio errno when using Fclose with libio.
-       - fix: initialize sigs everywhere in python header object.
-       - popt: support for float/double args.
-       - fix: honor --test when doing --freshen.
-       - add alpha* architectures.
-
-3.0.4 -> 3.0.5
-       - configure.in fiddles for BSD systems (Patrick Schoo).
-       - solaris2.6: avoid bsearch with empty dir list (Ric Klaren - klaren@cs.utwente.nl)
-       - include RPM-GPG-KEY in file manifest.
-       - Add ia64 and sparc64 changes.
-       - rpm.spec: add per-platform sub-directories.
-       - FreeBSD fixes (bero@redhat.com).
-       - handle version 4 packaging as input.
-       - builds against bzip2 1.0
-       - fix: resurrect symlink unique'ifying property of finger prints.
-       - fix: broken glob test with empty build directory (Geoff Keating).
-       - fix: create per-platform directories correctly.
-       - update brp-* scripts from rpm-4.0, enable in per-platform config.
-       - alpha: add -mieee to default optflags.
-       - add RPMTAG_OPTFLAGS, configured optflags when package was built.
-       - add RPMTAG_DISTURL for rpmfind-like tools (content unknown yet).
-       - teach brp-compress about /usr/info and /usr/share/info as well.
-       - update macros.in from rpm-4.0 (w/o dbi configuration).
-       - fix: don't expand macros in false branch of %if (kasal@suse.cz).
-       - fix: macro expansion problem and clean up (#11484) (kasal@suse.cz).
-       - uname on i370 has s390 as arch (#11456).
-       - python: initdb binding (Dan Burcaw <dburcaw@terraplex.com>).
-       - internalize --freshen (Gordon Messmer <yinyang@eburg.com>).
-       - support for separate source/binary compression policy.
-       - support for bzip payloads.
-       - fix: payload compression tag not nul terminated.
-       - identify package when install scriptlet fails (#12448).
-       - remove (unused) RPMTAG_CAPABILITY.
-       - remove (legacy) use of RPMTAG_{OBSOLETES,PROVIDES} internally.
-       - remove (legacy) support for version 1 packaging.
-       - remove (legacy) support for converting gdbm databases.
-       - eliminate unused headerGz{Read,Write}.
-       - support for rpmlib(...) internal feature dependencies.
-       - display rpmlib provides when invoked with --showrc.
-       - fix: compare versions if doing --freshen.
-       - disable rpmlib(VersionedDependencies) by defining _noVersionedDependencies.
-
-3.0.3 -> 3.0.4
-       - use compressed filenames on install side.
-       - start unifying FD types, CFD_t now gone.
-       - check for memory leaks (almost all leaks are plugged).
-       - fix: resurrect multiple target platform builds.
-       - freshen.sh: detect when all packages are up to date (Ian Macdonald).
-       - fix: typo in error message (#6858).
-       - add/update dependency scripts (Ken Estes).
-       - use directory tokens internally to reduce memory usage.
-       - permit --whatprovides to lookup file dependencies.
-       - fail to package if absolute symlink points within build root.
-       - initial version of check-prereqs.
-       - expose enough of legacy fdio interface to compile rpmfind/rpm2html.
-       - fix: Fopen should use 0666 as default (umask will be applied later).
-       - fix: default for rd_timeoutsecs is 1 sec (avoid ufdio assertion).
-       - fix: new FILENAMES tags require package index, not pointer in lookups.
-       - rename new FILENAMES tags to BASENAMES/DIRNAMES/DIRINDEXES.
-       - fix: don't look at password when searching urlCache.
-       - add contentLength sanity check on rpmdb headerWrite.
-       - fix: fprint abort on stat("/", ...) in empty chroots.
-       - perform glob on remote ftp query args.
-       - fix: ftpAbort must close the data channel to read abort status.
-       - perform glob on remote ftp install args.
-       - fix: reload macros from cmd line when re-reading config files.
-       - fix: compressFileList was over-generating dirNames.
-       - fix: alAddPackage sorted dirNames too soon, destroying dirMapping.
-       - expose enough of legacy fdio interface to compile gnorpm.
-       - fix: missing strdup when overriding buildroot from command line
-         argument (#1026,#5006).
-       - diddle some names to keep my C++ brethern happy (i.e. kpackage port).
-       - fix: add ufdSeek.
-       - build popt (with libpopt.so*) as a sub-package of rpm.
-       - split python bindings into a separate sub-package of rpm.
-       - add ja translation and man pages (Kanda Mitsuru kanda@nn.iij4u.or.jp).
-       - fix: fp.subDir was incorrectly set to NULL in sparse chroot's.
-       - fix: manageFile needs to and with O_WRONLY(=1), not O_RDONLY(=0).
-       - fix: resurrect failed glob error message during build.
-       - add several BuildRoot FTW policies.
-       - add manpage for gendiff (pbrown@redhat.com).
-       - updated sv.po (goeran@uddeborg.pp.se) (#8349).
-       - configurable PATH for install %pre/%post et al scriptlets.
-       - use only %_install_langs, not LINGUAS/LANG when deciding to install.
-       - configurable compression type/level for package payloads.
-       - default value for %_install_langs is all.
-       - fix: resurrect relative path's in fprint lookup queries.
-       - extract spec files from bzip'ped tarballs too on tar builds.
-       - add %_rebuilddbpath macro to permit rebuilding db in new location.
-       - updated perl scripts (Ken Estes).
-       - fix: on --rebuilddb, make sure new/old paths are not the same (#8752).
-       - fix: on --erase, segfault caused by "" prefix.
-       - explicitly expand file lists in writeRPM for rpmputtext.
-       - {Free,Open}BSD find-{provides,requires} (suzukis@file.phys.tohoku.ac.jp).
-       - new rpm-build package to isolate rpm dependencies on perl/bash2.
-       - always remove duplicate identical package entries on --rebuilddb.
-       - add scripts for autogenerating CPAN dependencies.
-       - add sl.po from Primoz Peterlin <peterlin@biofiz.mf.uni-lj.si>.
-       - updated sv.po from <goeran@uddeborg.pp.se>.
-       - macro expansion (and absolute path) in %files -f arg (#9508,#9091).
-       - permit cli setting of build root policies.
-       - fix: filter excluded paths before adding install prefixes (#8709).
-       - add i18n lookaside to PO catalogue(s) for i18n strings.
-       - try for /etc/rpm/macros.specspo so that specspo autoconfigures rpm.
-       - per-platform configuration factored into /usr/lib/rpm subdir.
-       - sparc-sun-solaris2.6 portability check.
-       - simpler hpux.prov script (Tim Mooney).
-       - portability: skip bzip2 if not available.
-       - portability: skip gzseek if not available (zlib-1.0.4).
-       - portability: skip personality if not available (linux).
-       - portability: always include arpa/inet.h (HP-UX).
-       - portability: don't use id -u (Brandon Allbery).
-       - portability: don't chown/chgrp -h w/o lchown.
-       - portability: splats in rpm.spec to find /usr/{share,lib}/locale/* .
-       - fix: better filter in linux.req to avoid ARM specific objdump output.
-       - fix: use glibc 2.1 glob/fnmatch everywhere.
-       - fix: noLibio = 0 on Red Hat 4.x and 5.x.
-       - fix: typo in autodeps/linux.req.
-       - configure noarch compatibility in rpmrc for ia64.
-
-3.0.2 -> 3.0.3
-       - add --eval to find result of macro expansion.
-       - add configure scaffolding to support rpm-4.0 packages.
-       - include shared libs in rpm-devel (no versioning yet).
-       - add epoch (as [0-9]*:version-release) to install dependency parse.
-       - move install/erase major modes into rpmlib.
-       - move checksig/resign major modes into rpmlib.
-       - add python bindings to rpm-devel (linux only).
-       - make query (rpm -qvl) behave like (POSIX?) ls for older files (#4050).
-       - fix: %if parsing skipped 3 chars too many.
-       - permit multiline macro expansions with comments and %if.
-       - add pl translation and man pages (PLD team - from Tomasz Kloczko).
-       - fix: incomplete cleanup if --rebuilddb fails (#4115).
-       - add versions to provides.
-       - fix: sanity test on specfile fails when encountering i18n chars.
-       - print all dependencies for each package at end of build.
-       - the death of RPMSENSE_SERIAL, use [epoch:]version[-release] instead.
-       - add _mandir/_infodir macro expansions to docdirs (Tomasz Kloczko).
-       - add post install configurable dependency checking.
-       - fix: segfault on --rebuild (#4185).
-       - macro fixes (Benedict Lofstedt, #4220):
-          expand %# just like %{#} (and with same value as shell analogues).
-          macro defaults for *, 0, and # if no args specified.
-          getopt on non-linux requires optind to be saved/restored.
-       - fix: don't remove file until last occurence in transaction (#4291).
-       - resuscitate net shared paths (#4330).
-       - fix: macro table cannot contain NULL pointers (#4263).
-       - fix: last char in rpmrc w/o terminating newline lost (#4361).
-       - prepare for handling \r in macro exapnsions.
-       - fix: n>1 occurrences of %config(noreplace) should not FA_CREATE (#4355).
-       - fix: use pgp5 rather than pgp-2.6.3 if both are in %_pgpbin (#4564).
-       - match "de" when locale is specified as "de_DE.ISO-8859-1@Munich".
-       - add versions to obsoletes.
-       - add %_install_langs to configure languages to be installed.
-       - add LC_ALL/LC_MESSAGES to query locale search.
-       - fix: segfault with "--sign" w/o supplying files (#4651).
-       - add headerWrite return code and check for errors.
-       - update python bindings from anaconda.
-       - add versions to prereq.
-       - add syntax sensitive implict prereq on rpm-3.0.3.
-       - fix: don't successfully match with strncasecmp("sparc", "sparc64", 5)
-       - add sparcv9 architecture.
-       - add --freshen to usage message (#4823).
-       - suggested changes to docs from Ken Estes (#4451).
-       - link libbz2.a statically to avoid rpm->bzip2 dependence for now.
-       - Tru64: avoid find-requires variable size limit (Tim Mooney).
-       - Solaris: use getpassphrase rather than getpass if available.
-       - pgp and pgp5 have compatible RSA signature (#4780).
-       - fix: avoid db problems with self-obsoleting packages on install.
-       - glibc2: always enable dynamic mtrace if available.
-       - fix: versioned provides devolved to existence test with conflicts.
-       - fix: with unspecified epochs, skip dependency epoch compare.
-       - python: shared module linked correctly.
-       - do versioned provides/conflicts resolution correctly.
-       - rpmpopt: display versioned provides/obsoletes.
-       - revert to shared libbz2.so now that bzip2 is in base install.
-       - fix: command line install had header memory leak.
-       - check for NULL on all memory allocations.
-       - free rpmrc mallocs on exit.
-       - glibc2: permit run time leak detection.
-       - fix: removed files fingerprint memory leak.
-       - fix: resurrect allfiles flag from rpm-2.5.x.
-       - fix: version compares compatible with epoch-less requires/conflicts.
-       - fix: rpm-2.5.1 had file list w/o leading / fix.
-       - portatbility fiddles (solaris).
-       - create binary rpm directory (e.g. .../%{_target_cpu}) on the fly.
-       - updated pl/rpm.8 (PLD team).
-       - new find req/prov scripts for non-linux platforms (Tim Mooney).
-       - fix: non-GNU globs burp on repeated '/' in patterns.
-       - dumb cpp's want white space around lclint annotations (Tim Mooney).
-       - aix: aix.req broken by cut-and-paste (Tim Mooney).
-
-3.0.1 -> 3.0.2
-       - eliminate armv4 entries from rpmrc (Andrew E. Mileski).
-       - permit multiple "Provides: " lines in rpmrc (#2999).
-       - add BuildConflicts: and BuildRequires: in spec file and src rpm.
-       - fix: bigendian's with longlong file sizes (e.g. IRIX) dinna work.
-       - move printDep* routines into rpmlib for gnorpm et al.
-       - updated ru translation (Sergey Kubushin).
-       - add vpkg-provides.sh (Tim Mooney).
-       - don't clobber LDFLAGS in top-level Makefile (Tim Mooney).
-       - fix: build root from cmd line did not set macro %buildroot (#1026).
-       - fix: resurrect "rpm -Va --nofiles" (verify dependencies only) (#3111).
-       - rpm-devel should require popt (#3125).
-       - don't spin while waiting for delayed requires/provides input (#3289).
-       - common parse for all dependency token syntax.
-       - eliminate find-requirements on libNoVersion (Red Hat linux only).
-       - add new-fangled requires on "libc.so.6(GLIBC_2.1)" (sparc-linux only).
-       - MiNT port (Guido Flohr <gufl0000@stud.uni-sb.de>).
-       - fix: --rebuilddb with --root dinna remove directory (Michael Andres).
-       - fix: false fingerprint stat cache hit -- "the tetex problem" (#2727).
-       - fix: bsearch needs macro table sorted after undefine. (#3713).
-       - fix: --checksig segfault with odd pgp output (e.g. w/o ~/.pgp) (#3720)
-       - avoid numeric overflow in version comparison (Thayne Harbaugh<tharbaug@liberate.com>).
-       - move url.c and ftp.c to rpmlib right next to query.
-       - 12 more dead strtoks.
-       - changelog stamp broken w/ big endian 64 bit time_t (Stephane Erania).
-       - tru64: use /bin/sh not /usr/bin/ksh in find-requires.
-       - 32Mb (~16x largest known) sanity check on header size.
-
-3.0 -> 3.0.1
-       - fix: %verifyscript resurrected (Shing-Gene Yung).
-       - fix: % before non-alphabetic non-macro special now passed unscathed.
-       - fix: noarch header gets initialized differently.
-       - fix: $2 to triggerpostun scripts was wrong
-       - fix: --querybypkg in man page should be --filesbypkg
-       - fix: optflags not implicitly set to canonical arch value.
-       - fix: prefer pgp2.6.3 over pgp5 if both are installed.
-       - make sure that rpm-the-package auto-requires glibc.
-       - add rpmputtext/rpmgettext to rpm package.
-       - fix: non-apache servers need "GET ... HTTP/1.0" by the book.
-       - fix: %doc wrongly inherits lang from last entry in %files.
-       - resurrect toplevel tar target.
-       - spec file removal separate from source removal (Shing-Gene Yung).
-       - add rpm prefix to MD5 routines to avoid name conflict on solaris.
-       - fix: resurrect -Vp, -Vf and -Vg functionality.
-       - colesce query and verify modes.
-       - better cpio error message if package contains missing hard links.
-       - fix: shared file not skipped when removed.
-       - fix: conversion script left off leading underscores.
-       - another strtok bites the dust.
-       - fix: prevent return code wrap during packagage checking/resigning.
-       - permit multiple %lang(xx) markers on elements in %files.
-       - permit %lang(xx,yy,zz) constructs --  2 more dead strtoks.
-       - fix: --prefix should work properly during package installs.
-       - add librpmbuild.a to the file list.
-
-2.94 -> 2.95
-       - fix: last update transaction set segfault bug in installer.
-       - improved checks for statfs (Tim Mooney).
-       - remove inconsistent use of __P((...)) throughout.
-       - non-static inline functions caused IRIX cc pain.
-       - CPIOERR_CHECK_ERRNO masking caused AIX cc warnings.
-       - solaris 2.6+ needs statvfs.
-       - check build prerequisites before building from specfile.
-       - convert per-system configuration in /etc/rpmrc to macros.
-
-2.93 -> 2.94
-       - fix: segfault while parsing target string.
-       - fix: os was not initialized with "--target i586".
-       - fix: --prefix resurrected.
-       - non-linux, non-gcc portability fixes (Tim Mooney).
-       - default to static libs only (remove implied support for shared libs).
-
-2.92 -> 2.93
-       - eliminate old rpmrc configuration syntax.
-       - pgp5 support (Carlo Wood <carlo@runaway.xs4all.nl>)
-       - fix: segfault from double close on ftpGetFileDesc->ftpAbort path.
-       - fix: don't add header if signature generation failed (Carlo Wood).
-       - more DU 4.0D fiddles (Shing-Gene Yung).
-       - fix: segfault from unknown uid/gid -- use builder's uid/gid instead.
-       - autoReq/autoProv now per-package.
-       - fix: avoid segfault using --prefix until ewt fixes.
-       - add --define "%foo %bar" option.
-       - dump macros to same fd as --showrc uses.
-       - add %GNUconfigure for full-blown package regeneration.
-       - fix: RPM_ARCH/RPM_OS had wrong values.
-       - fix: create ppc directories correctly.
-       - (re-)enable fixowner/fixgroup macros.
-       - fix: specfile BuildRoot was masking rpmrc macro.
-       - expand twiddles in macrofiles list.
-       - add explicit macrofiles path to rpmrc.
-       - add per-target macrofiles to search path.
-       - take globalMacroContext out of macro api.
-       - fix: flush all macros between builds.
-       - add name/version/release macros during src.rpm install.
-       - attempt mkdir sourcedir/specdir during src.rpm install.
-
-2.91 -> 2.92
-       - update with libtool-2.4f.
-       - DU 4.0D fiddles (Shing-Gene Yung<shing@cz3.nus.edu.sg>)
-       - change support@redhat.com to rpm-list@redhat.com.
-       - fix: with --target=i686, pass macro %_arch=i386.
-       - fix: rpm --target=arch ... resurrected.
-       - fix: rpm -q --specfile --specedit now works even with BuildArch:.
-       - fix: nested strtok's is a no-no.
-       - added disk space checking
-
-2.90 -> 2.91
-       - fix: memory leaks in rpmRunTransactions plugged.
-       - fix: build of packages w/o BuildRoot segfault.
-       - permit substitution of I18N strings from PO meta-catalogues.
-       - add callbacks for installer updates while doing URL xfers.
-       - resurrect http queries/verifies.
-       - create rpmbzio.c to avoid implicit dependence on libbz2 for installer.
-       - spec files can provide /filename now
-       - added rpmdbOpenForTraversal()
-       - proxy http (Alex deVries).
-       - add BuildPrereq: in spec file and src rpm.
-       - added rpmtransSetScriptFd()
-       - fixed config file problems during chroot upgrades
-       - fixed %attr brokenness for directories
-       - augment linux provides/requires for glibc 2.1 backward compatibility.
-       - fixed --noscript, --notriggers, --excludedocs, and a bunch
-         of other install/remove flags
-       - fixed noreplace handling
-       - complain about old packages being installed
-
-2.5.x -> 2.90
-       - added --excludepath
-       - identify missing keys by type (Toshio Kuratomi).
-       - package install/removal much smarter about symlinks
-       - redid install/remove API to allow transaction semantics
-       - support for GPG (Toshio Kuratomi <badger@prtr-13.ucsc.edu>)
-       - file lookup finally sane wrt symbolic links :-)
-       - fileindex format changed -- rebuilddb is necessary for rpm 2.90!!
-       - --rebuilddb doesn't open old index files
-       - permit http:// and file:// url's as well as ftp://.
-       - change --rcfile to permit colon separated file list.
-       - compile in defaults from rpmrc/macros.
-       - finish hiding rpmdb index record data ("matches").
-       - implement abstract fd type almost everywhere.
-       - update and rename Czech (Pavel Makovec <pavelm@terminal.cz>)
-       - augment --showrc with -v, only display set variables without -v.
-       - add macrofiles variable, permit second entry to initMacros().
-       - add config.h defines for paths to find-requires et. al.
-       - add readRPM to libbuild, headerGetLangs to librpm.
-       - permit rpm to be built in a sub-directory (--srcdir=DIR).
-       - configure using automake.
-       - arch/os (and platform) should be case insensitive everywhere forever.
-       - attempt to deal rationally with os as "Linux" or "linux".
-       - add generalized expression handler (Tom Dyas<tdyas@remus.rutgers.edu>)
-       - use /usr/lib/rpm/mkinstalldirs if mkdir -p fails.
-       - more portable dirent handling (Hermann Lauer).
-       - add Slovak translation (Stanislav Meduna <stano@trillian.eunet.sk>)
-       - gettextify rpmMessage/rpmError/fprintf messages.
-       - update po files; add cz to catalogs.
-       - cpio_gzip: dup the fd before doing gzdopen (Thanks Erik!)
-       - add --noLang to skip non-default languages.
-       - writeRPM can now copy cpio archive from fd.
-       - preliminary macro environment as side effect of rpmrc parse.
-       - macro handling in rpmlib -- rework include: tag with macro expansion.
-       - first attempt at librpmbuild API.
-       - fixed lib/rpmrc.c to accept include: tags (AdV)
-       - fixed the CHANGES file to reflect that this is 2.9, not 3.0 (AdV)
-       - aggregate system includes into system.h.
-       - rearrange functions to minimize exported routines in librpmbuild API.
-       - generalize cpio I/O to eliminate pipe to exec'd gzip on install.
-       - add {init,add,expand}Macro args everywhere (new macro.c compatibility)
-       - add new fully recursive macro.c
-       - there must be a { between two % in a query format (unless %% is used)
-
-2.5.6 -> 2.5.7:
-       - permit 0x1b in specfile sanity check.
-       - increase timeout in tread from 5 to 30 secs for slow links.
-       - rename file before unlinking to avoid EBUSY failures.
-       - headerGetEntry now returns count=0 if tag not found (Chris Blizzard).
-       - resurrect osf1 as canonical os name (Time Mooney).
-       - sub-packages should inheirit Prefixes tag (Ian Mortimer).
-       - make '-' character illegal (again) in version/release.
-       - use portable #!/bin/sh (Tim Mooney).
-       - don't erase failing build script (Tim Mooney).
-       - use portable mkinstalldirs (Tim Mooney).
-       - irix6 autodeps were dup'd (Shing-Gene Yung <shing@cz3.nus.edu.sg>).
-       - getservbyname needed ntohs().
-       - propagate "const char *" into rpmlib prototypes.
-       - use "original db-1.85" if available (Raw Hide glibc 2.1).
-       - make sure files to sign exist before asking for the pass phrase
-
-2.5.5 -> 2.5.6:
-       - ultrapenguin 1.1.9 sparc64 changes.
-       - attempt ftp ABOR on query/verify url's.
-       - cache open ftp control descriptor with password.
-       - verify needed same realpath semantics as query.
-       - plug fd leak in urlGetFile().
-       - translate cpio errors using cpioStrerror.
-       - display "..?....." rather than "..5....." for unreadable files.
-       - run time (rather than compile time) host endian check.
-       - caldera patches (ray@Caldera.DE)
-       - added ARM patches.
-       - fix incorrect directory permissions using %attr/%defattr.
-       - permit "rpm -q --specfile ... file.spec" queries.
-       - strncasecmp on spec file separators (KDE has %Description).
-       - remove redundant md5 computation on uninstall.
-       - permit --rmsource --force even if sources/patches are missing.
-       - don't compute md5sum on non-file %config objects. (from Jos Vos)
-       - check arch only on RPMBUILD_{PREP,BUILD,INSTALL,PACKAGEBINARY}.
-       - configure.in: set default value for RPM. (Tim Mooney)
-       - add new Epoch: keyword just like Serial:.
-       - update Russian translation w man pages.
-       - solaris: don't attempt static link. (Tim Mooney)
-       - fix: timeCheck in rpm.c should be unsigned long. (Tim Mooney)
-       - osf: prov searches only shared libraries. (Tim Mooney)
-       - solaris: set PATH in prov/req scripts. (Tim Mooney)
-       - fix: ignore modes on symlinks. (Tim Mooney)
-       - sub-packages inherit RPMTAG_EPOCH (just like RPMTAG_VERSION/RELEASE).
-       - fix off-by-1 alloca that prevented relocating /.
-       - there must be a { between two % in a query format (unless %% is
-         used).
-
-2.5.4 -> 2.5.5:
-       - permit rpm to be built in a sub-directory (--srcdir=DIR).
-       - return CPIO_BAD_HEADER instead of exiting. (Scott M. Stone)
-       - untranslate "(none)" for auto relocating script wrappers.
-       - non-linux arch/os identification (Eugene Kanter).
-       - portable mode_t/pid_t typedefs.
-       - fix check for trailing / in Prefix:
-       - remove 2 character language name assumption.
-       - add /usr/lib/rpm/find-lang.sh (W. L. Estes <wlestes@uncg.edu>)
-       - miscellaneous portability cruft (Eugene Kanter).
-       - Makefile: don't use ln -sf.
-       - getOutputFrom(): fix race between last read on pipe and child death
-         (exacerbated in 2.5.4).
-       - rpm.spec: create /usr/src/redhat/* in %install.
-
-2.5.3 -> 2.5.4:
-       - expand args using popt on pre-rpmReadConfigFiles arg pass.
-       - skip arch checks if only packaging source rpm.
-       - add license field to rpmpopt -qi alias.
-       - provides/obsoletes requires tokens that begin with alnum or _.
-       - non-zero exit status for verify failures.
-       - hpux does setreuid differently (Hermann Lauer).
-       - check for setreuid portably (Eugene Kanter).
-       - add Serbian translation (Zoltan Csala <zcsala@iname.com>).
-       - arch/os tables were not being initialized  for noarch builds.
-       - quote users/groups/filenames in --setugids.
-       - add Russian translation w man pages (Serguei Koubouchine <ksi@gu.net>)
-       - fix virtual file attribute bug that skipped all files in binary rpm.
-       - eliminate infinite loop with missing tmpdir (Trent Jarvi).
-       - os_canon for CYGWIN32_NT/95.
-       - rationalize autoconf detection of gzip/bzip2.
-       - restore backward compatible rpmrc/rpmpopt symlinks.
-       - update pt_BR translations (Arnaldo Carvalho de Melo).
-       - permit --{buildroot,timecheck,test,sign} with -tX (Toshio Kuratomi).
-       - fix database rebuilds with triggers (Steve Sanberg).
-       - diagnostic message if unreadable/short source or patch file.
-       - eliminate redundant close in provide/require processing.
-       - solaris portability patch resurrection (Steve Sanberg).
-       - permit autogen.sh to work on non "prefix=/usr" hosts.
-       - add %license/%readme virtual file attributes.
-       - align "Build Host:" with other fields.
-
-2.5.2 -> 2.5.3:
-       - copy changelog tags to sub-packages just before packaging.
-       - added EPOCH handling to supplement serial numbers
-       - add RPMTAG_EPOCH and RPMTAG_CAPABILITY init to 0.
-       - fix infinite recursion on non-ERANGE return from getcwd() during
-         install (Matt Wilson).
-       - rm .depend for multiple builds in same tree (Will Partain)
-       - addFile: fix special case of "/" in %files.
-       - better query semantics with symlinks (Tim Mooney)
-       - build.c: fix incorrect check for successful open
-       - allow %define with leading whitespace
-       - use /usr/lib/rpm for rpmpopt, rpmrc, find-requires, find-provides
-       - added popt 'exec' functionality
-       - made --rebuilddb a bit more robust by checking data types
-       - added --freshen via popt exec stuff
-       - fixed spelling of expected
-       - updated de.po (Karl Eichwalder)
-       - do a better job of checking for a spec file in tarballs
-         (Pavel Roskin)
-       - fixed --triggers alias (Michael Andres)
-       - added :hex query format
-       - fixed --querytags to display virtual tags
-?????  - added --triggers and --triggered by to man page, help, and usage
-?????  - added support for epochs
-
-2.5.1 -> 2.5.2:
-       - added -bs to build just a source package
-       - included irix.req and irix.prov (Tim Mooney)
-       - copy CHANGELOG* and URL tags to all subpackages
-       - follow symlinks when packaging sources
-       - handle %files -f with no %setup (no build directory)
-       - fixed ugly i18n header bug
-       - deal with lang paths sanely when entries are missing languages
-       - fix bug packing /usr/doc when last file was %dir
-       - added --last alias
-       - fix :depflags query format
-       - Group: i18n (like Summary:)
-       - make --justdb install files in normal state
-       - %{fssizes} segv'd for packages with empty file lists
-       - updated HP-UX, OSF1, Irix 6.x dependency scripts (Tim Mooney)
-       - added arm and MachTen arch/os info
-       - added --filesbypkg query format
-       - updated README to have proper URLs
-       - updated rpm.spec for proper paths and cleanliness
-       - dependency resolution could hang when Provides: line is used in
-         rpmrc (Tim Mooney)
-       - updated mips rpmrc entries (Alex deVries)
-       - version/release conditional triggers weren't ignoring the trigger     
-         package name at the front of the TRIGGERVERSION
-       - added --notriggers for -i and -e
-       - made --triggers a synonym for --triggerscripts
-       - ftp installs were trying to use /var/tmp/tmp
-       - allow whitespace in source/patch lines
-       
-2.5 -> 2.5.1:
-       - fail if sources are not regular files
-       - wasn't catching readLine() errors
-       - fixed (hopefully) temp file creation problems
-       - make %doc obey --test
-       - unlink before writing .rpms
-       - librpm.c: added headerGzRead()/headerGzWrite()
-       - set bzip2path via lib-rpmrc/configure (Toshio Kuratomi)
-       - added finish translation (Raimo Koski)
-       - prefer db_185.h to db.h (Christopher Seawood)
-       - included updated hpux.req (Ralph Goers)
-       - added aix.req (Ralph Goers)
-       - updated hpux.prov, osf.req, osf.prov (Tim Mooney)
-       - set file states for --justdb packages to "not installed"
-       - handle missing file states properly in -e code
-       - install time wasn missing for --justdb packages
-       - missing parameter in an rpmError() caused segfault
-
-2.4.109 -> 2.5:
-       - fixed return code bug in build code
-       - do macro expansion before %if processing
-       - dep ordering returns w/ an error as soon as a prereq loop is found
-       - autoreqprov flag was being ignored during builds
-       - add autoreq: and autoprov:
-       - missed a few unlink() when scripts failed
-       - freePrefixes wasn't initialized in runScript()
-       - fix typo in %triggerpostun generation
-       - include icons in source packages
-       - headerGetEntry() should return count of 1 when returning
-         strings plucked from i18n strings
-       - do not remove comments in scripts
-       - save/restore existing arch when done with buildarch
-       - copy the I18N table to the source header so i18n stuff works
-       - fixed multiple memory leaks in install code
-       - fixed bug in part recognition
-       - shared files weren't being handled properly in net shared paths
-
-2.4.108 -> 2.4.109:
-       - remove icons with --rmsource
-       - do dependecy generation on -bl
-       - check files on all packages on -bl
-       - integrate Jeff Johnson's memleak patches
-       - added OSF1 autodep scripts
-
-2.4.107 -> 2.4.108:
-       - make --clean work with no %setup
-       - fixed FSSIZES problem introduced in 2.4.107
-       - fixed search for find-requires.sh
-       - improved solaris autodeps scripts
-       - automated (somewhat) the -static flag
-
-2.4.106 -> 2.4.107:
-       - --nomd5 wasn't handled properly
-       - updated configure.in find-req and find-prov checks (Tim Mooney)
-       - make --rmsource actually work
-       - run postun triggers
-
-2.4.105 -> 2.4.106:
-       - build: only check for non-printables in first 128 chars
-       - added %triggerpostun
-       - linux.req generates deps for shared libs
-       - added a CC=@CC@ to popt/Makefile.in
-       - handle signed return types from poptGetNextOpt() properly
-
-2.4.104 -> 2.4.105:
-       - added langpatt: to rpmrc, and mark files with matches
-       - added some C++ cruft to rpmlib.h
-       - added find-requires and find-provides for hpux (Tim Mooney)
-       - respect LINGUAS when install package files
-       - added trigger support to build code
-       - got rid of annoying mwftw() type warning
-       - fixed many command line options which got broke by changes
-         for non-gcc compilers
-       - added trigger support in install code
-       - added doc/triggers
-       - strntoul() in lib/cpio.c was returning a pointer to freed
-         memory
-       - headerAppend() was doing a bad memcpy()
-
-2.4.103 -> 2.4.104:
-       - fixed popt/Makefile.in to use CPP from configure
-       - use tmppath from rpmrc to for ftp'd files (rather then /var/tmp)
-       - autoconf files and .depend files weren't created properly during
-         make archive
-
-2.4.102 -> 2.4.103:
-       - need to create popt/configure during make archive
-       - added comments about modifictation to base popt and rpmrc files
-       - allow spaces in group names
-       - fix bug in memory allocation of special doc stuff
-       - Jeff Johnson's mode/dev fixes
-       - clean up buildroot
-       - be more paranoid about making temp files
-       - added patches from Tim Mooney which let RPM build with non-gcc
-         compilers and non-GNU versions of make
-
-2.4.101 -> 2.4.102:
-       - fixed spelling of "instchangelog" in lib-rpmrc.in
-       - fixed memory leak in headerSprintf() extension cache
-       - fixed memory allocation for header formatting extension cache
-       - added support for INSTPREFIX virtual tag for backwards compatibility
-       - cpio error codes were poorly defined, causing bad error messages
-       - generates INSTPREFIXES tag properly, and sets RPM_INSTALL_PREFIX
-         and RPM_INSTALL_PREFIXn environment variables
-       - fixed memory leak in install code which occured when net shared paths
-         were used
-       - don't pass net shared path to rpmInstallPackage() -- it looks 
-         directly in the rpmrc entries
-       - don't remove files in netsharedpath, even for files whose states
-         are not net shared
-       - changed --setugids to use separate chown and chgrp programs, for
-         better portability
-       - popt moved to autoconf
-       - Makefiles changed to allow building in a different directory then
-         the source code resides in
-       - finally fixed the Build Host spacing in rpmpopt
-
-2.4.100 -> 2.4.101:
-       - handle files with spaces (put double quotes around them)
-       - new rpmrc setting, buildshell, can be used to set shell
-         used for build scripts (default is /bin/sh)
-       - fix bug where macros were being improperly set for
-         Patch: and Source: lines
-       - may use "instchangelog" in rpmrc to limit the maxmium number of 
-         changelog entries that are stored in the database for each package
-         (-1 means store all of them)
-       - default instchangelog is set to 5
-       - headerRemoveEntry() didn't free the item's data -- this led to
-         a slight memory leak when installing packages
-       - implemented generic file relocations at install time
-         (use --relocate <oldpath>=<newpath>, i.e. --relocate /usr=/foo)
-       - added --badreloc flag to force RPM to relocate files which packages
-         haven't advertised as relocatable
-       - fix return code on failed uncompresses in %prep
-       - preliminary handling of bzip2 compressed files
-       - differentiates between big and little endian mips
-       - added support for "prefixes:" tag
-
-2.4.99 -> 2.4.100:
-       - fixed handling of --rebuild and --recompile
-       - fixed rpmlibbuild.a typo in Makefile
-       - fixed handling of '\' in spec files (a specific case of a more
-         general bug)
-       - change use of "export" to work with non-bash shells
-       - compress the archives.  oops.
-       - fixed bug when there is no %setup
-       - added -L$(topdir)/popt to Makefile.inc
-
-2.4.12 -> 2.4.99:
-       - added many more i18n strings
-       - merged in large rewrite of build code, which includes the following
-         changes:
-           - new option --rmsource
-           - all scripts can now take -p <prog>
-           - more strict about %package placement and use of main package 
-             preamble
-           - %attr(mode, user, group [, dirmode])
-           - %defattr()
-           - %defverify()
-           - Root: is depricated.  Use BuildRoot: instead
-           - "nosrc" sources arn't deleted when sources are removed
-           - New tag DocDir: <dir> to set alternate doc dir (default is 
-             /usr/doc)
-           - %doc should work as expected with buildroot, prefix, DocDir:
-           - all file processing is done before any packaging
-           - should work with modern patch programs (later than 2.1)
-           - %patch -z <arg> same as %patch -b <arg>
-           - %define only defines a macro if it starts a line
-           - script prog entries are now arrays (ie with arguments)
-           - standard macros: tag names, buildarch, buildos, buildarch_lc, 
-             buildos_lc, PATCHn, SOURCEn, PATCHURLn, SOURCEURLn, sourcedir, 
-             builddir, optflags
-           - deprecate require_distribution, require_icon, require_vendor
-           - add RPMTAG_FILEDEVICES and RPMTAG_FILEINODES to header
-           - export variables in scripts
-           - fixed tag:field bug
-           - %lang() in %files
-           - %description -l <lang>
-           - Summary(<lang>):
-           - fixed read_line() termination usage
-       - Makefile changes to shorten compiler lines
-
-2.4.11 -> 2.4.12:
-       - intialize reserved portion of lead when writing packages
-       - fixed error messages displayed when opening the database
-         fails during package installation and removal
-       - query format of the form '[A%{}]' would drop the static string
-       - fixed fix in 2.4.9 for empty packages which broke -qip on ftp URL's
-       - fixed arch/os numbers in lead
-       - added Turkish message catalog
-       - -e was running scripts even w/ --test was specified
-
-2.4.10 -> 2.4.11:
-       - HAVE_SYS_SOCKET_H was mistakingly MACHINE_SYS_SOCKET_H in
-         config.h.in
-       - \%description was trying to do %d expansion in query formats
-       - made %% work in query formats
-       - fixed bug in handling characters before array
-       - let mips build noarch packages
-       - --setperms would set wrong permissions in some cases (it was
-         following symlinks)
-
-2.4.9 -> 2.4.10:
-       - obsolete entries could cause segv's during upgrades
-       - sources now installed with uid/gid of process rather then
-         the ids used when the src rpm was created
-       - don't give an error if missingok files don't exist during remove
-       - touched ftp code to make it coexist w/ Red Hat install better
-       - use rand/srand rather then random/srandom
-       - don't build misc directory unless it's necessary
-       - empty package files should be treated the same as files
-         with bad magic, not as read errors
-       - fix bug where Prefix directory is included in file list
-       - sinix readdir() work-around
-
-2.4.8 -> 2.4.9:
-       - fix for verification on systems where a single group id
-         maps to mulitiple group names (Benedict Lofstedt)
-       - added 'make tar' rule for building a distribution tarball
-         (Horacio Rodriguez Montero)
-       - fixed serial number handling in dependencies and install
-         code
-       - make mips compatible with noarch
-       - fixed bug w/ printing string arrays in conditionals
-       - handle modern patch programs (> 2.1)
-       - handle packages w/ duplicate dependency names
-       - --noscripts didn't get handled properly for removed packages
-       - fixed handling of packages where %prereq creates users/groups
-
-2.4.7 -> 2.4.8:
-       - added noarch build compatibilities for ppc, m68k
-       - fixed some minor typos (Florian La Roche)
-       - added Obsoletes: tag, an upgrade removes packages which
-         have been obsoleted
-       - updated rpmdepUpgradePackage() to deal with obsoletes tag
-       - convertdb needed to read rpmrc
-       - fixed ugly bug in package ordering
-       - archivesize tag was incorrect for packages with hard links
-       - moved popt into a separate library
-       - directory created with %doc is now name-version (dropped
-         the release)
-       - added buildarch/buildos macros
-       - added %ghost file option
-       - updated linux.req to only find requirements for exectuable files
-
-2.4.6 -> 2.4.7:
-       - had some wrong month lengths in changelog date parsing
-       - updated fine-requires (Linux version) to add lines for shell
-         scripts (Donnie Barnes)
-       - didn't package / properly
-       - pre/post script processing had some erroneous free() calls
-       - fixed typos for HP archs in lib/rpmrc.c
-       - uname() results should go through *_canon tables before anything
-         else happens
-       - set -x in debug shells, not -xs
-
-2.4.5 -> 2.4.6:
-       - added os_canon entries for BSD/OS and NextStep
-       - replaced include of <malloc.h> with includes of <stdlib.h>
-       - fixed md5sum of source packages w/ a buildroot is used
-       - fixed bugs installing version 1 packages
-       - remove hyphens from uname() result (specifically for HP-UX)
-       - hacks to recognize architecture under parisc
-       - RPM_INSTALL_PREFIX wasn't being set properly (this should be
-         fixed now)
-       - replaced temporary file creation to be race-condition safe
-       - prerequisites may not specify versions
-
-2.4.4 -> 2.4.5:
-       - call getpwnam()/endpwent() once before a chroot(), forcing name 
-         service shared libs to be loaded from outside of the root path
-       - added vesrion stamp to lib/misc.o (and librpm.a by extension)
-       - fixed config.sub, config.guess to recognize i686
-       - ARCHIVESIZE tag didn't get filled in properly, breaking progress
-         meters
-
-2.4.3 -> 2.4.4:
-       - restore working directory after installing a package w/ a chroot
-       - dump the package stack when a dependency loop is encountered
-       - when a user/group lookup fails, end*ent() and retry 
-       - fixed broken --scripts argument (it was --s2)
-       - only display the packager and url in -qi output if they have defined
-         values
-       - print "(not installed)" as the install time for -p queries rather
-         then "not a number"
-       - almost completely rewrote rcfile parsing; I'm sure this will
-         break things eventually but it's much more flexible now
-       - added buildarch/buildos compatibility tables, listed values
-         in --showrc
-       - added cpio archive building code; GNU cpio is no longer used!
-         packages created w/ rpm 2.4.4 and later cannot be installed with
-         rpm 2.4 - rpm 2.4.3 however (version of RPM before 2.4 will 
-         work fine, however). An "error -2 reading header" happens when
-         this is attempted
-       - removed cpiobin from rpmrc
-       - added rpmrc "provides" tag to allow easy fulfillment of 
-         automatically generated dependencies
-       - look for random() in libm if it can't be found be default
-       - fixed problems in Solaris's autodeps stuff (Eric Mumpower)
-       - --setperms should work properly on directories now
-       - --justdb on install, upgrade, and erasure causes a database
-         update w/o the filesystem being touched
-       - fixed version comparison of a package w/ a serial tag against
-         a package w/o one
-       - added BuildArchitectures: tag to spec file to enable builds
-         for alternate/multiple architectures
-       - look for random() in -lucb
-       - changed the licensing terms for librpm to allow redistribution
-         under the LGPL
-       - applied man page changes from Alex deVries
-       - configure.in builds up LIBS by appending (Benedict Lofstedt)
-       - rpm2cpio reported wrong zlib error string
-       - removed \n from (none) generated by query format code
-       - queries of fssizes w/o fsnames didn't work (Till Bubeck)
-       - added --noorder option to skip package reordering (Elliot Lee)
-
-2.4.2 -> 2.4.3:
-       - implemented install time prerequisites
-       - repaired %{#TAG} query format
-       - implemented ternary operator as query expression
-       - fixed --scripts to only print information on scripts which
-         are present
-       - check symlink() return for < 0, not != 0 (Bob Tanner)
-       - uses chroot() for installs --root option
-       - archive expansion doesn't create new devices or symlinks when
-         the proper files already exist
-       - added -p to %post (etc) to specify the program which a script
-         is run through
-       - if -p is used w/ an empty script, the specified program is
-         executed directly 
-       - the -p argument (or /bin/sh) is automaticall added as a prereq
-
-2.4.1 -> 2.4.2:
-       - completely rewrote queryformat code
-       - added fsnames, fssizes virtual query tags
-       - added rpmdbFindByHeader() and rpmdbFindByTag() public functions
-       - added rpmfilename tag to rpmrc to define the filename format to
-         use for binary packages (note the rpmdir is prepended to it)
-       - used pclose() instead of fclose() in -t code
-       - updated man pages
-       - changed "struct rpmdb" to "struct rpmdb_s" for C++
-       - netsharedpath entries shouldn't match partial directory names
-         anymore (a nersharedpath of /usr/lib shouldn't affect /usr/libexec)
-       - don't backup config files on netsharedpaths (take 2)
-       - added "day" query format which is like date, but doesn't print
-         any time
-       - added --changelog alias to query a packages changelog entry
-       - added mntctl() support for AIX (I think, I can't test this)
-       - fflags query type displays 's' for specfiles, 'm' for missingok
-         files, and 'n' for noreplace files
-       - implemented %config(missingok) flag in install
-       - added --allfiles flag for -i and -U, which forces all files (even
-         missingok files) to be installed
-       - implemented %config(noreplace) for the install, but it hasn't
-         been tested in any way
-       - added i18n support to headers
-       - added ppc/rs6000 differntiation for AIX
-       - all IP* from uname() is changed to just IP
-       - IP is considered the same as mips (not sgi)
-       - added IRIX64 OS, it's compatible w/ IRIX
-
-2.4 -> 2.4.1:
-       - take advantage of lchown() if it's available
-       - fixed configure script to assume chown() doesn't follow symlinks
-         if lchown() isn't available and configure is not being run as root
-       - more header file changes for AIX
-       - added :shescape query format type for strings, which prints strings
-         which will survive a single level of shell expansion
-       - fixed --setperms and --setugids to handle empty packages and 
-         packages with odd filenames
-       - include <sys/time.h> before <sys/resource.h>
-       - include "miscfn.h" first in every file which needs it
-       - created noarch architecture which everything is compatible with
-       - fixed group verification (Benedict Lofstedt)
-       - don't backup config files on netsharedpaths
-       - added info on --build{arch|os} to --help and usage messages
-
-2.3.11 -> 2.4:
-       - changed RPMNLSDIR directories to and @datadir@ to better
-         conform with autoconf
-       - set RPM_INSTALL_PREFIX environment variable when running 
-         verify scripts
-       - beginnings of SCO support (though I suspect it will take one
-         or two more iterations to get it right)
-       - switched to CVS and updated some Makefile rules
-       - look for gethostbyname() instead of gethostname() in -nsl
-         (this could break some things)
-       - added check for strcasecmp() in -lucb on systems which don't
-         have strcasecmp() in libc
-       - don't build -static on hpux10
-       - don't try and NLS empty strings
-       - changed index() call to strchr() in macro code
-       - include <time.h> in build/spec.c for various platforms
-       - added update-po rule to po/Makefile.in
-       - updated de.po (thanks to Karl Eichwalder)
-       - rpmFindByFile() removes trailing and duplicate /'s
-       - made many string in rpm program (though not yet in the various
-         libraries) translatable
-       - eight character user names could break -qlv
-       - requirements which begin with a leading / require files (in
-         the database!) instead of packages
-       - clean up conflictsindex during --rebuilddb
-       - get path to gzip from /usr/lib/rpmrc rather then just hoping it's 
-         in the path
-       - use dbpath for error messages with include database path in 
-         their text
-       - don't set owner/group if binaries installed by "make install"
-       - include <strings.h> on SCO
-       - don't use cpio when installing packages <gulp>
-       - fixed bug which affected dependencies on the Alpha
-       - made '=' work for long arguments (the switch to popt broke this)
-       - handle solaris systems better
-       - complain if critical rpmrc variables (cpiobin, gzipbin, etc) aren't
-         set anywhere
-       - allow --dbpath for --rebuilddb
-       - added check for systems whose chown() follows symlinks. If configure
-         is run as root, this should get it right, otherwise it assumes
-         chown() does not follow symlinks. You can use --enable-broken-chown
-         to force configure to think chown does indeed follow symlinks.
-       - if chown() follows symlinks, we don't chown() symlinks during cpio
-         unpacking and we don't verify the owner or group of symlinks
-       - added packager and url to default -qi output
-       - look for <sys/select.h> and use it if it's there (for AIX)
-
-2.3.10 -> 2.3.11:
-       - fixed newlines in --scripts output
-       - fix handling of source files with bad owners/groups
-
-2.3.9 -> 2.3.10:
-       - --allmatches handling in -e broke some cases
-       - new predefined macros: %SOURCEn %PATCHn %SOURCEURLn %PATCHURLn
-       - fix anomoly with %files -f <file> and %doc
-       - ignore config bit when it's set on directories (which allows
-         users to replace directories with symlinks)
-       - don't set config bit on directories
-       - strip trailing slashes from files (during build)
-       - %tags are now case sensitive (macros too)
-
-2.3.8 -> 2.3.9:
-       - reworked %setup to allow multiple -a and -b options, which
-         should noticeably ease the task of unapcking multiple tar files
-       - md5 sum's were calculated incorrectly on big endian machines
-         from 2.3.2 through 2.3.8 -- this was fixed and some hacks were
-         done to keep verification working
-       - updated README
-       - added --allmatches to allow erasing multiple versions/releases
-         of a package
-       - changed ftp URL's to use \r\n, not just \n (this should let RPM
-         work w/ some picky (but rfc compliant) ftp servers
-       - fix problem where parts at end of spec file were dropped
-       - added %config(noreplace missingok) (build-side)
-       - simple spec file macros
-       - should now process entire file list before failing
-       
-2.3.7 -> 2.3.8:
-       - added -t? options to build packages from tarballs which contain
-         .spec files instead of from the .spec files directly
-       - fixed error in man page where ftp URLs are discussed
-       - don't strlen(NULL) in headerAddEntry()
-       - minor portability changes
-       - stopped building oldrpmdb.c as part of rpmlib
-       - added Makefile rule for building rpmconvert (which is almost
-         never needed) -- this isolated gdbm dependence to this target
-       - fixed checking of popt stack overflow
-       - --requires shouldn't imply -q
-       - fixed error message issued when a groupname does not exist
-       - fixed but in changelog processing which made it hang on '*' in a
-         changelog entry
-       - generate S_ISSOCK and S_ISLNK macros on systems w/o them
-       - "rpm --erase" wasn't returning proper error codes w/ package
-         removal failed
-
-2.3.6 -> 2.3.7:
-       - fixed nasty memory link in -Va
-       - configure checks for -lnsl explicitly rather then linking it
-         to -lsocket (for NCR SysVR4)
-       - configure checks for dirent.h
-       - modified glob.c to include config.h and use HAVE_DIRENT_H
-       - cleanup of LIBS/LIBPATH mess a bit more
-
-2.3.5 -> 2.3.6:
-       - -Vf uses realpath() now
-       - -Vp lets you use --ftpproxy, --ftpport
-       - changed popt format, breaking all popt alises :-(
-       - added ability to alias character arguments to popt 
-       - moved --requires, --info to /usr/lib/rpmpopt
-       - RPM is more forgiving of blank user names (dumb)
-       - popt searches for aliases in the correct order now
-       - cleanup query code to handle missing uid lists better
-       - cleanup up configure.in a tad
-
-2.3.4 -> 2.3.5:
-       - %{#TAG} in query format prints the array length
-       - cleanup up protoypes in rpmlib.h
-       - let -Vp work on URLs
-       - don't set umask(0) anymore -- that confused programs which
-         link against rpmlib quite badly
-       - moved print out in "rpm -v -i" to occur after any warnings
-         to pretty up the output a bit
-       - added default optflags for powerpc
-       - run shell for post/pre scripts in debug mode with -sx for
-         some silly shells
-       - installing source packages with --root checked for the 
-         sources/specs directory to exist outside of the root -- fixed
-       - modified toplevel Makefile to run dependency generation only
-         against referenced sources
-       - array size mismatches in --qf should send error to stderr
-       - tried to make the locale stuff a bit more portable (again)
-       - reworked the owner/group setting on installs to be more generic
-         (in preperation for getting rid of cpio)
-       - made verify verify owner and groups by name rather then by id -- if
-         the symbolic names aren't available use the uids
-       - cleaned up relocateFilelist() and related code thanks to
-         new header introduced in 2.3.3 -- this could break relocatable
-         packages but they seem okay
-       - fixed a bug which could cause relocatable packages to not get
-         relocated -- I think this bit some people during hard drive
-         installs of all things (Jason Salopek pestered me consistently
-         enough to keep this on the front burner for me)
-       - removed FILEUIDS and FILEGIDS from the header in the database --
-         we never used it and it jsut wasted room
-       - convert uid/gid lists in v1 headers to symbolic names 
-
-2.3.3 -> 2.3.4:
-       - %changelog processing
-       - fixed broken requires/conflicts parsing for spec file
-       - vastly improved --rebuilddb's robustness
-       - fixed misplaced free() (only affected inconsistent databases)
-       - added conflicts documentation to docs/dependencies
-       - using multiple query formats has them all concatenated
-       - removed stdin based query and verify selectors
-       - installs rpmpopt in libdir
-       - moved --provides and --scripts to rpmpopt
-       - added --setperms, --setugids
-       - incorporated newer de.po from Karsten Weiss
-       - --resign/--addsign was broken in 2.3.3 from popt conversion
-
-2.3.2 -> 2.3.3:
-       - Ripped out header internals and redid them. Any compatibility 
-         problems this causes are *bugs* as it should be completley 
-         transparent. If this works the devil better buy some Prestone (TM).
-       - Use "cp -pr" instead of "cp -ar" for %doc expansion
-       - use <string.h> instead of (non standard) <strings.h> in some places
-       - look for non-POSIX (broken) chmod
-       - include local copies of glob/fnmatch
-       - removed getopt() check from configure.in
-       - fixed bug in ftp code which prevented proper logins to some sites
-       - switched to popt from getopt, which allows command line aliasing
-       - read initial aliases from /usr/lib/rpmpopt then /etc/popt and
-         $HOME/.popt
-       - cleanup up rdev verification (only verifies device files, checks
-         device related mode bits as well)
-       - fixed allocation of temporary paths (Eugene Kanter noticed this)
-       - made tools/dumpdb read the rpmrc so it can find the database
-       - added --nomd5 for -V and -K
-       - don't assume mkdir -p will succeed if the dir exists
-       - use RPMNLS* defines to avoid header file conflicts
-       - bunch of minor cleanups to avoid warnings on other OS's
-
-2.3.1 -> 2.3.2:
-       - fixed bug in new rpmVersionCompare() which made it worse then
-         useless (thanks to Norbert Kiesel)
-       - fixed silly message
-
-2.3 -> 2.3.1:
-       - changed --help routing to have intelligent line wrapping
-         to make i18n efforts easier
-       - NLSDIR should be used for nls catalogs, not a hardcoded path
-       - NLSDIR should be in share, not lib
-       - renamed sweedish catalog from se to sv
-       - added german catalog
-       - treat RPM_CHAR_TYPE as RPM_INT8_TYPE for queries
-       - made rpmEnsureOlder() internal to lib/install.c
-       - added rpmVersionCompare() to compare version/release/serial numbers
-         for packages -- returns like strcmp()
-       - stdout/stderr were getting closed after running a verify script
-       - relocting packages didn't work w/ the packages contained the
-         directory which was it's prefix
-
-2.2.11 -> 2.3:
-       - replaced putenv/setenv which calls which malloc() buffer -- these
-         are memory leaks, but the functions are only used between a fork()
-         and exec() so it doesn't matter
-       - created directroies are stamped with mtime from the file list
-
-2.2.10 -> 2.2.11:
-       - fixed some include file problems for FreeBSD
-       - fixed find-provides script for Linux (silly typo)
-       - -qvl didn't print out sticky bit
-       - linux.prov won't print provides info for symlinks which point
-         to libraries w/ proper sonames
-
-2.2.9 -> 2.2.10:
-       - changed how installArchive() handles running out of gzread()
-         bytes while the child is still alive
-       - changed tag for Alpha's to "alpha" from "axp" <gulp>
-       - made ./configure look for --quiet support in cpio
-       - netsharedPath's were having mkdir()'s done on them and had
-         bad interactions with rooted directories
-       - made -qp accept '-' to query the package on stdin
-       - dependency checking was broken when no database was being used
-       - don't *ever* let cpio make directories -- we do a better job
-         (esp because we don't kill symlinks!)
-       - plugged memory leaks in upgrade (again thanks to mpr) -- install,
-         erase, upgrade, query, and verify all seem to be leakproof
-       - use select() rather than busy waiting in cpio_gzip()
-       - use half as much temp space during package assembly
-       - fail if spec file check fails
-       - changed canonical name for 68k to m68k (sorry)
-       - integrated FreeBSD changes from Jared Mauch
-       - integrated Irix changes from Hermann Lauer
-       - i18n support can be disabled w/ configure by --disable-nls
-         (thanks to Remy Card)
-       - integrated more AmigaOS patches, played with configure some
-         more to allow cross compiling (Kristof Depraetere)
-       - cleanups to rpm2cpio (closing the gz stream) (Elliot Lee)
-       - made find-provides return filename for libs w/ no soname
-
-2.2.8 -> 2.2.9:
-       - fixed typo in default rpmrc
-       - made getBooleanVar() a bit better
-       - added triggers to package builds
-       - tagged spec file in source package file list
-       - added %verifyscript (controlled by --noscript, -v flags)
-       - changed pkgReadHeader() mechanism to be more generic
-       - added find-provides for Solaris, made find-provides setup
-         more generic (w/ configure.in picking the right one)
-       - fix -Q
-       - The Great Renaming
-       - use external OS specific script to generate requires lines
-         (should work with ld.so 1.8.x) (find-requries)
-
-2.2.7 -> 2.2.8:
-       - added --ftpproxy, --ftpport (and wrote about them in rpm.8)
-       - added --nodeps to man page
-       - added --showrc to man page
-       - added conflict checking (use conflicts tag, which looks
-         just like the requires tag)
-       - fixed RPM's return code when package removal fails
-       - cleaned up lib/install.c a bit for readability
-       - plugged a bunch of memory leaks thanks to mpr -- install,
-         uninstall, verify, and query all seem clean now
-       - added support for trees shared over a network via netsharedpath
-         in rpmrc
-       - don't exit when there is an unknown option in an rpmrc, just
-         give an error and continue
-       - tried once again to get things working properly with 2.1's
-         write behavior
-       - added -E option for %patch
-       - added UltraSPARC support to lib-rpmrc
-       - moved default topdir and optflags settings to lib-rpmrc from 
-         /etc/rpmrc
-       - removed /etc/rpmrc from standard distribution
-       - use separate chgrp/chown commands in %setup macro
-       - kill(2) arguments were backwards in lib/install.c
-       - fileFile logging needed stdio to handle NULL args to %s
-       - default docdir (for %doc macro) set in lib-rpmrc rather then
-         hardcoded
-       - removed some of the \n from args to error() [though many are
-         still left]
-       - uninstall should fail if the preuninstall script fails
-       - --root works with --initdb now
-
-2.2.6 -> 2.2.7:
-       - applied lots of portability patches
-       - builds on Solaris machines now!
-       - will build w/o i18n support if GNU gettext isn't installed
-       - added inet_aton, setenv functions for libmisc
-       - added Sun4c, Sun4m architectures
-       - use vfork() if fork() doesn't exist (for AmigaOS)
-       - look for GNU cpio, complain if it doesn't exist at build time
-       - put path for GNU cpio in /usr/lib/librpmrc
-       - install rpm.shared if rpm wasn't built (for Solaris)
-       - readHeader() in librpm.a should work on sockets (which may
-         return partial reads)
-       - package file query (-q -p) accepts ftp:// style URL's
-       - if gzread returns 0 bytes (at EOF), don't call write w/ 0 byte
-         argument as it's behviour isn't portable
-       - fixed -Vp behavior (doesn't seg fault w/ packages have dependencies)
-
-2.2.5 -> 2.2.6:
-       - added --rebuilddb to rebuild database, updated man page
-       - fix fd leak in md5sum
-       - fixed group cache bug
-
-2.2.4 -> 2.2.5:
-       - if rename() for moving .spec file from SOURCES to SPECS fails,
-         try copying it instead
-       - -h and -v work for source package >= V2
-       - -h output is much smoother now
-       - new AutoReqProv: tag in spec file can disable automatic
-         require/provide generation
-       - fixed md5sum problem on big endian machines in a way that's
-         mostly backwards compatible; this hack will be removed someday
-       - added :fflags tag
-       - fixed a couple of minor memory leaks in lib/install.c
-       - --test for building
-
-2.2.3 -> 2.2.4:
-       - only remove docdir if %doc occurs
-       - allow -R to %patch
-       - moved to use GNU autoconf, though it probably isn't perfect yet
-         (thanks Kristof Depraetere)
-       - spec file sanity: no - chars in version or release,
-         must be a regular file :-)
-       - version specifications for requirements can use "-<release number>"
-       - default lib path, tmp path, topdir, and /usr/lib/rpmrc get set
-         by configure script relative to --prefix
-
-2.2.2 -> 2.2.3:
-       - fixed script file md5 checking when files are in a root
-       - implemented proper strdup/free logic for dependency conflict
-         lists
-       - strip leading directories from ldd output
-       - fix non-null-terminated readlink() result
-       - fixed sscanf() in ftp code to use proper types
-
-2.2.1 -> 2.2.2:
-       - added functionality to rpmlib to suggest resolutions for
-         dependency problems
-       - fix stupid allocation problem in exclude/exclusive stuff
-       - fix nasty bug where pointers in to the header were getting
-         stale after some realloc()s in addEntry()
-       - ignore OS tag for v2 packages -- it was wrong anyway
-       - match shared libs on ".so" rather than ".so."
-       - skip blanks from objdump for auto-provide
-       - if objdump gets us _end, provide the file name
-       - do not ldd non-regular files
-       - do not pass leading "/" to ldd
-       - fix ExcludeOs: and ExclusiveOs:
-       - -V verifies dependencies, can be controlled with --nodeps
-         and --nofiles
-       - added information on --nodeps to usage messages
-       - implement --timecheck and rpmrc timecheck:
-       - implement -bl
-       - catch duplicate files in file lists
-       - some random sanity checking on the file list
-
-2.2 -> 2.2.1:
-       - made rpmRemovePackage() print message in verbose mode
-       - added support for ftp://user:pass@machine.org/ URL's
-         during installation - the password will be prompted for
-         if only the user is given, and anonymous ftp will be used
-         it both user and password are omitted (as before)
-       - Remove Exclusive: Exclude:
-         Replace with: ExclusiveArch: ExclusiveOs:
-                       ExcludeArch: ExcludeOs:
-       - fixed dependency cheking for packages that are installed
-         at the same time
-       - fixed version number dependency checking
-       - fixed problem installing v1 source packages (thanks to
-         Nikita Borisov)
-       - fixed minor spelling/spacing problems (Nikita Borisov)
-       - assume all v1 packages were made for Linux so OS check works
-       - began to implement proxyftp, though it doesn't work yet
-       - fixed spacing when reporting dependency conflicts
-       - fixed bug where a long name (uname()) was mapping to itself
-
-2.1.2 -> 2.2:
-       - don't fail, and do report, if -K can't find a PGP key
-       - handle file names with quotes and spaces when passed to ldd
-         (still can't have spaces in %files)
-       - do not allow Buildprefix: in sub packages
-       - removed require_group from rpmrc -- groups are always required
-       - removed arch_sensitive from rpmrc -- always on
-       - removed docdir from rpmrc -- always /usr/doc
-       - fixed nasty bug in installing packages with large filelists
-       - made -R work
-       - --provides and --requries don't print anything if no information
-         is present (rather then (none) )
-       - -qi prints Summary now
-       - changed Buildprefix: -> Buildroot: (spec file, rpmrc)
-                 --buildprefix -> --buildroot (command line)
-                 RPM_BUILD_PREFIX -> RPM_BUILD_ROOT
-                                       (%prep, %build, %install, %clean)
-         sorry :-)
-       - allow Prefix: for sub-packages
-       - allow packager: in rpmrc
-       - --arch and --os are now --buildarch and --buildos
-       - magic arch/os handling through arch_canon and os_canon
-         see /usr/lib/rpmrc (in short: uname short_name num)
-       - removed build_arch: from rpmrc
-         Replacing it is buildarchtranslate: and buildostranslate:
-         to allow building with arch/os other than what uname() returns.
-         Can still be overriden with --buildarch and --buildos
-       - rpmrc keywords are now case-insensitive
-       - check os at install time
-       - check return code from gzread() during installs
-       - implemented os_compat
-       - added arch_compat and os_compat information to --showrc (the
-         changes needed to do this removed any lingering questions about
-         the efficiency of the compat lookups for large tables or tables
-         with loops -- it should all work fine)
-       - made -u (--uninstall) exit with an error and not do anything
-       - added --ignoreos
-       - fixed error message given when a file is missing
-       - fixed hashing when multiple packages are being modified
-       - changed man page for readability (thanks to Joseph L. Hartmann, Jr)
-
-2.1.1 -> 2.1.2:
-       - fixed error message for unrelocatable packages
-       - automatic shared lib provides now work with buildprefix
-       - fixed dependency checking during upgrades to work if the
-         package wasn't previously installed
-       - clean up temp file after signature check
-       - dependencies weren't looking through packages that were
-         being installed at the same time quite right
-
-2.1 -> 2.1.1:
-       - fixed -qi query format 
-
-2.0.11 -> 2.1:
-       - added --requires, --whatrequires, --provides and 
-         --whatprovides queries
-       - using a string array tag in a queryformat results in every
-         item in the string being printed out with spaces in between
-         (though this behaviour will probably go away shortly)
-       - all packages are ftp'd before any are installed (required to
-         do proper dependency checking)
-       - if only source packages are being installed, the database is
-         never opened
-       - automatic shared library require/provides tags generated
-       - added --nodeps flag for install and uninstall
-       - added dependency checking for installs and uninstalls
-       - misc fixes to compile with glibc
-       - use PGPPATH if set (and no pgp_path: in rpmrc)
-       - remove pgp_pubring, pgp_secring stuff
-       - new extensible signature
-       - signature section supports multiple signatures
-       - --addsign to add a signature to a package
-       - PGP key no longer limited to 1024 bits
-       - always do at least an MD5 "signature"
-         as a result, -K will always tell you something
-       - signatures now include a simple "header+archive size" check
-         just calling readSignature() checks this
-       - --nopgp (with -K) to skip PGP check, just do MD5
-       - allow '#' comments in preamble and %files section
-       - fixed -qsv to print both the states and the file information  
-       - added --dump option to query to print all file attributes
-       - installs with --root use the /etc/passwd and /etc/group from
-         the target directory
-       - added --initdb to aid in database initialization
-       - --queryformat can print items of type INT8
-       - "sourceless" packages with nosource: and nopatch:
-       - [] now allows interation through query formats
-       - '-' flag for query tags removed
-       - :date and :perms supported as query format specifiers
-       - new rpmrc entries "arch" and "os" to override
-       - --arch and --os on the command line to override
-       - arch and os are now strings in the package header
-       - added arch_compat handling in /etc/rpmrc
-       - added build_arch to /etc/rpmrc
-       - support arch as string
-       - added --ignorearch option
-       - Prefix: in spec file to specify default installation prefix
-       - rpmrc and command line may be used to override the path
-         used for the rpm database
-       - relocatable packages get installed properly
-       - added support for --prefix and RPM_INSTALL_PREFIX environemtn
-         variable
-       - added dependency checking for version numbers
-       - added correct dependency checking for upgrades
-       - added :depflags query format flag
-       - changes --provides, --requires, and --scripts queries to use
-         queryFormats
-
-2.0.10 -> 2.0.11:
-       - fixed chmod(symlink) bug (since 2.0.9)
-
-2.0.9 -> 2.0.10:
-       - fixed the fix to rpm -q <num> bug
-         to query by number you now need --querybynumber
-       - made arch_sensitive on by default
-       - handle # comments in preamble
-       - don't barf if we can't canonicalize the hostname during builds
-       - fixed --verify with --root
-
-2.0.8 -> 2.0.9:
-       - %files -f <file>
-       - prelim Require/Provide handling
-       - prelim strict checking of spec file
-       - removed some bash-isms
-       - fixed globbing/root bug
-       - fixed rpm -q <num> bug
-       - fixed ftw() related bug where symlinks were being
-         followed in %files rather than just being noted!!
-       - pass "upgrade" arg to pre/post scripts when upgrading
-       - use PATH to find cpio when installing
-       - fixed rpm.magic, added sun4, mips, 68k, sgi, sunos, solaris
-       - added %attr(mode owner group) feature to file list
-       - fixed dumb %verify() parse bug
-
-2.0.7 -> 2.0.8:
-       - explicitly turn off ASCII armor when running PGP
-       - fixed --noscripts logic, which was on by default and 
-         off if you specified it!
-       - uses a temp file to pass filenames to cpio in case when 
-         their are more then 500 filenames in a package
-       - added --rcfile
-       - fixed problem with $HOME/.rcfile not being read
-       - undocumented --search, --where, --keep-temps which
-         will probably won't be implemented in RPM 2.x anyway
-
-2.0.6 -> 2.0.7:
-       - builds now set umask 022 for all scripts
-       - queries relative paths correctly (thanks to Johnie Stafford)
-       - fixed error codes for failed installs
-       - don't add NULL entry to group index for packages that don't
-         have group information, add it to the "Unknown" group instead
-       - added --scripts query option
-       - added --noscripts for installing and uninstall without using 
-         the pre/post scripts
-       - "rpm -qd" and "rpm -qc" work properly now (they didn't imply
-          -l before)
-
-2.0.5 -> 2.0.6:
-       - internal changes to error messages
-
-2.0.4 -> 2.0.5:
-       - added support for generic querying
-       - added --querytags option
-       - updated man page for above two
-       - short-circuit got added before 2.0.5, but I don't know when
-       - query and installs should now return 0 on success and nonzero
-         otherwise (rpm -i should return the number of packages that
-         failed actually)
-       - made rpm -qa fail if extra arguments are passed to it
-
-2.0.3 -> 2.0.4:
-       - added support for PowerPC, and OSF mklinux ports
-       - added --resign
-       - added --recompile
-       - added verbose error messages from Tyson Sawyer
-       - rpmconvert won't overwrite an existing database
-       - won't core dump querying old format source packages
-       - freed minor memory leak
-       - more descriptive error messages during build
-       - added support for not installing documentation
-
-2.0.2 -> 2.0.3:
-       - added support for 686, 786, 886, 986
-
-2.0.1 -> 2.0.2:
-       - fixed ftp.c to return an error code when select timeouts
-       - added basic NLS support, along with a Sweedish message catalog
-         (thanks to Michael Nyquist)
-
-2.0 -> 2.0.1:
-       - hashing and percentages no longer SIGFPE on 0 byte packages
-       - when an ftp fails, install.c no longer tries to install the package
-       - uses /var/tmp rather then /usr/tmp during for ftp space
-       - added debugging messages to ftp.c
-       - fixed some mistakes in the PGP section of the man page
-       - added mdfile prototype to rpmlib.h - the Python module wants this
-       - fixed struct oldrpmlead to align properly on the alpha
-
-2.0    - everything done :-)
-
-2.0b -> 2.0c:
-       - an incredible number of changes - I won't bother trying to 
-         list them
-
-2.0a -> 2.0b:
-       - moved build stuff to main rpm command, though --rebuild is still
-         not supported
-       - install should work, although replaced files are not marked as
-         replaced
-       - %doc macro fixed
-       - --percent, --hash work for installs
-       - converted databases and packages get the file list in the correct
-         order now
-       - none of this is well tested
-       - rpms are output to proper dirs (which are always arch sensitive)
-       - basic rpmrc functions are implemented, full parsing is present
-       - changed error messages for missing files to include full path
-       - fixed detection of Alpha's
-
-1.4.6 -> 2.0a:
-       - completely rewritten in C
-       - verification missing
-       - build functionality not in main rpm, in rpmbuild instead
-         (this will be corrected)
-       - an awful lot is still missing - this is an ALPHA release
-
-1.4.5 -> 1.4.6:
-       - fixed rpmq problem with packages w/o groups (old RPM's would do this)
-       - fixed uninstalling with --root 
-
-1.4.4 -> 1.4.5:
-       - added support for mips processors
-       - added support for osf1 and irix os's
-
-1.4.3 -> 1.4.4:
-       - fixed bug in arch detection code which caused i386 failure
-
-1.4.2 -> 1.4.3:
-       - added tokens for SPARC, MIPS, PowerPC, and 680x0 architectures
-       - fixed sparc arch, added arch sanity check
-
-1.4.1 -> 1.4.2:
-       - added --root to man page, usage, and help messages
-       - added a " " to the "Creating directory" debug message in install.pl
-       - make --rebuild fail on binary packages
-       - don't output prep/build/install sections if there aren't any
-
-1.4 -> 1.4.1:
-       - fixed man page
-       - updated corruption messages to not mention --rebuild
-       - added RPM_PACKAGE_VERSION and RPM_PACKAGE_RELEASE variables
-         at build time
-       - no longer allows installing binary packages across architectures
-       - fixed handling of symlinks marked as config files
-
-1.3.2 -> 1.4:
-       - make -v the default when using -b and --rebuild
-       - added %postbuild as an alias for %clean
-       - added gendiff
-       - added groups file installed in /usr/lib/rhs/rpm
-       - made usage message different and more concise then the --help message
-       - added --version option
-       - updated man page
-       - changed C build tree for concurrent building on multiple architectures
-
-1.3.1 -> 1.3.2:
-       - add -b option to %patch
-       - fixed install/chroot temp file deleting
-
-1.3 -> 1.3.1:
-       - fixed bug when doing md5 of erased config file during rpm -u
-       - fixed spec file searching
-
-1.2 -> 1.3:
-       - added --search and --where options
-       - multiarchitecture support
-       - added --rebuild option
-       - started C rewrite - rpmq (query options only)
-
-1.1 -> 1.2:
-       - preuninstalls weren't getting handled properly
-       - Alpha architecture is now recognized and builds are allowed
-       - the database open is checked for success before continuing
-       - rpm -b? checks the SPEC files for package names given as args
diff --git a/COPYING b/COPYING
index 3ffa0ab955a35b27c74e10362ce65120090a1e34..57b3f12ae288c6695b8ea4cddb68d5faa5db5c7c 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,4 @@
-RPM and it's source code are covered under two separate licenses. 
+RPM is covered under two separate licenses.
 
 The entire code base may be distributed under the terms of the GNU General
 Public License (GPL), which appears immediately below.  Alternatively,
@@ -8,7 +8,7 @@ distributed under the GNU Library General Public License (LGPL), at the
 choice of the distributor. The complete text of the LGPL appears
 at the bottom of this file.
 
-This alternatively is allowed to enable applications to be linked against
+This alternative is provided to enable applications to be linked against
 the RPM library (commonly called librpm) without forcing such applications
 to be distributed under the GPL. 
 
diff --git a/CREDITS b/CREDITS
index 97779b35076e0e33ef93ef528849b675b3a3e6f7..ea30c105e70721a2685484ae903c1ec7151fea45 100644 (file)
--- a/CREDITS
+++ b/CREDITS
-Work on RPM was done primarily by:
+Initial work on RPM was done primarily by:
 
-       Erik Troan
        Marc Ewing
+       Erik Troan
 
-Significant code, ideas, or porting help have been contributed by:
+Over the years, code, documentation, ideas, porting help, tests etc 
+have been contributed by:
 
+       Tero Aho
        Stuart Anderson
        Ed Bailey
        Donnie Barnes
+       Stefan Berger
+       Eric W. Biederman
+       Anders F Bjorklund
+       Frederic Bonnard
        Nikita Borisov
+       Pádraig Brady
+       Tony Breeds
        Till Bubeck
+       Héctor Daniel Cabrera
+       Davide Cavalca
+       Yuri Chornoivan
+       Michal Čihař
+       Archie Cobbs
+       Ralf Corsépius
        Kit Cosper
+       Rafal Cygnarowski
+       Jean Delvare
        Kristof Depraetere
         Alex deVries
+       Johannes Dewender
+       Michal Domonkos
+       Piotr Drąg
+       Boris Egorov
        Karl Eichwalder
+       Peter Eisentraut
+       W. L. Estes
+       Giulio Eulisse
+       Christophe Fergeau
+       Florian Festi
+       Jakub Filak
+       Brian Elliott Finley
        Fred Fish
+       Nikola Forró
+       Gleb Fotengauer-Malinovskiy
        David Fox
-       Joseph L. Hartmann, Jr
+       Artur Frysiak
+       Stephen Gallagher
+       Rafael Garcia-Suarez
+       Alexey Gladkov
+       Igor Gnatenko
+       Neal Gompa
+       Guido Grazioli
+       David Greaves
+       Aron Griffis
+       Fionnuala Gunter
+       Anssi Hannula
+       Richard Hughes
+       Tom Hughes
+       Thomas Jarosch
+       Zbigniew Jędrzejewski-Szmek
+       Jakub Jelinek
        Jeff Johnson
        Michael K. Johnson
+       Tadashi Jokagi
+       Peter Jones
+       Richard W.M. Jones
+       Guillem Jover
+       Joseph L. Hartmann, Jr
+       Juha Kallioinen
+       Alexandr D. Kanevskiy
        Eugene Kanter
+       Lubos Kardos
+       Per Øyvind Karlsen
+       Jiri Kastner
+       Peter Kjellerstedt
+       Phil Knirsch
+       Michal Kochanowicz
+       Ales Kozumplik
+       Jan Kratochvil
        Toshio Kuratomi
+       Tim Landscheidt
        Hermann Lauer
+       Steve Lawrence
+       Alec Leamas
+       Dimitri John Ledkov
        Elliot Lee
+       Robin Lee
+       Simon Lees
+       Dominique Leuenberger
        Benedict Lofstedt
+       Till Maas
+       David Malcolm
+       Michal Marek
+       Panu Matilainen
        Jared Mauch
+       Roland McGrath
+       Kyle McMartin
+       Joshua Megerman
        Nigel Metheringham
+       Arkadiusz Miśkiewicz
+       Tomas Mlcoch
        Horacio Rodriguez Montero
        Tim Mooney
+       David Martínez Moreno
        Eric Mumpower
+       Paul Nasrat
+       Gustavo Niemeyer
+       Jindrich Novy
        Michael Nyquisk
+       Stanislav Ochotnicky
+       Denis Ollier
+       Vít Ondruch
+       Tomas Orsava
+       Rakesh Pandit
+       Thomas Petazzoni
+       Jan Pokorný
+       Trần Ngọc Quân
+       Jerome Quelin
+       Pavel Raiskup
+       Elena Reshetova
+       Sebastian Riedel
+       Lubomir Rintel
+       Pavol Rusnak
+       Kamil Rytarowski
+       Mark Salter
        Steve Sanbeg
        Tyson Sawyer
+       Andreas Scherer
+       Michal Schmidt
+       Michael Schroeder
+       Andreas Schwab
        Christopher Seawood
+       Misha Shnurapet
+       Kirill A. Shutemov
+       Jan Silhan
+       Taylon Silmer
+       Mukund Sivaraman
+       Ville Skyttä
+       Jeff Smith
        Johnie Stafford
-       Gary Thomas
+       Hajime Taira
        Bob Tanner
+       Pascal Terjan
+       Gary Thomas
+       Jeff Tickle
+       Michal Toman
+       Alexey Tourbin
+       Tom Tromey
+       Chip Turner
+       Vincent Untz
+       Pavlina Varekova
+       Nicolas Vigier
+       Thierry Vignaud
+       Jonathan Wakely
+       Colin Walters
+       Florian Weimer
        Karsten Weiss
+       Bernhard M. Wiedemann
+       Mark Wielaard
+       Mimi Zohar
diff --git a/INSTALL b/INSTALL
index 85cc8d61f4d20e0bcb1c238509dc1afb7811635f..053672768d56e1b1b8988de5511f9b1e9e87b275 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -9,17 +9,34 @@ The libmagic (aka file) library for file type detection (used by rpmbuild).
 The source for the file utility + library is available from
     ftp://ftp.astron.com/pub/file/
 
-The NSS >= 3.12 library for encryption, and NSPR library which NSS uses. 
-Both NSPR and NSS libraries and headers need to be installed during RPM
-compilation. As NSPR and NSS typically install their headers outside
-the regular include search path, you need to tell configure about this,
-eg something like:
+You will need a cryptographic library to support digests and signatures.
+This library may be Mozilla NSS, OpenSSL or beecrypt. Which library to use
+must be specified with the --with-crypto=[beecrypt|nss|openssl] argument
+to configure.
+
+If using the Mozilla NSS library for encyption (and NSPR library which
+NSS uses) it must be version 3.12 or later. Both NSPR and NSS libraries and
+headers need to be installed during RPM compilation. As NSPR and NSS
+typically install their headers outside the regular include search path,
+you need to tell configure about this, eg something like:
     ./configure <......> CPPFLAGS="-I/usr/include/nspr -I/usr/include/nss"
 
 The NSPR and NSS libraries are available from 
     http://www.mozilla.org/projects/security/pki/nss/
     http://www.mozilla.org/projects/nspr/
 
+If using the OpenSSL library for encryption, it must be version 1.0.2 or
+later. Note: when compiling against OpenSSL, there is a possible license
+incompatibility. For more details on this, see
+https://people.gnome.org/~markmc/openssl-and-the-gpl.html
+Some Linux distributions have different legal interpretations of this
+possible incompatibility. It is recommended to consult with a lawyer before
+building RPM against OpenSSL.
+Fedora: https://fedoraproject.org/wiki/Licensing:FAQ#What.27s_the_deal_with_the_OpenSSL_license.3F
+Debian: https://lists.debian.org/debian-legal/2002/10/msg00113.html
+
+The OpenSSL crypto library is available from https://www.openssl.org/
+
 The Berkeley DB >= 4.3.x (4.5.x or newer recommended) is required for the
 default database backend. BDB can be downloaded from
 http://www.oracle.com/technology/software/products/berkeley-db/index.html
@@ -77,7 +94,7 @@ is available from
 It may be desired to install bzip2, gzip, and xz/lzma so that RPM can use these
 formats.  Gzip is necessary to build packages that contain compressed
 tar balls, these are quite common on the Internet.
-These are availible from
+These are available from
     http://www.gzip.org
     http://www.bzip.org
     http://tukaani.org/xz/
@@ -162,9 +179,9 @@ and then install with:
     make install
 
 Rpm comes with an automated self-test suite. The test-suite relies heavily
-on fakechroot (https://github.com/fakechroot/) and cannot be executed
+on fakechroot (https://github.com/dex4er/fakechroot/) and cannot be executed
 without it. Provided that fakechroot was found during configure,
-it can be executed after a succesful build with:
+it can be executed after a successful build with:
 
     make check
 
@@ -186,7 +203,7 @@ with two rpms which can be found in RPMS and SRPMS.
 If you are going to install rpm on machines with OS package managers
 other then rpm, you may choose to install the base rpm package via a
 cpio instead of a tar file.  Instead of running "make tar" during the
-build process, as discribed above, use the base rpm packages to create
+build process, as described above, use the base rpm packages to create
 a cpio.  After the rpms have been created run rpm2cpio on the base rpm
 package, this will give you a cpio package which can then use to
 install rpm on a new system.
@@ -208,13 +225,13 @@ an issue.
 RPM will need to be informed of all the dependencies which were
 satisfied before RPM was installed.  Typically this only refers to
 libraries that are installed by the OS, but may include other
-libraries and packages which are availible at the time RPM is
+libraries and packages which are available at the time RPM is
 installed and will not under RPM control.  Another common example of
 libraries which may need dependency provisions are precompiled
 libraries which are installed by the OS package manager during system
 build time.  The list of dependencies you will wish to load into RPM
 will depend on exactly how you bootstrap RPM onto your system and what
-parts of the sytem you put into packages as well as on the specific OS
+parts of the system you put into packages as well as on the specific OS
 you are using.
 
 The script vpkg-provides.sh can be used to generate a package which
@@ -231,7 +248,7 @@ can use the option:
 
 By default the generated rpm will include a %verifyscript to verify
 checksum of all files traversed has not changed.  This additional
-check can be surpressed with:
+check can be suppressed with:
 
     --no_verify
 
index d2074fae4cae66b47ea69fd10229cefff4acb507..77fe7eec2eb30717c7dd78ff2ec77f3aa059e8c3 100644 (file)
@@ -2,14 +2,14 @@
 
 ACLOCAL_AMFLAGS = -I m4
 
-DISTCHECK_CONFIGURE_FLAGS = --with-external-db
+DISTCHECK_CONFIGURE_FLAGS = --with-external-db --enable-python --enable-zstd
 
 include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
 
 CLEANFILES =
-EXTRA_DIST = CHANGES ChangeLog CREDITS GROUPS INSTALL \
-       autodeps autogen.sh \
-       db3/configure installplatform platform.in
+EXTRA_DIST = ChangeLog CREDITS INSTALL \
+       autogen.sh db3/configure installplatform platform.in
 BUILT_SOURCES =
 
 SUBDIRS = po misc
@@ -41,7 +41,9 @@ AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -I$(top_builddir)/include/
 AM_CPPFLAGS += -I$(top_srcdir)/build
 AM_CPPFLAGS += -I$(top_srcdir)/lib
 AM_CPPFLAGS += -I$(top_srcdir)/rpmio
+AM_CPPFLAGS += @WITH_BEECRYPT_INCLUDE@
 AM_CPPFLAGS += @WITH_NSS_INCLUDE@
+AM_CPPFLAGS += @WITH_OPENSSL_INCLUDE@
 AM_CPPFLAGS += @WITH_POPT_INCLUDE@
 AM_CPPFLAGS += -I$(top_srcdir)/misc
 AM_CPPFLAGS += -DLOCALEDIR="\"$(localedir)\""
@@ -72,6 +74,7 @@ pkginclude_HEADERS += lib/rpmcli.h
 pkginclude_HEADERS += lib/rpmlib.h
 pkginclude_HEADERS += lib/rpmds.h
 pkginclude_HEADERS += lib/rpmfi.h
+pkginclude_HEADERS += lib/rpmfiles.h
 pkginclude_HEADERS += lib/rpmlegacy.h
 pkginclude_HEADERS += lib/rpmpol.h
 pkginclude_HEADERS += lib/rpmps.h
@@ -82,6 +85,7 @@ pkginclude_HEADERS += lib/rpmte.h
 pkginclude_HEADERS += lib/rpmts.h
 pkginclude_HEADERS += lib/rpmtypes.h
 pkginclude_HEADERS += lib/rpmvf.h
+pkginclude_HEADERS += lib/rpmarchive.h
 
 pkginclude_HEADERS += sign/rpmsign.h
 
@@ -95,12 +99,13 @@ rpmbin_PROGRAMS = rpm
 
 bin_PROGRAMS =         rpm2cpio rpmbuild rpmdb rpmkeys rpmsign rpmspec
 
+if WITH_ARCHIVE
+bin_PROGRAMS +=        rpm2archive 
+endif
+
 rpmlibexec_PROGRAMS =
-rpmconfig_SCRIPTS =    autodeps/find-provides autodeps/find-requires \
-                       mkinstalldirs \
+rpmconfig_SCRIPTS =    mkinstalldirs \
                        config.guess config.sub
-DISTCLEANFILES = autodeps/find-provides
-DISTCLEANFILES += autodeps/find-requires
 
 noinst_LTLIBRARIES =           libcliutils.la
 libcliutils_la_SOURCES =       cliutils.h cliutils.c
@@ -112,56 +117,85 @@ rpm_SOURCES =             rpmqv.c debug.h system.h
 rpm_CPPFLAGS =         $(AM_CPPFLAGS) -DIAM_RPMEIU -DIAM_RPMQ -DIAM_RPMV
 rpm_LDADD =            libcliutils.la
 rpm_LDADD +=           lib/librpm.la rpmio/librpmio.la
-rpm_LDADD +=           @WITH_NSS_LIB@ @WITH_POPT_LIB@ @WITH_ZLIB_LIB@
+
+rpm_LDADD +=           @WITH_POPT_LIB@
+rpm_CFLAGS =            $(CFLAGS) -fPIE
+rpm_LDFLAGS =           $(LDFLAGS) -pie
+
 
 rpmdb_SOURCES =                rpmdb.c debug.h system.h
 rpmdb_CPPFLAGS =       $(AM_CPPFLAGS)
 rpmdb_LDADD =          libcliutils.la
 rpmdb_LDADD +=         lib/librpm.la rpmio/librpmio.la
-rpmdb_LDADD +=         @WITH_NSS_LIB@ @WITH_POPT_LIB@ @WITH_ZLIB_LIB@
+
+rpmdb_LDADD +=         @WITH_POPT_LIB@
+rpmdb_CFLAGS =          $(CFLAGS) -fPIE
+rpmdb_LDFLAGS =         $(LDFLAGS) -pie
+
 
 rpmkeys_SOURCES =      rpmkeys.c debug.h system.h
 rpmkeys_CPPFLAGS =     $(AM_CPPFLAGS)
 rpmkeys_LDADD =                libcliutils.la
 rpmkeys_LDADD +=       lib/librpm.la rpmio/librpmio.la
-rpmkeys_LDADD +=       @WITH_NSS_LIB@ @WITH_POPT_LIB@ @WITH_ZLIB_LIB@
+
+rpmkeys_LDADD +=       @WITH_POPT_LIB@
+rpmkeys_CFLAGS =        $(CFLAGS) -fPIE
+rpmkeys_LDFLAGS =       $(LDFLAGS) -pie
 
 rpmsign_SOURCES =      rpmsign.c debug.h system.h
 rpmsign_CPPFLAGS =     $(AM_CPPFLAGS)
 rpmsign_LDADD =                libcliutils.la
 rpmsign_LDADD +=       sign/librpmsign.la lib/librpm.la rpmio/librpmio.la
-rpmsign_LDADD +=       @WITH_NSS_LIB@ @WITH_POPT_LIB@ @WITH_ZLIB_LIB@
+rpmsign_LDADD +=       @WITH_POPT_LIB@
 
 rpmbuild_SOURCES =     rpmbuild.c debug.h system.h
 rpmbuild_CPPFLAGS =    $(AM_CPPFLAGS)
 rpmbuild_LDADD =       libcliutils.la
 rpmbuild_LDADD +=      build/librpmbuild.la lib/librpm.la rpmio/librpmio.la
-rpmbuild_LDADD +=      @WITH_NSS_LIB@ @WITH_POPT_LIB@ @WITH_ZLIB_LIB@
+rpmbuild_LDADD +=      @WITH_POPT_LIB@
 
 rpmspec_SOURCES =      rpmspec.c debug.h system.h
 rpmspec_CPPFLAGS =     $(AM_CPPFLAGS)
 rpmspec_LDADD =                libcliutils.la
 rpmspec_LDADD +=       build/librpmbuild.la lib/librpm.la rpmio/librpmio.la
-rpmspec_LDADD +=       @WITH_NSS_LIB@ @WITH_POPT_LIB@ @WITH_ZLIB_LIB@
+rpmspec_LDADD +=       @WITH_POPT_LIB@
 
 rpm2cpio_SOURCES =     rpm2cpio.c debug.h system.h
 rpm2cpio_LDADD =       lib/librpm.la rpmio/librpmio.la
-rpm2cpio_LDADD +=      @WITH_NSS_LIB@ @WITH_POPT_LIB@ @WITH_ZLIB_LIB@
+rpm2cpio_LDADD +=      @WITH_POPT_LIB@
+rpm2cpio_CFLAGS =       $(CFLAGS) -fPIE
+rpm2cpio_LDFLAGS =      $(LDFLAGS) -pie
+
+rpm2archive_SOURCES =  rpm2archive.c debug.h system.h
+rpm2archive_LDADD =    lib/librpm.la rpmio/librpmio.la
+rpm2archive_LDADD +=   @WITH_POPT_LIB@ @WITH_ARCHIVE_LIB@
 
 
 if LIBELF
+if LIBDW
+
 rpmconfig_SCRIPTS += scripts/find-debuginfo.sh
 
 rpmlibexec_PROGRAMS += debugedit
 debugedit_SOURCES =    tools/debugedit.c tools/hashtab.c tools/hashtab.h
 debugedit_LDADD =      rpmio/librpmio.la
 debugedit_LDADD +=     @WITH_LIBELF_LIB@ @WITH_POPT_LIB@
-
+if HAVE_LIBDW_STRTAB
+debugedit_LDADD +=     @WITH_LIBDW_LIB@
+else
+debugedit_LDADD +=     @WITH_LIBDW_LIB@ -lebl
+endif # HAVE_LIBDW_STRTAB
+endif # LIBDW
 rpmlibexec_PROGRAMS += elfdeps
 elfdeps_SOURCES =      tools/elfdeps.c
 elfdeps_LDADD =                rpmio/librpmio.la
 elfdeps_LDADD +=       @WITH_LIBELF_LIB@ @WITH_POPT_LIB@
-endif
+
+rpmlibexec_PROGRAMS += sepdebugcrcfix
+sepdebugcrcfix_SOURCES = tools/sepdebugcrcfix.c
+sepdebugcrcfix_LDADD = @WITH_LIBELF_LIB@
+
+endif #LIBELF
 
 rpmlibexec_PROGRAMS += rpmdeps
 rpmdeps_SOURCES =      tools/rpmdeps.c
@@ -175,7 +209,9 @@ dist_bin_SCRIPTS =  scripts/gendiff
 
 bin_PROGRAMS +=                rpmqpack
 rpmqpack_SOURCES =      rpmqpack.c
-rpmqpack_LDADD =        lib/librpm.la @WITH_DB_LIB@
+rpmqpack_LDADD =        lib/librpm.la
+rpmqpack_CFLAGS =       $(CFLAGS) -fPIE
+rpmqpack_LDFLAGS =      $(LDFLAGS) -pie
 
 rpmconfig_DATA = rpmrc
 rpmrc: $(top_srcdir)/rpmrc.in
@@ -186,13 +222,16 @@ rpmrc: $(top_srcdir)/rpmrc.in
 CLEANFILES += rpmrc.tmp rpmrc
 EXTRA_DIST += rpmrc.in
 
-rpmconfig_DATA += macros
+noinst_DATA = macros
 macros: $(top_srcdir)/macros.in
          ( cd $(top_builddir) && ./config.status --file=${subdir}/macros:${subdir}/macros.in )
 CLEANFILES += macros
 EXTRA_DIST += macros.in
 
-noinst_DATA = platform
+# Used for the testsuite to test creating debuginfo packages
+EXTRA_DIST += macros.debug
+
+noinst_DATA += platform
 platform: $(top_srcdir)/platform.in
        @$(SED) \
          -e "s,[@]RPMCONFIGDIR[@],$(rpmconfigdir),g" \
@@ -227,29 +266,32 @@ rpmvar_DATA =
 
 install-exec-hook:
        @rm -f $(DESTDIR)$(bindir)/rpmquery
-       @LN_S@ ../../bin/rpm $(DESTDIR)$(bindir)/rpmquery
+       @LN_S@ $(rpm_symlink_prefix)rpm $(DESTDIR)$(bindir)/rpmquery
        @rm -f $(DESTDIR)$(bindir)/rpmverify
-       @LN_S@ ../../bin/rpm $(DESTDIR)$(bindir)/rpmverify
+       @LN_S@  $(rpm_symlink_prefix)rpm $(DESTDIR)$(bindir)/rpmverify
 
 install-data-local:
        DESTDIR="$(DESTDIR)" pkglibdir="$(rpmconfigdir)" \
                $(SHELL) $(top_srcdir)/installplatform \
-                       rpmrc platform \
+                       rpmrc platform macros \
                        $(RPMCANONVENDOR) $(RPMCANONOS) $(RPMCANONGNU)
        @$(MKDIR_P) $(DESTDIR)$(localstatedir)/tmp
+       @$(MKDIR_P) $(DESTDIR)$(rpmconfigdir)/macros.d
 
 # XXX to appease distcheck we need to remove "stuff" here...
 uninstall-local:
        @rm -f $(DESTDIR)$(bindir)/rpmquery
        @rm -f $(DESTDIR)$(bindir)/rpmverify
        @rm -rf $(DESTDIR)$(rpmconfigdir)/platform/
+       @rm -f $(DESTDIR)$(rpmconfigdir)/macros
+       @rm -rf $(DESTDIR)$(rpmconfigdir)/macros.d
 
 MAINTAINERCLEANFILES = ChangeLog
 
 # Build hacking docs only on request
 if HACKINGDOCS
 if DOXYGEN
-doc/hacking.doxy: doc/hacking.doxy.in doc/hacking/Doxyheader Makefile.am
+doc/hacking.doxy: doc/hacking.doxy.in doc/hacking/Doxyheader.h Makefile.am
        $(SED) \
          -e "s,\@top_srcdir\@/,$(top_srcdir)/,g" \
          -e "s,[@]HAVE_DOT[@],$(HAVE_DOT)," \
@@ -262,12 +304,12 @@ doc/hacking/html/index.html: doc/hacking.doxy rpmpopt-@VERSION@
 noinst_DATA += doc/hacking/html/index.html
 endif
 endif
-EXTRA_DIST += doc/hacking.doxy.in doc/hacking/Doxyheader
+EXTRA_DIST += doc/hacking.doxy.in doc/hacking/Doxyheader.h
 
 # Always build librpm docs
 if DOXYGEN
-doc/librpm.doxy: doc/librpm.doxy.in doc/librpm/Doxyheader Makefile.am $(pkginclude_HEADERS)
-       files=`echo " $(HEADERS)" | $(SED) -e "s, , \@top_srcdir\@/,g"`; \
+doc/librpm.doxy: doc/librpm.doxy.in doc/librpm/Doxyheader.h Makefile.am configure.ac $(pkginclude_HEADERS)
+       files=`echo " $(pkginclude_HEADERS)" | $(SED) -e "s, , \@top_srcdir\@/,g"`; \
        $(SED) -e "s,[@]pkginclude_HEADERS[@],$$files," \
          -e "s,\@top_srcdir\@/,$(top_srcdir)/,g" \
          -e "s,[@]HAVE_DOT[@],$(HAVE_DOT)," \
@@ -279,7 +321,7 @@ doc/librpm/html/index.html: doc/librpm.doxy
        @DOXYGEN@ doc/librpm.doxy
 noinst_DATA += doc/librpm/html/index.html
 endif
-EXTRA_DIST += doc/librpm.doxy.in doc/librpm/Doxyheader
+EXTRA_DIST += doc/librpm.doxy.in doc/librpm/Doxyheader.h
 EXTRA_DIST += doc/librpm/html
 
 if WITH_INTERNAL_DB
@@ -287,19 +329,23 @@ db.h:     $(top_builddir)/db3/db.h
        $(LN_S) $(top_builddir)/db3/db.h $@
 BUILT_SOURCES += db.h
 endif
-DISTCLEANFILES += db.h
+DISTCLEANFILES = db.h
+
+ChangeLog:
+       touch ChangeLog
+
+dist-hook:
+       if [ -d .git ] && [ -x $(command -v git) ]; then git log --no-merges > $(distdir)/ChangeLog; fi
 
 clean-local:
        rm -rf doc/hacking/html
        rm -rf include
 
 distclean-local:
+       rm -rf doc/librpm.doxy doc/librpm/html
        rm -rf Doxytags
        rm -f stamp-h.in db3/*.orig db3/db3lobjs
 
-maintainer-clean-local:
-       rm -rf doc/librpm/html
-
 $(top_srcdir)/preinstall.am: Makefile.am
        rm -f $(top_srcdir)/preinstall.am
        @for f in $(HEADERS); do \
diff --git a/Makefile.maint b/Makefile.maint
deleted file mode 100644 (file)
index 6eddaa1..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-include Makefile
-
-snapshot: ChangeLog
-       @$(MAKE) dist VERSION=$(VERSION).git`git log --pretty=oneline|wc -l`
-
-ChangeLog: .git
-       @git log --no-merges > ChangeLog
diff --git a/README b/README
index 9b4f643c9b95b1151de973c092bc3cc69f60381c..7bf76bcf3942574ce427259f0a8f997a8dd6e981 100644 (file)
--- a/README
+++ b/README
@@ -7,7 +7,7 @@ The latest releases are always available at:
 Additional RPM documentation (papers, slides, HOWTOs) can also be
 found at the same site: http://rpm.org.
 
-http://rpm.org/wiki/Communicate lists all rpm releated mailing lists.
+http://rpm.org/community all rpm releated mailing lists.
 
 RPM was originally written by:
 
diff --git a/autodeps/.gitignore b/autodeps/.gitignore
deleted file mode 100644 (file)
index 1151756..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/find-provides
-/find-requires
diff --git a/autodeps/aix.prov b/autodeps/aix.prov
deleted file mode 100644 (file)
index 6f7c8bd..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-#! /usr/bin/ksh
-
-# Original Author: Ralph Goers(rgoer@Candle.Com)
-# Borrowed heavily from Tim Mooney's HP version.
-# This file is distributed under the terms of the GNU General Public License
-#
-# find-requires is part of RPM, the RedHat Package Manager.  find-requires
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries the package requires to run correctly.
-#
-
-find_prov_ia64()
-{
-   # On AIX for IA64, use the file command to find shared modules
-   #
-   # Example file output:
-   #
-   #$file /usr/lib/ia64l32/libc.so
-   #/usr/lib/ia64l32/libc.so:     ELF 32-bit LSB version 1 AIX shared obj IA-64
-   # 
-   #
-   #
-   
-   # Search for shared objects - the file command on AIX for IA64 reports 
-   # shared objects
-   sed -e "s/['\"]/\\\&/g" -e "s/$/\//g" | LANG=C xargs file | grep -e ":.*shared obj" | cut -d: -f1 | sed "s/\/$//g" | xargs -i basename {} | sort -u
-}
-
-find_prov_power()
-{
-   #
-   # Example dump output:
-   #
-   #$dump -H /usr/bin/dump
-   #
-   #/usr/bin/dump:
-   #
-   #                        ***Loader Section***
-   #                      Loader Header Information
-   #VERSION#         #SYMtableENT     #RELOCent        LENidSTR
-   #0x00000001       0x00000021       0x0000006c       0x0000002f
-   #
-   ##IMPfilID        OFFidSTR         LENstrTBL        OFFstrTBL
-   #0x00000002       0x00000848       0x00000049       0x00000877
-   #
-   #
-   #                        ***Import File Strings***
-   #INDEX  PATH                          BASE                MEMBER
-   #0      /usr/lib:/lib:/usr/lpp/xlC/lib
-   #1                                    libc.a              shr.o
-   
-   #
-   #
-   
-   # Search executables, archives, and symlinks to those types for shared
-   # objects
-   sed -e "s/['\"]/\\\&/g" -e "s/$/\//g" | LANG=C xargs file | grep -e ":.*executable" -e ":.*archive" | cut -d: -f1 | sed "s/\/$//g" |
-   
-   # Use the verbose version of dump to find the sharable objects 
-   while read f
-   do
-           LANG=C /usr/bin/dump -ov $f/ 2>/dev/null | grep -E "^Flags.*SHROBJ|:$" |
-       awk 'match($1,":$") { member=$1 }
-       !match($1,":$") {print member} '
-   done | sed -e 's/:$//' -e 's/\/\[/\(/g' -e 's/\]/)/g' | xargs -i basename {} | 
-   sort -u
-}
-
-PATH=/usr/bin
-
-machinetype=`uname -m`
-if [[ $machinetype = "ia64" ]]
-then
-   find_prov_ia64
-else
-   find_prov_power
-fi
-
diff --git a/autodeps/aix.req b/autodeps/aix.req
deleted file mode 100755 (executable)
index e8503b3..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-#! /usr/bin/ksh
-
-# Original Author: Ralph Goers(rgoer@Candle.Com)
-# Borrowed heavily from Tim Mooney's HP version.
-# This file is distributed under the terms of the GNU General Public License
-#
-# find-requires is part of RPM, the RedHat Package Manager.  find-requires
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries the package requires to run correctly.
-#
-
-find_req_power ()
-{
-   # On AIX Power, use `dump -H' to find the library dependencies 
-   # for an executable
-   #
-   # Example dump output:
-   #
-   #$dump -H /usr/bin/dump
-   #
-   #/usr/bin/dump:
-   #
-   #                        ***Loader Section***
-   #                      Loader Header Information
-   #VERSION#         #SYMtableENT     #RELOCent        LENidSTR
-   #0x00000001       0x00000021       0x0000006c       0x0000002f
-   #
-   ##IMPfilID        OFFidSTR         LENstrTBL        OFFstrTBL
-   #0x00000002       0x00000848       0x00000049       0x00000877
-   #
-   #
-   #                        ***Import File Strings***
-   #INDEX  PATH                          BASE                MEMBER
-   #0      /usr/lib:/lib:/usr/lpp/xlC/lib
-   #1                                    libc.a              shr.o
-   
-   #
-   #
-
-   while read f
-    do
-     # Find the required symbols in executables and the required shells in 
-     # scripts
-     LANG=C /usr/bin/file $f | /usr/bin/grep -q -e ":.*shell script" 
-
-     if [ $? -ne 0 ]  # Use dump to examine executables
-     then
-        LANG=C /usr/bin/dump -H $f 2>/dev/null | awk '
-   
-               #
-               # Since this entire awk script is enclosed in single quotes,
-               # you need to be careful to not use single quotes, even in awk
-               # comments, if you modify this script.
-               #
-
-        BEGIN {
-            in_shlib_list = 0;
-            in_file_strings = 0;
-            FS = " ";
-            RS = "\n";
-        }
-
-        in_shlib_list == 1 && /^$/ {
-            in_shlib_list = 0;
-            in_file_strings = 0;
-        }
-
-        in_shlib_list == 1 {
-            pos = index($2, "/")
-            numfields = split($0, fields, " ")
-
-            if (pos == 0)  {
-              namevar = 2
-            }
-            else {
-              namevar = 3
-            }
-            if (namevar < numfields) {
-              printf("%s(%s)\n", fields[namevar], fields[namevar+1])
-            }
-            else {
-             if ((fields[namevar] != ".") && (fields[namevar] != "..")) {
-                  print fields[namevar]
-             }
-            }
-        }
-
-        in_file_strings == 1 && $1 == "0" {
-            in_shlib_list = 1
-        }
-
-        /\*Import File Strings\*/ {
-            in_file_strings = 1
-        }
-      ' # end of awk
-     else # shell scripts
-        if [ -x $f ]; then 
-            /usr/bin/head -1 $f | /usr/bin/sed -e 's/^\#\![   ]*//' | /usr/bin/cut -d" " -f1
-        fi
-     fi
-    done | sort -u
-}
-
-find_req_ia64 ()
-{
-   # On AIX IA64, use `dump -Lv' to find the library dependencies 
-   # for an executable
-   #
-   # Example dump output:
-   #
-   #$dump -Lv /usr/bin/dump
-   #
-   #   
-   #/usr/bin/dump:
-   #
-   #           ****  DYNAMIC SECTION INFORMATION ****
-   #[INDEX]   Tag         Value
-   #
-   #.dynamic:
-   #[1]       NEEDED      libC.so.1
-   #[2]       NEEDED      libelf.so
-   #[3]       NEEDED      /usr/lib/ia64l32/libc.so.1
-   #[4]       INIT        0x1001d6c0
-   #[5]       FINI        0x1001d700
-   #[6]       HASH        0x1000011c
-   #[7]       STRTAB      0x10000914
-   #[8]       SYMTAB      0x10000364
-   #[9]       STRSZ       0x3dd
-   #[10]      SYMENT      0x10
-   #[11]      PLTGOT      0x20018994
-   #[12]      PLT_RESERVE 0x20018a00
-   #[13]      PLTSZ       0x1c0
-   #[14]      PLTREL      REL
-   #[15]      JMPREL      0x100024bc
-   #[16]      REL         0x10000cf4
-   #[17]      RELSZ       0x17c8
-   #[18]      RELENT      0x8
-   #
-   #
-
-   while read f
-   do
-     # Find the required symbols in executables and the required shells in 
-     # scripts
-     LANG=C /usr/bin/file $f | /usr/bin/grep -q -e ":.*shell script" 
-
-     if [ $? -ne 0 ]  # Use dump to examine executables
-     then
-           LANG=C /usr/bin/dump -Lv $f 2>/dev/null | \
-          awk '$2=="NEEDED" {print $3}' | xargs -i basename {}
-   
-     else  # Extract the exec module from shell scripts
-           if [ -x $f ]; then
-               head -1 $f | sed -e 's/^\#\![   ]*//' | cut -d" " -f1
-           fi
-     fi
-   done | sort -u
-}
-
-machinetype=`uname -m`
-if [[ $machinetype = "ia64" ]]
-then
-   /usr/bin/sed "s/['\"]/\\\&/g" | LANG=C /usr/bin/xargs /usr/bin/file | \
-      /usr/bin/grep -e ":.*executable" -e ":.*archive" -e ":.*shell script" | /usr/bin/cut -d: -f1 |
-   find_req_ia64
-else
-   /usr/bin/sed "s/['\"]/\\\&/g" | LANG=C /usr/bin/xargs /usr/bin/file | \
-      /usr/bin/grep -e ":.*executable" -e ":.*archive" -e ":.*shell script" | /usr/bin/cut -d: -f1 |
-   find_req_power
-fi
-
diff --git a/autodeps/aix4.prov b/autodeps/aix4.prov
deleted file mode 100644 (file)
index 59637a7..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-#! /usr/bin/ksh
-
-# Current Maintainer: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
-#
-# Original Author: Ralph Goers(rgoer@Candle.Com)
-# Borrowed heavily from H10 version created by Tim Mooney.
-# This file is distributed under the terms of the GNU Public License
-#
-# find-provides is part of RPM, the RedHat Package Manager.  find-provides
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries provided by (contained in) the package.
-#
-# On AIX, use `dump -o' to find what the library provides, if anything.
-#
-#
-# Ralph's comments:
-#
-# Executables are skipped because, by convention, shared libraries
-# which are not dynamically loaded are packaged as archives. Also,
-# it is impossible to tell the difference between an executable
-# program and a dynamically loaded shared library.
-#
-# Because archives can contain any number of things, including
-# apparently, multiple shared libraries, dependencies in archives
-# will be specified as file[member]. Any member in an archive which
-# has a loader section will be listed as provided.
-#
-# Tim's (subsequent) comments:
-#
-# Based on discussions on the rpm-list in mid-March of 2000, I've modified
-# the copy of find-provides that Ralph provided me to use `dump -o' instead
-# of `dump -H', and I've followed Brandon S. Allbery's suggestions and modified
-# the awk script to look for a modtype of `RE', which is what constitutes a
-# shared member of a library.  Just like everything else on AIX, libraries are
-# weird.  :-|
-#
-# I've followed Ralph's convention of generating provides in the form of
-# `filebasename(member-object)' *if* there is a member object, or just
-# `filebasename' if there isn't (such as in the case of certain perl modules,
-# locally built shared libraries, etc.).
-#
-# Example dump output:
-#
-#$dump -o /usr/lpp/X11/lib/R6/libX11.a
-#
-#/usr/lpp/X11/lib/R6/libX11.a[shr4.o]:
-#
-#                      ***Object Module Header***
-## Sections    Symbol Ptr      # Symbols       Opt Hdr Len     Flags
-#         4    0x00126c28          14557                72     0x3002
-#Timestamp = 920377624
-#Magic = 0x1df  
-#
-#                      ***Optional Header***
-#Tsize      Dsize       Bsize       Tstart      Dstart
-#0x000bcc20  0x00024bd4  0x00000e0c  0x00000000  0x00000000
-#
-#SNloader     SNentry     SNtext            SNtoc       SNdata
-#0x0004      0x0000      0x0001      0x0002      0x0002    
-#
-#TXTalign     DATAalign   TOC         vstamp      entry
-#0x0005      0x0003      0x00023d74  0x0001      0xffffffff
-#
-#maxSTACK     maxDATA     SNbss       magic       modtype
-#0x00000000  0x00000000  0x0003      0x010b        RE
-#
-#/usr/lpp/X11/lib/R6/libX11.a[shr4net.o]:
-#
-#                      ***Object Module Header***
-## Sections    Symbol Ptr      # Symbols       Opt Hdr Len     Flags
-#         7    0x000006fb             22                72     0x3002
-#Timestamp = 774732998
-#Magic = 0x1df  
-#
-#                      ***Optional Header***
-#Tsize      Dsize       Bsize       Tstart      Dstart
-#0x00000084  0x00000088  0x00000000  0x00000200  0x00000000
-#
-#SNloader     SNentry     SNtext            SNtoc       SNdata
-#0x0007      0x0000      0x0002      0x0004      0x0004    
-#
-#TXTalign     DATAalign   TOC         vstamp      entry
-#0x0002      0x0003      0x00000080  0x0001      0xffffffff
-#
-#maxSTACK     maxDATA     SNbss       magic       modtype
-#0x00000000  0x00000000  0x0005      0x010b        RE
-
-PATH=/usr/bin:/usr/ccs/bin
-export PATH
-
-#
-# TVM: Marc Stephenson (marc@austin.ibm.com) points out we run things
-# like `file', et. al. and expect the output to be what we see in the
-# C/POSIX locale.  Make sure it is so.
-#
-LANG=C
-export LANG
-
-#
-# TVM: Because AIX libraries don't have the equivalent of a SONAME, if you do
-#
-# ln -s /usr/lib/libc.a /tmp/libmy_libc_link.a
-#
-# and then link your program with `-L/tmp -lmy_libc_link', that's the name
-# that will be recorded as the BASE in the Import File Strings area.
-# This means we need to include "symbolic link" in the list of files to check
-# out.
-#
-filelist=`sed "s/['\"]/\\\&/g" | xargs file \
-       | grep -E 'archive|executable|symbolic link' | cut -d: -f1`
-
-for f in $filelist
-do
-   #
-   # Uncomment the next line for some additional debugging info:
-   #echo "Checking $f"
-   dump -o $f 2>/dev/null | awk '
-
-        # TVM: be careful to not use any single quotes, even in comments,
-        # since this entire awk script is enclosed in single quotes.
-
-        BEGIN {
-                FS = " ";
-                RS = "\n";
-                # our flag to indicate we found a filename[membername] or
-                # filename.
-                found_file_or_member = 0
-                # our flag to indicate we found the modtype tag.  If so,
-                # we want to look for RE on the next line.
-                found_modtype = 0
-                               #
-                               # number of times gsub substituted, used twice below
-                               nsub = 0
-        }
-
-        # Uncomment the next line for some debugging info.
-        # { print NR , ":", $0 }
-
-        found_modtype == 1 && found_file_or_member == 1 {
-
-          if ( $0 ~ / RE/ ) {
-            # we have seen a filename, we have seen a modtype line, and now
-            # we know that the modtype is RE.  Print out the member name.
-                       #
-                       # Note that member names generally look like foo[bar.o], and
-                       # since the RPM standard has become to use parens, we will
-                       # translate the [ and ] into ( and ) in the output stream.
-                       # awk on AIX 4 has sub() and gsub(), so we can use them to do
-                       # it.  If this script is adapted for use on some other platform
-                       # make sure that awk on that platform has sub/gsub.  If not,
-                       # you will need to postprocess the output stream (probably before
-                       # the sort -u) with tr or sed.
-                       nsub = gsub(/\[/, "(", member)
-                       if ( nsub > 1 ) {
-                               print "substituted too many times for [:", member | "cat 1>&2"
-                       }
-                       nsub = gsub(/\]/, ")", member)
-                       if ( nsub > 1 ) {
-                               print "substituted too many times for ]:", member | "cat 1>&2"
-                       }
-            print member
-          }
-          # In any case, reset our flags to zero, to indicate we are done
-          # with this member, so we are ready to handle additional members
-          # if needed.
-          found_file_or_member = 0
-          found_modtype = 0
-        }
-
-        found_file_or_member == 1 && /magic *modtype/ {
-          # we have seen a filename, and now we have seen the modtype
-          # line.  Set the found_modtype flag.  The next line of input
-          # will be caught by the rule above, and we will print out
-          # the member if the modtype is RE.
-          found_modtype = 1
-        }
-
-        /:$/ {
-          numfields = split($0,fields, "/")
-          # chop off the trailing colon
-          fieldlen = length(fields[numfields])-1
-          member= substr(fields[numfields], 1, fieldlen)
-          # Set the flat to indicate we found a file or a file(member).
-          found_file_or_member = 1
-        }
-   ' # end of awk
-done | sort -u
-#comment out the previous line and uncomment the next line when debugging
-#done
diff --git a/autodeps/aix4.req b/autodeps/aix4.req
deleted file mode 100644 (file)
index 79e988b..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#! /usr/bin/ksh
-#
-# Current Maintainer: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
-# Original Author: Ralph Goers(rgoer@Candle.Com)
-#
-# This file is distributed under the terms of the GNU Public License
-#
-# find-requires is part of RPM, the RedHat Package Manager.  find-requires
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries the package requires to run correctly.
-#
-# On AIX, use `dump -H' to find the library dependencies for an executable
-#
-# Example dump output:
-#
-#$dump -H /usr/bin/dump
-#
-#/usr/bin/dump:
-#
-#                        ***Loader Section***
-#                      Loader Header Information
-#VERSION#         #SYMtableENT     #RELOCent        LENidSTR
-#0x00000001       0x00000021       0x0000006c       0x0000002f
-#
-##IMPfilID        OFFidSTR         LENstrTBL        OFFstrTBL
-#0x00000002       0x00000848       0x00000049       0x00000877
-#
-#
-#                        ***Import File Strings***
-#INDEX  PATH                          BASE                MEMBER
-#0      /usr/lib:/lib:/usr/lpp/xlC/lib
-#1                                    libc.a              shr.o
-#
-#
-
-PATH=/usr/bin:/usr/ccs/bin
-export PATH
-
-#
-# TVM: Marc Stephenson (marc@austin.ibm.com) points out we run things
-# like `file', et. al. and expect the output to be what we see in the
-# C/POSIX locale.  Make sure it is so.
-#
-LANG=C
-export LANG
-
-filelist=`sed "s/['\"]/\\\&/g" | xargs file \
-       | grep -E '^.*:.*(executable |archive )' | cut -d: -f1`
-
-for f in $filelist
-do
-    dump -H $f 2>/dev/null | awk '
-
-               #
-               # Since this entire awk script is enclosed in single quotes,
-               # you need to be careful to not use single quotes, even in awk
-               # comments, if you modify this script.
-               #
-
-        BEGIN {
-            in_shlib_list = 0;
-            in_file_strings = 0;
-            FS = " ";
-            RS = "\n";
-        }
-
-        in_shlib_list == 1 && /^$/ {
-            in_shlib_list = 0;
-            in_file_strings = 0;
-        }
-
-        in_shlib_list == 1 {
-            pos = index($2, "/")
-            numfields = split($0, fields, " ")
-
-            if (pos == 0)  {
-              namevar = 2
-            }
-            else {
-              namevar = 3
-            }
-            if (namevar < numfields) {
-              printf("%s(%s)\n", fields[namevar], fields[namevar+1])
-            }
-            else {
-              print fields[namevar]
-            }
-        }
-
-        in_file_strings == 1 && $1 == "0" {
-            in_shlib_list = 1
-        }
-
-        /\*Import File Strings\*/ {
-            in_file_strings = 1
-        }
-
-    ' # end of awk
-done | sort -u
diff --git a/autodeps/amigaos.prov b/autodeps/amigaos.prov
deleted file mode 100644 (file)
index 87ad08f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-cat > /dev/null
diff --git a/autodeps/amigaos.req b/autodeps/amigaos.req
deleted file mode 100644 (file)
index 87ad08f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-cat > /dev/null
diff --git a/autodeps/darwin.prov b/autodeps/darwin.prov
deleted file mode 100644 (file)
index b068912..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-# ----------------------------------------------------------
-#       find-provides for Darwin/MacOSX
-# ----------------------------------------------------------
-# This script reads filenames from STDIN and outputs any relevant provides
-# information that needs to be included in the package.
-
-filelist=$(sed -n -e '/\.dylib/p' -e '/\.so/p' -e '/\.bundle/p' | sort | uniq | xargs file -L 2>/dev/null | grep "Mach-O.*\(ppc\|i386\)" | cut -d: -f1)
-
-for f in $filelist; do
-    libname=$(basename $f | sed -e 's;\..*;;')
-    soname=$(otool -l $f | grep $libname | awk '/ name/ {print $2}')
-
-    if [ "$soname" != "" ]; then
-       if [ ! -L $f ]; then
-           basename $soname
-       fi
-    else
-       echo ${f##*/}
-    fi
-done | sort -u
diff --git a/autodeps/darwin.req b/autodeps/darwin.req
deleted file mode 100644 (file)
index e571710..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------------
-#      find-requires for Darwin/MacOSX
-# ----------------------------------------------------------------
-ulimit -c 0
-
-filelist=`sed "s/['\"]/\\\&/g"`
-exelist=`echo $filelist | xargs file | grep -F Mach-O | cut -d: -f1 `
-scriptlist=`echo $filelist | xargs file | grep -E ":.* (commands|script) " | cut -d: -f1 `
-
-for f in $exelist; do
-    if [ -x $f ]; then
-        otool -L $f  \
-       | awk '/^\t/ { print }' \
-       | sed -n -e '/ (compatibility version .* current version .*)/p' \
-       | sed -e 's/ (compatibility version .* current version .*)//'
-    fi
-done | sort -u | sed "s/['\"]/\\\&/g" | xargs -n 1 basename | sort -u
-
-for f in $scriptlist; do
-    if [ -x $f ]; then
-        head -1 $f | sed -e 's/^\#\![   ]*//' \
-       | sed -n -e '/^\/bin/!p' | sed -n -e '/^\/usr\/bin/!p' | uniq \
-       | cut -d" " -f1
-    fi
-done
diff --git a/autodeps/freebsd.prov b/autodeps/freebsd.prov
deleted file mode 100644 (file)
index cf00d4f..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------
-#      find-provides for FreeBSD-2.2.x
-# ----------------------------------------------------------
-filelist=$(grep "\\.so" | grep -v "^/lib/ld.so" | xargs file -L 2>/dev/null | grep "FreeBSD.*shared" | cut -d: -f1)
-
-for f in $filelist; do
-        echo ${f##*/}
-done | sort -u
diff --git a/autodeps/freebsd.req b/autodeps/freebsd.req
deleted file mode 100644 (file)
index 9a1e0f4..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------------
-#      find-requires for FreeBSD-2.2.x
-#      how do we know what is required by a.out shared libraries?
-# ----------------------------------------------------------------
-ulimit -c 0
-
-filelist=`sed "s/['\"]/\\\&/g"`
-exelist=`echo $filelist | xargs file | grep -F executable | cut -d: -f1 `
-scriptlist=`echo $filelist | xargs file | grep -E ":.* (commands|script) " | cut -d: -f1 `
-
-for f in $exelist; do
-    if [ -x $f ]; then
-        ldd $f | /usr/bin/awk '/=>/&&!/not found/ { print $3 }'
-    fi
-done | sort -u | sed "s/['\"]/\\\&/g" | xargs -n 1 basename | sort -u
-
-for f in $scriptlist; do
-    if [ -x $f ]; then
-        head -1 $f | sed -e 's/^\#\![   ]*//' | cut -d" " -f1
-    fi
-done | sort -u
diff --git a/autodeps/freebsdelf.prov b/autodeps/freebsdelf.prov
deleted file mode 100644 (file)
index df7d829..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------
-#      find-provides for FreeBSD >= 3.3
-# ----------------------------------------------------------
-filelist=$(grep "\\.so" | grep -v "^/lib/ld.so" | xargs file -L 2>/dev/null | grep "ELF.*shared" | cut -d: -f1)
-
-for f in $filelist; do
-        echo ${f##*/}
-done | sort -u
diff --git a/autodeps/freebsdelf.req b/autodeps/freebsdelf.req
deleted file mode 100644 (file)
index dde04c5..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/sh
-
-# note this works for both a.out and ELF executables
-# it also auto-generates requirment lines for shell scripts
-
-ulimit -c 0
-
-filelist=`sed "s/['\"]/\\\&/g"`
-exelist=`if test "x$filelist" != x; then echo $filelist | xargs file | grep ":.*executable" | cut -d: -f1; fi`
-scriptlist=`if test "x$filelist" != x; then echo $filelist | xargs file | grep -E ":.* (commands|script) " | cut -d: -f1; fi`
-liblist=`if test "x$filelist" != x; then echo $filelist | xargs file | grep ":.*shared object" | cut -d : -f1; fi`
-
-LDDLIST=`for f in $exelist; do
-    if [ -x $f ]; then
-       ldd $f | awk '/=>/ { print $1 }'
-    fi
-done | sort -u | sed "s/['\"]/\\\&/g"`
-if test "x$LDDLIST" != x; then
-    echo $LDDLIST | xargs -n 1 basename | grep -v 'libNoVersion.so' | sort -u
-fi
-
-LDDLIST=`for f in $liblist; do
-    ldd $f | awk '/=>/ { print $1 }'
-done | sort -u | sed "s/['\"]/\\\&/g"`
-if test "x$LDDLIST" != x; then
-    echo $LDDLIST | xargs -n 1 basename | grep -v 'libNoVersion.so' | sort -u
-fi
-
-for f in $scriptlist; do
-    if [ -x $f ]; then
-       head -1 $f | sed -e 's/^\#\![   ]*//' | cut -d" " -f1
-    fi
-done | sort -u
-
-for f in $liblist $exelist ; do
-    objdump -p $f | awk '
-       BEGIN { START=0; LIBNAME=""; }
-       /Version References:/ { START=1; }
-       /required from/ && (START==1) {
-           sub(/:/, "", $3);
-           LIBNAME=$3;
-       }
-       (START==1) && (LIBNAME!="") && ($4~/^GLIBC_*/) { print LIBNAME "(" $4 ")"; }
-       /^$/ { START=0; }
-    '
-done | sort -u
diff --git a/autodeps/hpux.prov b/autodeps/hpux.prov
deleted file mode 100644 (file)
index 9fd4ce6..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-#! /usr/bin/ksh
-
-# Original Author: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
-# $Id: hpux.prov,v 1.8 2001/09/15 13:49:11 jbj Exp $
-#
-# This file is distributed under the terms of the GNU Public License
-#
-# find-provides is part of RPM, the Red Hat Package Manager.  find-provides
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries provided by (contained in) the package.
-#
-#
-# On HP-UX, use `chatr' to find what libraries a package provides
-#
-# Example chatr output:
-#
-#$chatr /usr/lib/libc.sl
-#
-#/usr/lib/libc.sl: 
-#         shared library 
-#         shared library dynamic path search:
-#             SHLIB_PATH     disabled  second 
-#             embedded path  disabled  first  Not Defined
-#         internal name:
-#             libc.1
-#         shared library list:
-#             dynamic   /usr/lib/libdld.1
-#         static branch prediction disabled
-#         kernel assisted branch predictionenabled
-#         lazy swap allocationdisabled
-#         text segment lockingdisabled
-#         data segment lockingdisabled
-#         data page size: 4K
-#         instruction page size: 4K
-#
-
-#
-# Implementation notes: some of the system libraries are built without an
-# `internal name' (HP-UX's equivalent to a SONAME), so I need to track what
-# chatr outputs as its first line.  We'll use the basename of that line in
-# the event of no internal name.
-#
-
-PATH=/usr/bin:/usr/sbin:/usr/ccs/bin
-export PATH
-
-#
-# TVM: Marc Stephenson (marc@austin.ibm.com) points out we run things
-# like `file', et. al. and expect the output to be what we see in the
-# C/POSIX locale.  Make sure it is so.
-#
-LANG=C
-export LANG
-
-#
-# TVM: use `while read ...' instead of `for f in ...', because there may
-# be too many files to stuff into one shell variable.
-#
-IFS=""
-while read f
-do
-       # It's possible that I should be testing to make sure that the file
-       # we're trying isn't a symlink,  and skipping it if it is, because of
-       # the possible odd situation where we could have a link to a library
-       # with no internal name.  This would need more investigation, though.
-       chatr $f 2>/dev/null \
-       | awk '
-
-               BEGIN { 
-                       FS = " ";
-                       RS = "\n";
-
-                       # This flag signfies that we have seen the internal name:
-                       # marker.  Once we see that, we set the flag to 1.  The next
-                       # line we read should contain the library internal name, the
-                       # SOM equivalent of an soname.  At that point we set the flag
-                       # found_internal_name to 1 and exit
-                       # the main body of the awk script, going through the END
-                       in_internal_name = 0;
-
-                       #
-                       # We have seen the internal name: section (yet)?
-                       #
-                       found_internal_name = 0;
-
-                       #
-                       # assume it is a shared library, until record 2 proves us wrong.
-                       #
-                       isa_shared_library = 1;
-               }
-
-               # Uncomment the next line for some debugging info.
-               #{ print NR , ":", $0  }
-
-               #
-               # save the first line in case there is no internal name built
-               # into this object.
-               #
-               NR == 1 {
-                       my_name = $0
-                       opened_something = 1;
-               }
-
-               #
-               # Check the second line (record).  Clear the flag if it is not a
-               # shared library.
-               #
-               NR == 2 && $0 !~ /^[    ]+shared library[       ]*$/ {
-                       # It is not a shared library.  Bow out early
-                       isa_shared_library = 0;
-                       exit
-               }
-
-               in_internal_name == 1 {
-               
-                       # We found the library internal name.  If it does not contain
-                       # a path, print it.  At least a couple of the system libraries
-                       # have a full path as the internal name (this is probably a bug).
-
-                       if ( $0 ~ /\// ) {
-                               numfields = split($0, internal_name, "/")
-                               print internal_name[numfields]
-                       } else {
-                               print $1
-                       }
-
-                       #
-                       # Set a flag for the EXIT section, to indicate that we found
-                       # an internal name
-                       #
-                       found_internal_name = 1;
-                       in_internal_name = 0
-                       exit
-               }
-
-               #
-               # we have hit the internal name section.  Set the flag.  The next
-               # line should be what we are looking for.
-               #
-               /^ +internal name: *$/ {
-                       in_internal_name = 1
-               }
-
-               END {
-                       # Uncomment the next line for debugging info
-                       #{ print "END: NR: ", NR }
-                       if ( (isa_shared_library == 0) || (NR < 2) ) {
-                               # both of these indicate error conditions, for which we
-                               # should not generate any output.
-                               exit;
-                       } else {
-                               if (found_internal_name == 1) {
-                                       exit;
-                               } else {
-                                       #
-                                       # chop the : off the end of the line
-                                       #
-                                       colon = index(my_name, ":")
-                                       colon = colon - 1
-                                       temp = substr(my_name, 1, colon)
-                                       #
-                                       # get the basename
-                                       #
-                                       numfields = split(temp, basename, "/")
-                                       # Uncomment the next line for debugging info
-                                       #print "In END:",  numfields, ":", temp
-                                       print basename[numfields]
-                                       exit
-                               }
-                       }
-               }
-       ' # end of awk
-done | sort -u
-#comment out the previous line and uncomment the next line when debugging
-#done
diff --git a/autodeps/hpux.req b/autodeps/hpux.req
deleted file mode 100644 (file)
index ab72900..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-#! /usr/bin/ksh
-
-# Original Author: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
-# $Id: hpux.req,v 1.7 2001/09/15 13:49:11 jbj Exp $
-#
-# This file is distributed under the terms of the GNU Public License
-#
-# find-requires is part of RPM, the Red Hat Package Manager.  find-requires
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries the package requires to run correctly.
-#
-# On HP-UX, use `chatr' to find the library dependencies for an executable
-#
-# Example chatr output:
-#
-#$chatr /usr/bin/chatr
-#/usr/bin/chatr: 
-#         shared executable 
-#         shared library dynamic path search:
-#             SHLIB_PATH     disabled  second 
-#             embedded path  disabled  first  Not Defined
-#         internal name:
-#             chatr
-#         shared library list:
-#             dynamic   /usr/lib/libc.1
-#         shared library binding:
-#             deferred 
-#         static branch prediction disabled
-#         kernel assisted branch predictionenabled
-#         lazy swap allocationdisabled
-#         text segment lockingdisabled
-#         data segment lockingdisabled
-#         data page size: 4K
-#         instruction page size: 4K
-
-PATH=/usr/bin:/usr/sbin:/sbin:/usr/ccs/bin
-export PATH
-
-#
-# TVM: Marc Stephenson (marc@austin.ibm.com) points out we run things
-# like `file', et. al. and expect the output to be what we see in the
-# C/POSIX locale.  Make sure it is so.
-#
-LANG=C
-export LANG
-
-IFS=""
-while read f
-do
-       # uncomment the next line if debugging
-       # echo "### processing $f"
-
-       #
-       # Only run the file command once per file:
-       #
-       file_output=`file $f`
-
-       #
-       # First, check to see if it's a script, and try figure out what
-       # intpreter it requires.  This is more work on HP-UX, since `file'
-       # doesn't tell us what interpreter the script uses, or even if it
-       # really is a script.
-       #
-       is_shell_script=`od -N 2 -t c $f 2>/dev/null | grep '0000000    #   !'`
-       if test X"$is_shell_script" != X ; then
-               #
-               # it's a shell script.  Now figure out what interpreter it needs
-               # Look at me!  I'm good with sed.  ;-)
-               interp=`head -1 $f | sed -e 's/^#! \{0,1\}\([^  ]*\).*$/\1/'`
-               if test X"$interp" != X ; then
-                       echo "$interp"
-                       #
-                       # We've found what we need for this file.  Skip back to the
-                       # top of the loop.  This saves me an `else' and another indent
-                       # level!  ;-)
-                       continue
-               fi
-       fi
-       
-       #
-       # The `else' is implied here by the `continue' above
-       #
-
-       #
-       # Is it a shared library?
-       #
-       maybe_shared_lib=`echo "$file_output" | grep -E '(executable|library)'`
-       if test X"$maybe_shared_lib" != X ; then
-               chatr $f 2>/dev/null \
-               | awk '
-
-               #
-               # For you non-awk-ers, no single quotes in comments -- the shell
-               # sees them and things get hosed.
-               #
-
-               BEGIN { 
-                       in_shlib_list = 0;
-                       FS = " ";
-                       RS = "\n";
-               }
-
-               # uncomment the next line for debugging information
-               #{ print NR, ": ", $0 }
-
-
-               in_shlib_list == 1 && /dynamic[         ]+[\/\.]/ {
-               
-                       # split the line on "/" and print out the last element
-                       numfields = split($0,fields,"/")
-                       print fields[numfields]
-
-               }
-
-               /^ +shared library list: *$/ {
-                       in_shlib_list = 1
-               }
-
-               /^ +shared library binding: *$/ {
-                       exit
-               }
-               ' # end of awk
-       fi # end of shared library if.
-done | sort -u
-#comment out the previous line and uncomment the next one if debugging.
-#done
diff --git a/autodeps/irix6.prov b/autodeps/irix6.prov
deleted file mode 100644 (file)
index 87ee4e1..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-#! /usr/bin/ksh
-
-# Original Author: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
-# $Id: irix6.prov,v 1.7 2001/09/15 13:49:11 jbj Exp $
-#
-# This file is distributed under the terms of the GNU Public License
-#
-# find-provides is part of RPM, the Red Hat Package Manager.  find-provides
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries provided by (contained in) the package.
-#
-# NOTE: IRIX libraries (even system libraries) have "version information"
-# in both the soname and the internal version field, so it's important to
-# be able to separate the soname and internal version fields.  As has
-# become the case on other platforms, the soname/iversion delimiters have
-# become the `(' and `)' characters.
-#
-# On IRIX, use `elfdump -L' to find what libraries a package provides
-#
-# Example `elfdump -L' output:
-#
-#$elfdump -L /usr/lib/libc.so
-#
-#
-#/usr/lib/libc.so:
-#
-#  **** DYNAMIC SECTION INFORMATION ****
-#.dynamic :
-#[INDEX]       Tag      Value
-#[0]   HASH     0xfa099d0
-#[1]   STRTAB   0xfa0027c
-#[2]   SYMTAB   0xfa10e3c
-#[3]   STRSZ    0x9751
-#[4]   SYMENT   0x10
-#[5]   INIT     0
-#[6]   FINI     0
-#[7]   RLDVERS  0x1
-#[8]   FLAGS    0x1411
-#[9]   BASEADDR 0xfa00000
-#[10]  LOCGOTNO 0x3c
-#[11]  PROTECT  0x3c
-#[12]  HIDDEN   0x12
-#[13]  CNFLCTNO 0
-#[14]  LBLISTNO 0
-#[15]  SYMTABNO 0xd19
-#[16]  UNREFEXT 0x8
-#[17]  GOTSYM   0x8b3
-#[18]  LOCAL    0x12
-#[19]  LOCALPG  0x1
-#[20]  LOCALPG  0x10
-#[21]  PLTGOT   0xfb483b0
-#[22]  RLDTXT_ADR0xfb6b580
-#[23]  OPTIONS  0xfa000f4
-#[24]  SONAME   libc.so.1
-#[25]  TIMSTAMP Jun 16 18:23:15 1997   
-#[26]  CHECKSUM 0x92321a0c
-#[27]  IVERSION sgi1.0
-#[28]  REL      0xfa1dfcc
-#[29]  RELSZ    0x1988
-#[30]  RELENT   0x8
-#[31]  MSYM     0xfa1f954
-#[32]  COMPCTSIZE0xc60c
-#No Library List Section in /usr/lib/libc.so
-#
-
-PATH=/usr/bin:/usr/sbin
-export PATH
-
-#
-# TVM: Marc Stephenson (marc@austin.ibm.com) points out we run things
-# like `file', et. al. and expect the output to be what we see in the
-# C/POSIX locale.  Make sure it is so.
-#
-LANG=C
-export LANG
-
-#
-# Use `while read ...' instead of `for f in ...', because there may be too
-# many files to stuff into one shell variable.
-#
-IFS=""
-while read f
-do
-       #
-       # If it's a shared library, run elfdump on it.
-       #
-       maybe_shared_lib=`file $f | grep -E 'ELF.*dynamic lib'` 
-       if test X"$maybe_shared_lib" != X ; then
-               elfdump -L $f 2>/dev/null | awk '
-
-               #
-               # Since this entire awk script is enclosed in single quotes,
-               # you need to be careful to not use single quotes, even in awk
-               # comments, if you modify this script.
-               #
-
-               BEGIN { 
-                       FS = " ";
-                       RS = "\n";
-                       OFS = "";
-
-                       found_soname = 0;
-                       found_iversion = 0;
-               }
-
-               # Uncomment the next line for some debugging info.
-               #{ print NR , ":", $0  }
-
-               /[       ]+SONAME .*[   ]*$/ {
-                       found_soname = 1;
-                       numfields = split($0, internal_name)
-                       if (numfields == 3) {
-                               soname = $3
-                       } else {
-                               #
-                               # Should never be here.
-                               #
-                               print "Really odd looking soname:", $0 | "cat 1>&2"
-                               exit
-                       }
-               }
-
-               /[      ]+IVERSION .*[  ]*$/ {
-                       if (found_soname == 1) {
-                               numfields = split($0, iversion)
-                               if (numfields == 3) {
-                                       version = $3
-                                       #
-                                       # handle libraries with multiple versions, like
-                                       # 1.1:1.2.  Since they really provide both versions,
-                                       # we need to generate output for each version.
-                                       #
-                                       numfields = split(version, versions, ":")
-                                       if (numfields > 1) {
-                                               for (i = 1; i < numfields; i++) {
-                                                       print soname, "(", versions[i], ")"
-                                               }
-                                               #
-                                               # let our END routine print out the *last* version
-                                               # provided
-                                               #
-                                               version = versions[numfields]
-                                       }
-                                       #
-                                       # stick a fork in us.
-                                       #
-                                       found_iversion = 1;
-                                       exit
-                               } else {
-                                       #
-                                       # handle libraries with comments and other junk in
-                                       # the version field.  IRIX has a number of system libraries
-                                       # with whitespace and other junk in the version field!
-                                       #
-                                       # we discard the whitespace and keep the identifier after
-                                       # the # sign.
-                                       #
-                                       version = iversion[numfields]
-                                       numfields = split(version, version_junk, "#")
-                                       if (numfields > 1) {
-                                               version = version_junk[numfields]
-                                               found_iversion = 1;
-                                       }
-                               }
-                       } else {
-                               #
-                               # found an iversion without an soname.  Is that possible?
-                               #
-                               print "Found version but no soname:", $0 | "cat 1>&2"
-                               exit
-                       }
-               }
-
-               #
-               # we could probably watch for some other token (like RELSZ)
-               # that *generally* occurs later in the input than the stuff we watch
-               # for, and exit if we see it, but it is just as easy to read all
-               # the output, even after we have seen what we are looking for.
-               #
-
-               END {
-                       # Uncomment the next line for debugging info
-                       #{ print "END: NR: ", NR }
-                       if ( (found_soname == 1) && (found_iversion == 1) ) {
-                               print soname, "(", version, ")"
-                               exit
-                       } else if ( (found_soname == 1) && (found_iversion == 0) ) {
-                               #
-                               # no library version information *BUT* any programs linked
-                               # against this library will pick up a dependency on version 0
-                               # of this library, so we output that.
-                               #
-                               print soname, "(", 0, ")"
-                       }
-                       # else do nothing
-               }
-       ' # end of awk
-       fi # end of the 'if test X"$maybe_shared_lib != X ; then' clause
-done | sort -u
-#comment out the previous line and uncomment the next line when debugging
-#done
diff --git a/autodeps/irix6.req b/autodeps/irix6.req
deleted file mode 100644 (file)
index 72442ac..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-#! /usr/bin/ksh
-
-# Original Author: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
-# $Id: irix6.req,v 1.7 2001/09/15 13:49:11 jbj Exp $
-#
-# This file is distributed under the terms of the GNU Public License
-#
-# find-requires is part of RPM, the Red Hat Package Manager.  find-requires
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries the package requires to execute.
-#
-# NOTE: IRIX libraries (even system libraries) have "version information"
-# in both the soname and the internal version field, so it's important to
-# be able to separate the soname and internal version fields.  As has
-# become the case on other platforms, the soname/iversion delimiters have
-# become the `(' and `)' characters.
-#
-# On IRIX, use `elfdump -Dl' to find what libraries are required by
-# an executable.  `elfdump -L' does what we need too, but it gives us more
-# than we really need.
-#
-# Example `elfdump -Dl' output:
-#
-#$elfdump -Dl /usr/bin/X11/xterm
-#
-#
-#
-#/usr/bin/X11/xterm:
-#
-#                 **** MIPS LIBLIST INFORMATION ****
-#.liblist :
-#[INDEX]       Timestamp               Checksum        Flags   Name            Version
-#[1]   Nov 23 15:39:02 1997    0x4da65893      -----   libXaw.so.2     sgi2.0
-#[2]   Nov 23 15:39:02 1997    0x414eece6      -----   libXmu.so       sgi1.0
-#[3]   Nov 23 15:39:02 1997    0x6f314e69      -----   libXt.so        sgi1.0
-#[4]   Nov 23 15:39:02 1997    0xcbe81fff      -----   libXext.so      sgi1.0
-#[5]   Nov 23 15:39:02 1997    0x89ae8e98      -----   libX11.so.1     sgi1.0
-#[6]   Oct 27 01:00:29 1997    0x99b27890      -----   libcurses.so    sgi1.0
-#[7]   Jun 16 18:23:15 1997    0x92321a0c      -----   libc.so.1       sgi1.0
-#
-#
-# TVM: it might be better to re-write this so that `file' isn't used, since
-# it can all be done with `elfdump',  but this works.
-#
-
-PATH=/usr/bin:/usr/sbin
-export PATH
-
-#
-# TVM: Marc Stephenson (marc@austin.ibm.com) points out we run things
-# like `file', et. al. and expect the output to be what we see in the
-# C/POSIX locale.  Make sure it is so.
-#
-LANG=C
-export LANG
-
-#
-# TVM: switch to using `while read ...' instead of `for f in ...', because
-# packages with a large number of files could be too big for one shell
-# variable to hold.
-#
-IFS=""
-while read f
-do
-
-       #
-       # Uncomment the next line for additional debugging:
-       #echo "read ->$f<-"
-       
-       #
-       # Only run file once per file:
-       #
-       file_output=`file $f`
-
-       #
-       # Handle scripts first
-       #
-       is_shell_script=`echo "$file_output" | grep 'script text' | \
-               cut -d: -f 2 | awk '{ print $1 }'`
-       
-       #
-       # If it's a script...
-       #
-       if test X"$is_shell_script" != X ; then
-               echo "$is_shell_script"
-               #
-               # use `continue' to skip back up to the top of the loop.  We've
-               # already done as much as we need to, and this saves me from having
-               # to have an else, and another indent level... ;-)
-               #
-               continue
-       fi
-
-       #
-       # the `else' is implied here, since we used `continue' in the test above
-       #
-
-       #
-       # It might be a shared library.
-       #
-       maybe_shared_lib=`echo "$file_output" | grep -E 'executable|lib'`
-       if test X"$maybe_shared_lib" != X ; then
-
-               elfdump -Dl $f 2>/dev/null \
-               | awk '
-
-               #
-               # Since this entire awk script is enclosed in single quotes,
-               # you need to be careful to not use single quotes, even in awk
-               # comments, if you modify this script.
-               #
-
-               BEGIN { 
-                       found_column_headers = 0;
-                       FS = " ";
-                       RS = "\n";
-                       OFS="";
-               }
-
-               # uncomment the next line for debugging information
-               #{ print "Saw input:", $0 }
-
-               found_column_headers == 1 && $0 !~ /^$/ {
-
-                       # get the library name (field 15) and the library version (field 16)
-                       # if present.
-                       numfields = split($0,fields)
-                       if (numfields == 8) {
-                               print fields[8]
-                       } else if (numfields == 9) {
-                               #
-                               print fields[8], "(", fields[9], ")"
-                       } else if (numfields > 9) {
-                               #
-                               # SGI has this annoying habit of putting comments, complete
-                               # with whitespace, in their library IVERSION field.  Yuck.
-                               #
-                               # Handle libraries like this gracefully.
-                               #
-                               verfields = split(fields[NF], junk, "#")
-                               if (verfields == 2) {
-                                       print fields[8], "(", junk[2], ")"
-                               } else if (verfields > 2) {
-                                       print fields[8], "(", junk[verfields], ")"
-                               } else {
-                                       print "Cannot find version:", fields[numfields] | "cat 2>&1"
-                               }
-                       }
-               }
-
-               /^\[INDEX\].Timestamp.*Checksum.*Flags.*Name.*Version$/ {
-                       # we better start paying attention now.
-                       found_column_headers = 1
-                       #
-                       # uncomment the next line for debugging information
-                       #print "found the column headers: ", $0
-               }
-
-       ' # end of awk
-       fi
-done | sort -u
-# comment out the previous line and uncomment the next when debugging
-#done
diff --git a/autodeps/linux.prov b/autodeps/linux.prov
deleted file mode 100644 (file)
index 99e58c4..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/bin/bash
-
-# This script reads filenames from STDIN and outputs any relevant provides
-# information that needs to be included in the package.
-IFS=$'\n'
-filelist=($(cat))
-
-debuginfolist=($(printf "%s\n" "${filelist[@]}" | grep "/usr/lib/debug/"))
-filelist=($(printf "%s\n" "${filelist[@]}" | grep -v "/usr/lib/debug/"))
-
-solist=($(printf "%s\n" "${filelist[@]}" | grep "\\.so" | grep -v "^/lib/ld.so" | \
-         tr '\n' '\0' | xargs -0 -r file -L | grep "ELF.*shared object" | \
-         cut -d: -f1))
-pythonlist=($(printf "%s\n" "${filelist[@]}" | egrep '/usr/bin/python.\..$'))
-tcllist=
-monolist=($(printf "%s\n" "${filelist[@]}" | egrep "\\.(exe|dll)\$"))
-firmwarelist=($(printf "%s\n" "${filelist[@]}" | grep "/lib/firmware/"))
-pkgconfiglist=($(printf "%s\n" "${filelist[@]}" | egrep '\.pc$'))
-fontlist=($(printf "%s\n" "${filelist[@]}" | egrep -i "/usr/share/fonts/.*\.(ttf|otf|pfa)$"))
-
-#
-# --- Alpha does not mark 64bit dependencies
-case `uname -m` in
-  alpha*)      mark64=false ;;
-  *)           mark64=true ;;
-esac
-
-#
-# --- Library sonames and weak symbol versions (from glibc).
-for f in "${solist[@]}"; do
-    soname=$(objdump -p "$f" | awk '/SONAME/ {print $2}')
-    [ -n "$soname" -a -L "$f" ] && continue
-    [ -z "$soname" ] && soname="${f##*/}"
-
-    if $mark64 && file -L "$f" 2>/dev/null | grep "ELF 64-bit" >/dev/null; then
-       lib64="()(64bit)" slib64="(64bit)"
-    else
-       lib64= slib64=
-    fi
-    echo "$soname$lib64"
-    objdump -p "$f" | awk '
-       BEGIN { START=0 ; }
-       /Version definitions:/ { START=1; }
-       /^[0-9]/ && (START==1) { print $4; }
-       /^$/ { START=0; }
-    ' | \
-       while read symbol ; do
-           echo "$soname($symbol)$slib64"
-       done
-done | sort -u
-
-#
-# --- Perl modules.
-[ -x /usr/lib/rpm/perl.prov ] &&
-    printf "%s\n" "${filelist[@]}" | grep '\.pm$' | /usr/lib/rpm/perl.prov | sort -u
-
-#
-# --- Python modules.
-[ -x /usr/lib/rpm/pythondeps.sh -a -n "$pythonlist" ] &&
-    printf "%s\n" "${pythonlist[@]}" | /usr/lib/rpm/pythondeps.sh -P | sort -u
-
-#
-# --- Tcl modules.
-[ -x /usr/lib/rpm/tcl.prov -a -n "$tcllist" ] &&
-    printf "%s\n" "${tcllist[@]}" | /usr/lib/rpm/tcl.prov | sort -u
-
-#
-# --- firmware files
-[ -x /usr/lib/rpm/firmware.prov -a -n "$firmwarelist" ] &&
-     printf "%s\n" "${firmwarelist[@]}" | /usr/lib/rpm/firmware.prov | sort -u
-
-#
-# --- debuginfo files
-[ -x /usr/lib/rpm/debuginfo.prov -a -n "$debuginfolist" ] &&
-     printf "%s\n" "${debuginfolist[@]}" | /usr/lib/rpm/debuginfo.prov | sort -u
-
-#
-# --- Mono exes/dlls
-: ${MONO_PREFIX=/usr}
-if [ -x $MONO_PREFIX/bin/mono -a -n "$monolist" ] ; then
-    printf "%s\n" "${monolist[@]}" | MONO_PATH=$MONO_PREFIX/lib${MONO_PATH:+:$MONO_PATH} prefix=$MONO_PREFIX $MONO_PREFIX/bin/mono-find-provides || echo "WARNING: MONO RPM PROVIDES WERE NOT GENERATED FOR THIS BUILD!!" 1>&2
-fi
-
-#
-# --- pkgconfig provides
-[ -x /usr/lib/rpm/pkgconfigdeps.sh -a -n "$pkgconfiglist" ] &&
-     printf "%s\n" "${pkgconfiglist[@]}" | /usr/lib/rpm/pkgconfigdeps.sh -P | sort -u
-
-#
-# --- font provides
-[ -x /usr/lib/rpm/fontconfig.prov -a -n "$fontlist" ] &&
-     printf "%s\n" "${fontlist[@]}" | /usr/lib/rpm/fontconfig.prov | sort -u
-
-#
-# --- Kernel module exported symbols
-[ -x /usr/lib/rpm/find-provides.ksyms ] &&
-    printf "%s\n" "${filelist[@]}" | /usr/lib/rpm/find-provides.ksyms "$@"
-
-#
-# --- GStreamer provides, codecs
-[ -x /usr/lib/rpm/gstreamer-provides ] &&
-    printf "%s\n" "${filelist[@]}" | /usr/lib/rpm/gstreamer-provides | sort -u
-
-exit 0
diff --git a/autodeps/linux.req b/autodeps/linux.req
deleted file mode 100644 (file)
index cc19f5f..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-#!/bin/bash
-
-#
-# Auto-generate requirements for executables (both ELF and a.out) and library
-# sonames, script interpreters, and perl modules.
-#
-
-ulimit -c 0
-
-#
-# --- Set needed to 0 for traditional find-requires behavior.
-needed=1
-if [ X"$1" = Xldd ]; then
-    needed=0
-elif [ X"$1" = Xobjdump ]; then
-    needed=1
-fi
-
-#
-# --- Grab the file manifest and classify files.
-#filelist=`sed "s/[]['\"*?{}]/\\\\\&/g"`
-filelist=($(grep -Ev '/usr/doc/|/usr/share/doc/'))
-exelist=($(printf "%s\0" "${filelist[@]}" | xargs -0 -r file | \
-       grep -Ev ":.* (commands|script)[, ]" | \
-       grep ":.*executable" | cut -d: -f1))
-scriptlist=($(printf "%s\0" "${filelist[@]}" | xargs -0 -r file | \
-       grep -E ":.* (commands|script)[, ]" | cut -d: -f1))
-liblist=($(printf "%s\0" "${filelist[@]}" | xargs -0 -r file | \
-       grep ":.*shared object" | cut -d : -f1))
-
-interplist=()
-perllist=()
-pythonlist=($(printf "%s\n" "${filelist[@]}" | egrep '/usr/lib[^/]*/python.\..'))
-tcllist=()
-monolist=($(printf "%s\n" "${filelist[@]}" | egrep "\\.(exe|dll)(\\.config)?\$"))
-pkgconfiglist=($(printf "%s\n" "${filelist[@]}" | egrep '\.pc$'))
-
-#
-# --- Alpha does not mark 64bit dependencies
-case `uname -m` in
-  alpha*)      mark64="" ;;
-  *)           mark64="()(64bit)" ;;
-esac
-
-if [ "$needed" -eq 0 ]; then
-#
-# --- Executable dependency sonames.
-  for f in "${exelist[@]}"; do
-    [ -r "$f" -a -x "$f" ] || continue
-    lib64=`if file -L "$f" 2>/dev/null | \
-       grep "ELF 64-bit" >/dev/null; then echo "$mark64"; fi`
-    ldd "$f" | awk '/=>/ {
-       if ($1 !~ /libNoVersion.so/ && $1 !~ /4[um]lib.so/ && $1 !~ /linux-gate.so/) {
-           gsub(/'\''"/,"\\&",$1);
-           printf "%s'$lib64'\n", $1
-       }
-    }'
-  done | xargs -r -n 1 basename | sort -u
-
-#
-# --- Library dependency sonames.
-  for f in "${liblist[@]}"; do
-    [ -r "$f" ] || continue
-    lib64=`if file -L "$f" 2>/dev/null | \
-       grep "ELF 64-bit" >/dev/null; then echo "$mark64"; fi`
-    ldd "$f" | awk '/=>/ {
-       if ($1 !~ /libNoVersion.so/ && $1 !~ /4[um]lib.so/ && $1 !~ /linux-gate.so/) {
-           gsub(/'\''"/,"\\&",$1);
-           printf "%s'$lib64'\n", $1
-       }
-    }'
-  done | xargs -r -n 1 basename | sort -u
-fi
-
-#
-# --- Script interpreters.
-for f in "${scriptlist[@]}"; do
-    [ -r "$f" -a -x "$f" ] || continue
-    interp=`head -n 1 "$f" | sed -ne 's/^\#\![         ]*//p' | cut -d" " -f1`
-    interplist=("${interplist[@]}" "$interp")
-    case $interp in
-    */perl)    perllist=("${perllist[@]}" "$f") ;;
-    esac
-done
-[ -n "$interplist" ] && { printf "%s\n" "${interplist[@]}" | sort -u ; }
-
-#
-# --- Add perl module files to perllist.
-for f in "${filelist[@]}"; do
-    [ -r "$f" -a "${f%.pm}" != "${f}" ] && perllist=("${perllist[@]}" "$f")
-done
-
-#
-# --- Weak symbol versions (from glibc).
-[ -n "$mark64" ] && mark64="(64bit)"
-for f in "${liblist[@]}" "${exelist[@]}" ; do
-    [ -r "$f" ] || continue
-    lib64=`if file -L "$f" 2>/dev/null | \
-       grep "ELF 64-bit" >/dev/null; then echo "$mark64"; fi`
-    objdump -p "$f" | awk 'BEGIN { START=0; LIBNAME=""; needed='$needed'; }
-       /^$/ { START=0; }
-       /^Dynamic Section:$/ { START=1; }
-       (START==1) && /NEEDED/ {
-           if (needed) {
-               if ("'$lib64'" != "") {
-                   sub(/$/, "()'$lib64'", $2) ;
-               }
-               print $2 ;
-           }
-       }
-       (START==2) && /^[A-Za-z]/ { START=3; }
-       /^Version References:$/ { START=2; }
-       (START==2) && /required from/ {
-           sub(/:/, "", $3);
-           LIBNAME=$3;
-       }
-       (START==2) && (LIBNAME!="") && ($4!="") {
-           print LIBNAME "(" $4 ")'$lib64'";
-       }
-    '
-done | sort -u
-
-#
-# --- Perl modules.
-#[ -x /usr/lib/rpm/perl.req -a -n "$perllist" ] && \
-#    printf "%s\n" "${perllist[@]}" | /usr/lib/rpm/perl.req | sort -u
-
-#
-# --- Python modules.
-[ -x /usr/lib/rpm/pythondeps.sh -a -n "$pythonlist" ] && \
-    printf "%s\n" "${pythonlist[@]}" | /usr/lib/rpm/pythondeps.sh -R | sort -u
-
-#
-# --- Tcl modules.
-[ -x /usr/lib/rpm/tcl.req -a -n "$tcllist" ] && \
-    printf "%s\n" "${tcllist[@]}" | /usr/lib/rpm/tcl.req | sort -u
-
-#
-# --- Mono exes/dlls
-: ${MONO_PREFIX=/usr}
-if [ -x $MONO_PREFIX/bin/mono -a -n "$monolist" ] ; then
-    printf "%s\n" "${monolist[@]}" | MONO_PATH=$MONO_PREFIX/lib${MONO_PATH:+:$MONO_PATH} prefix=$MONO_PREFIX $MONO_PREFIX/bin/mono-find-requires || echo "WARNING: MONO RPM REQUIRES WERE NOT GENERATED FOR THIS BUILD!!" 1>&2
-fi
-
-#
-# --- pkgconfig requires
-[ -x /usr/lib/rpm/pkgconfigdeps.sh -a -n "$pkgconfiglist" ] &&
-     printf "%s\n" "${pkgconfiglist[@]}" | /usr/lib/rpm/pkgconfigdeps.sh -R | sort -u
-
-#
-# --- Kernel module imported symbols
-[ -x ${0%/*}/find-requires.ksyms ] &&
-    printf "%s\n" "${filelist[@]}" | ${0%/*}/find-requires.ksyms "$@"
-
-exit 0
diff --git a/autodeps/mint.prov b/autodeps/mint.prov
deleted file mode 100644 (file)
index a752f8f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-#
-# No shared libs on MiNT yet, sigh.
-
-echo > /dev/null
diff --git a/autodeps/mint.req b/autodeps/mint.req
deleted file mode 100644 (file)
index a752f8f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-#
-# No shared libs on MiNT yet, sigh.
-
-echo > /dev/null
diff --git a/autodeps/none b/autodeps/none
deleted file mode 100644 (file)
index 87ad08f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-cat > /dev/null
diff --git a/autodeps/openbsd.prov b/autodeps/openbsd.prov
deleted file mode 100644 (file)
index 1e7b06e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------
-#      find-provides for OpenBSD-2.5
-# ----------------------------------------------------------
-filelist=$(grep "\\.so" | grep -v "^/lib/ld.so" | xargs file -L 2>/dev/null | grep "OpenBSD.*shared" | cut -d: -f1)
-
-for f in $filelist; do
-        echo ${f##*/}
-done | sort -u
diff --git a/autodeps/openbsd.req b/autodeps/openbsd.req
deleted file mode 100644 (file)
index ec3bac7..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------------
-#      find-requires for OpenBSD-2.2.x
-#      how do we know what is required by a.out shared libraries?
-# ----------------------------------------------------------------
-ulimit -c 0
-
-filelist=`sed "s/['\"]/\\\&/g"`
-exelist=`echo $filelist | xargs file | grep -F executable | cut -d: -f1 `
-scriptlist=`echo $filelist | xargs file | grep -E ":.* (commands|script) " | cut -d: -f1 `
-
-for f in $exelist; do
-    if [ -x $f ]; then
-        ldd $f | /usr/bin/awk '/\=\>/&&!/not found/ { print $3 }'
-    fi
-done | sort -u | sed "s/['\"]/\\\&/g" | xargs -n 1 basename | sort -u
-
-for f in $scriptlist; do
-    if [ -x $f ]; then
-        head -1 $f | sed -e 's/^\#\![   ]*//' | cut -d" " -f1
-    fi
-done | sort -u
diff --git a/autodeps/osf.prov b/autodeps/osf.prov
deleted file mode 100644 (file)
index 6b54133..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-#! /usr/bin/ksh
-
-# Original Author: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
-# $Id: osf.prov,v 1.7 2000/10/31 20:47:23 mooney Exp $
-#
-# This file is distributed under the terms of the GNU Public License
-#
-# find-provides is part of RPM, the Red Hat Package Manager.  find-provides
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries provided by (contained in) the package.
-#
-#
-# On Digital/Tru64 Unix (OSF1), use `odump -D' to find what libraries a
-# package provides.  Note that Tru64 Unix 5.x and later come with `ldd',
-# but sticking with `odump' works with versions of the OS back to at least
-# 3.x, so it's the preferred method.
-#
-# Example `odump -D' output:
-#
-#$odump -D /usr/shlib/libc.so
-#
-#
-#
-#
-#                      ***DYNAMIC SECTION***
-#               Tag            Value
-#
-#/usr/shlib/libc.so:
-#                UNREFEXTNO: 14.
-#               LOCAL_GOTNO: 521.
-#                    GOTSYM: 2205.
-#               LOCAL_GOTNO: 1606.
-#                    GOTSYM: 3289.
-#                    SONAME: libc.so
-#                TIME_STAMP: (0x34a82daa) Mon Dec 29 17:09:30 1997
-#
-#                 ICHECKSUM: 0x5e955f9b
-#                  IVERSION: osf.1
-#                CONFLICTNO: 0.
-#               RLD_VERSION: 2.
-#                      HASH: 0x000003ff800a82e0
-#                    STRTAB: 0x000003ff8008aad0
-#                    SYMTAB: 0x000003ff80094ab0
-#                      MSYM: 0x000003ff800842c0
-#                     STRSZ: 40922.
-#                    SYMENT: 24.
-#                    PLTGOT: 0x000003ffc008f240
-#                  SYMTABNO: 3330.
-#              BASE_ADDRESS: 0x000003ff80080000
-#                  HIPAGENO: 0.
-#                     RELSZ: 15296.
-#                    RELENT: 16.
-#                       REL: 0x000003ff80080700
-#                 LIBLISTNO: 0.
-#                      INIT: 0x000003ff8019c520
-#                      FINI: 0x000003ff8019c570
-#                     FLAGS: 0x00000001
-#
-
-PATH=/usr/bin:/usr/sbin:/sbin:/usr/ccs/bin
-export PATH
-
-#
-# TVM: Marc Stephenson (marc@austin.ibm.com) points out we run things
-# like `file', et. al. and expect the output to be what we see in the
-# C/POSIX locale.  Make sure it is so.
-#
-LANG=C
-export LANG
-
-#
-# Use `while read ...' instead of a `for f in ...', because there may
-# be too many files to stuff into one shell variable.
-#
-IFS=""
-while read f
-do
-
-       #
-       # if it's a shared library, run odump on it.
-       #
-       maybe_shared_lib=`file $f | grep -E 'COFF.*shared library'`
-       if test X"$maybe_shared_lib" != X ; then
-               odump -D $f 2>/dev/null | awk '
-
-                       BEGIN { 
-                               FS = " ";
-                               RS = "\n";
-                               OFS = "";
-
-                               found_soname = 0;
-                               found_iversion = 0;
-
-                       }
-
-                       # Uncomment the next line for some debugging info.
-                       #{ print NR , ":", $0  }
-
-                       /^[      ]+SONAME: .*[  ]*$/ {
-                               found_soname = 1;
-                               numfields = split($0, internal_name)
-                               if (numfields == 2) {
-                                       soname = $2
-                                       #
-                                       # we should probably check to see if the soname ends with
-                                       # a number (indicating that it contains versioning info,
-                                       # possibly in addition to the versioning info in the
-                                       # versions field) and generate a warning here.  Shared
-                                       # libraries should not be built with version info in
-                                       # the soname on Digital/Tru64 Unix.
-                                       #
-                               } else {
-                                       #
-                                       # Should never be here.
-                                       #
-                                       print "Really odd looking soname:", $0 | "cat 1>&2"
-                                       exit
-                               }
-                       }
-
-                       /^[     ]+IVERSION: .*[         ]*$/ {
-                               if (found_soname == 1) {
-                                       numfields = split($0, iversion)
-                                       if (numfields == 2) {
-                                               version = $2
-                                               #
-                                               # handle libraries with multiple versions, like
-                                               # 1.1:1.2.  Since they really provide both versions,
-                                               # we need to generate output for each version.
-                                               #
-                                               numfields = split(version, versions, ":")
-                                               if (numfields > 1) {
-                                                       for (i = 1; i < numfields; i++) {
-                                                               print soname, "(", versions[i], ")"
-                                                       }
-                                                       #
-                                                       # let our END routine print out the *last* version
-                                                       # provided
-                                                       #
-                                                       version = versions[numfields]
-                                               }
-                                               #
-                                               # stick a fork in us.
-                                               #
-                                               found_iversion = 1;
-                                               exit
-                                       } else {
-                                               #
-                                               # Should never be here.
-                                               #
-                                               print "Odd looking library version:", $0 | "cat 1>&2"
-                                               exit
-                                       }
-                               } else {
-                                       #
-                                       # found an iversion without an soname.  Is that possible?
-                                       #
-                                       print "Found version but no soname:", $0 | "cat 1>&2"
-                                       exit
-                               }
-                       }
-
-                       #
-                       # we could probably watch for some other token (like RLD_VERSION)
-                       # that *generally* occurs later in the input than the stuff we watch
-                       # for, and exit if we see it, but it is just as easy to read all
-                       # the output, even after we have seen what we are looking for.
-                       #
-
-                       END {
-                               # Uncomment the next line for debugging info
-                               #{ print "END: NR: ", NR }
-                               if ( (found_soname == 1) && (found_iversion == 1) ) {
-                                       print soname, "(", version, ")"
-                                       exit
-                               } else if (found_soname == 1) {
-                                       #
-                                       # no library version information
-                                       #
-                                       print soname
-                               }
-                               # else do nothing
-                       }
-               ' # end of awk
-       fi
-done | sort -u
-#comment out the previous line and uncomment the next line when debugging
-#done
diff --git a/autodeps/osf.req b/autodeps/osf.req
deleted file mode 100644 (file)
index 39d00c3..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-#! /usr/bin/ksh
-
-# Original Author: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
-# $Id: osf.req,v 1.9 2001/09/15 13:49:11 jbj Exp $
-#
-# This file is distributed under the terms of the GNU Public License
-#
-# find-requires is part of RPM, the Red Hat Package Manager.  find-requires
-# reads a list of full pathnames (in a package) on stdin, and outputs all
-# shared libraries the package requires to execute.
-#
-# On Digital/Tru64 Unix (OSF1), use `odump -Dl' to find the library
-# dependencies for an executable.  `odump -D' does most of what we need,
-# but it doesn't give us library version information, so you must use
-# `odump -Dl'.  Note that Tru64 5.x and on have `ldd', but this works just
-# as well, and works on older versions of the OS.
-#
-# Example `odump -Dl' output:
-#
-#$odump -Dl /usr/bin/X11/xterm
-# 
-#
-#
-#
-#                      ***LIBRARY LIST SECTION***
-#      Name             Time-Stamp        CheckSum   Flags Version
-#/usr/bin/X11/xterm:
-#      libXaw.so    Dec  9 00:15:35 1997 0x285006d0     0 6.0
-#      libXmu.so    Dec  9 00:13:36 1997 0x3bf3a33d     0 
-#      libXt.so     Dec  9 00:12:18 1997 0x10dd9a17     0 
-#      libSM.so     Dec  9 00:08:11 1997 0xb64c7082     0 
-#      libICE.so    Dec  9 00:07:52 1997 0x1199be32     0 
-#      libXext.so   Dec  9 00:08:51 1997 0xafcb84d5     0 
-#      libX11.so    Dec  9 00:06:05 1997 0xaa1bf091     0 
-#      libc.so      Dec  8 18:41:11 1997 0x5e955f9b     0 osf.1
-
-PATH=/usr/bin:/usr/sbin:/sbin:/usr/ccs/bin
-export PATH
-
-#
-# TVM: Marc Stephenson (marc@austin.ibm.com) points out we run things
-# like `file', et. al. and expect the output to be what we see in the
-# C/POSIX locale.  Make sure it is so.
-#
-LANG=C
-export LANG
-
-#
-# TVM: switch to using `while read ...' instead of `for f in ...', because
-# packages with a large number of files could be too big for one shell variable
-# to hold.
-#
-IFS=""
-while read f
-do
-
-       #
-       # Uncomment the next line for addtional debugging:
-       # echo "read ->$f<-"
-
-       #
-       # Only run file once per file:
-       #
-       file_output=`file $f`
-
-       #
-       # handle shell scripts first
-       #
-       is_shell_script=`echo "$file_output" | grep 'shell script' | \
-               cut -d: -f 2 | awk '{ print $1 }'`
-
-       #
-       # If it's a script...
-       #
-       if test X"$is_shell_script" != X ; then
-               echo "$is_shell_script"
-               #
-               # use `continue' to skip back up to the top of the loop.
-               # We have already done as much as we need to for this
-               # file, and this saves me from having to have an else,
-               # and another indent level... ;-)
-               #
-               continue
-       fi
-
-       #
-       # The `else' here is implied by the `continue' above...
-       #
-
-       #
-       # it might be a shared library.
-       #
-
-       maybe_shared_lib=`echo "$file_output" | grep 'executable'`
-       if test X"$maybe_shared_lib" != X ; then
-
-               odump -Dl $f 2>/dev/null \
-               | awk '
-
-                       #
-                       # Since this entire awk script is enclosed in single quotes,
-                       # you need to be careful to not use single quotes, even in awk
-                       # comments, if you modify this script.
-                       #
-
-                       BEGIN { 
-                               found_program_name = 0;
-                               FS = " ";
-                               RS = "\n";
-                               OFS="";
-                       }
-
-                       # uncomment the next line for debugging information
-                       #{ print "Saw input:", $0 }
-
-                       found_program_name == 1 && $0 !~ /^$/ {
-
-                               # uncomment for debugging information
-                               #print "found shared library: $0"
-
-                               # get the library name (field 1) and the library version
-                               # (field 8) if present.
-                               numfields = split($0,fields)
-                               if (numfields == 7) {
-                                       print fields[1]
-                               } else if (numfields == 8) {
-                                       print fields[1], "(", fields[8], ")"
-                               }
-                       }
-
-                       /^.*: *$/ {
-                               found_program_name = 1
-                               #
-                               # uncomment the next line for debugging information
-                               #print "found the program name: ", $1
-                       }
-
-               ' # end of awk
-       fi
-done | sort -u
-# comment out the previous line and uncomment the next when debugging
-# done
diff --git a/autodeps/solaris.prov b/autodeps/solaris.prov
deleted file mode 100644 (file)
index 6e0fe9f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-# This script reads filenames from STDIN and outputs any relevant provides
-# information that needs to be included in the package.
-
-PATH=/usr/bin:/usr/ccs/bin:/usr/sbin:/sbin
-export PATH
-
-filelist=`grep "lib.*\\.so" | xargs /usr/ucb/file -L 2>/dev/null |\
-       grep "ELF.*dynamic lib" | cut -d: -f1 | sort -u`
-for I in $filelist; do
-        basename $I
-done
-
diff --git a/autodeps/solaris.req b/autodeps/solaris.req
deleted file mode 100644 (file)
index 05e4024..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-
-# note this works for both a.out and ELF executables
-
-PATH=/usr/bin:/usr/ccs/bin:/usr/sbin:/sbin
-export PATH
-
-ulimit -c 0
-
-filelist=`sed "s/['\"]/\\\&/g"`
-[ -z "$filelist" ] && exit #emulate -r option for xargs
-
-for f in `echo $filelist | xargs file | grep -F executable | cut -d: -f1`; do
-    ldd $f 2>/dev/null | awk '/\=\>/ { print $1 }'
-done | sort -u | sed "s/['\"]/\\\&/g" | xargs -n 1 basename | sort -u
-
index 1a540bce3c0f7a878d9826da0562c25adcec9a82..2fa3c3d6c1e9672bfa6534ad4de3f95e98778806 100644 (file)
@@ -1,6 +1,10 @@
 # Makefile for rpmbuild library.
 
+include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
+
 AM_CPPFLAGS =  -I$(top_builddir) -I$(top_srcdir) -I$(top_builddir)/include/
+AM_CPPFLAGS += @WITH_BEECRYPT_INCLUDE@
 AM_CPPFLAGS += @WITH_NSS_INCLUDE@
 AM_CPPFLAGS += @WITH_MAGIC_INCLUDE@
 AM_CPPFLAGS += @WITH_POPT_INCLUDE@
@@ -16,10 +20,15 @@ librpmbuild_la_SOURCES = \
        parsePolicies.c policies.c \
        rpmbuild_internal.h rpmbuild_misc.h
 
-librpmbuild_la_LDFLAGS = -version-info 4:0:1
+librpmbuild_la_LDFLAGS = -version-info $(rpm_version_info)
 librpmbuild_la_LIBADD = \
        $(top_builddir)/lib/librpm.la \
        $(top_builddir)/rpmio/librpmio.la \
        $(top_builddir)/misc/libmisc.la \
+       @LTLIBICONV@ \
        @WITH_POPT_LIB@ \
        @WITH_MAGIC_LIB@
+
+if LIBDW
+librpmbuild_la_LIBADD += @WITH_LIBELF_LIB@ @WITH_LIBDW_LIB@
+endif
index 04b039c5e6e2e4dc6f9a2b0d526eb1ddddb44784..81152e53e310eb9533f2d13a2ef79b93860ec22f 100644 (file)
@@ -69,7 +69,7 @@ rpmRC doScript(rpmSpec spec, rpmBuildFlags what, const char *name,
     pid_t pid;
     pid_t child;
     int status;
-    rpmRC rc;
+    rpmRC rc = RPMRC_FAIL; /* assume failure */
     
     switch (what) {
     case RPMBUILD_PREP:
@@ -118,13 +118,11 @@ rpmRC doScript(rpmSpec spec, rpmBuildFlags what, const char *name,
     fd = rpmMkTempFile(spec->rootDir, &scriptName);
     if (Ferror(fd)) {
        rpmlog(RPMLOG_ERR, _("Unable to open temp file: %s\n"), Fstrerror(fd));
-       rc = RPMRC_FAIL;
        goto exit;
     }
 
     if ((fp = fdopen(Fileno(fd), "w")) == NULL) {
        rpmlog(RPMLOG_ERR, _("Unable to open stream: %s\n"), strerror(errno));
-       rc = RPMRC_FAIL;
        goto exit;
     }
     
@@ -151,7 +149,6 @@ rpmRC doScript(rpmSpec spec, rpmBuildFlags what, const char *name,
     }
     
     if (buildDir && buildDir[0] != '/') {
-       rc = RPMRC_FAIL;
        goto exit;
     }
 
@@ -160,8 +157,6 @@ rpmRC doScript(rpmSpec spec, rpmBuildFlags what, const char *name,
 
     rpmlog(RPMLOG_NOTICE, _("Executing(%s): %s\n"), name, buildCmd);
     if (!(child = fork())) {
-       /* NSPR messes with SIGPIPE, reset to default for the kids */
-       signal(SIGPIPE, SIG_DFL);
        errno = 0;
        (void) execvp(argv[0], (char *const *)argv);
 
@@ -176,21 +171,19 @@ rpmRC doScript(rpmSpec spec, rpmBuildFlags what, const char *name,
     if (pid == -1) {
        rpmlog(RPMLOG_ERR, _("Error executing scriptlet %s (%s)\n"),
                 scriptName, name);
-       rc = RPMRC_FAIL;
        goto exit;
     }
 
     if (!WIFEXITED(status) || WEXITSTATUS(status)) {
        rpmlog(RPMLOG_ERR, _("Bad exit status from %s (%s)\n"),
                 scriptName, name);
-       rc = RPMRC_FAIL;
     } else
        rc = RPMRC_OK;
     
 exit:
     Fclose(fd);
     if (scriptName) {
-       if (rc == RPMRC_OK)
+       if (rc == RPMRC_OK && !rpmIsDebug())
            (void) unlink(scriptName);
        free(scriptName);
     }
@@ -209,6 +202,21 @@ static rpmRC buildSpec(BTA_t buildArgs, rpmSpec spec, int what)
     int test = (what & RPMBUILD_NOBUILD);
     char *cookie = buildArgs->cookie ? xstrdup(buildArgs->cookie) : NULL;
 
+    if (rpmExpandNumeric("%{?source_date_epoch_from_changelog}") &&
+       getenv("SOURCE_DATE_EPOCH") == NULL) {
+       /* Use date of first (== latest) changelog entry */
+       Header h = spec->packages->header;
+       struct rpmtd_s td;
+       if (headerGet(h, RPMTAG_CHANGELOGTIME, &td, (HEADERGET_MINMEM|HEADERGET_RAW))) {
+           char sdestr[22];
+           snprintf(sdestr, sizeof(sdestr), "%lli",
+                    (long long) rpmtdGetNumber(&td));
+           rpmlog(RPMLOG_NOTICE, _("setting %s=%s\n"), "SOURCE_DATE_EPOCH", sdestr);
+           setenv("SOURCE_DATE_EPOCH", sdestr, 0);
+           rpmtdFreeData(&td);
+       }
+    }
+
     /* XXX TODO: rootDir is only relevant during build, eliminate from spec */
     spec->rootDir = buildArgs->rootdir;
     if (!spec->recursing && spec->BACount) {
index a71ad095cd904ea610ca83edc292499b7df3b336..581a79e19570bc1a913c72cb89866888dd889b1c 100644 (file)
@@ -105,7 +105,6 @@ typedef struct _parseState {
     char *p;           /*!< current position in expression string */
     int nextToken;     /*!< current lookahead token */
     Value tokenValue;  /*!< valid when TOK_INTEGER or TOK_STRING */
-    rpmSpec spec;      /*!< spec file that we are parsing inside of */
 } *ParseState;
 
 
@@ -644,7 +643,7 @@ static Value doLogical(ParseState state)
   return v1;
 }
 
-int parseExpressionBoolean(rpmSpec spec, const char *expr)
+int parseExpressionBoolean(const char *expr)
 {
   struct _parseState state;
   int result = -1;
@@ -654,7 +653,6 @@ int parseExpressionBoolean(rpmSpec spec, const char *expr)
 
   /* Initialize the expression parser state. */
   state.p = state.str = xstrdup(expr);
-  state.spec = spec;
   state.nextToken = 0;
   state.tokenValue = NULL;
   (void) rdToken(&state);
index 71d12729d464c0875be20bdf0da83227dc39a972..c641528a4f59e58f663f2dd770f30e5cdba35c05 100644 (file)
@@ -9,11 +9,17 @@
 #define        MYALLPERMS      07777
 
 #include <errno.h>
+#include <stdlib.h>
 #include <regex.h>
 #if WITH_CAP
 #include <sys/capability.h>
 #endif
 
+#if HAVE_LIBDW
+#include <libelf.h>
+#include <elfutils/libdwelf.h>
+#endif
+
 #include <rpm/rpmpgp.h>
 #include <rpm/argv.h>
 #include <rpm/rpmfc.h>
 #include <rpm/rpmlog.h>
 #include <rpm/rpmbase64.h>
 
-#if HAVE_GELF_H
-#include <gelf.h>
-#endif
-
 #include "rpmio/rpmio_internal.h"      /* XXX rpmioSlurp */
 #include "misc/rpmfts.h"
-#include "lib/cpio.h"
 #include "lib/rpmfi_internal.h"        /* XXX fi->apath */
 #include "lib/rpmug.h"
 #include "build/rpmbuild_internal.h"
 #include <libgen.h>
 
 #define SKIPSPACE(s) { while (*(s) && risspace(*(s))) (s)++; }
-#define        SKIPWHITE(_x)   {while(*(_x) && (risspace(*_x) || *(_x) == ',')) (_x)++;}
-#define        SKIPNONWHITE(_x){while(*(_x) &&!(risspace(*_x) || *(_x) == ',')) (_x)++;}
+#define        SKIPWHITE(_x)   {while (*(_x) && (risspace(*_x) || *(_x) == ',')) (_x)++;}
+#define        SKIPNONWHITE(_x){while (*(_x) &&!(risspace(*_x) || *(_x) == ',')) (_x)++;}
+
+/* the following defines must be in sync with the equally hardcoded paths from
+ * scripts/find-debuginfo.sh
+ */
+#define BUILD_ID_DIR           "/usr/lib/.build-id"
+#define DEBUG_SRC_DIR          "/usr/src/debug"
+#define DEBUG_LIB_DIR          "/usr/lib/debug"
+#define DEBUG_LIB_PREFIX       "/usr/lib/debug/"
+#define DEBUG_ID_DIR           "/usr/lib/debug/.build-id"
+#define DEBUG_DWZ_DIR          "/usr/lib/debug/.dwz"
+
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+#define HASHTYPE fileRenameHash
+#define HTKEYTYPE const char *
+#define HTDATATYPE const char *
+#include "lib/rpmhash.C"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
 
 /**
  */
@@ -85,8 +107,8 @@ typedef struct FileListRec_s {
 
     char *diskPath;            /* get file from here       */
     char *cpioPath;            /* filename in cpio archive */
-    const char *uname;
-    const char *gname;
+    rpmsid uname;
+    rpmsid gname;
     unsigned   flags;
     specfFlags specdFlags;     /* which attributes have been explicitly specified. */
     rpmVerifyFlags verifyFlags;
@@ -97,26 +119,19 @@ typedef struct FileListRec_s {
 /**
  */
 typedef struct AttrRec_s {
-    char *ar_fmodestr;
-    char *ar_dmodestr;
-    char *ar_user;
-    char *ar_group;
+    rpmsid     ar_fmodestr;
+    rpmsid     ar_dmodestr;
+    rpmsid     ar_user;
+    rpmsid     ar_group;
     mode_t     ar_fmode;
     mode_t     ar_dmode;
 } * AttrRec;
 
-static struct AttrRec_s root_ar = { NULL, NULL, "root", "root", 0, 0 };
-
 /* list of files */
 static StringBuf check_fileList = NULL;
 
-typedef struct specialDir_s {
-    char * dirname;
-    ARGV_t files;
-    struct AttrRec_s ar;
-    struct AttrRec_s def_ar;
-    rpmFlags sdtype;
-} * specialDir;
+/*backup of maindb->fileList*/
+ARGV_t maindb_fileList_bakup = NULL;
 
 typedef struct FileEntry_s {
     rpmfileAttrs attrFlags;
@@ -134,6 +149,23 @@ typedef struct FileEntry_s {
     int isDir;
 } * FileEntry;
 
+typedef struct specialDir_s {
+    char * dirname;
+    ARGV_t files;
+    struct AttrRec_s ar;
+    struct AttrRec_s def_ar;
+    rpmFlags sdtype;
+
+    int entriesCount;
+    int entriesAlloced;
+
+    struct {
+       struct FileEntry_s defEntry;
+       struct FileEntry_s curEntry;
+    } *entries;
+
+} * specialDir;
+
 typedef struct FileRecords_s {
     FileListRec recs;
     int alloced;
@@ -146,11 +178,13 @@ typedef struct FileRecords_s {
 typedef struct FileList_s {
     /* global filelist state */
     char * buildRoot;
+    size_t buildRootLen;
     int processingFailed;
     int haveCaps;
     int largeFiles;
     ARGV_t docDirs;
     rpmBuildPkgFlags pkgFlags;
+    rpmstrPool pool;
 
     /* actual file records */
     struct FileRecords_s files;
@@ -162,63 +196,45 @@ typedef struct FileList_s {
     struct FileEntry_s cur;
 } * FileList;
 
-/**
- */
 static void nullAttrRec(AttrRec ar)
 {
-    ar->ar_fmodestr = NULL;
-    ar->ar_dmodestr = NULL;
-    ar->ar_user = NULL;
-    ar->ar_group = NULL;
-    ar->ar_fmode = 0;
-    ar->ar_dmode = 0;
+    memset(ar, 0, sizeof(*ar));
 }
 
-/**
- */
-static void freeAttrRec(AttrRec ar)
-{
-    ar->ar_fmodestr = _free(ar->ar_fmodestr);
-    ar->ar_dmodestr = _free(ar->ar_dmodestr);
-    ar->ar_user = _free(ar->ar_user);
-    ar->ar_group = _free(ar->ar_group);
-    /* XXX doesn't free ar (yet) */
-    return;
-}
-
-/**
- */
 static void dupAttrRec(const AttrRec oar, AttrRec nar)
 {
     if (oar == nar)
        return;
-    freeAttrRec(nar);
-    nar->ar_fmodestr = (oar->ar_fmodestr ? xstrdup(oar->ar_fmodestr) : NULL);
-    nar->ar_dmodestr = (oar->ar_dmodestr ? xstrdup(oar->ar_dmodestr) : NULL);
-    nar->ar_user = (oar->ar_user ? xstrdup(oar->ar_user) : NULL);
-    nar->ar_group = (oar->ar_group ? xstrdup(oar->ar_group) : NULL);
-    nar->ar_fmode = oar->ar_fmode;
-    nar->ar_dmode = oar->ar_dmode;
+    *nar = *oar; /* struct assignment */
 }
 
-#if 0
-/**
- */
-static void dumpAttrRec(const char * msg, AttrRec ar)
+/* Creates a default $defattr string. Can be used with argvAdd().
+   Caller owns the new string which needs to be freed when done.  */
+static char *mkattr(void)
 {
-    if (msg)
-       fprintf(stderr, "%s:\t", msg);
-    fprintf(stderr, "(%s, %s, %s, %s)\n",
-       ar->ar_fmodestr,
-       ar->ar_user,
-       ar->ar_group,
-       ar->ar_dmodestr);
+    char *s = NULL;
+    rasprintf(&s, "%s(644,%s,%s,755)", "%defattr", UID_0_USER, GID_0_GROUP);
+    return s;
+}
+
+static void copyFileEntry(FileEntry src, FileEntry dest)
+{
+    /* Copying struct makes just shallow copy */
+    *dest = *src;
+
+    /* Do also deep copying */
+    if (src->langs != NULL) {
+       dest->langs = argvNew();
+       argvAppend(&dest->langs, src->langs);
+    }
+
+    if (src->caps != NULL) {
+       dest->caps = xstrdup(src->caps);
+    }
 }
-#endif
 
 static void FileEntryFree(FileEntry entry)
 {
-    freeAttrRec(&(entry->ar));
     argvFree(entry->langs);
     memset(entry, 0, sizeof(*entry));
 }
@@ -377,7 +393,11 @@ exit:
     return rc;
 }
 
-#define        isAttrDefault(_ars)     ((_ars)[0] == '-' && (_ars)[1] == '\0')
+static int isAttrDefault(rpmstrPool pool, rpmsid arsid)
+{
+    const char *ars = rpmstrPoolStr(pool, arsid);
+    return (ars && ars[0] == '-' && ars[1] == '\0');
+}
 
 /**
  * Parse %dev from file manifest.
@@ -391,6 +411,7 @@ static rpmRC parseForDev(char * buf, FileEntry cur)
     const char * errstr = NULL;
     char *p, *pe, *q = NULL;
     rpmRC rc = RPMRC_FAIL;     /* assume error */
+    char *attr_parameters = NULL;
 
     if ((p = strstr(buf, (name = "%dev"))) == NULL)
        return RPMRC_OK;
@@ -416,6 +437,10 @@ static rpmRC parseForDev(char * buf, FileEntry cur)
     /* Localize. Erase parsed string */
     q = xmalloc((pe-p) + 1);
     rstrlcpy(q, p, (pe-p) + 1);
+
+    attr_parameters = xmalloc((pe-p) + 1);
+    rstrlcpy(attr_parameters, p, (pe-p) + 1);
+
     while (p <= pe)
        *p++ = ' ';
 
@@ -465,23 +490,26 @@ static rpmRC parseForDev(char * buf, FileEntry cur)
 
 exit:
     if (rc) {
-       rpmlog(RPMLOG_ERR, _("Missing %s in %s %s\n"), errstr, name, p);
+       rpmlog(RPMLOG_ERR, _("Missing %s in %s(%s)\n"), errstr, name, attr_parameters);
     }
+    free(attr_parameters);
     free(q);
     return rc;
 }
 
 /**
  * Parse %attr and %defattr from file manifest.
+ * @param pool         string pool
  * @param buf          current spec file line
  * @param def          parse for %defattr or %attr?
  * @param entry                file entry data (current / default)
  * @return             0 on success
  */
-static rpmRC parseForAttr(char * buf, int def, FileEntry entry)
+static rpmRC parseForAttr(rpmstrPool pool, char * buf, int def, FileEntry entry)
 {
     const char *name = def ? "%defattr" : "%attr";
     char *p, *pe, *q = NULL;
+    char *attr_parameters = NULL;
     int x;
     struct AttrRec_s arbuf;
     AttrRec ar = &arbuf;
@@ -519,6 +547,10 @@ static rpmRC parseForAttr(char * buf, int def, FileEntry entry)
     /* Localize. Erase parsed string */
     q = xmalloc((pe-p) + 1);
     rstrlcpy(q, p, (pe-p) + 1);
+
+    attr_parameters = xmalloc((pe-p) + 1);
+    rstrlcpy(attr_parameters, p, (pe-p) + 1);
+
     while (p <= pe)
        *p++ = ' ';
 
@@ -527,61 +559,61 @@ static rpmRC parseForAttr(char * buf, int def, FileEntry entry)
     p = q; SKIPWHITE(p);
     if (*p != '\0') {
        pe = p; SKIPNONWHITE(pe); if (*pe != '\0') *pe++ = '\0';
-       ar->ar_fmodestr = p;
+       ar->ar_fmodestr = rpmstrPoolId(pool, p, 1);
        p = pe; SKIPWHITE(p);
     }
     if (*p != '\0') {
        pe = p; SKIPNONWHITE(pe); if (*pe != '\0') *pe++ = '\0';
-       ar->ar_user = p;
+       ar->ar_user = rpmstrPoolId(pool, p, 1);
        p = pe; SKIPWHITE(p);
     }
     if (*p != '\0') {
        pe = p; SKIPNONWHITE(pe); if (*pe != '\0') *pe++ = '\0';
-       ar->ar_group = p;
+       ar->ar_group = rpmstrPoolId(pool, p, 1);
        p = pe; SKIPWHITE(p);
     }
     if (*p != '\0' && def) {   /* %defattr */
        pe = p; SKIPNONWHITE(pe); if (*pe != '\0') *pe++ = '\0';
-       ar->ar_dmodestr = p;
+       ar->ar_dmodestr = rpmstrPoolId(pool, p, 1);
        p = pe; SKIPWHITE(p);
     }
 
     if (!(ar->ar_fmodestr && ar->ar_user && ar->ar_group) || *p != '\0') {
-       rpmlog(RPMLOG_ERR, _("Bad syntax: %s(%s)\n"), name, q);
+       rpmlog(RPMLOG_ERR, _("Bad syntax: %s(%s)\n"), name, attr_parameters);
        goto exit;
     }
 
     /* Do a quick test on the mode argument and adjust for "-" */
-    if (ar->ar_fmodestr && !isAttrDefault(ar->ar_fmodestr)) {
+    if (ar->ar_fmodestr && !isAttrDefault(pool, ar->ar_fmodestr)) {
        unsigned int ui;
-       x = sscanf(ar->ar_fmodestr, "%o", &ui);
+       x = sscanf(rpmstrPoolStr(pool, ar->ar_fmodestr), "%o", &ui);
        if ((x == 0) || (ar->ar_fmode & ~MYALLPERMS)) {
-           rpmlog(RPMLOG_ERR, _("Bad mode spec: %s(%s)\n"), name, q);
+           rpmlog(RPMLOG_ERR, _("Bad mode spec: %s(%s)\n"), name, attr_parameters);
            goto exit;
        }
        ar->ar_fmode = ui;
     } else {
-       ar->ar_fmodestr = NULL;
+       ar->ar_fmodestr = 0;
     }
 
-    if (ar->ar_dmodestr && !isAttrDefault(ar->ar_dmodestr)) {
+    if (ar->ar_dmodestr && !isAttrDefault(pool, ar->ar_dmodestr)) {
        unsigned int ui;
-       x = sscanf(ar->ar_dmodestr, "%o", &ui);
+       x = sscanf(rpmstrPoolStr(pool, ar->ar_dmodestr), "%o", &ui);
        if ((x == 0) || (ar->ar_dmode & ~MYALLPERMS)) {
-           rpmlog(RPMLOG_ERR, _("Bad dirmode spec: %s(%s)\n"), name, q);
+           rpmlog(RPMLOG_ERR, _("Bad dirmode spec: %s(%s)\n"), name, attr_parameters);
            goto exit;
        }
        ar->ar_dmode = ui;
     } else {
-       ar->ar_dmodestr = NULL;
+       ar->ar_dmodestr = 0;
     }
 
-    if (!(ar->ar_user && !isAttrDefault(ar->ar_user))) {
-       ar->ar_user = NULL;
+    if (!(ar->ar_user && !isAttrDefault(pool, ar->ar_user))) {
+       ar->ar_user = 0;
     }
 
-    if (!(ar->ar_group && !isAttrDefault(ar->ar_group))) {
-       ar->ar_group = NULL;
+    if (!(ar->ar_group && !isAttrDefault(pool, ar->ar_group))) {
+       ar->ar_group = 0;
     }
 
     dupAttrRec(ar, &(entry->ar));
@@ -592,6 +624,7 @@ static rpmRC parseForAttr(char * buf, int def, FileEntry entry)
 
 exit:
     free(q);
+    free(attr_parameters);
     
     return rc;
 }
@@ -826,7 +859,9 @@ static VFA_t const virtualAttrs[] = {
     { "%readme",       RPMFILE_README },
     { "%license",      RPMFILE_LICENSE },
     { "%pubkey",       RPMFILE_PUBKEY },
-    { "%manifest",     RPMFILE_SECMANIFEST },
+    { "%missingok",    RPMFILE_MISSINGOK },
+    { "%artifact",     RPMFILE_ARTIFACT },
+    { "%manifest",  RPMFILE_SECMANIFEST },
     { NULL, 0 }
 };
 
@@ -907,7 +942,7 @@ static int isHardLink(FileListRec flp, FileListRec tlp)
 /**
  * Verify that file attributes scope over hardlinks correctly.
  * If partial hardlink sets are possible, then add tracking dependency.
- * @param fl           package file records
+ * @param files                package file records
  * @return             1 if partial hardlink sets can exist, 0 otherwise.
  */
 static int checkHardLinks(FileRecords files)
@@ -946,22 +981,35 @@ static int seenHardLink(FileRecords files, FileListRec flp, rpm_ino_t *fileid)
  * @todo Should directories have %doc/%config attributes? (#14531)
  * @todo Remove RPMTAG_OLDFILENAMES, add dirname/basename instead.
  * @param fl           package file tree walk data
- * @retval *fip                file info for package
- * @param h
- * @param isSrc
+ * @param pkg          (sub) package
+ * @param isSrc                pass 1 for source packages 0 otherwise
  */
-static void genCpioListAndHeader(FileList fl,
-               rpmfi * fip, Header h, int isSrc)
+static void genCpioListAndHeader(FileList fl, Package pkg, int isSrc)
 {
-    int _addDotSlash = !(isSrc || rpmExpandNumeric("%{_noPayloadPrefix}"));
-    size_t apathlen = 0;
-    size_t dpathlen = 0;
-    size_t skipLen = 0;
     FileListRec flp;
     char buf[BUFSIZ];
-    int i;
+    int i, npaths = 0;
     uint32_t defaultalgo = PGPHASHALGO_MD5, digestalgo;
     rpm_loff_t totalFileSize = 0;
+    Header h = pkg->header; /* just a shortcut */
+    int override_date = 0;
+    time_t source_date_epoch;
+    char *srcdate = getenv("SOURCE_DATE_EPOCH");
+
+    /* Limit the maximum date to SOURCE_DATE_EPOCH if defined
+     * similar to the tar --clamp-mtime option
+     * https://reproducible-builds.org/specs/source-date-epoch/
+     */
+    if (srcdate && rpmExpandNumeric("%{?clamp_mtime_to_source_date_epoch}")) {
+       char *endptr;
+       errno = 0;
+       source_date_epoch = strtol(srcdate, &endptr, 10);
+       if (srcdate == endptr || *endptr || errno != 0) {
+           rpmlog(RPMLOG_ERR, _("unable to parse %s=%s\n"), "SOURCE_DATE_EPOCH", srcdate);
+           exit(28);
+       }
+       override_date = 1;
+    }
 
     /*
      * See if non-md5 file digest algorithm is requested. If not
@@ -979,16 +1027,40 @@ static void genCpioListAndHeader(FileList fl,
                digestalgo);
        digestalgo = defaultalgo;
     }
-    
+
+    /* Adjust paths if needed */
+    if (!isSrc && pkg->removePostfixes) {
+       pkg->fileRenameMap = fileRenameHashCreate(fl->files.used,
+                                                 rstrhash, strcmp,
+                                                 (fileRenameHashFreeKey)rfree, (fileRenameHashFreeData)rfree);
+       for (i = 0, flp = fl->files.recs; i < fl->files.used; i++, flp++) {
+           char * cpiopath = flp->cpioPath;
+           char * cpiopath_orig = xstrdup(cpiopath);
+
+           for (ARGV_const_t postfix_p = pkg->removePostfixes; *postfix_p; postfix_p++) {
+               int len = strlen(*postfix_p);
+               int plen = strlen(cpiopath);
+               if (len <= plen && !strncmp(cpiopath+plen-len, *postfix_p, len)) {
+                   cpiopath[plen-len] = '\0';
+                   if (plen-len > 0 && cpiopath[plen-len-1] == '/') {
+                       cpiopath[plen-len-1] = '\0';
+                   }
+               }
+           }
+           if (strcmp(cpiopath_orig, cpiopath))
+               fileRenameHashAddEntry(pkg->fileRenameMap, xstrdup(cpiopath), cpiopath_orig);
+           else
+               _free(cpiopath_orig);
+       }
+    }
+
     /* Sort the big list */
     qsort(fl->files.recs, fl->files.used,
          sizeof(*(fl->files.recs)), compareFileListRecs);
     
-    /* Generate the header. */
-    if (! isSrc) {
-       skipLen = 1;
-    }
+    pkg->dpaths = xmalloc((fl->files.used + 1) * sizeof(*pkg->dpaths));
 
+    /* Generate the header. */
     for (i = 0, flp = fl->files.recs; i < fl->files.used; i++, flp++) {
        rpm_ino_t fileid = flp - fl->files.recs;
 
@@ -1044,29 +1116,26 @@ static void genCpioListAndHeader(FileList fl,
        }
 
        /* Skip files that were marked with %exclude. */
-       if (flp->flags & RPMFILE_EXCLUDE) continue;
-
-       /* Omit '/' and/or URL prefix, leave room for "./" prefix */
-       apathlen += (strlen(flp->cpioPath) - skipLen + (_addDotSlash ? 3 : 1));
+       if (flp->flags & RPMFILE_EXCLUDE)
+       {
+           argvAdd(&pkg->fileExcludeList, flp->cpioPath);
+           continue;
+       }
 
-       /* Leave room for both dirname and basename NUL's */
-       dpathlen += (strlen(flp->diskPath) + 2);
+       /* Collect on-disk paths for archive creation */
+       pkg->dpaths[npaths++] = xstrdup(flp->diskPath);
 
-       /*
-        * Make the header. Store the on-disk path to OLDFILENAMES for
-        * cpio list generation purposes for now, final path temporarily
-        * to ORIGFILENAMES, to be swapped later into OLDFILENAMES.
-        */
-       headerPutString(h, RPMTAG_OLDFILENAMES, flp->diskPath);
-       headerPutString(h, RPMTAG_ORIGFILENAMES, flp->cpioPath);
-       headerPutString(h, RPMTAG_FILEUSERNAME, flp->uname);
-       headerPutString(h, RPMTAG_FILEGROUPNAME, flp->gname);
+       headerPutString(h, RPMTAG_OLDFILENAMES, flp->cpioPath);
+       headerPutString(h, RPMTAG_FILEUSERNAME,
+                       rpmstrPoolStr(fl->pool, flp->uname));
+       headerPutString(h, RPMTAG_FILEGROUPNAME,
+                       rpmstrPoolStr(fl->pool, flp->gname));
 
        /* Only use 64bit filesizes tag if required. */
        if (fl->largeFiles) {
            rpm_loff_t rsize64 = (rpm_loff_t)flp->fl_size;
            headerPutUint64(h, RPMTAG_LONGFILESIZES, &rsize64, 1);
-           /* XXX TODO: add rpmlib() dependency for large files */
+            (void) rpmlibNeedsFeature(pkg, "LargeFiles", "4.12.0-1");
        } else {
            rpm_off_t rsize32 = (rpm_off_t)flp->fl_size;
            headerPutUint32(h, RPMTAG_FILESIZES, &rsize32, 1);
@@ -1078,6 +1147,9 @@ static void genCpioListAndHeader(FileList fl,
            }
        }
        
+       if (override_date && flp->fl_mtime > source_date_epoch) {
+           flp->fl_mtime = source_date_epoch;
+       }
        /*
         * For items whose size varies between systems, always explicitly 
         * cast to the header type before inserting.
@@ -1116,7 +1188,7 @@ static void genCpioListAndHeader(FileList fl,
        }
        
        buf[0] = '\0';
-       if (S_ISREG(flp->fl_mode))
+       if (S_ISREG(flp->fl_mode) && !(flp->flags & RPMFILE_GHOST))
            (void) rpmDoDigest(digestalgo, flp->diskPath, 1, 
                               (unsigned char *)buf, NULL);
        headerPutString(h, RPMTAG_FILEDIGESTS, buf);
@@ -1131,7 +1203,7 @@ static void genCpioListAndHeader(FileList fl,
            } else {
                buf[llen] = '\0';
                if (buf[0] == '/' && !rstreq(fl->buildRoot, "/") &&
-                       rstreqn(buf, fl->buildRoot, strlen(fl->buildRoot))) {
+                       rstreqn(buf, fl->buildRoot, fl->buildRootLen)) {
                    rpmlog(RPMLOG_ERR,
                                _("Symlink points to BuildRoot: %s -> %s\n"),
                                flp->cpioPath, buf);
@@ -1157,6 +1229,7 @@ static void genCpioListAndHeader(FileList fl,
 
        headerPutUint32(h, RPMTAG_FILEFLAGS, &(flp->flags) ,1);
     }
+    pkg->dpaths[npaths] = NULL;
 
     if (totalFileSize < UINT32_MAX) {
        rpm_off_t totalsize = totalFileSize;
@@ -1168,69 +1241,31 @@ static void genCpioListAndHeader(FileList fl,
 
     if (digestalgo != defaultalgo) {
        headerPutUint32(h, RPMTAG_FILEDIGESTALGO, &digestalgo, 1);
-       rpmlibNeedsFeature(h, "FileDigests", "4.6.0-1");
+       rpmlibNeedsFeature(pkg, "FileDigests", "4.6.0-1");
     }
 
     if (fl->haveCaps) {
-       rpmlibNeedsFeature(h, "FileCaps", "4.6.1-1");
+       rpmlibNeedsFeature(pkg, "FileCaps", "4.6.1-1");
     }
 
-    if (_addDotSlash)
-       (void) rpmlibNeedsFeature(h, "PayloadFilesHavePrefix", "4.0-1");
-
-  {
-    struct rpmtd_s filenames;
-    rpmfiFlags flags = RPMFI_NOHEADER|RPMFI_NOFILEUSER|RPMFI_NOFILEGROUP;
-    rpmfi fi;
-    int fc;
-    const char *fn;
-    char *a, **apath;
+    if (!isSrc && !rpmExpandNumeric("%{_noPayloadPrefix}"))
+       (void) rpmlibNeedsFeature(pkg, "PayloadFilesHavePrefix", "4.0-1");
 
     /* rpmfiNew() only groks compressed filelists */
     headerConvert(h, HEADERCONV_COMPRESSFILELIST);
-    fi = rpmfiNew(NULL, h, RPMTAG_BASENAMES, flags);
+    pkg->cpioList = rpmfilesNew(NULL, h, RPMTAG_BASENAMES,
+                           (RPMFI_NOFILEUSER|RPMFI_NOFILEGROUP));
 
-    if (fi == NULL) {
+    if (pkg->cpioList == NULL || rpmfilesFC(pkg->cpioList) != npaths) {
        fl->processingFailed = 1;
-       return;
     }
 
-    /* 
-     * Grab the real filenames from ORIGFILENAMES and put into OLDFILENAMES,
-     * remove temporary cruft and side-effects from filelist compression 
-     * for rpmfiNew().
-     */
-    headerGet(h, RPMTAG_ORIGFILENAMES, &filenames, HEADERGET_ALLOC);
-    headerDel(h, RPMTAG_ORIGFILENAMES);
-    headerDel(h, RPMTAG_BASENAMES);
-    headerDel(h, RPMTAG_DIRNAMES);
-    headerDel(h, RPMTAG_DIRINDEXES);
-    rpmtdSetTag(&filenames, RPMTAG_OLDFILENAMES);
-    headerPut(h, &filenames, HEADERPUT_DEFAULT);
-
-    /* Create hge-style archive path array, normally adding "./" */
-    fc = rpmtdCount(&filenames);
-    apath = xmalloc(fc * sizeof(*apath) + apathlen + 1);
-    a = (char *)(apath + fc);
-    *a = '\0';
-    rpmtdInit(&filenames);
-    for (int i = 0; (fn = rpmtdNextString(&filenames)); i++) {
-       apath[i] = a;
-       if (_addDotSlash)
-           a = stpcpy(a, "./");
-       a = stpcpy(a, (fn + skipLen));
-       a++;            /* skip apath NUL */
-    }
-    fi->apath = apath;
-    *fip = fi;
-    rpmtdFreeData(&filenames);
-  }
-
-    /* Compress filelist unless legacy format requested */
-    if (!(fl->pkgFlags & RPMBUILD_PKG_NODIRTOKENS)) {
-       headerConvert(h, HEADERCONV_COMPRESSFILELIST);
+    if (fl->pkgFlags & RPMBUILD_PKG_NODIRTOKENS) {
+       /* Uncompress filelist if legacy format requested */
+       headerConvert(h, HEADERCONV_EXPANDFILELIST);
+    } else {
        /* Binary packages with dirNames cannot be installed by legacy rpm. */
-       (void) rpmlibNeedsFeature(h, "CompressedFileNames", "3.0.4-1");
+       (void) rpmlibNeedsFeature(pkg, "CompressedFileNames", "3.0.4-1");
     }
 }
 
@@ -1253,6 +1288,7 @@ static void FileListFree(FileList fl)
     FileRecordsFree(&(fl->files));
     free(fl->buildRoot);
     argvFree(fl->docDirs);
+    rpmstrPoolFree(fl->pool);
 }
 
 /* forward ref */
@@ -1310,6 +1346,10 @@ static rpmRC addFile(FileList fl, const char * diskPath,
     }
     cpioPath = diskPath;
        
+    if (strncmp(diskPath, fl->buildRoot, fl->buildRootLen)) {
+       rpmlog(RPMLOG_ERR, _("Path is outside buildroot: %s\n"), diskPath);
+       goto exit;
+    }
     
     /* Path may have prepended buildRoot, so locate the original filename. */
     /*
@@ -1323,7 +1363,7 @@ static rpmRC addFile(FileList fl, const char * diskPath,
      *
      */
     if (fl->buildRoot && !rstreq(fl->buildRoot, "/"))
-       cpioPath += strlen(fl->buildRoot);
+       cpioPath += fl->buildRootLen;
 
     /* XXX make sure '/' can be packaged also */
     if (*cpioPath == '\0')
@@ -1358,6 +1398,12 @@ static rpmRC addFile(FileList fl, const char * diskPath,
        }
     }
 
+    /* Error out when a non-directory is specified as one in spec */
+    if (fl->cur.isDir && (statp == &statbuf) && !S_ISDIR(statp->st_mode)) {
+       rpmlog(RPMLOG_ERR, _("Not a directory: %s\n"), diskPath);
+       goto exit;
+    }
+
     /* Don't recurse into explicit %dir, don't double-recurse from fts */
     if ((fl->cur.isDir != 1) && (statp == &statbuf) && S_ISDIR(statp->st_mode)) {
        return recurseDir(fl, diskPath);
@@ -1368,9 +1414,15 @@ static rpmRC addFile(FileList fl, const char * diskPath,
     fileGid = statp->st_gid;
 
     /* Explicit %attr() always wins */
-    if (fl->cur.ar.ar_fmodestr != NULL) {
-       fileMode &= S_IFMT;
-       fileMode |= fl->cur.ar.ar_fmode;
+    if (fl->cur.ar.ar_fmodestr) {
+       if (S_ISLNK(fileMode)) {
+           rpmlog(RPMLOG_WARNING,
+                  "Explicit %%attr() mode not applicable to symlink: %s\n",
+                  diskPath);
+       } else {
+           fileMode &= S_IFMT;
+           fileMode |= fl->cur.ar.ar_fmode;
+       }
     } else {
        /* ...but %defattr() for directories and files is different */
        if (S_ISDIR(fileMode)) {
@@ -1378,22 +1430,22 @@ static rpmRC addFile(FileList fl, const char * diskPath,
                fileMode &= S_IFMT;
                fileMode |= fl->def.ar.ar_dmode;
            }
-       } else if (fl->def.ar.ar_fmodestr) {
+       } else if (!S_ISLNK(fileMode) && fl->def.ar.ar_fmodestr) {
            fileMode &= S_IFMT;
            fileMode |= fl->def.ar.ar_fmode;
        }
     }
     if (fl->cur.ar.ar_user) {
-       fileUname = fl->cur.ar.ar_user;
+       fileUname = rpmstrPoolStr(fl->pool, fl->cur.ar.ar_user);
     } else if (fl->def.ar.ar_user) {
-       fileUname = fl->def.ar.ar_user;
+       fileUname = rpmstrPoolStr(fl->pool, fl->def.ar.ar_user);
     } else {
        fileUname = rpmugUname(fileUid);
     }
     if (fl->cur.ar.ar_group) {
-       fileGname = fl->cur.ar.ar_group;
+       fileGname = rpmstrPoolStr(fl->pool, fl->cur.ar.ar_group);
     } else if (fl->def.ar.ar_group) {
-       fileGname = fl->def.ar.ar_group;
+       fileGname = rpmstrPoolStr(fl->pool, fl->def.ar.ar_group);
     } else {
        fileGname = rpmugGname(fileGid);
     }
@@ -1423,11 +1475,13 @@ static rpmRC addFile(FileList fl, const char * diskPath,
        flp->fl_mode = fileMode;
        flp->fl_uid = fileUid;
        flp->fl_gid = fileGid;
+       if (S_ISDIR(fileMode))
+           flp->fl_size = 0;
 
        flp->cpioPath = xstrdup(cpioPath);
        flp->diskPath = xstrdup(diskPath);
-       flp->uname = rpmugStashStr(fileUname);
-       flp->gname = rpmugStashStr(fileGname);
+       flp->uname = rpmstrPoolId(fl->pool, fileUname, 1);
+       flp->gname = rpmstrPoolId(fl->pool, fileGname, 1);
 
        if (fl->cur.langs) {
            flp->langs = argvJoin(fl->cur.langs, "|");
@@ -1436,7 +1490,7 @@ static rpmRC addFile(FileList fl, const char * diskPath,
        }
 
        if (fl->cur.caps) {
-           flp->caps = fl->cur.caps;
+           flp->caps = xstrdup(fl->cur.caps);
        } else {
            flp->caps = xstrdup("");
        }
@@ -1555,15 +1609,15 @@ static rpmRC processMetadataFile(Package pkg, FileList fl,
        apkt = pgpArmorWrap(PGPARMOR_PUBKEY, pkt, pktlen);
        break;
     }
-    case RPMTAG_SECMANIFEST: {
+       case RPMTAG_SECMANIFEST: {
        if ((xx = rpmioSlurp(fn, &pkt, &pktlen)) != 0 || pkt == NULL) {
-           rpmlog(RPMLOG_ERR, _("%s: Security manifest file read failed.\n"), fn);
-           goto exit;
+               rpmlog(RPMLOG_ERR, _("%s: Security manifest file read failed.\n"), fn);
+                       goto exit;
+               }
+               apkt = rpmBase64Encode(pkt, pktlen, -1);
+               rpmlog(RPMLOG_INFO, _("Aptk: %s\n"), apkt);
+               break;
        }
-       apkt = rpmBase64Encode(pkt, pktlen, -1);
-       rpmlog(RPMLOG_INFO, _("Aptk: %s\n"), apkt);
-       break;
-    }
     }
 
     if (!apkt) {
@@ -1588,6 +1642,448 @@ exit:
     return rc;
 }
 
+/* add a file with possible virtual attributes to the file list */
+static void argvAddAttr(ARGV_t *filesp, rpmfileAttrs attrs, const char *path)
+{
+    char *line = NULL;
+
+    for (VFA_t *vfa = virtualAttrs; vfa->attribute != NULL; vfa++) {
+       if (vfa->flag & attrs)
+           line = rstrscat(&line, vfa->attribute, " ", NULL);
+    }
+    line = rstrscat(&line, path, NULL);
+    argvAdd(filesp, line);
+    free(line);
+}
+
+#if HAVE_LIBDW
+/* How build id links are generated.  See macros.in for description.  */
+#define BUILD_IDS_NONE     0
+#define BUILD_IDS_ALLDEBUG 1
+#define BUILD_IDS_SEPARATE 2
+#define BUILD_IDS_COMPAT   3
+
+static int addNewIDSymlink(ARGV_t *files,
+                          char *targetpath, char *idlinkpath,
+                          int isDbg, int *dups)
+{
+    const char *linkerr = _("failed symlink");
+    int rc = 0;
+    int nr = 0;
+    int exists = 0;
+    char *origpath, *linkpath;
+
+    if (isDbg)
+       rasprintf(&linkpath, "%s.debug", idlinkpath);
+    else
+       linkpath = idlinkpath;
+    origpath = linkpath;
+
+    while (faccessat(AT_FDCWD, linkpath, F_OK, AT_SYMLINK_NOFOLLOW) == 0) {
+        /* We don't care about finding dups for compat links, they are
+          OK as is.  Otherwise we will need to double check if
+          existing link points to the correct target. */
+       if (dups == NULL)
+         {
+           exists = 1;
+           break;
+         }
+
+       char ltarget[PATH_MAX];
+       ssize_t llen;
+       /* In short-circuited builds the link might already exist  */
+       if ((llen = readlink(linkpath, ltarget, sizeof(ltarget)-1)) != -1) {
+           ltarget[llen] = '\0';
+           if (rstreq(ltarget, targetpath)) {
+               exists = 1;
+               break;
+           }
+       }
+
+       if (nr > 0)
+           free(linkpath);
+       nr++;
+       rasprintf(&linkpath, "%s.%d%s", idlinkpath, nr,
+                 isDbg ? ".debug" : "");
+    }
+
+    if (!exists && symlink(targetpath, linkpath) < 0) {
+       rc = 1;
+       rpmlog(RPMLOG_ERR, "%s: %s -> %s: %m\n",
+              linkerr, linkpath, targetpath);
+    } else {
+       argvAddAttr(files, RPMFILE_ARTIFACT, linkpath);
+    }
+
+    if (nr > 0) {
+       /* Lets see why there are multiple build-ids. If the original
+          targets are hard linked, then it is OK, otherwise warn
+          something fishy is going on. Would be nice to call
+          something like eu-elfcmp to see if they are really the same
+          ELF file or not. */
+       struct stat st1, st2;
+       if (stat (origpath, &st1) != 0) {
+           rpmlog(RPMLOG_WARNING, _("Duplicate build-id, stat %s: %m\n"),
+                  origpath);
+       } else if (stat (linkpath, &st2) != 0) {
+           rpmlog(RPMLOG_WARNING, _("Duplicate build-id, stat %s: %m\n"),
+                  linkpath);
+       } else if (!(S_ISREG(st1.st_mode) && S_ISREG(st2.st_mode)
+                 && st1.st_nlink > 1 && st2.st_nlink == st1.st_nlink
+                 && st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev)) {
+           char *rpath1 = realpath(origpath, NULL);
+           char *rpath2 = realpath(linkpath, NULL);
+           rpmlog(RPMLOG_WARNING, _("Duplicate build-ids %s and %s\n"),
+                  rpath1, rpath2);
+           free(rpath1);
+           free(rpath2);
+       }
+    }
+
+    if (isDbg)
+       free(origpath);
+    if (nr > 0)
+       free(linkpath);
+    if (dups != NULL)
+      *dups = nr;
+
+    return rc;
+}
+
+static int generateBuildIDs(FileList fl, ARGV_t *files)
+{
+    int rc = 0;
+    int i;
+    FileListRec flp;
+    char **ids = NULL;
+    char **paths = NULL;
+    size_t nr_ids, allocated;
+    nr_ids = allocated = 0;
+
+    /* How are we supposed to create the build-id links?  */
+    char *build_id_links_macro = rpmExpand("%{?_build_id_links}", NULL);
+    int build_id_links;
+    if (*build_id_links_macro == '\0') {
+       rpmlog(RPMLOG_WARNING,
+              _("_build_id_links macro not set, assuming 'compat'\n"));
+       build_id_links = BUILD_IDS_COMPAT;
+    } else if (strcmp(build_id_links_macro, "none") == 0) {
+       build_id_links = BUILD_IDS_NONE;
+    } else if (strcmp(build_id_links_macro, "alldebug") == 0) {
+       build_id_links = BUILD_IDS_ALLDEBUG;
+    } else if (strcmp(build_id_links_macro, "separate") == 0) {
+       build_id_links = BUILD_IDS_SEPARATE;
+    } else if (strcmp(build_id_links_macro, "compat") == 0) {
+       build_id_links = BUILD_IDS_COMPAT;
+    } else {
+       rc = 1;
+       rpmlog(RPMLOG_ERR,
+              _("_build_id_links macro set to unknown value '%s'\n"),
+              build_id_links_macro);
+       build_id_links = BUILD_IDS_NONE;
+    }
+    free(build_id_links_macro);
+
+    if (build_id_links == BUILD_IDS_NONE || rc != 0)
+       return rc;
+
+    /* Historically we have only checked build_ids when __debug_package
+       was defined. So don't terminate the build if __debug_package is
+       unset, even when _missing_build_ids_terminate_build is. */
+    int terminate = (rpmExpandNumeric("%{?_missing_build_ids_terminate_build}")
+                    && rpmExpandNumeric("%{?__debug_package}"));
+
+    /* Collect and check all build-ids for ELF files in this package.  */
+    int needMain = 0;
+    int needDbg = 0;
+    for (i = 0, flp = fl->files.recs; i < fl->files.used; i++, flp++) {
+       struct stat sbuf;
+       if (lstat(flp->diskPath, &sbuf) == 0 && S_ISREG (sbuf.st_mode)) {
+           /* We determine whether this is a main or
+              debug ELF based on path.  */
+           int isDbg = strncmp (flp->cpioPath,
+                                DEBUG_LIB_PREFIX, strlen (DEBUG_LIB_PREFIX)) == 0;
+
+           /* For the main package files mimic what find-debuginfo.sh does.
+              Only check build-ids for executable files. Debug files are
+              always non-executable. */
+           if (!isDbg
+               && (sbuf.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0)
+             continue;
+
+           int fd = open (flp->diskPath, O_RDONLY);
+           if (fd >= 0) {
+               /* Only real ELF files, that are ET_EXEC, ET_DYN or
+                  kernel modules (ET_REL files with names ending in .ko)
+                  should have build-ids. */
+               GElf_Ehdr ehdr;
+               Elf *elf = elf_begin (fd, ELF_C_READ, NULL);
+               if (elf != NULL && elf_kind(elf) == ELF_K_ELF
+                   && gelf_getehdr(elf, &ehdr) != NULL
+                   && (ehdr.e_type == ET_EXEC || ehdr.e_type == ET_DYN
+                       || (ehdr.e_type == ET_REL
+                           && rpmFileHasSuffix (flp->diskPath, ".ko")))) {
+                   const void *build_id;
+                   ssize_t len = dwelf_elf_gnu_build_id (elf, &build_id);
+                   /* len == -1 means error. Zero means no
+                      build-id. We want at least a length of 2 so we
+                      have at least a xx/yy (hex) dir/file. But
+                      reasonable build-ids are between 16 bytes (md5
+                      is 128 bits) and 64 bytes (largest sha3 is 512
+                      bits), common is 20 bytes (sha1 is 160 bits). */
+                   if (len >= 16 && len <= 64) {
+                       int addid = 0;
+                       if (isDbg) {
+                           needDbg = 1;
+                           addid = 1;
+                       }
+                       else if (build_id_links != BUILD_IDS_ALLDEBUG) {
+                           needMain = 1;
+                           addid = 1;
+                       }
+                       if (addid) {
+                           const unsigned char *p = build_id;
+                           const unsigned char *end = p + len;
+                           char *id_str;
+                           if (allocated <= nr_ids) {
+                               allocated += 16;
+                               paths = xrealloc (paths,
+                                                 allocated * sizeof(char *));
+                               ids = xrealloc (ids,
+                                               allocated * sizeof(char *));
+                           }
+
+                           paths[nr_ids] = xstrdup(flp->cpioPath);
+                           id_str = ids[nr_ids] = xmalloc(2 * len + 1);
+                           while (p < end)
+                               id_str += sprintf(id_str, "%02x",
+                                                 (unsigned)*p++);
+                           *id_str = '\0';
+                           nr_ids++;
+                       }
+                   } else {
+                       if (len < 0) {
+                           rpmlog(terminate ? RPMLOG_ERR : RPMLOG_WARNING,
+                                  _("error reading build-id in %s: %s\n"),
+                                  flp->diskPath, elf_errmsg (-1));
+                       } else if (len == 0) {
+                             rpmlog(terminate ? RPMLOG_ERR : RPMLOG_WARNING,
+                                    _("Missing build-id in %s\n"),
+                                    flp->diskPath);
+                       } else {
+                           rpmlog(terminate ? RPMLOG_ERR : RPMLOG_WARNING,
+                                  (len < 16
+                                   ? _("build-id found in %s too small\n")
+                                   : _("build-id found in %s too large\n")),
+                                  flp->diskPath);
+                       }
+                       if (terminate)
+                           rc = 1;
+                   }
+                   elf_end (elf);
+               }
+               close (fd);
+           }
+       }
+    }
+
+    /* Process and clean up all build-ids.  */
+    if (nr_ids > 0) {
+       const char *errdir = _("failed to create directory");
+       char *mainiddir = NULL;
+       char *debugiddir = NULL;
+       if (rc == 0) {
+           char *attrstr;
+           /* Add .build-id directories to hold the subdirs/symlinks.  */
+
+           mainiddir = rpmGetPath(fl->buildRoot, BUILD_ID_DIR, NULL);
+           debugiddir = rpmGetPath(fl->buildRoot, DEBUG_ID_DIR, NULL);
+
+           /* Make sure to reset all file flags to defaults.  */
+           attrstr = mkattr();
+           argvAdd(files, attrstr);
+           free (attrstr);
+
+           /* Supported, but questionable.  */
+           if (needMain && needDbg)
+               rpmlog(RPMLOG_WARNING,
+                      _("Mixing main ELF and debug files in package"));
+
+           if (needMain) {
+               if ((rc = rpmioMkpath(mainiddir, 0755, -1, -1)) != 0) {
+                   rpmlog(RPMLOG_ERR, "%s %s: %m\n", errdir, mainiddir);
+               } else {
+                   argvAddAttr(files, RPMFILE_DIR|RPMFILE_ARTIFACT, mainiddir);
+               }
+           }
+
+           if (rc == 0 && needDbg) {
+               if ((rc = rpmioMkpath(debugiddir, 0755, -1, -1)) != 0) {
+                   rpmlog(RPMLOG_ERR, "%s %s: %m\n", errdir, debugiddir);
+               } else {
+                   argvAddAttr(files, RPMFILE_DIR|RPMFILE_ARTIFACT, debugiddir);
+               }
+           }
+       }
+
+       /* In case we need ALLDEBUG links we might need the vra as
+          tagged onto the .debug file name. */
+       char *vra = NULL;
+       if (rc == 0 && needDbg && build_id_links == BUILD_IDS_ALLDEBUG) {
+           int unique_debug_names =
+               rpmExpandNumeric("%{?_unique_debug_names}");
+           if (unique_debug_names == 1)
+               vra = rpmExpand("-%{VERSION}-%{RELEASE}.%{_arch}", NULL);
+       }
+
+       /* Now add a subdir and symlink for each buildid found.  */
+       for (i = 0; i < nr_ids; i++) {
+           /* Don't add anything more when an error occurred. But do
+              cleanup.  */
+           if (rc == 0) {
+               int isDbg = strncmp (paths[i], DEBUG_LIB_PREFIX,
+                                    strlen (DEBUG_LIB_PREFIX)) == 0;
+
+               char *buildidsubdir;
+               char subdir[4];
+               subdir[0] = '/';
+               subdir[1] = ids[i][0];
+               subdir[2] = ids[i][1];
+               subdir[3] = '\0';
+               if (isDbg)
+                   buildidsubdir = rpmGetPath(debugiddir, subdir, NULL);
+               else
+                   buildidsubdir = rpmGetPath(mainiddir, subdir, NULL);
+               /* We only need to create and add the subdir once. */
+               int addsubdir = access (buildidsubdir, F_OK) == -1;
+               if (addsubdir
+                   && (rc = rpmioMkpath(buildidsubdir, 0755, -1, -1)) != 0) {
+                   rpmlog(RPMLOG_ERR, "%s %s: %m\n", errdir, buildidsubdir);
+               } else {
+                   if (addsubdir)
+                      argvAddAttr(files, RPMFILE_DIR|RPMFILE_ARTIFACT, buildidsubdir);
+                   if (rc == 0) {
+                       char *linkpattern, *targetpattern;
+                       char *linkpath, *targetpath;
+                       int dups = 0;
+                       if (isDbg) {
+                           linkpattern = "%s/%s";
+                           targetpattern = "../../../../..%s";
+                       } else {
+                           linkpattern = "%s/%s";
+                           targetpattern = "../../../..%s";
+                       }
+                       rasprintf(&linkpath, linkpattern,
+                                 buildidsubdir, &ids[i][2]);
+                       rasprintf(&targetpath, targetpattern, paths[i]);
+                       rc = addNewIDSymlink(files, targetpath, linkpath,
+                                            isDbg, &dups);
+
+                       /* We might want to have a link from the debug
+                          build_ids dir to the main one. We create it
+                          when we are creating compat links or doing
+                          an old style alldebug build-ids package. In
+                          the first case things are simple since we
+                          just link to the main build-id symlink. The
+                          second case is a bit tricky, since we
+                          cannot be 100% sure the file names in the
+                          main and debug package match. Currently
+                          they do, but when creating parallel
+                          installable debuginfo packages they might
+                          not (in that case we might have to also
+                          strip the nvr from the debug name).
+
+                          In general either method is discouraged
+                           since it might create dangling symlinks if
+                           the package versions get out of sync.  */
+                       if (rc == 0 && isDbg
+                           && build_id_links == BUILD_IDS_COMPAT) {
+                           /* buildidsubdir already points to the
+                              debug buildid. We just need to setup
+                              the symlink to the main one. There
+                              might be duplicate IDs, those are found
+                              by the addNewIDSymlink above. Target
+                              the last found duplicate, if any. */
+                           free(linkpath);
+                           free(targetpath);
+                           if (dups == 0)
+                             {
+                               rasprintf(&linkpath, "%s/%s",
+                                         buildidsubdir, &ids[i][2]);
+                               rasprintf(&targetpath,
+                                         "../../../.build-id%s/%s",
+                                         subdir, &ids[i][2]);
+                             }
+                           else
+                             {
+                               rasprintf(&linkpath, "%s/%s.%d",
+                                         buildidsubdir, &ids[i][2], dups);
+                               rasprintf(&targetpath,
+                                         "../../../.build-id%s/%s.%d",
+                                         subdir, &ids[i][2], dups);
+                             }
+                           rc = addNewIDSymlink(files, targetpath, linkpath,
+                                                0, NULL);
+                       }
+
+                       if (rc == 0 && isDbg
+                           && build_id_links == BUILD_IDS_ALLDEBUG) {
+                           /* buildidsubdir already points to the
+                              debug buildid. We do have to figure out
+                              the main ELF file though (which is most
+                              likely not in this package). Guess we
+                              can find it by stripping the
+                              /usr/lib/debug path and .debug
+                              prefix. Which might not really be
+                              correct if there was a more involved
+                              transformation (for example for
+                              parallel installable debuginfo
+                              packages), but then we shouldn't be
+                              using ALLDEBUG in the first place.
+                              Also ignore things like .dwz multifiles
+                              which don't end in ".debug". */
+                           int pathlen = strlen(paths[i]);
+                           int debuglen = strlen(".debug");
+                           int prefixlen = strlen(DEBUG_LIB_DIR);
+                           int vralen = vra == NULL ? 0 : strlen(vra);
+                           if (pathlen > prefixlen + debuglen + vralen
+                               && strcmp ((paths[i] + pathlen - debuglen),
+                                          ".debug") == 0) {
+                               free(linkpath);
+                               free(targetpath);
+                               char *targetstr = xstrdup (paths[i]
+                                                          + prefixlen);
+                               int targetlen = pathlen - prefixlen;
+                               int targetend = targetlen - debuglen - vralen;
+                               targetstr[targetend] = '\0';
+                               rasprintf(&linkpath, "%s/%s",
+                                         buildidsubdir, &ids[i][2]);
+                               rasprintf(&targetpath, "../../../../..%s",
+                                         targetstr);
+                               rc = addNewIDSymlink(files, targetpath,
+                                                    linkpath, 0, &dups);
+                               free(targetstr);
+                           }
+                       }
+                       free(linkpath);
+                       free(targetpath);
+                   }
+               }
+               free(buildidsubdir);
+           }
+           free(paths[i]);
+           free(ids[i]);
+       }
+       free(mainiddir);
+       free(debugiddir);
+       free(vra);
+       free(paths);
+       free(ids);
+    }
+    return rc;
+}
+#endif
+
 /**
  * Add a file to a binary package.
  * @param pkg
@@ -1647,16 +2143,13 @@ static rpmRC processBinaryFile(Package pkg, FileList fl, const char * fileName)
            }
            argvFree(argv);
        } else {
-           int lvl = RPMLOG_WARNING;
            const char *msg = (fl->cur.isDir) ?
-                               _("Directory not found by glob: %s\n") :
-                               _("File not found by glob: %s\n");
-           if (!(fl->cur.attrFlags & RPMFILE_EXCLUDE)) {
-               lvl = RPMLOG_ERR;
-               rc = RPMRC_FAIL;
-           }
-           rpmlog(lvl, msg, diskPath);
-           goto exit;
+                               _("Directory not found by glob: %s. "
+                               "Trying without globbing.\n") :
+                               _("File not found by glob: %s. "
+                               "Trying without globbing.\n");
+           rpmlog(RPMLOG_DEBUG, msg, diskPath);
+           rc = addFile(fl, diskPath, NULL);
        }
     } else {
        rc = addFile(fl, diskPath, NULL);
@@ -1676,6 +2169,8 @@ static rpmRC readFilesManifest(rpmSpec spec, Package pkg, const char *path)
     char *fn, buf[BUFSIZ];
     FILE *fd = NULL;
     rpmRC rc = RPMRC_FAIL;
+    unsigned int nlines = 0;
+    char *expanded;
 
     if (*path == '/') {
        fn = rpmGetPath(path, NULL);
@@ -1690,13 +2185,28 @@ static rpmRC readFilesManifest(rpmSpec spec, Package pkg, const char *path)
        goto exit;
     }
 
+    /* XXX unmask %license while parsing files manifest*/
+    rpmPushMacro(spec->macros, "license", NULL, "%%license", RMIL_SPEC);
+
     while (fgets(buf, sizeof(buf), fd)) {
-       handleComments(buf);
-       if (expandMacros(spec, spec->macros, buf, sizeof(buf))) {
+       if (handleComments(buf))
+           continue;
+       if (rpmExpandMacros(spec->macros, buf, &expanded, 0) < 0) {
            rpmlog(RPMLOG_ERR, _("line: %s\n"), buf);
            goto exit;
        }
-       argvAdd(&(pkg->fileList), buf);
+       argvAdd(&(pkg->fileList), expanded);
+       free(expanded);
+       nlines++;
+    }
+
+    if (nlines == 0) {
+       int terminate =
+               rpmExpandNumeric("%{?_empty_manifest_terminate_build}");
+       rpmlog(terminate ? RPMLOG_ERR : RPMLOG_WARNING,
+              _("Empty %%files file %s\n"), fn);
+       if (terminate)
+               goto exit;
     }
 
     if (ferror(fd))
@@ -1705,6 +2215,7 @@ static rpmRC readFilesManifest(rpmSpec spec, Package pkg, const char *path)
        rc = RPMRC_OK;
 
 exit:
+    rpmPopMacro(NULL, "license");
     if (fd) fclose(fd);
     free(fn);
     return rc;
@@ -1737,24 +2248,47 @@ static char * getSpecialDocDir(Header h, rpmFlags sdtype)
     return res;
 }
 
-static specialDir specialDirNew(Header h, rpmFlags sdtype,
-                               AttrRec ar, AttrRec def_ar)
+static specialDir specialDirNew(Header h, rpmFlags sdtype)
 {
     specialDir sd = xcalloc(1, sizeof(*sd));
-    dupAttrRec(ar, &(sd->ar));
-    dupAttrRec(def_ar, &(sd->def_ar));
+
+    sd->entriesCount = 0;
+    sd->entriesAlloced = 10;
+    sd->entries = xcalloc(sd->entriesAlloced, sizeof(sd->entries[0]));
+
     sd->dirname = getSpecialDocDir(h, sdtype);
     sd->sdtype = sdtype;
     return sd;
 }
 
+static void addSpecialFile(specialDir sd, const char *path, FileEntry cur,
+    FileEntry def)
+{
+    argvAdd(&sd->files, path);
+
+    if (sd->entriesCount >= sd->entriesAlloced) {
+       sd->entriesAlloced <<= 1;
+       sd->entries = xrealloc(sd->entries, sd->entriesAlloced *
+           sizeof(sd->entries[0]));
+    }
+
+    copyFileEntry(cur, &sd->entries[sd->entriesCount].curEntry);
+    copyFileEntry(def, &sd->entries[sd->entriesCount].defEntry);
+    sd->entriesCount++;
+}
+
 static specialDir specialDirFree(specialDir sd)
 {
+    int i = 0;
+
     if (sd) {
        argvFree(sd->files);
-       freeAttrRec(&(sd->ar));
-       freeAttrRec(&(sd->def_ar));
        free(sd->dirname);
+       for (i = 0; i < sd->entriesCount; i++) {
+           FileEntryFree(&sd->entries[i].curEntry);
+           FileEntryFree(&sd->entries[i].defEntry);
+       }
+       free(sd->entries);
        free(sd);
     }
     return NULL;
@@ -1767,10 +2301,13 @@ static void processSpecialDir(rpmSpec spec, Package pkg, FileList fl,
     const char *sdname = (sd->sdtype == RPMFILE_DOC) ? "%doc" : "%license";
     char *mkdocdir = rpmExpand("%{__mkdir_p} $", sdenv, NULL);
     StringBuf docScript = newStringBuf();
+    char *basepath, **files;
+    int fi;
 
     appendStringBuf(docScript, sdenv);
     appendStringBuf(docScript, "=$RPM_BUILD_ROOT");
     appendLineStringBuf(docScript, sd->dirname);
+    appendLineStringBuf(docScript, "export LC_ALL=C");
     appendStringBuf(docScript, "export ");
     appendLineStringBuf(docScript, sdenv);
     appendLineStringBuf(docScript, mkdocdir);
@@ -1781,7 +2318,8 @@ static void processSpecialDir(rpmSpec spec, Package pkg, FileList fl,
        appendStringBuf(docScript, "cp -pr ");
        appendStringBuf(docScript, efn);
        appendStringBuf(docScript, " $");
-       appendLineStringBuf(docScript, sdenv);
+       appendStringBuf(docScript, sdenv);
+       appendLineStringBuf(docScript, " ||:");
        free(efn);
     }
 
@@ -1793,52 +2331,77 @@ static void processSpecialDir(rpmSpec spec, Package pkg, FileList fl,
            fl->processingFailed = 1;
     }
 
-    /* Reset for %doc */
-    FileEntryFree(&fl->cur);
-
-    fl->cur.attrFlags |= sd->sdtype;
-    fl->cur.verifyFlags = fl->def.verifyFlags;
-    dupAttrRec(&(sd->ar), &(fl->cur.ar));
-    dupAttrRec(&(sd->def_ar), &(fl->def.ar));
+    basepath = rpmGenPath(spec->rootDir, "%{_builddir}", spec->buildSubdir);
+    files = sd->files;
+    fi = 0;
+    while (*files != NULL) {
+       char *origfile = rpmGenPath(basepath, *files, NULL);
+       char *eorigfile = rpmEscapeSpaces(origfile);
+       ARGV_t globFiles;
+       int globFilesCount, i;
+       char *newfile;
+
+       FileEntryFree(&fl->cur);
+       FileEntryFree(&fl->def);
+       copyFileEntry(&sd->entries[fi].curEntry, &fl->cur);
+       copyFileEntry(&sd->entries[fi].defEntry, &fl->def);
+       fi++;
+
+       if (rpmGlob(eorigfile, &globFilesCount, &globFiles) == 0) {
+           for (i = 0; i < globFilesCount; i++) {
+               rasprintf(&newfile, "%s/%s", sd->dirname, basename(globFiles[i]));
+               processBinaryFile(pkg, fl, newfile);
+               free(newfile);
+           }
+           argvFree(globFiles);
+       } else {
+           rpmlog(RPMLOG_ERR, _("File not found by glob: %s\n"), eorigfile);
+           fl->processingFailed = 1;
+       }
+       free(eorigfile);
+       free(origfile);
+       files++;
+    }
+    free(basepath);
 
+    FileEntryFree(&fl->cur);
+    FileEntryFree(&fl->def);
+    copyFileEntry(&sd->entries[0].defEntry, &fl->def);
+    fl->cur.isDir = 1;
     (void) processBinaryFile(pkg, fl, sd->dirname);
 
     freeStringBuf(docScript);
     free(mkdocdir);
 }
-                               
 
-static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
-                                Package pkg, int installSpecialDoc, int test)
+
+/* Resets the default settings for files in the package list.
+   Used in processPackageFiles whenever a new set of files is added. */
+static void resetPackageFilesDefaults (struct FileList_s *fl,
+                                      rpmBuildPkgFlags pkgFlags)
 {
-    struct FileList_s fl;
-    ARGV_t fileNames = NULL;
-    specialDir specialDoc = NULL;
-    specialDir specialLic = NULL;
+    struct AttrRec_s root_ar = { 0, 0, 0, 0, 0, 0 };
 
-    pkg->cpioList = NULL;
+    root_ar.ar_user = rpmstrPoolId(fl->pool, UID_0_USER, 1);
+    root_ar.ar_group = rpmstrPoolId(fl->pool, GID_0_GROUP, 1);
+    dupAttrRec(&root_ar, &fl->def.ar); /* XXX assume %defattr(-,root,root) */
 
-    for (ARGV_const_t fp = pkg->fileFile; fp && *fp != NULL; fp++) {
-       if (readFilesManifest(spec, pkg, *fp))
-           return RPMRC_FAIL;
-    }
-    /* Init the file list structure */
-    memset(&fl, 0, sizeof(fl));
+    fl->def.verifyFlags = RPMVERIFY_ALL;
 
-    /* XXX spec->buildRoot == NULL, then xstrdup("") is returned */
-    fl.buildRoot = rpmGenPath(spec->rootDir, spec->buildRoot, NULL);
-
-    dupAttrRec(&root_ar, &fl.def.ar);  /* XXX assume %defattr(-,root,root) */
-    fl.def.verifyFlags = RPMVERIFY_ALL;
-
-    fl.pkgFlags = pkgFlags;
+    fl->pkgFlags = pkgFlags;
+}
 
-    {  char *docs = rpmGetPath("%{?__docdir_path}", NULL);
-       argvSplit(&fl.docDirs, docs, ":");
-       free(docs);
-    }
-    
-    for (ARGV_const_t fp = pkg->fileList; *fp != NULL; fp++) {
+/* Adds the given fileList to the package. If fromSpecFileList is not zero
+   then the specialDirs are also filled in and the files are sanitized
+   through processBinaryFile(). Otherwise no special files are processed
+   and the files are added directly through addFile().  */
+static void addPackageFileList (struct FileList_s *fl, Package pkg,
+                               ARGV_t *fileList,
+                               specialDir *specialDoc, specialDir *specialLic,
+                               int fromSpecFileList)
+{
+    ARGV_t fileNames = NULL;
+    for (ARGV_const_t fp = *fileList; *fp != NULL; fp++) {
        char buf[strlen(*fp) + 1];
        const char *s = *fp;
        SKIPSPACE(s);
@@ -1848,92 +2411,169 @@ static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
        rstrlcpy(buf, s, sizeof(buf));
        
        /* Reset for a new line in %files */
-       FileEntryFree(&fl.cur);
+       FileEntryFree(&fl->cur);
 
        /* turn explicit flags into %def'd ones (gosh this is hacky...) */
-       fl.cur.specdFlags = ((unsigned)fl.def.specdFlags) >> 8;
-       fl.cur.verifyFlags = fl.def.verifyFlags;
-
-       if (parseForVerify(buf, 0, &fl.cur) ||
-           parseForVerify(buf, 1, &fl.def) ||
-           parseForAttr(buf, 0, &fl.cur) ||
-           parseForAttr(buf, 1, &fl.def) ||
-           parseForDev(buf, &fl.cur) ||
-           parseForConfig(buf, &fl.cur) ||
-           parseForLang(buf, &fl.cur) ||
-           parseForCaps(buf, &fl.cur) ||
-           parseForSimple(buf, &fl.cur, &fileNames))
+       fl->cur.specdFlags = ((unsigned)fl->def.specdFlags) >> 8;
+       fl->cur.verifyFlags = fl->def.verifyFlags;
+
+       if (parseForVerify(buf, 0, &fl->cur) ||
+           parseForVerify(buf, 1, &fl->def) ||
+           parseForAttr(fl->pool, buf, 0, &fl->cur) ||
+           parseForAttr(fl->pool, buf, 1, &fl->def) ||
+           parseForDev(buf, &fl->cur) ||
+           parseForConfig(buf, &fl->cur) ||
+           parseForLang(buf, &fl->cur) ||
+           parseForCaps(buf, &fl->cur) ||
+           parseForSimple(buf, &fl->cur, &fileNames))
        {
-           fl.processingFailed = 1;
+           fl->processingFailed = 1;
            continue;
        }
 
        for (ARGV_const_t fn = fileNames; fn && *fn; fn++) {
-           if (fl.cur.attrFlags & RPMFILE_SPECIALDIR) {
-               rpmFlags oattrs = (fl.cur.attrFlags & ~RPMFILE_SPECIALDIR);
+
+           /* For file lists that don't come from a spec file list
+              processing is easy. There are no special files and the
+              file names don't need to be adjusted. */
+           if (!fromSpecFileList) {
+               if (fl->cur.attrFlags & RPMFILE_SPECIALDIR
+                   || fl->cur.attrFlags & RPMFILE_DOCDIR
+                   || fl->cur.attrFlags & RPMFILE_PUBKEY) {
+                       rpmlog(RPMLOG_ERR,
+                              _("Special file in generated file list: %s\n"),
+                              *fn);
+                       fl->processingFailed = 1;
+                       continue;
+               }
+               if (fl->cur.attrFlags & RPMFILE_DIR)
+                   fl->cur.isDir = 1;
+               addFile(fl, *fn, NULL);
+               continue;
+           }
+
+           /* File list does come from the spec, try to detect special
+              files and adjust the actual file names.  */
+           if (fl->cur.attrFlags & RPMFILE_SPECIALDIR) {
+               rpmFlags oattrs = (fl->cur.attrFlags & ~RPMFILE_SPECIALDIR);
                specialDir *sdp = NULL;
                if (oattrs == RPMFILE_DOC) {
-                   sdp = &specialDoc;
+                   sdp = specialDoc;
                } else if (oattrs == RPMFILE_LICENSE) {
-                   sdp = &specialLic;
+                   sdp = specialLic;
                }
 
                if (sdp == NULL || **fn == '/') {
                    rpmlog(RPMLOG_ERR,
                           _("Can't mix special %s with other forms: %s\n"),
                           (oattrs & RPMFILE_DOC) ? "%doc" : "%license", *fn);
-                   fl.processingFailed = 1;
+                   fl->processingFailed = 1;
                    continue;
                }
 
                /* save attributes on first special doc/license for later use */
                if (*sdp == NULL) {
-                   *sdp = specialDirNew(pkg->header, oattrs,
-                                        &fl.cur.ar, &fl.def.ar);
+                   *sdp = specialDirNew(pkg->header, oattrs);
                }
-               argvAdd(&(*sdp)->files, *fn);
+               addSpecialFile(*sdp, *fn, &fl->cur, &fl->def);
                continue;
            }
 
            /* this is now an artificial limitation */
            if (fn != fileNames) {
                rpmlog(RPMLOG_ERR, _("More than one file on a line: %s\n"),*fn);
-               fl.processingFailed = 1;
+               fl->processingFailed = 1;
                continue;
            }
 
-           if (fl.cur.attrFlags & RPMFILE_DOCDIR) {
-               argvAdd(&(fl.docDirs), *fn);
-           } else if (fl.cur.attrFlags & RPMFILE_PUBKEY) {
-               (void) processMetadataFile(pkg, &fl, *fn, RPMTAG_PUBKEYS);
-           } else if (fl.cur.attrFlags & RPMFILE_SECMANIFEST) {
-               (void) processMetadataFile(pkg, &fl, *fn, RPMTAG_SECMANIFEST);
-           else {
-               if (fl.cur.attrFlags & RPMFILE_DIR)
-                   fl.cur.isDir = 1;
-               (void) processBinaryFile(pkg, &fl, *fn);
+           if (fl->cur.attrFlags & RPMFILE_DOCDIR) {
+               argvAdd(&(fl->docDirs), *fn);
+           } else if (fl->cur.attrFlags & RPMFILE_PUBKEY) {
+               (void) processMetadataFile(pkg, fl, *fn, RPMTAG_PUBKEYS);
+           } else if (fl->cur.attrFlags & RPMFILE_SECMANIFEST) {
+                       (void) processMetadataFile(pkg, fl, *fn, RPMTAG_SECMANIFEST);
+               }else {
+                       if (fl->cur.attrFlags & RPMFILE_DIR)
+                       fl->cur.isDir = 1;
+               (void) processBinaryFile(pkg, fl, *fn);
            }
        }
 
-       if (fl.cur.caps)
-           fl.haveCaps = 1;
+       if (fl->cur.caps)
+           fl->haveCaps = 1;
     }
+    argvFree(fileNames);
+}
+
+static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
+                                Package pkg, int didInstall, int test)
+{
+    struct FileList_s fl;
+    specialDir specialDoc = NULL;
+    specialDir specialLic = NULL;
+
+    pkg->cpioList = NULL;
+
+    for (ARGV_const_t fp = pkg->fileFile; fp && *fp != NULL; fp++) {
+       if (readFilesManifest(spec, pkg, *fp))
+           return RPMRC_FAIL;
+    }
+    /* Init the file list structure */
+    memset(&fl, 0, sizeof(fl));
+
+    fl.pool = rpmstrPoolLink(spec->pool);
+    /* XXX spec->buildRoot == NULL, then xstrdup("") is returned */
+    fl.buildRoot = rpmGenPath(spec->rootDir, spec->buildRoot, NULL);
+    fl.buildRootLen = strlen(fl.buildRoot);
+
+    resetPackageFilesDefaults (&fl, pkgFlags);
+
+    {  char *docs = rpmGetPath("%{?__docdir_path}", NULL);
+       argvSplit(&fl.docDirs, docs, ":");
+       free(docs);
+    }
+
+    addPackageFileList (&fl, pkg, &pkg->fileList,
+                       &specialDoc, &specialLic, 1);
 
     /* Now process special docs and licenses if present */
     if (specialDoc)
-       processSpecialDir(spec, pkg, &fl, specialDoc, installSpecialDoc, test);
+       processSpecialDir(spec, pkg, &fl, specialDoc, didInstall, test);
     if (specialLic)
-       processSpecialDir(spec, pkg, &fl, specialLic, installSpecialDoc, test);
+       processSpecialDir(spec, pkg, &fl, specialLic, didInstall, test);
     
     if (fl.processingFailed)
        goto exit;
 
+#if HAVE_LIBDW
+    /* Check build-ids and add build-ids links for files to package list. */
+    const char *arch = headerGetString(pkg->header, RPMTAG_ARCH);
+    if (!rstreq(arch, "noarch")) {
+       /* Go through the current package list and generate a files list. */
+       ARGV_t idFiles = NULL;
+       if (generateBuildIDs (&fl, &idFiles) != 0) {
+           rpmlog(RPMLOG_ERR, _("Generating build-id links failed\n"));
+           fl.processingFailed = 1;
+           argvFree(idFiles);
+           goto exit;
+       }
+
+       if (idFiles != NULL) {
+           resetPackageFilesDefaults (&fl, pkgFlags);
+           addPackageFileList (&fl, pkg, &idFiles, NULL, NULL, 0);
+       }
+       argvFree(idFiles);
+
+       if (fl.processingFailed)
+           goto exit;
+    }
+#endif
+
     /* Verify that file attributes scope over hardlinks correctly. */
     if (checkHardLinks(&fl.files))
-       (void) rpmlibNeedsFeature(pkg->header,
-                       "PartialHardlinkSets", "4.0.4-1");
+       (void) rpmlibNeedsFeature(pkg, "PartialHardlinkSets", "4.0.4-1");
 
-    genCpioListAndHeader(&fl, &pkg->cpioList, pkg->header, 0);
+    genCpioListAndHeader(&fl, pkg, 0);
 
 exit:
     FileListFree(&fl);
@@ -1958,6 +2598,7 @@ rpmRC processSourceFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags)
     struct FileList_s fl;
     ARGV_t files = NULL;
     Package pkg;
+    Package sourcePkg = spec->sourcePackage;
     static char *_srcdefattr;
     static int oneshot;
 
@@ -1988,13 +2629,14 @@ rpmRC processSourceFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags)
        }
     }
 
-    spec->sourceCpioList = NULL;
+    sourcePkg->cpioList = NULL;
 
     /* Init the file list structure */
     memset(&fl, 0, sizeof(fl));
+    fl.pool = rpmstrPoolLink(spec->pool);
     if (_srcdefattr) {
        char *a = rstrscat(NULL, "%defattr ", _srcdefattr, NULL);
-       parseForAttr(a, 1, &fl.def);
+       parseForAttr(fl.pool, a, 1, &fl.def);
        free(a);
     }
     fl.files.alloced = spec->numSources + 1;
@@ -2039,31 +2681,39 @@ rpmRC processSourceFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags)
            flp->fl_mode &= S_IFMT;
            flp->fl_mode |= fl.def.ar.ar_fmode;
        }
+
        if (fl.def.ar.ar_user) {
-           flp->uname = rpmugStashStr(fl.def.ar.ar_user);
+           flp->uname = fl.def.ar.ar_user;
        } else {
-           flp->uname = rpmugStashStr(rpmugUname(flp->fl_uid));
+           flp->uname = rpmstrPoolId(fl.pool, rpmugUname(flp->fl_uid), 1);
        }
+       if (! flp->uname) {
+           flp->uname = rpmstrPoolId(fl.pool, rpmugUname(getuid()), 1);
+       }
+       if (! flp->uname) {
+           flp->uname = rpmstrPoolId(fl.pool, UID_0_USER, 1);
+       }
+
        if (fl.def.ar.ar_group) {
-           flp->gname = rpmugStashStr(fl.def.ar.ar_group);
+           flp->gname = fl.def.ar.ar_group;
        } else {
-           flp->gname = rpmugStashStr(rpmugGname(flp->fl_gid));
+           flp->gname = rpmstrPoolId(fl.pool, rpmugGname(flp->fl_gid), 1);
        }
-       flp->langs = xstrdup("");
-       
-       if (! (flp->uname && flp->gname)) {
-           rpmlog(RPMLOG_ERR, _("Bad owner/group: %s\n"), diskPath);
-           fl.processingFailed = 1;
+       if (! flp->gname) {
+           flp->gname = rpmstrPoolId(fl.pool, rpmugGname(getgid()), 1);
+       }
+       if (! flp->gname) {
+           flp->gname = rpmstrPoolId(fl.pool, GID_0_GROUP, 1);
        }
 
+       flp->langs = xstrdup("");
        fl.files.used++;
     }
     argvFree(files);
 
     if (! fl.processingFailed) {
-       if (spec->sourceHeader != NULL) {
-           genCpioListAndHeader(&fl, &spec->sourceCpioList,
-                       spec->sourceHeader, 1);
+       if (sourcePkg->header != NULL) {
+           genCpioListAndHeader(&fl, sourcePkg, 1);
        }
     }
 
@@ -2073,6 +2723,7 @@ rpmRC processSourceFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags)
 
 /**
  * Check packaged file list against what's in the build root.
+ * @param buildRoot    path of build root
  * @param fileList     packaged file list
  * @return             -1 if skipped, 0 on OK, 1 on error
  */
@@ -2109,245 +2760,370 @@ exit:
     return rc;
 }
 
-#if HAVE_GELF_H && HAVE_LIBELF
-/* Query the build-id from the ELF file NAME and store it in the newly
-   allocated *build_id array of size *build_id_size.  Returns -1 on
-   error.  */
+static rpmTag copyTagsFromMainDebug[] = {
+    RPMTAG_ARCH,
+    RPMTAG_SUMMARY,
+    RPMTAG_DESCRIPTION,
+    RPMTAG_GROUP,
+    /* see addTargets */
+    RPMTAG_OS,
+    RPMTAG_PLATFORM,
+    RPMTAG_OPTFLAGS,
+};
 
-int
-getELFBuildId (const char *name,
-              unsigned char **id, size_t *id_size)
+/* this is a hack: patch the summary and the description to include
+ * the correct package name */
+static void patchDebugPackageString(Package dbg, rpmTag tag, Package pkg, Package mainpkg)
 {
-  int fd, i;
-  Elf *elf;
-  GElf_Ehdr ehdr;
-  Elf_Data *build_id = NULL;
-  size_t build_id_offset = 0, build_id_size = 0;
-
-  /* Now query the build-id of the file and add the
-     corresponding links in the .build-id tree.
-     The following code is based on tools/debugedit.c.  */
-  fd = open (name, O_RDONLY);
-  if (fd < 0)
-    return -1;
-  elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
-  if (elf == NULL)
-    {
-      fprintf (stderr, "cannot open ELF file: %s",
-              elf_errmsg (-1));
-      close (fd);
-      return -1;
-    }
-  if (elf_kind (elf) != ELF_K_ELF
-      || gelf_getehdr (elf, &ehdr) == NULL
-      || (ehdr.e_type != ET_DYN
-         && ehdr.e_type != ET_EXEC
-         && ehdr.e_type != ET_REL))
-    {
-      elf_end (elf);
-      close (fd);
-      return -1;
-    }
-  for (i = 0; i < ehdr.e_shnum; ++i)
-    {
-      Elf_Scn *s = elf_getscn (elf, i);
-      GElf_Shdr shdr;
-      Elf_Data *data;
-      Elf32_Nhdr nh;
-      Elf_Data dst =
-       {
-         .d_version = EV_CURRENT, .d_type = ELF_T_NHDR,
-         .d_buf = &nh, .d_size = sizeof nh
-       };
-      Elf_Data src = dst;
-
-      gelf_getshdr (s, &shdr);
-      if (shdr.sh_type != SHT_NOTE
-         || !(shdr.sh_flags & SHF_ALLOC))
-       continue;
-
-      /* Look for a build-ID note here.  */
-      data = elf_rawdata (s, NULL);
-      src.d_buf = data->d_buf;
-      assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));
-      while (data->d_buf + data->d_size - src.d_buf > (int) sizeof nh
-            && elf32_xlatetom (&dst, &src, ehdr.e_ident[EI_DATA]))
-       {
-         Elf32_Word len = sizeof nh + nh.n_namesz;
-         len = (len + 3) & ~3;
+    const char *oldname, *newname, *old;
+    char *oldsubst = NULL, *newsubst = NULL, *p;
+    oldname = headerGetString(mainpkg->header, RPMTAG_NAME);
+    newname = headerGetString(pkg->header, RPMTAG_NAME);
+    rasprintf(&oldsubst, "package %s", oldname);
+    rasprintf(&newsubst, "package %s", newname);
+    old = headerGetString(dbg->header, tag);
+    p = old ? strstr(old, oldsubst) : NULL;
+    if (p) {
+       char *new = NULL;
+       rasprintf(&new, "%.*s%s%s", (int)(p - old), old, newsubst, p + strlen(oldsubst));
+       headerDel(dbg->header, tag);
+       headerPutString(dbg->header, tag, new);
+       _free(new);
+    }
+    _free(oldsubst);
+    _free(newsubst);
+}
 
-         if (nh.n_namesz == sizeof "GNU" && nh.n_type == 3
-             && !memcmp (src.d_buf + sizeof nh, "GNU", sizeof "GNU"))
-           {
-             build_id = data;
-             build_id_offset = src.d_buf + len - data->d_buf;
-             build_id_size = nh.n_descsz;
-             break;
-           }
+/* Early prototype for use in filterDebuginfoPackage. */
+static void addPackageDeps(Package from, Package to, enum rpmTag_e tag);
 
-         len += nh.n_descsz;
-         len = (len + 3) & ~3;
-         src.d_buf += len;
-       }
+/* create a new debuginfo subpackage for package pkg from the
+ * main debuginfo package */
+static Package cloneDebuginfoPackage(rpmSpec spec, Package pkg, Package maindbg)
+{
+    const char *name = headerGetString(pkg->header, RPMTAG_NAME);
+    char *dbgname = NULL;
+    Package dbg;
+
+    rasprintf(&dbgname, "%s-%s", name, "debuginfo");
+    dbg = newPackage(dbgname, spec->pool, &spec->packages);
+    headerPutString(dbg->header, RPMTAG_NAME, dbgname);
+    copyInheritedTags(dbg->header, pkg->header);
+    headerDel(dbg->header, RPMTAG_GROUP);
+    headerCopyTags(maindbg->header, dbg->header, copyTagsFromMainDebug);
+    dbg->autoReq = maindbg->autoReq;
+    dbg->autoProv = maindbg->autoProv;
+
+    /* patch summary and description strings */
+    patchDebugPackageString(dbg, RPMTAG_SUMMARY, pkg, spec->packages);
+    patchDebugPackageString(dbg, RPMTAG_DESCRIPTION, pkg, spec->packages);
+
+    /* Add self-provides (normally done by addTargets) */
+    addPackageProvides(dbg);
+    dbg->ds = rpmdsThis(dbg->header, RPMTAG_REQUIRENAME, RPMSENSE_EQUAL);
+
+    _free(dbgname);
+    return dbg;
+}
 
-      if (build_id != NULL)
-       break;
-    }
+/* collect the debug files for package pkg and put them into
+ * a (possibly new) debuginfo subpackage */
+static void filterDebuginfoPackage(rpmSpec spec, Package pkg,
+                                  Package maindbg, Package dbgsrc,
+                                  char *buildroot, char *uniquearch)
+{
+    rpmfi fi;
+    ARGV_t files = NULL;
+    ARGV_t dirs = NULL;
+    int lastdiridx = -1, dirsadded;
+    char *path = NULL, *p, *pmin;
+    size_t buildrootlen = strlen(buildroot);
 
-  if (build_id == NULL)
-    return -1;
+    /* ignore noarch subpackages */
+    if (rstreq(headerGetString(pkg->header, RPMTAG_ARCH), "noarch"))
+       return;
 
-  *id = malloc (build_id_size);
-  *id_size = build_id_size;
-  memcpy (*id, build_id->d_buf + build_id_offset, build_id_size);
+    if (!uniquearch)
+       uniquearch = "";
+
+    fi = rpmfilesIter(pkg->cpioList, RPMFI_ITER_FWD);
+    /* Check if the current package has files with debug info
+       and add them to the file list */
+    fi = rpmfiInit(fi, 0);
+    while (rpmfiNext(fi) >= 0) {
+       const char *name = rpmfiFN(fi);
+       int namel = strlen(name);
+
+       /* strip trailing .debug like in find-debuginfo.sh */
+       if (namel > 6 && !strcmp(name + namel - 6, ".debug"))
+           namel -= 6;
+
+       /* fileRenameMap doesn't necessarily have to be initialized */
+       if (pkg->fileRenameMap) {
+           const char **names = NULL;
+           int namec = 0;
+           fileRenameHashGetEntry(pkg->fileRenameMap, name, &names, &namec, NULL);
+           if (namec) {
+               if (namec > 1)
+                   rpmlog(RPMLOG_WARNING, _("%s was mapped to multiple filenames"), name);
+               name = *names;
+               namel = strlen(name);
+           }
+       }
+       
+       /* generate path */
+       rasprintf(&path, "%s%s%.*s%s.debug", buildroot, DEBUG_LIB_DIR, namel, name, uniquearch);
+
+       /* If that file exists we have debug information for it */
+       if (access(path, F_OK) == 0) {
+           /* Append the file list preamble */
+           if (!files) {
+               char *attr = mkattr();
+               argvAdd(&files, attr);
+               argvAddAttr(&files, RPMFILE_DIR, DEBUG_LIB_DIR);
+               free(attr);
+           }
 
-  elf_end (elf);
-  close (fd);
+           /* Add the files main debug-info file */
+           argvAdd(&files, path + buildrootlen);
+
+           /* Add the dir(s) */
+           dirsadded = 0;
+           pmin = path + buildrootlen + strlen(DEBUG_LIB_DIR);
+           while ((p = strrchr(path + buildrootlen, '/')) != NULL && p > pmin) {
+               *p = 0;
+               if (lastdiridx >= 0 && !strcmp(dirs[lastdiridx], path + buildrootlen))
+                   break;              /* already added this one */
+               argvAdd(&dirs, path + buildrootlen);
+               dirsadded++;
+           }
+           if (dirsadded)
+               lastdiridx = argvCount(dirs) - dirsadded;       /* remember longest dir */
+       }
+       path = _free(path);
+    }
+    rpmfiFree(fi);
+    /* Exclude debug files for files which were excluded in respective non-debug package */
+    for (ARGV_const_t excl = pkg->fileExcludeList; excl && *excl; excl++) {
+        const char *name = *excl;
+
+       /* generate path */
+       rasprintf(&path, "%s%s%s%s.debug", buildroot, DEBUG_LIB_DIR, name, uniquearch);
+       /* Exclude only debuginfo files which actually exist */
+       if (access(path, F_OK) == 0) {
+           char *line = NULL;
+           rasprintf(&line, "%%exclude %s", path + buildrootlen);
+           argvAdd(&files, line);
+           _free(line);
+       }
+       path = _free(path);
+    }
 
-  return 0;
-}
+    /* add collected directories to file list */
+    if (dirs) {
+       int i;
+       argvSort(dirs, NULL);
+       for (i = 0; dirs[i]; i++) {
+           if (!i || strcmp(dirs[i], dirs[i - 1]) != 0)
+               argvAddAttr(&files, RPMFILE_DIR, dirs[i]);
+       }
+       dirs = argvFree(dirs);
+    }
 
+    if (files) {
+       /* Add security manifest to set right SMACK labels */
+       argvAdd(&files, "%manifest %{name}-debuginfo.manifest");
 
-static rpmTag copyTagsForDebug[] = {
-    RPMTAG_EPOCH,
-    RPMTAG_VERSION,
-    RPMTAG_RELEASE,
-    RPMTAG_LICENSE,
-    RPMTAG_PACKAGER,
-    RPMTAG_DISTRIBUTION,
-    RPMTAG_DISTURL,
-    RPMTAG_VENDOR,
-    RPMTAG_ICON,
-    RPMTAG_URL,
-    RPMTAG_CHANGELOGTIME,
-    RPMTAG_CHANGELOGNAME,
-    RPMTAG_CHANGELOGTEXT,
-    RPMTAG_PREFIXES,
-    RPMTAG_RHNPLATFORM,
-    RPMTAG_OS,
-    RPMTAG_DISTTAG,
-    RPMTAG_CVSID,
-    RPMTAG_ARCH,
-    0
-};
+       /* we have collected some files. Now put them in a debuginfo
+         * package. If this is not the main package, clone the main
+         * debuginfo package */
+       if (pkg == spec->packages) {
+           maindbg->fileList = files;
+            /*free maindb_fileList_bakup and set to NULL*/
+            maindb_fileList_bakup = argvFree(maindb_fileList_bakup);
+       }
+       else {
+           Package dbg = cloneDebuginfoPackage(spec, pkg, maindbg);
+           dbg->fileList = files;
+           /* Recommend the debugsource package (or the main debuginfo).  */
+           addPackageDeps(dbg, dbgsrc ? dbgsrc : maindbg,
+                          RPMTAG_RECOMMENDNAME);
+       }
+    } else {
+       /*To allow generate debuginfo package which is written in spec file,  even there is no .debug files*/
+        if (pkg == spec->packages && headerGetString(maindbg->header,RPMTAG_MULTIFILELIST)) {
+            rpmlog(RPMLOG_WARNING, "user rewrite %%file debuginfo to pack something\n");
+            maindbg->fileList = maindb_fileList_bakup;
+            maindb_fileList_bakup = NULL;
+            headerDel(maindbg->header,RPMTAG_MULTIFILELIST);
+       }
+    }
+}
 
-static void addDebuginfoPackage(rpmSpec spec, Package pkg, char *buildroot)
+/* add the debug dwz files to package pkg.
+ * return 1 if something was added, 0 otherwise. */
+static int addDebugDwz(Package pkg, char *buildroot)
 {
-    const char *a;
-
-    elf_version(EV_CURRENT);
-    a = headerGetString(pkg->header, RPMTAG_ARCH);
-    if (strcmp(a, "noarch") != 0 && strcmp(a, "src") != 0 && strcmp(a, "nosrc") != 0)
-      {
-       Package dbg;
-       rpmfi fi = pkg->cpioList;
-       char tmp[1024];
-       const char *name;
-       ARGV_t files = NULL;
-       int seen_build_id = 0;
-
-       /* Check if the current package has files with debug info
-          and record them.  */
-       fi = rpmfiInit (fi, 0);
-       while (rpmfiNext (fi) >= 0)
-         {
-           const char *base;
-           int i;
-           unsigned char *build_id;
-           size_t build_id_size = 0;
-           struct stat sbuf;
-
-           name = rpmfiFN (fi);
-           /* Skip leading buildroot.  */
-           base = name + strlen (buildroot);
-           /* Pre-pend %buildroot/usr/lib/debug and append .debug.  */
-           snprintf (tmp, 1024, "%s/usr/lib/debug%s.debug",
-                     buildroot, base);
-           /* If that file exists we have debug information for it.  */
-           if (access (tmp, F_OK) != 0)
-             continue;
+    int ret = 0;
+    char *path = NULL;
+    struct stat sbuf;
+
+    rasprintf(&path, "%s%s", buildroot, DEBUG_DWZ_DIR);
+    if (lstat(path, &sbuf) == 0 && S_ISDIR(sbuf.st_mode)) {
+       if (!pkg->fileList) {
+           char *attr = mkattr();
+           argvAdd(&pkg->fileList, attr);
+           argvAddAttr(&pkg->fileList, RPMFILE_DIR|RPMFILE_ARTIFACT, DEBUG_LIB_DIR);
+           free(attr);
+       }
+       argvAddAttr(&pkg->fileList, RPMFILE_ARTIFACT, DEBUG_DWZ_DIR);
+       ret = 1;
+    }
+    path = _free(path);
+    return ret;
+}
 
-           /* Append the file list preamble.  */
-           if (!files)
-             {
-               argvAdd(&files, "%defattr(-,root,root)");
-               argvAdd(&files, "%dir /usr/lib/debug");
-             }
-           /* Add the files main debug-info file.  */
-           snprintf (tmp, 1024, "/usr/lib/debug/%s.debug", base);
-           argvAdd(&files, tmp);
-
-           /* Do not bother to check build-ids for symbolic links.
-              We'll handle them for the link target.  */
-           if (lstat (name, &sbuf) == -1
-               || S_ISLNK (sbuf.st_mode))
-             continue;
+/* add the debug source files to package pkg.
+ * return 1 if something was added, 0 otherwise. */
+static int addDebugSrc(Package pkg, char *buildroot)
+{
+    int ret = 0;
+    char *path = NULL;
+    DIR *d;
+    struct dirent *de;
+
+    /* not needed if we have an extra debugsource subpackage */
+    if (rpmExpandNumeric("%{?_debugsource_packages}"))
+       return 0;
+
+    rasprintf(&path, "%s%s", buildroot, DEBUG_SRC_DIR);
+    d = opendir(path);
+    path = _free(path);
+    if (d) {
+       while ((de = readdir(d)) != NULL) {
+           if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, ".."))
+               continue;
+           rasprintf(&path, "%s/%s", DEBUG_SRC_DIR, de->d_name);
+           if (!pkg->fileList) {
+               char *attr = mkattr();
+               argvAdd(&pkg->fileList, attr);
+               free(attr);
+           }
+           argvAdd(&pkg->fileList, path);
+           path = _free(path);
+           ret = 1;
+       }
+       closedir(d);
+    }
+    return ret;
+}
 
-           /* Try to gather the build-id from the binary.  */
-           if (getELFBuildId (name, &build_id, &build_id_size) == -1)
-             continue;
+/* find the debugsource package, if it has been created.
+ * We do this simply by searching for a package with the right name. */
+static Package findDebugsourcePackage(rpmSpec spec)
+{
+    Package pkg = NULL;
+    if (lookupPackage(spec, "debugsource", PART_SUBNAME|PART_QUIET, &pkg))
+       return NULL;
+    return pkg && pkg->fileList ? pkg : NULL;
+}
 
-           /* If we see build-id links for the first time add the
-              directory.  */
-           if (!seen_build_id)
-             argvAdd(&files, "%dir /usr/lib/debug/.build-id");
-
-           /* From the build-id construct the two links pointing back
-              to the debug information file and the binary.  */
-           snprintf (tmp, 1024, "/usr/lib/debug/.build-id/%02x/",
-                     build_id[0]);
-           for (i = 1; i < build_id_size; ++i)
-             sprintf (tmp + strlen (tmp), "%02x", build_id[i]);
-           argvAdd(&files, tmp);
-           sprintf (tmp + strlen (tmp), ".debug");
-           argvAdd(&files, tmp);
-
-           free (build_id);
-         }
+/* find the main debuginfo package. We do this simply by
+ * searching for a package with the right name. */
+static Package findDebuginfoPackage(rpmSpec spec)
+{
+    Package pkg = NULL;
+    if (lookupPackage(spec, "debuginfo", PART_SUBNAME|PART_QUIET, &pkg))
+       return NULL;
+    return pkg && pkg->fileList ? pkg : NULL;
+}
 
-       /* If there are debuginfo files for this package add a
-          new debuginfo package.  */
-       if (files)
-         {
-           dbg = newPackage (spec);
-           headerNVR (pkg->header, &name, NULL, NULL);
-           /* Set name, summary and group.  */
-           snprintf (tmp, 1024, "%s-debuginfo", name);
-           headerPutString(dbg->header, RPMTAG_NAME, tmp);
-           snprintf (tmp, 1024, "Debug information for package %s", name);
-           headerPutString(dbg->header, RPMTAG_SUMMARY, tmp);
-           snprintf (tmp, 1024, "This package provides debug information for package %s.\n"
-                     "Debug information is useful when developing applications that use this\n"
-                     "package or when debugging this package.", name);
-           headerPutString(dbg->header, RPMTAG_DESCRIPTION, tmp);
-           headerPutString(dbg->header, RPMTAG_GROUP, "Development/Debug");
-           /* Inherit other tags from parent.  */
-           headerCopyTags (pkg->header, dbg->header, copyTagsForDebug);
-
-           /* Build up the files list.  */
-           dbg->fileList = files;
-         }
-      }
+/* add a dependency (e.g. RPMTAG_REQUIRENAME or RPMTAG_RECOMMENDNAME)
+   for package "to" into package "from". */
+static void addPackageDeps(Package from, Package to, enum rpmTag_e tag)
+{
+    const char *name;
+    char *evr, *isaprov;
+    name = headerGetString(to->header, RPMTAG_NAME);
+    evr = headerGetAsString(to->header, RPMTAG_EVR);
+    isaprov = rpmExpand(name, "%{?_isa}", NULL);
+    addReqProv(from, tag, isaprov, evr, RPMSENSE_EQUAL, 0);
+    free(isaprov);
+    free(evr);
 }
-#endif
 
 rpmRC processBinaryFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
-                       int installSpecialDoc, int test)
+                       int didInstall, int test)
 {
     Package pkg;
     rpmRC rc = RPMRC_OK;
     char *buildroot;
+    char *uniquearch = NULL;
+    Package maindbg = NULL;            /* the (existing) main debuginfo package */
+    Package deplink = NULL;            /* create requires to this package */
+    /* The debugsource package, if it exists, that the debuginfo package(s)
+       should Recommend.  */
+    Package dbgsrcpkg = findDebugsourcePackage(spec);
     
+#if HAVE_LIBDW
+    elf_version (EV_CURRENT);
+#endif
     check_fileList = newStringBuf();
-    buildroot = rpmGenPath(spec->rootDir, spec->buildRoot, NULL);
     genSourceRpmName(spec);
+    buildroot = rpmGenPath(spec->rootDir, spec->buildRoot, NULL);
     
+    if (rpmExpandNumeric("%{?_debuginfo_subpackages}")) {
+       maindbg = findDebuginfoPackage(spec);
+       if (maindbg) {
+           /* move debuginfo package to back */
+           if (maindbg->next) {
+               Package *pp;
+               /* dequeue */
+               for (pp = &spec->packages; *pp != maindbg; pp = &(*pp)->next)
+                   ;
+               *pp = maindbg->next;
+               maindbg->next = 0;
+               /* enqueue at tail */
+               for (; *pp; pp = &(*pp)->next)
+                   ;
+               *pp = maindbg;
+           }
+           /* delete unsplit file list, we will re-add files back later */
+           /*backup maindb fileList before free*/
+           maindb_fileList_bakup = maindbg->fileList;
+           maindbg->fileFile = argvFree(maindbg->fileFile);
+           maindbg->fileList = NULL;
+           if (rpmExpandNumeric("%{?_unique_debug_names}"))
+               uniquearch = rpmExpand("-%{VERSION}-%{RELEASE}.%{_arch}", NULL);
+       }
+    } else if (dbgsrcpkg != NULL) {
+       /* We have a debugsource package, but no debuginfo subpackages.
+          The main debuginfo package should recommend the debugsource one. */
+       Package dbgpkg = findDebuginfoPackage(spec);
+       if (dbgpkg)
+           addPackageDeps(dbgpkg, dbgsrcpkg, RPMTAG_RECOMMENDNAME);
+    }
+
     for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
        char *nvr;
        const char *a;
        int header_color;
        int arch_color;
 
+       if (pkg == maindbg) {
+           /* if there is just one debuginfo package, we put our extra stuff
+            * in it. Otherwise we put it in the main debug package */
+           Package extradbg = !maindbg->fileList && maindbg->next && !maindbg->next->next ?
+                maindbg->next : maindbg;
+           if (addDebugDwz(extradbg, buildroot))
+               deplink = extradbg;
+           if (addDebugSrc(extradbg, buildroot))
+               deplink = extradbg;
+           if (dbgsrcpkg != NULL)
+               addPackageDeps(extradbg, dbgsrcpkg, RPMTAG_RECOMMENDNAME);
+           maindbg = NULL;     /* all normal packages processed */
+       }
+
        if (pkg->fileList == NULL)
            continue;
 
@@ -2356,13 +3132,17 @@ rpmRC processBinaryFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
        nvr = headerGetAsString(pkg->header, RPMTAG_NVRA);
        rpmlog(RPMLOG_NOTICE, _("Processing files: %s\n"), nvr);
        free(nvr);
-                  
-       if ((rc = processPackageFiles(spec, pkgFlags, pkg, installSpecialDoc, test)) != RPMRC_OK)
+
+       if ((rc = processPackageFiles(spec, pkgFlags, pkg, didInstall, test)) != RPMRC_OK)
            goto exit;
-#if HAVE_GELF_H && HAVE_LIBELF
-        addDebuginfoPackage(spec, pkg, buildroot);
-#endif
-       if ((rc = rpmfcGenerateDepends(spec, pkg)) != RPMRC_OK)
+
+       if (maindbg)
+           filterDebuginfoPackage(spec, pkg, maindbg, dbgsrcpkg,
+                                  buildroot, uniquearch);
+       else if (deplink && pkg != deplink)
+           addPackageDeps(pkg, deplink, RPMTAG_REQUIRENAME);
+
+        if ((rc = rpmfcGenerateDepends(spec, pkg)) != RPMRC_OK)
            goto exit;
 
        a = headerGetString(pkg->header, RPMTAG_ARCH);
@@ -2397,6 +3177,8 @@ rpmRC processBinaryFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
     }
 exit:
     check_fileList = freeStringBuf(check_fileList);
+    _free(buildroot);
+    _free(uniquearch);
     
     return rc;
 }
index 6480cecaaa8583c1593394b0108e027fab848bc3..34e0568a7be8609509cb61cc788f036bffc1b2c1 100644 (file)
@@ -6,8 +6,7 @@
 #include "system.h"
 
 #include <errno.h>
-#include <netdb.h>
-#include <time.h>
+#include <sys/wait.h>
 
 #include <rpm/rpmlib.h>                        /* RPMSIGTAG*, rpmReadPackageFile */
 #include <rpm/rpmfileutil.h>
@@ -15,7 +14,6 @@
 
 #include "rpmio/rpmio_internal.h"      /* fdInitDigest, fdFiniDigest */
 #include "lib/fsm.h"
-#include "lib/cpio.h"
 #include "lib/signature.h"
 #include "lib/rpmlead.h"
 #include "build/rpmbuild_internal.h"
 
 #include "debug.h"
 
-typedef struct cpioSourceArchive_s {
-    rpm_loff_t cpioArchiveSize;
-    rpmfi      cpioList;
-} * CSA_t;
+static int rpmPackageFilesArchive(rpmfiles fi, int isSrc,
+                                 FD_t cfd, ARGV_t dpaths,
+                                 rpm_loff_t * archiveSize, char ** failedFile)
+{
+    int rc = 0;
+    rpmfi archive = rpmfiNewArchiveWriter(cfd, fi);
+
+    while (!rc && (rc = rpmfiNext(archive)) >= 0) {
+        /* Copy file into archive. */
+       FD_t rfd = NULL;
+       const char *path = dpaths[rpmfiFX(archive)];
+
+       rfd = Fopen(path, "r.ufdio");
+       if (Ferror(rfd)) {
+           rc = RPMERR_OPEN_FAILED;
+       } else {
+           rc = rpmfiArchiveWriteFile(archive, rfd);
+       }
+
+       if (rc && failedFile)
+           *failedFile = xstrdup(path);
+       if (rfd) {
+           /* preserve any prior errno across close */
+           int myerrno = errno;
+           Fclose(rfd);
+           errno = myerrno;
+       }
+    }
+
+    if (rc == RPMERR_ITER_END)
+       rc = 0;
+
+    /* Finish the payload stream */
+    if (!rc)
+       rc = rpmfiArchiveClose(archive);
+
+    if (archiveSize)
+       *archiveSize = (rc == 0) ? rpmfiArchiveTell(archive) : 0;
+
+    rpmfiFree(archive);
 
+    return rc;
+}
 /**
  * @todo Create transaction set *much* earlier.
  */
-static rpmRC cpio_doio(FD_t fdo, Header h, CSA_t csa, const char * fmodeMacro)
+static rpmRC cpio_doio(FD_t fdo, Package pkg, const char * fmodeMacro,
+                       rpm_loff_t *archiveSize)
 {
     char *failedFile = NULL;
     FD_t cfd;
@@ -42,16 +79,18 @@ static rpmRC cpio_doio(FD_t fdo, Header h, CSA_t csa, const char * fmodeMacro)
     if (cfd == NULL)
        return RPMRC_FAIL;
 
-    fsmrc = rpmPackageFilesArchive(csa->cpioList, headerIsSource(h), cfd,
-                     &csa->cpioArchiveSize, &failedFile);
+    fsmrc = rpmPackageFilesArchive(pkg->cpioList, headerIsSource(pkg->header),
+                                  cfd, pkg->dpaths,
+                                  archiveSize, &failedFile);
 
     if (fsmrc) {
+       char *emsg = rpmfileStrerror(fsmrc);
        if (failedFile)
            rpmlog(RPMLOG_ERR, _("create archive failed on file %s: %s\n"),
-                  failedFile, rpmcpioStrerror(fsmrc));
+                  failedFile, emsg);
        else
-           rpmlog(RPMLOG_ERR, _("create archive failed: %s\n"),
-                  rpmcpioStrerror(fsmrc));
+           rpmlog(RPMLOG_ERR, _("create archive failed: %s\n"), emsg);
+       free(emsg);
     }
 
     free(failedFile);
@@ -92,11 +131,13 @@ static rpmRC addFileToTag(rpmSpec spec, const char * file,
     }
 
     while (fgets(buf, sizeof(buf), f)) {
-       if (expandMacros(spec, spec->macros, buf, sizeof(buf))) {
+       char *expanded;
+       if (rpmExpandMacros(spec->macros, buf, &expanded, 0) < 0) {
            rpmlog(RPMLOG_ERR, _("%s: line: %s\n"), fn, buf);
            goto exit;
        }
-       appendStringBuf(sb, buf);
+       appendStringBuf(sb, expanded);
+       free(expanded);
     }
     headerPutString(h, tag, getStringBuf(sb));
     rc = RPMRC_OK;
@@ -109,40 +150,31 @@ exit:
     return rc;
 }
 
-static rpm_time_t * getBuildTime(void)
-{
-    static rpm_time_t buildTime[1];
-
-    if (buildTime[0] == 0)
-       buildTime[0] = (int32_t) time(NULL);
-    return buildTime;
-}
-
-static const char * buildHost(void)
-{
-    static char hostname[1024];
-    static int oneshot = 0;
-    struct hostent *hbn;
-
-    if (! oneshot) {
-        (void) gethostname(hostname, sizeof(hostname));
-       hbn = gethostbyname(hostname);
-       if (hbn)
-           strcpy(hostname, hbn->h_name);
-       else
-           rpmlog(RPMLOG_WARNING,
-                       _("Could not canonicalize hostname: %s\n"), hostname);
-       oneshot = 1;
-    }
-    return(hostname);
-}
-
 static rpmRC processScriptFiles(rpmSpec spec, Package pkg)
 {
     struct TriggerFileEntry *p;
     int addflags = 0;
     rpmRC rc = RPMRC_FAIL;
     Header h = pkg->header;
+    struct TriggerFileEntry *tfa[] = {pkg->triggerFiles,
+                                     pkg->fileTriggerFiles,
+                                     pkg->transFileTriggerFiles};
+
+    rpmTagVal progTags[] = {RPMTAG_TRIGGERSCRIPTPROG,
+                           RPMTAG_FILETRIGGERSCRIPTPROG,
+                           RPMTAG_TRANSFILETRIGGERSCRIPTPROG};
+
+    rpmTagVal flagTags[] = {RPMTAG_TRIGGERSCRIPTFLAGS,
+                           RPMTAG_FILETRIGGERSCRIPTFLAGS,
+                           RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS};
+
+    rpmTagVal scriptTags[] = {RPMTAG_TRIGGERSCRIPTS,
+                             RPMTAG_FILETRIGGERSCRIPTS,
+                             RPMTAG_TRANSFILETRIGGERSCRIPTS};
+    rpmTagVal priorityTags[] = {0,
+                               RPMTAG_FILETRIGGERPRIORITIES,
+                               RPMTAG_TRANSFILETRIGGERPRIORITIES};
+    int i;
     
     if (addFileToTag(spec, pkg->preInFile, h, RPMTAG_PREIN, 1) ||
        addFileToTag(spec, pkg->preUnFile, h, RPMTAG_PREUN, 1) ||
@@ -155,30 +187,39 @@ static rpmRC processScriptFiles(rpmSpec spec, Package pkg)
        goto exit;
     }
 
-    /* if any trigger has flags, we need to add flags entry for all of them */
-    for (p = pkg->triggerFiles; p != NULL; p = p->next) {
-       if (p->flags) {
-           addflags = 1;
-           break;
-       }
-    }
 
-    for (p = pkg->triggerFiles; p != NULL; p = p->next) {
-       headerPutString(h, RPMTAG_TRIGGERSCRIPTPROG, p->prog);
-       if (addflags) {
-           headerPutUint32(h, RPMTAG_TRIGGERSCRIPTFLAGS, &p->flags, 1);
+    for (i = 0; i < sizeof(tfa)/sizeof(tfa[0]); i++) {
+       addflags = 0;
+       /* if any trigger has flags, we need to add flags entry for all of them */
+       for (p = tfa[i]; p != NULL; p = p->next) {
+           if (p->flags) {
+               addflags = 1;
+               break;
+           }
        }
 
-       if (p->script) {
-           headerPutString(h, RPMTAG_TRIGGERSCRIPTS, p->script);
-       } else if (p->fileName) {
-           if (addFileToTag(spec, p->fileName, h, RPMTAG_TRIGGERSCRIPTS, 0)) {
-               goto exit;
+       for (p = tfa[i]; p != NULL; p = p->next) {
+           headerPutString(h, progTags[i], p->prog);
+
+           if (priorityTags[i]) {
+               headerPutUint32(h, priorityTags[i], &p->priority, 1);
+           }
+
+           if (addflags) {
+               headerPutUint32(h, flagTags[i], &p->flags, 1);
+           }
+
+           if (p->script) {
+               headerPutString(h, scriptTags[i], p->script);
+           } else if (p->fileName) {
+               if (addFileToTag(spec, p->fileName, h, scriptTags[i], 0)) {
+                   goto exit;
+               }
+           } else {
+               /* This is dumb.  When the header supports NULL string */
+               /* this will go away.                                  */
+               headerPutString(h, scriptTags[i], "");
            }
-       } else {
-           /* This is dumb.  When the header supports NULL string */
-           /* this will go away.                                  */
-           headerPutString(h, RPMTAG_TRIGGERSCRIPTS, "");
        }
     }
     rc = RPMRC_OK;
@@ -187,92 +228,40 @@ exit:
     return rc;
 }
 
-static rpmRC copyPayload(FD_t ifd, const char *ifn, FD_t ofd, const char *ofn)
+static int haveTildeDep(Package pkg)
 {
-    char buf[BUFSIZ];
-    size_t nb;
-    rpmRC rc = RPMRC_OK;
-
-    while ((nb = Fread(buf, 1, sizeof(buf), ifd)) > 0) {
-       if (Fwrite(buf, sizeof(buf[0]), nb, ofd) != nb) {
-           rpmlog(RPMLOG_ERR, _("Unable to write payload to %s: %s\n"),
-                    ofn, Fstrerror(ofd));
-           rc = RPMRC_FAIL;
-           break;
+    for (int i = 0; i < PACKAGE_NUM_DEPS; i++) {
+       rpmds ds = rpmdsInit(pkg->dependencies[i]);
+       while (rpmdsNext(ds) >= 0) {
+           if (strchr(rpmdsEVR(ds), '~'))
+               return 1;
        }
     }
-
-    if (nb < 0) {
-       rpmlog(RPMLOG_ERR, _("Unable to read payload from %s: %s\n"),
-                ifn, Fstrerror(ifd));
-       rc = RPMRC_FAIL;
-    }
-
-    return rc;
+    return 0;
 }
 
-static int depContainsTilde(Header h, rpmTagVal tagEVR)
+static int haveRichDep(Package pkg)
 {
-    struct rpmtd_s evrs;
-    const char *evr = NULL;
-
-    if (headerGet(h, tagEVR, &evrs, HEADERGET_MINMEM)) {
-       while ((evr = rpmtdNextString(&evrs)) != NULL)
-           if (strchr(evr, '~'))
-               break;
-       rpmtdFreeData(&evrs);
+    for (int i = 0; i < PACKAGE_NUM_DEPS; i++) {
+       rpmds ds = rpmdsInit(pkg->dependencies[i]);
+       rpmTagVal tagN = rpmdsTagN(ds);
+       if (tagN != RPMTAG_REQUIRENAME && tagN != RPMTAG_CONFLICTNAME)
+           continue;
+       while (rpmdsNext(ds) >= 0) {
+           if (rpmdsIsRich(ds))
+               return 1;
+       }
     }
-    return evr != NULL;
-}
-
-static rpmTagVal depevrtags[] = {
-    RPMTAG_PROVIDEVERSION,
-    RPMTAG_REQUIREVERSION,
-    RPMTAG_OBSOLETEVERSION,
-    RPMTAG_CONFLICTVERSION,
-    RPMTAG_ORDERVERSION,
-    RPMTAG_TRIGGERVERSION,
-    RPMTAG_SUGGESTSVERSION,
-    RPMTAG_ENHANCESVERSION,
-    0
-};
-
-static int haveTildeDep(Header h)
-{
-    int i;
-
-    for (i = 0; depevrtags[i] != 0; i++)
-       if (depContainsTilde(h, depevrtags[i]))
-           return 1;
     return 0;
 }
 
-static rpmRC writeRPM(Header *hdrp, unsigned char ** pkgidp, const char *fileName,
-            CSA_t csa, char **cookie)
+static char *getIOFlags(Package pkg)
 {
-    FD_t fd = NULL;
-    FD_t ifd = NULL;
-    char * sigtarget = NULL;;
-    char * rpmio_flags = NULL;
-    char * SHA1 = NULL;
+    char *rpmio_flags;
     const char *s;
-    Header h;
-    Header sig = NULL;
-    int xx;
-    rpmRC rc = RPMRC_OK;
-    struct rpmtd_s td;
-    rpmTagVal sizetag;
-    rpmTagVal payloadtag;
-
-    /* Transfer header reference form *hdrp to h. */
-    h = headerLink(*hdrp);
-    *hdrp = headerFree(*hdrp);
-
-    if (pkgidp)
-       *pkgidp = NULL;
 
     /* Save payload information */
-    if (headerIsSource(h))
+    if (headerIsSource(pkg->header))
        rpmio_flags = rpmExpand("%{?_source_payload}", NULL);
     else 
        rpmio_flags = rpmExpand("%{?_binary_payload}", NULL);
@@ -286,7 +275,7 @@ static rpmRC writeRPM(Header *hdrp, unsigned char ** pkgidp, const char *fileNam
     if (s) {
        char *buf = NULL;
        const char *compr = NULL;
-       headerPutString(h, RPMTAG_PAYLOADFORMAT, "cpio");
+       headerPutString(pkg->header, RPMTAG_PAYLOADFORMAT, "cpio");
 
        if (rstreq(s+1, "ufdio")) {
            compr = NULL;
@@ -296,229 +285,300 @@ static rpmRC writeRPM(Header *hdrp, unsigned char ** pkgidp, const char *fileNam
        } else if (rstreq(s+1, "bzdio")) {
            compr = "bzip2";
            /* Add prereq on rpm version that understands bzip2 payloads */
-           (void) rpmlibNeedsFeature(h, "PayloadIsBzip2", "3.0.5-1");
+           (void) rpmlibNeedsFeature(pkg, "PayloadIsBzip2", "3.0.5-1");
 #endif
 #if HAVE_LZMA_H
        } else if (rstreq(s+1, "xzdio")) {
            compr = "xz";
-           (void) rpmlibNeedsFeature(h, "PayloadIsXz", "5.2-1");
+           (void) rpmlibNeedsFeature(pkg, "PayloadIsXz", "5.2-1");
        } else if (rstreq(s+1, "lzdio")) {
            compr = "lzma";
-           (void) rpmlibNeedsFeature(h, "PayloadIsLzma", "4.4.6-1");
+           (void) rpmlibNeedsFeature(pkg, "PayloadIsLzma", "4.4.6-1");
+#endif
+#ifdef HAVE_ZSTD
+       } else if (rstreq(s+1, "zstdio")) {
+           compr = "zstd";
+           /* Add prereq on rpm version that understands zstd payloads */
+           (void) rpmlibNeedsFeature(pkg, "PayloadIsZstd", "5.4.18-1");
 #endif
        } else {
            rpmlog(RPMLOG_ERR, _("Unknown payload compression: %s\n"),
                   rpmio_flags);
-           rc = RPMRC_FAIL;
+           rpmio_flags = _free(rpmio_flags);
            goto exit;
        }
 
        if (compr)
-           headerPutString(h, RPMTAG_PAYLOADCOMPRESSOR, compr);
+           headerPutString(pkg->header, RPMTAG_PAYLOADCOMPRESSOR, compr);
        buf = xstrdup(rpmio_flags);
        buf[s - rpmio_flags] = '\0';
-       headerPutString(h, RPMTAG_PAYLOADFLAGS, buf+1);
+       headerPutString(pkg->header, RPMTAG_PAYLOADFLAGS, buf+1);
        free(buf);
     }
+exit:
+    return rpmio_flags;
+}
 
+static void finalizeDeps(Package pkg)
+{
     /* check if the package has a dependency with a '~' */
-    if (haveTildeDep(h))
-       (void) rpmlibNeedsFeature(h, "TildeInVersions", "4.10.0-1");
+    if (haveTildeDep(pkg))
+       (void) rpmlibNeedsFeature(pkg, "TildeInVersions", "4.10.0-1");
+
+    /* check if the package has a rich dependency */
+    if (haveRichDep(pkg))
+       (void) rpmlibNeedsFeature(pkg, "RichDependencies", "4.12.0-1");
+
+    /* All dependencies added finally, write them into the header */
+    for (int i = 0; i < PACKAGE_NUM_DEPS; i++) {
+       /* Nuke any previously added dependencies from the header */
+       headerDel(pkg->header, rpmdsTagN(pkg->dependencies[i]));
+       headerDel(pkg->header, rpmdsTagEVR(pkg->dependencies[i]));
+       headerDel(pkg->header, rpmdsTagF(pkg->dependencies[i]));
+       headerDel(pkg->header, rpmdsTagTi(pkg->dependencies[i]));
+       /* ...and add again, now with automatic dependencies included */
+       rpmdsPutToHeader(pkg->dependencies[i], pkg->header);
+    }
+}
 
-    /* Create and add the cookie */
-    if (cookie) {
-       rasprintf(cookie, "%s %d", buildHost(), (int) (*getBuildTime()));
-       headerPutString(h, RPMTAG_COOKIE, *cookie);
+static void *nullDigest(int algo, int ascii)
+{
+    void *d = NULL;
+    DIGEST_CTX ctx = rpmDigestInit(algo, 0);
+    rpmDigestFinal(ctx, &d, NULL, ascii);
+    return d;
+}
+
+static rpmRC fdJump(FD_t fd, off_t offset)
+{
+    if (Fseek(fd, offset, SEEK_SET) < 0) {
+       rpmlog(RPMLOG_ERR, _("Could not seek in file %s: %s\n"),
+               Fdescr(fd), Fstrerror(fd));
+       return RPMRC_FAIL;
     }
-    
-    /* Reallocate the header into one contiguous region. */
-    h = headerReload(h, RPMTAG_HEADERIMMUTABLE);
-    if (h == NULL) {   /* XXX can't happen */
-       rc = RPMRC_FAIL;
-       rpmlog(RPMLOG_ERR, _("Unable to create immutable header region.\n"));
-       goto exit;
+    return RPMRC_OK;
+}
+
+static rpmRC fdConsume(FD_t fd, off_t start, off_t nbytes)
+{
+    size_t bufsiz = 32*BUFSIZ;
+    unsigned char buf[bufsiz];
+    off_t left = nbytes;
+    ssize_t nb;
+
+    if (start && fdJump(fd, start))
+       return RPMRC_FAIL;
+
+    while (left > 0) {
+       nb = Fread(buf, 1, (left < bufsiz) ? left : bufsiz, fd);
+       if (nb > 0)
+           left -= nb;
+       else
+           break;
+    };
+
+    if (left) {
+       rpmlog(RPMLOG_ERR, _("Failed to read %jd bytes in file %s: %s\n"),
+              (intmax_t) nbytes, Fdescr(fd), Fstrerror(fd));
     }
-    /* Re-reference reallocated header. */
-    *hdrp = headerLink(h);
 
-    /*
-     * Write the header+archive into a temp file so that the size of
-     * archive (after compression) can be added to the header.
-     */
-    fd = rpmMkTempFile(NULL, &sigtarget);
-    if (fd == NULL || Ferror(fd)) {
-       rc = RPMRC_FAIL;
-       rpmlog(RPMLOG_ERR, _("Unable to open temp file.\n"));
+    return (left == 0) ? RPMRC_OK : RPMRC_FAIL;
+}
+
+static rpmRC writeHdr(FD_t fd, Header pkgh)
+{
+    /* Reallocate the header into one contiguous region for writing. */
+    Header h = headerReload(headerCopy(pkgh), RPMTAG_HEADERIMMUTABLE);
+    rpmRC rc = RPMRC_FAIL;
+
+    if (h == NULL) {
+       rpmlog(RPMLOG_ERR,_("Unable to create immutable header region\n"));
        goto exit;
     }
 
-    fdInitDigest(fd, PGPHASHALGO_SHA1, 0);
     if (headerWrite(fd, h, HEADER_MAGIC_YES)) {
-       rc = RPMRC_FAIL;
-       rpmlog(RPMLOG_ERR, _("Unable to write temp header\n"));
-    } else { /* Write the archive and get the size */
-       (void) Fflush(fd);
-       fdFiniDigest(fd, PGPHASHALGO_SHA1, (void **)&SHA1, NULL, 1);
-       if (csa->cpioList != NULL) {
-           rc = cpio_doio(fd, h, csa, rpmio_flags);
-       } else {
-           rc = RPMRC_FAIL;
-           rpmlog(RPMLOG_ERR, _("Bad CSA data\n"));
-       }
+       rpmlog(RPMLOG_ERR, _("Unable to write header to %s: %s\n"),
+               Fdescr(fd), Fstrerror(fd));
+       goto exit;
     }
+    (void) Fflush(fd);
+    rc = RPMRC_OK;
+
+exit:
+    headerFree(h);
+    return rc;
+}
+
+/*
+ * This is more than just a little insane:
+ * In order to write the signature, we need to know the size and
+ * the size and digests of the header and payload, which are located
+ * after the signature on disk. We also need a digest of the compressed
+ * payload for the main header, and of course the payload is after the
+ * header on disk. So we need to create placeholders for both the
+ * signature and main header that exactly match the final sizes, calculate
+ * the payload digest, then generate and write the real main header to
+ * be able to FINALLY calculate the digests we need for the signature
+ * header. In other words, we need to write things in the exact opposite
+ * order to how the RPM format is laid on disk.
+ */
+static rpmRC writeRPM(Package pkg, unsigned char ** pkgidp,
+                     const char *fileName, char **cookie,
+                     rpm_time_t buildTime, const char* buildHost)
+{
+    FD_t fd = NULL;
+    char * rpmio_flags = NULL;
+    char * SHA1 = NULL;
+    char * SHA256 = NULL;
+    uint8_t * MD5 = NULL;
+    char * pld = NULL;
+    uint32_t pld_algo = PGPHASHALGO_SHA256; /* TODO: macro configuration */
+    rpmRC rc = RPMRC_FAIL; /* assume failure */
+    rpm_loff_t archiveSize = 0;
+    off_t sigStart, hdrStart, payloadStart, payloadEnd;
+
+    if (pkgidp)
+       *pkgidp = NULL;
 
-    if (rc != RPMRC_OK)
+    rpmio_flags = getIOFlags(pkg);
+    if (!rpmio_flags)
        goto exit;
 
-    (void) Fclose(fd);
-    fd = NULL;
-    (void) unlink(fileName);
+    finalizeDeps(pkg);
 
-    /* Generate the signature */
-    (void) fflush(stdout);
-    sig = rpmNewSignature();
+    /* Create and add the cookie */
+    if (cookie) {
+       rasprintf(cookie, "%s %d", buildHost, buildTime);
+       headerPutString(pkg->header, RPMTAG_COOKIE, *cookie);
+    }
 
     /*
-     * There should be rpmlib() dependency on this, but that doesn't
-     * really do much good as these are signature tags that get read
-     * way before dependency checking has a chance to figure out anything.
-     * On the positive side, not inserting the 32bit tag at all means
-     * older rpm will just bail out with error message on attempt to read
-     * such a package.
+     * Add system-wide Tizen build information
      */
-    if (csa->cpioArchiveSize < UINT32_MAX) {
-       sizetag = RPMSIGTAG_SIZE;
-       payloadtag = RPMSIGTAG_PAYLOADSIZE;
-    } else {
-       sizetag = RPMSIGTAG_LONGSIZE;
-       payloadtag = RPMSIGTAG_LONGARCHIVESIZE;
-    }
-    (void) rpmGenDigest(sig, sigtarget, sizetag);
-    (void) rpmGenDigest(sig, sigtarget, RPMSIGTAG_MD5);
-
-    if (SHA1) {
-       /* XXX can't use rpmtdFromFoo() on RPMSIGTAG_* items */
-       rpmtdReset(&td);
-       td.tag = RPMSIGTAG_SHA1;
-       td.type = RPM_STRING_TYPE;
-       td.data = SHA1;
-       td.count = 1;
-       headerPut(sig, &td, HEADERPUT_DEFAULT);
-       SHA1 = _free(SHA1);
-    }
+    char *buildinfo = rpmExpand("%{?_buildinfo}", NULL);
+    if (buildinfo && *buildinfo) {
+               int xx;
+               int count = 0;
+               char **strings = NULL;
 
-    {  
-       /* XXX can't use headerPutType() on legacy RPMSIGTAG_* items */
-       rpmtdReset(&td);
-       td.tag = payloadtag;
-       td.count = 1;
-       if (payloadtag == RPMSIGTAG_PAYLOADSIZE) {
-           rpm_off_t asize = csa->cpioArchiveSize;
-           td.type = RPM_INT32_TYPE;
-           td.data = &asize;
-           headerPut(sig, &td, HEADERPUT_DEFAULT);
-       } else {
-           rpm_loff_t asize = csa->cpioArchiveSize;
-           td.type = RPM_INT64_TYPE;
-           td.data = &asize;
-           headerPut(sig, &td, HEADERPUT_DEFAULT);
-       }
+
+       if ((xx = poptParseArgvString(buildinfo, &count, &strings))) {
+       rc = RPMRC_FAIL;
+       free(buildinfo);
+       rpmlog(RPMLOG_ERR, _("Can't parse BUILDINFO tag: %s\n"), poptStrerror(xx));
+       goto exit;
+      }
+
+      if (count)
+       headerPutStringArray(pkg->header, RPMTAG_BUILDINFO, strings, count);
+
+      strings = _free(strings);
     }
+    free(buildinfo);
 
-    /* Reallocate the signature into one contiguous region. */
-    sig = headerReload(sig, RPMTAG_HEADERSIGNATURES);
-    if (sig == NULL) { /* XXX can't happen */
-       rc = RPMRC_FAIL;
-       rpmlog(RPMLOG_ERR, _("Unable to reload signature header.\n"));
+    /* Create a dummy payload digest to get the header size right */
+    pld = nullDigest(pld_algo, 1);
+    headerPutUint32(pkg->header, RPMTAG_PAYLOADDIGESTALGO, &pld_algo, 1);
+    headerPutString(pkg->header, RPMTAG_PAYLOADDIGEST, pld);
+    pld = _free(pld);
+    
+    /* Check for UTF-8 encoding of string tags, add encoding tag if all good */
+    if (checkForEncoding(pkg->header, 1))
        goto exit;
-    }
 
     /* Open the output file */
-    fd = Fopen(fileName, "w.ufdio");
+    fd = Fopen(fileName, "w+.ufdio");
     if (fd == NULL || Ferror(fd)) {
-       rc = RPMRC_FAIL;
        rpmlog(RPMLOG_ERR, _("Could not open %s: %s\n"),
                fileName, Fstrerror(fd));
        goto exit;
     }
 
     /* Write the lead section into the package. */
-    {  
-       rpmlead lead = rpmLeadFromHeader(h);
-       rc = rpmLeadWrite(fd, lead);
-       rpmLeadFree(lead);
-       if (rc != RPMRC_OK) {
-           rc = RPMRC_FAIL;
-           rpmlog(RPMLOG_ERR, _("Unable to write package: %s\n"),
-                Fstrerror(fd));
-           goto exit;
-       }
+    if (rpmLeadWrite(fd, pkg->header)) {
+       rpmlog(RPMLOG_ERR, _("Unable to write package: %s\n"), Fstrerror(fd));
+       goto exit;
     }
 
-    /* Write the signature section into the package. */
-    if (rpmWriteSignature(fd, sig)) {
-       rc = RPMRC_FAIL;
+    /* Save the position of signature section */
+    sigStart = Ftell(fd);
+
+    /* Generate and write a placeholder signature header */
+    SHA1 = nullDigest(PGPHASHALGO_SHA1, 1);
+    SHA256 = nullDigest(PGPHASHALGO_SHA256, 1);
+    MD5 = nullDigest(PGPHASHALGO_MD5, 0);
+    if (rpmGenerateSignature(SHA256, SHA1, MD5, 0, 0, fd))
        goto exit;
-    }
+    SHA1 = _free(SHA1);
+    SHA256 = _free(SHA256);
+    MD5 = _free(MD5);
 
-    /* Append the header and archive */
-    ifd = Fopen(sigtarget, "r.ufdio");
-    if (ifd == NULL || Ferror(ifd)) {
-       rc = RPMRC_FAIL;
-       rpmlog(RPMLOG_ERR, _("Unable to open sigtarget %s: %s\n"),
-               sigtarget, Fstrerror(ifd));
+    /* Write a placeholder header. */
+    hdrStart = Ftell(fd);
+    if (writeHdr(fd, pkg->header))
        goto exit;
-    }
 
-    /* Add signatures to header, and write header into the package. */
-    /* XXX header+payload digests/signatures might be checked again here. */
-    {  Header nh = headerRead(ifd, HEADER_MAGIC_YES);
+    /* Write payload section (cpio archive) */
+    payloadStart = Ftell(fd);
+    if (cpio_doio(fd, pkg, rpmio_flags, &archiveSize))
+       goto exit;
+    payloadEnd = Ftell(fd);
 
-       if (nh == NULL) {
-           rc = RPMRC_FAIL;
-           rpmlog(RPMLOG_ERR, _("Unable to read header from %s: %s\n"),
-                       sigtarget, Fstrerror(ifd));
-           goto exit;
-       }
+    /* Re-read payload to calculate compressed digest */
+    fdInitDigestID(fd, pld_algo, RPMTAG_PAYLOADDIGEST, 0);
+    if (fdConsume(fd, payloadStart, payloadEnd - payloadStart))
+       goto exit;
+    fdFiniDigest(fd, RPMTAG_PAYLOADDIGEST, (void **)&pld, NULL, 1);
 
-       xx = headerWrite(fd, nh, HEADER_MAGIC_YES);
-       headerFree(nh);
+    /* Insert the payload digest in main header */
+    headerDel(pkg->header, RPMTAG_PAYLOADDIGEST);
+    headerPutString(pkg->header, RPMTAG_PAYLOADDIGEST, pld);
+    pld = _free(pld);
 
-       if (xx) {
-           rc = RPMRC_FAIL;
-           rpmlog(RPMLOG_ERR, _("Unable to write header to %s: %s\n"),
-                       fileName, Fstrerror(fd));
-           goto exit;
-       }
-    }
-       
-    /* Write the payload into the package. */
-    rc = copyPayload(ifd, fileName, fd, sigtarget);
+    /* Write the final header */
+    if (fdJump(fd, hdrStart))
+       goto exit;
+    if (writeHdr(fd, pkg->header))
+       goto exit;
+
+    /* Calculate digests: SHA on header, legacy MD5 on header + payload */
+    fdInitDigestID(fd, PGPHASHALGO_MD5, RPMTAG_SIGMD5, 0);
+    fdInitDigestID(fd, PGPHASHALGO_SHA1, RPMTAG_SHA1HEADER, 0);
+    fdInitDigestID(fd, PGPHASHALGO_SHA256, RPMTAG_SHA256HEADER, 0);
+    if (fdConsume(fd, hdrStart, payloadStart - hdrStart))
+       goto exit;
+    fdFiniDigest(fd, RPMTAG_SHA1HEADER, (void **)&SHA1, NULL, 1);
+    fdFiniDigest(fd, RPMTAG_SHA256HEADER, (void **)&SHA256, NULL, 1);
+
+    if (fdConsume(fd, 0, payloadEnd - payloadStart))
+       goto exit;
+    fdFiniDigest(fd, RPMTAG_SIGMD5, (void **)&MD5, NULL, 0);
+
+    if (fdJump(fd, sigStart))
+       goto exit;
+
+    /* Generate the signature. Now with right values */
+    if (rpmGenerateSignature(SHA256, SHA1, MD5, payloadEnd - hdrStart, archiveSize, fd))
+       goto exit;
+
+    rc = RPMRC_OK;
 
 exit:
     free(rpmio_flags);
     free(SHA1);
-    headerFree(h);
+    free(SHA256);
 
     /* XXX Fish the pkgid out of the signature header. */
-    if (sig != NULL && pkgidp != NULL) {
-       struct rpmtd_s md5tag;
-       headerGet(sig, RPMSIGTAG_MD5, &md5tag, HEADERGET_DEFAULT);
-       if (rpmtdType(&md5tag) == RPM_BIN_TYPE &&
-                               md5tag.count == 16 && md5tag.data != NULL) {
-           *pkgidp = md5tag.data;
+    if (pkgidp != NULL) {
+       if (MD5 != NULL) {
+           *pkgidp = MD5;
        }
+    } else {
+       free(MD5);
     }
 
-    rpmFreeSignature(sig);
-    Fclose(ifd);
     Fclose(fd);
 
-    if (sigtarget) {
-       (void) unlink(sigtarget);
-       free(sigtarget);
-    }
-
     if (rc == RPMRC_OK)
        rpmlog(RPMLOG_NOTICE, _("Wrote: %s\n"), fileName);
     else
@@ -553,78 +613,13 @@ static rpmRC checkPackages(char *pkgcheck)
     return RPMRC_OK;
 }
 
-static void trimChangelog(Header h)
-{
-    static int oneshot;
-    static int cuttime, minnum, maxnum;
-    int * times;
-    char ** names = 0, ** texts = 0;
-    int i, keep, count = 0;
-
-    if (!oneshot) {
-       char *binarychangelogtrim = rpmExpand("%{?_binarychangelogtrim}", NULL);
-       oneshot = 1;
-       if (binarychangelogtrim && *binarychangelogtrim) {
-           maxnum = atoi(binarychangelogtrim);
-           binarychangelogtrim = strchr(binarychangelogtrim, ',');
-           if (binarychangelogtrim)
-             binarychangelogtrim++;
-       }
-       if (binarychangelogtrim && *binarychangelogtrim) {
-           cuttime = atoi(binarychangelogtrim);
-           binarychangelogtrim = strchr(binarychangelogtrim, ',');
-           if (binarychangelogtrim)
-             binarychangelogtrim++;
-       }
-       if (binarychangelogtrim && *binarychangelogtrim) {
-           minnum = atoi(binarychangelogtrim);
-           binarychangelogtrim = strchr(binarychangelogtrim, ',');
-       }
-    }
-    if (!cuttime && !minnum && !maxnum) {
-       return;
-    }
-    if (!headerGetEntry(h, RPMTAG_CHANGELOGTIME, NULL, (void **) &times, &count))
-       return;
-    if ((!cuttime || count <= minnum) && (!maxnum || count <= maxnum)) {
-       return;
-    }
-    keep = count;
-    if (maxnum && keep > maxnum)
-       keep = maxnum;
-    if (cuttime) {
-       for (i = 0; i < keep; i++) {
-           if (i >= minnum && times[i] < cuttime)
-               break;
-       }
-       keep = i;
-    }
-    if (keep >= count)
-       return;
-    headerGetEntry(h, RPMTAG_CHANGELOGNAME, NULL, (void **) &names, &count);
-    headerGetEntry(h, RPMTAG_CHANGELOGTEXT, NULL, (void **) &texts, &count);
-    headerModifyEntry(h, RPMTAG_CHANGELOGTIME, RPM_INT32_TYPE, times, keep);
-    headerModifyEntry(h, RPMTAG_CHANGELOGNAME, RPM_STRING_ARRAY_TYPE, names, keep);
-    headerModifyEntry(h, RPMTAG_CHANGELOGTEXT, RPM_STRING_ARRAY_TYPE, texts, keep);
-    free(names);
-    free(texts);
-}
-
-rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
+static rpmRC packageBinary(rpmSpec spec, Package pkg, const char *cookie, int cheating, char** filename)
 {
-    struct cpioSourceArchive_s csabuf;
-    CSA_t csa = &csabuf;
-    rpmRC rc;
-    const char *errorString;
-    Package pkg;
-    char *pkglist = NULL;
-
-    trimChangelog(spec->packages->header);
-    for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
-       char *fn;
+       const char *errorString;
+       rpmRC rc = RPMRC_OK;
 
        if (pkg->fileList == NULL)
-           continue;
+           return rc;
 
        if ((rc = processScriptFiles(spec, pkg)))
            return rc;
@@ -637,15 +632,15 @@ rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
        headerCopyTags(spec->packages->header, pkg->header, copyTags);
        
        headerPutString(pkg->header, RPMTAG_RPMVERSION, VERSION);
-       headerPutString(pkg->header, RPMTAG_BUILDHOST, buildHost());
-       headerPutUint32(pkg->header, RPMTAG_BUILDTIME, getBuildTime(), 1);
+       headerPutString(pkg->header, RPMTAG_BUILDHOST, spec->buildHost);
+       headerPutUint32(pkg->header, RPMTAG_BUILDTIME, &(spec->buildTime), 1);
 
        if (spec->sourcePkgId != NULL) {
            headerPutBin(pkg->header, RPMTAG_SOURCEPKGID, spec->sourcePkgId,16);
        }
 
        if (cheating) {
-           (void) rpmlibNeedsFeature(pkg->header, "ShortCircuited", "4.9.0-1");
+           (void) rpmlibNeedsFeature(pkg, "ShortCircuited", "4.9.0-1");
        }
        
        {   char *binFormat = rpmGetPath("%{_rpmfilename}", NULL);
@@ -658,14 +653,14 @@ rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
                     headerGetString(pkg->header, RPMTAG_NAME), errorString);
                return RPMRC_FAIL;
            }
-           fn = rpmGetPath("%{_rpmdir}/", binRpm, NULL);
+           *filename = rpmGetPath("%{_rpmdir}/", binRpm, NULL);
            if ((binDir = strchr(binRpm, '/')) != NULL) {
                struct stat st;
                char *dn;
                *binDir = '\0';
                dn = rpmGetPath("%{_rpmdir}/", binRpm, NULL);
                if (stat(dn, &st) < 0) {
-                   switch(errno) {
+                   switch (errno) {
                    case  ENOENT:
                        if (mkdir(dn, 0755) == 0)
                            break;
@@ -680,19 +675,28 @@ rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
            free(binRpm);
        }
 
-       memset(csa, 0, sizeof(*csa));
-       csa->cpioArchiveSize = 0;
-       csa->cpioList = rpmfiLink(pkg->cpioList);
-
-       rc = writeRPM(&pkg->header, NULL, fn, csa, NULL);
-       csa->cpioList = rpmfiFree(csa->cpioList);
+       rc = writeRPM(pkg, NULL, *filename, NULL, spec->buildTime, spec->buildHost);
        if (rc == RPMRC_OK) {
            /* Do check each written package if enabled */
-           char *pkgcheck = rpmExpand("%{?_build_pkgcheck} ", fn, NULL);
+           char *pkgcheck = rpmExpand("%{?_build_pkgcheck} ", *filename, NULL);
            if (pkgcheck[0] != ' ') {
                rc = checkPackages(pkgcheck);
            }
            free(pkgcheck);
+       }
+       return rc;
+}
+
+rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
+{
+    rpmRC rc;
+    Package pkg;
+    char *pkglist = NULL;
+
+    for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
+       char *fn = NULL;
+       rc = packageBinary(spec, pkg, cookie, cheating, &fn);
+       if (rc == RPMRC_OK) {
            rstrcat(&pkglist, fn);
            rstrcat(&pkglist, " ");
        }
@@ -718,32 +722,28 @@ rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
 
 rpmRC packageSources(rpmSpec spec, char **cookie)
 {
-    struct cpioSourceArchive_s csabuf;
-    CSA_t csa = &csabuf;
+    Package sourcePkg = spec->sourcePackage;
     rpmRC rc;
+    uint32_t one = 1;
 
     /* Add some cruft */
-    headerPutString(spec->sourceHeader, RPMTAG_RPMVERSION, VERSION);
-    headerPutString(spec->sourceHeader, RPMTAG_BUILDHOST, buildHost());
-    headerPutUint32(spec->sourceHeader, RPMTAG_BUILDTIME, getBuildTime(), 1);
+    headerPutString(sourcePkg->header, RPMTAG_RPMVERSION, VERSION);
+    headerPutString(sourcePkg->header, RPMTAG_BUILDHOST, spec->buildHost);
+    headerPutUint32(sourcePkg->header, RPMTAG_BUILDTIME, &(spec->buildTime), 1);
+    headerPutUint32(sourcePkg->header, RPMTAG_SOURCEPACKAGE, &one, 1);
 
     /* XXX this should be %_srpmdir */
     {  char *fn = rpmGetPath("%{_srcrpmdir}/", spec->sourceRpmName,NULL);
        char *pkgcheck = rpmExpand("%{?_build_pkgcheck_srpm} ", fn, NULL);
 
-       memset(csa, 0, sizeof(*csa));
-       csa->cpioArchiveSize = 0;
-       csa->cpioList = rpmfiLink(spec->sourceCpioList); 
-
        spec->sourcePkgId = NULL;
-       rc = writeRPM(&spec->sourceHeader, &spec->sourcePkgId, fn, csa, cookie);
+       rc = writeRPM(sourcePkg, &spec->sourcePkgId, fn, cookie, spec->buildTime, spec->buildHost);
 
        /* Do check SRPM package if enabled */
        if (rc == RPMRC_OK && pkgcheck[0] != ' ') {
            rc = checkPackages(pkgcheck);
        }
 
-       rpmfiFree(csa->cpioList);
        free(pkgcheck);
        free(fn);
     }
index 6386c2365e1863c0254bf20af58f8268cfa54d68..f7b4bb71508d8f234e43fc3fbf52b601a246106e 100644 (file)
@@ -46,7 +46,24 @@ int parseBuildInstallClean(rpmSpec spec, int parsePart)
     } else if (rc < 0) {
        goto exit;
     }
-    
+
+    if (parsePart == PART_BUILD) {
+        char* buf = strdup(
+            "if [[ `uname -m` == \"aarch64\" ]]; then\n"
+            "ref=/usr/lib/rpm\n"
+            "for s in guess sub; do\n"
+            "    for c in $(find -maxdepth 8 -name \"config.$s\"); do\n"
+            "         grep -q config-patches@ $c || continue\n"
+            "         grep -q aarch64 $c || install -m 755 $ref/config.$s $c\n"
+            "         grep -q ppc64le $c || install -m 755 $ref/config.$s $c\n"
+            "     done\n"
+            "done\n"
+            "fi\n"
+        );
+        appendLineStringBuf(*sbp, buf);
+        free(buf);
+    }
+
     while (! (nextPart = isPart(spec->line))) {
        appendStringBuf(*sbp, spec->line);
        if ((rc = readLine(spec, STRIP_NOTHING)) > 0) {
index b06c9236b4cc82f0185788ff86452c082b4bb036..105bb20c3027e8137b86d407ad633e137ac68153 100644 (file)
@@ -32,17 +32,20 @@ static int sameDate(const struct tm *ot, const struct tm *nt)
 
 /**
  * Parse date string to seconds.
+ * accepted date formats are "Mon Jun 6 2016" (original one)
+ * and "Thu Oct  6 06:48:39 CEST 2016" (extended one)
  * @param datestr      date string (e.g. 'Wed Jan 1 1997')
  * @retval secs                secs since the unix epoch
  * @return             0 on success, -1 on error
  */
-static int dateToTimet(const char * datestr, time_t * secs)
+static int dateToTimet(const char * datestr, time_t * secs, int * date_words)
 {
     int rc = -1; /* assume failure */
     struct tm time, ntime;
     const char * const * idx;
     char *p, *pe, *q, *date, *tz;
-    
+    char tz_name[10];               /* name of timezone (if extended format is used) */
+
     static const char * const days[] =
        { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL };
     static const char * const months[] =
@@ -80,26 +83,93 @@ static int dateToTimet(const char * datestr, time_t * secs)
     if (*p == '\0') goto exit;
     pe = p; SKIPNONSPACE(pe); if (*pe != '\0') *pe++ = '\0';
 
-    /* make this noon so the day is always right (as we make this UTC) */
-    time.tm_hour = 12;
-
     time.tm_mday = strtol(p, &q, 10);
     if (!(q && *q == '\0')) goto exit;
     if (time.tm_mday < 0 || time.tm_mday > lengths[time.tm_mon]) goto exit;
 
-    /* year */
-    p = pe; SKIPSPACE(p);
-    if (*p == '\0') goto exit;
-    pe = p; SKIPNONSPACE(pe); if (*pe != '\0') *pe = '\0';
+    /* first part of year entry (original format) / time entry (extended format)*/
+    p = pe;
+    SKIPSPACE(p);
+    if (*p == '\0')
+       goto exit;
+
+    /* in the original format here is year record (e.g. 1999),
+     * in the extended one here is time stamp (e.g. 10:22:30).
+     * Choose the format
+     */
+    if ((p[1]==':') || ((p[1]!='\0') && ((p[2]==':')))) {
+       /* it can be extended format */
+       *date_words = 6;
+
+       /* second part of time entry */
+       /* hours */
+       time.tm_hour = strtol(p, &q, 10);
+       if ( (time.tm_hour < 0) || (time.tm_hour > 23) )
+          goto exit;
+       if (*q!=':')
+          goto exit;
+       p = ++q;
+       /* minutes */
+       time.tm_min = strtol(p, &q, 10);
+       if ( (time.tm_min < 0) || (time.tm_min > 59) )
+          goto exit;
+       if (*q != ':')
+          goto exit;
+       p = ++q;
+       /* time - seconds */
+       time.tm_sec = strtol(p, &q, 10);
+       if ( (time.tm_sec < 0) || (time.tm_sec > 59) )
+          goto exit;
+       p = q;
+
+       /* time zone name */
+       SKIPSPACE(p);
+       if (*p == '\0')
+          goto exit;
+       pe = p;
+       SKIPNONSPACE(pe);
+       if (*pe != '\0')
+          *pe++ = '\0';
+       if (((int)(pe-p) + 1) > 9 )
+          goto exit;
+       strncpy(tz_name, p, (int)(pe-p));
+       tz_name[(int)(pe-p)] = '\0';
+
+       /* first part of year entry */
+       p = pe;
+       SKIPSPACE(p);
+       if (*p == '\0')
+          goto exit;
+    } else {
+       *date_words = 4;
+       /* the original format */
+       /* make this noon so the day is always right (as we make this UTC) */
+       time.tm_hour = 12;
+   }
+
+    /* year - second part */
+    pe = p;
+    SKIPNONSPACE(pe);
+    if (*pe != '\0')
+       *pe = '\0';
     time.tm_year = strtol(p, &q, 10);
     if (!(q && *q == '\0')) goto exit;
     if (time.tm_year < 1990 || time.tm_year >= 3000) goto exit;
     time.tm_year -= 1900;
 
-    /* chnagelog date is always in UTC */
+    /* change time zone and compute calendar time representation */
     tz = getenv("TZ");
-    if (tz) tz = xstrdup(tz);
-    setenv("TZ", "UTC", 1);
+    if (tz)
+       tz = xstrdup(tz);
+    if (*date_words == 6) {
+       /* changelog date is in read time zone */
+       tz = getenv("TZ");
+       if (tz) tz = xstrdup(tz);
+       setenv("TZ", tz_name, 1);
+    } else {
+       /* changelog date is always in UTC */
+       setenv("TZ", "UTC", 1);
+    }
     ntime = time; /* struct assignment */
     *secs = mktime(&ntime);
     unsetenv("TZ");
@@ -107,6 +177,7 @@ static int dateToTimet(const char * datestr, time_t * secs)
        setenv("TZ", tz, 1);
        free(tz);
     }
+
     if (*secs == -1) goto exit;
 
     /* XXX Turn this into a hard error in a release or two */
@@ -135,6 +206,7 @@ static rpmRC addChangelog(Header h, ARGV_const_t sb)
     time_t lastTime = 0;
     time_t trimtime = rpmExpandNumeric("%{?_changelog_trimtime}");
     char *date, *name, *text, *next;
+    int date_words;      /* number of words in date string */
 
     s = sp = argvJoin(sb, "");
 
@@ -149,7 +221,7 @@ static rpmRC addChangelog(Header h, ARGV_const_t sb)
 
        /* find end of line */
        date = s;
-       while(*s && *s != '\n') s++;
+       while (*s && *s != '\n') s++;
        if (! *s) {
            rpmlog(RPMLOG_ERR, _("incomplete %%changelog entry\n"));
            goto exit;
@@ -160,12 +232,8 @@ static rpmRC addChangelog(Header h, ARGV_const_t sb)
        /* 4 fields of date */
        date++;
        s = date;
-       for (i = 0; i < 4; i++) {
-           SKIPSPACE(s);
-           SKIPNONSPACE(s);
-       }
        SKIPSPACE(date);
-       if (dateToTimet(date, &time)) {
+       if (dateToTimet(date, &time, &date_words)) {
            rpmlog(RPMLOG_ERR, _("bad date in %%changelog: %s\n"), date);
            goto exit;
        }
@@ -174,6 +242,10 @@ static rpmRC addChangelog(Header h, ARGV_const_t sb)
                     _("%%changelog not in descending chronological order\n"));
            goto exit;
        }
+       for (i = 0; i < date_words; i++) {
+           SKIPSPACE(s);
+           SKIPNONSPACE(s);
+       }
        lastTime = time;
 
        /* skip space to the name */
@@ -237,6 +309,11 @@ int parseChangelog(rpmSpec spec)
 {
     int nextPart, rc, res = PART_ERROR;
     ARGV_t sb = NULL;
+
+    if (headerIsEntry(spec->packages->header, RPMTAG_CHANGELOGTIME)) {
+       rpmlog(RPMLOG_ERR, _("line %d: second %%changelog\n"), spec->lineNum);
+       goto exit;
+    }
     
     /* There are no options to %changelog */
     if ((rc = readLine(spec, STRIP_COMMENTS)) > 0) {
index f233d8d2479422080c62cbe777de8a3a900203c1..428821e566d847a3cda6aca49d25e38ff19f681a 100644 (file)
@@ -60,22 +60,8 @@ int parseDescription(rpmSpec spec)
        }
     }
 
-    if (lookupPackage(spec, name, flag, &pkg)) {
-       rpmlog(RPMLOG_ERR, _("line %d: Package does not exist: %s\n"),
-                spec->lineNum, spec->line);
+    if (lookupPackage(spec, name, flag, &pkg))
        goto exit;
-    }
-
-
-    /******************/
-
-#if 0    
-    if (headerIsEntry(pkg->header, RPMTAG_DESCRIPTION)) {
-       rpmlog(RPMLOG_ERR, _("line %d: Second description\n"),
-               spec->lineNum);
-       goto exit;
-    }
-#endif
 
     sb = newStringBuf();
 
@@ -99,11 +85,10 @@ int parseDescription(rpmSpec spec)
     }
     
     stripTrailingBlanksStringBuf(sb);
-    if (!((spec->flags & RPMSPEC_NOLANG) && !rstreq(lang, RPMBUILD_DEFAULT_LANG))) {
-       (void) headerAddI18NString(pkg->header, RPMTAG_DESCRIPTION,
-                       getStringBuf(sb), lang);
+    if (addLangTag(spec, pkg->header,
+                  RPMTAG_DESCRIPTION, getStringBuf(sb), lang)) {
+       nextPart = PART_ERROR;
     }
-    
      
 exit:
     freeStringBuf(sb);
index ea0d6385f279d598d6451eba964be13fc82eeb39..d2ea9e3d1560fd17675172c1ba3af7dfb4ef5a8a 100644 (file)
@@ -27,7 +27,7 @@ int parseFiles(rpmSpec spec)
     };
 
     /* XXX unmask %license while parsing %files */
-    addMacro(spec->macros, "license", NULL, "%%license", RMIL_SPEC);
+    rpmPushMacro(spec->macros, "license", NULL, "%%license", RMIL_SPEC);
 
     if ((rc = poptParseArgvString(spec->line, &argc, &argv))) {
        rpmlog(RPMLOG_ERR, _("line %d: Error parsing %%files: %s\n"),
@@ -61,10 +61,23 @@ int parseFiles(rpmSpec spec)
        }
     }
 
-    if (lookupPackage(spec, name, flag, &pkg)) {
-       rpmlog(RPMLOG_ERR, _("line %d: Package does not exist: %s\n"),
-                spec->lineNum, spec->line);
+    if (lookupPackage(spec, name, flag, &pkg))
        goto exit;
+
+    /*
+     * This should be an error, but its surprisingly commonly abused for the
+     * effect of multiple -f arguments in versions that dont support it.
+     * Warn but preserve behavior, except for leaking memory.
+     */
+    if (pkg->fileList != NULL) {
+       rpmlog(RPMLOG_WARNING, _("line %d: multiple %%files for package '%s'\n"),
+              spec->lineNum, rpmstrPoolStr(pkg->pool, pkg->name));
+       if ((name != NULL) && (0 == strncmp(name, "debuginfo", 9)))
+       {
+           char* multifilelist_flag = "1";
+            headerPutString(pkg->header, RPMTAG_MULTIFILELIST, multifilelist_flag);
+       }
+       pkg->fileList = argvFree(pkg->fileList);
     }
 
     for (arg=1; arg<argc; arg++) {
@@ -95,7 +108,7 @@ int parseFiles(rpmSpec spec)
     res = nextPart;
 
 exit:
-    delMacro(NULL, "license");
+    rpmPopMacro(NULL, "license");
     free(argv);
     poptFreeContext(optCon);
        
index 129541635571194f25c5fabed084a60023602cc0..54c8593ece70ed4376a2dc62584c28dd29d94d3e 100644 (file)
@@ -58,11 +58,8 @@ int parsePolicies(rpmSpec spec)
        }
     }
 
-    if (lookupPackage(spec, name, flag, &pkg)) {
-       rpmlog(RPMLOG_ERR, _("line %d: Package does not exist: %s\n"),
-              spec->lineNum, spec->line);
+    if (lookupPackage(spec, name, flag, &pkg))
        goto exit;
-    }
 
     if ((rc = readLine(spec, STRIP_TRAILINGSPACE | STRIP_COMMENTS)) > 0) {
        nextPart = PART_NONE;
index c2a7f6ead54bc44ea049eb2a37b4b56536f03a2d..cb97a5d8e3c859c42321a5d41b3d9f83bce20a7b 100644 (file)
@@ -19,8 +19,8 @@
 
 #define SKIPSPACE(s) { while (*(s) && risspace(*(s))) (s)++; }
 #define SKIPNONSPACE(s) { while (*(s) && !risspace(*(s))) (s)++; }
-#define SKIPWHITE(_x)  {while(*(_x) && (risspace(*_x) || *(_x) == ',')) (_x)++;}
-#define SKIPNONWHITE(_x){while(*(_x) &&!(risspace(*_x) || *(_x) == ',')) (_x)++;}
+#define SKIPWHITE(_x)  {while (*(_x) && (risspace(*_x) || *(_x) == ',')) (_x)++;}
+#define SKIPNONWHITE(_x){while (*(_x) &&!(risspace(*_x) || *(_x) == ',')) (_x)++;}
 
 /**
  */
@@ -92,7 +92,7 @@ static int parseSimplePart(const char *line, char **name, int *flag)
     *name = NULL;
 
     if (!(tok = strtok(NULL, " \t\n"))) {
-       rc = 0;
+       rc = 1;
        goto exit;
     }
     
@@ -299,14 +299,14 @@ static int addSource(rpmSpec spec, Package pkg, const char *field, rpmTagVal tag
 
        rasprintf(&buf, "%s%d",
                (flag & RPMBUILD_ISPATCH) ? "PATCH" : "SOURCE", num);
-       addMacro(spec->macros, buf, NULL, body, RMIL_SPEC);
+       rpmPushMacro(spec->macros, buf, NULL, body, RMIL_SPEC);
        free(buf);
        rasprintf(&buf, "%sURL%d",
                (flag & RPMBUILD_ISPATCH) ? "PATCH" : "SOURCE", num);
-       addMacro(spec->macros, buf, NULL, p->fullSource, RMIL_SPEC);
+       rpmPushMacro(spec->macros, buf, NULL, p->fullSource, RMIL_SPEC);
        free(buf);
 #ifdef WITH_LUA
-       if (!spec->recursing) {
+       {
            rpmlua lua = NULL; /* global state */
            const char * what = (flag & RPMBUILD_ISPATCH) ? "patches" : "sources";
            rpmluaPushTable(lua, what);
@@ -428,6 +428,11 @@ static rpmRC checkForValidArchitectures(rpmSpec spec)
     char *arch = rpmExpand("%{_target_cpu}", NULL);
     char *os = rpmExpand("%{_target_os}", NULL);
     rpmRC rc = RPMRC_FAIL; /* assume failure */
+
+    if (!strcmp(arch, "noarch")) {
+       free(arch);
+       arch = rpmExpand("%{_build_cpu}", NULL);
+    }
     
     if (isMemberInEntry(spec->buildRestrictions,
                        arch, RPMTAG_EXCLUDEARCH) == 1) {
@@ -537,6 +542,13 @@ static void fillOutMainPackage(Header h)
     }
 }
 
+/**
+ */
+void copyInheritedTags(Header h, Header fromh)
+{
+    headerCopyTags(fromh, h, (rpmTagVal *)copyTagsDuringParse);
+}
+
 /**
  */
 static rpmRC readIcon(Header h, const char * file)
@@ -598,36 +610,114 @@ if (multiToken) { \
     return RPMRC_FAIL; \
 }
 
+static void specLog(rpmSpec spec, int lvl, const char *line, const char *msg)
+{
+    if (spec) {
+       rpmlog(lvl, _("line %d: %s in: %s\n"), spec->lineNum, msg, spec->line);
+    } else {
+       rpmlog(lvl, _("%s in: %s\n"), msg, line);
+    }
+}
+
 /**
  * Check for inappropriate characters. All alphanums are considered sane.
- * @param spec         spec
+ * @param spec         spec (or NULL)
  * @param field                string to check
- * @param fsize                size of string to check
  * @param whitelist    string of permitted characters
  * @return             RPMRC_OK if OK
  */
-rpmRC rpmCharCheck(rpmSpec spec, const char *field, size_t fsize, const char *whitelist)
+rpmRC rpmCharCheck(rpmSpec spec, const char *field, const char *whitelist)
 {
-    const char *ch, *stop = &field[fsize];
+    const char *ch;
+    char *err = NULL;
+    rpmRC rc = RPMRC_OK;
 
-    for (ch=field; *ch && ch < stop; ch++) {
+    for (ch=field; *ch; ch++) {
        if (risalnum(*ch) || strchr(whitelist, *ch)) continue;
-       if (isprint(*ch)) {
-           rpmlog(RPMLOG_ERR, _("line %d: Illegal char '%c' in: %s\n"),
-               spec->lineNum, *ch, spec->line);
-       } else {
-           rpmlog(RPMLOG_ERR, _("line %d: Illegal char in: %s\n"),
-               spec->lineNum, spec->line);
+       rasprintf(&err, _("Illegal char '%c' (0x%x)"),
+                 isprint(*ch) ? *ch : '?', *ch);
+    }
+    for (ch=field; *ch; ch++) {
+       if (strchr("%{}", *ch)) {
+           specLog(spec, RPMLOG_WARNING, field,
+                   _("Possible unexpanded macro"));
+           break;
        }
-       return RPMRC_FAIL;
     }
-    if (strstr(field, "..") != NULL) {
-       rpmlog(RPMLOG_ERR, _("line %d: Illegal sequence \"..\" in: %s\n"),
-           spec->lineNum, spec->line);
-       return RPMRC_FAIL;
+
+    if (err == NULL && strstr(field, "..") != NULL) {
+       rasprintf(&err, _("Illegal sequence \"..\""));
     }
-    
-    return RPMRC_OK;
+
+    if (err) {
+       specLog(spec, RPMLOG_ERR, field, err);
+       free(err);
+       rc = RPMRC_FAIL;
+    }
+    return rc;
+}
+
+static int haveLangTag(Header h, rpmTagVal tag, const char *lang)
+{
+    int rc = 0;        /* assume tag not present */
+    int langNum = -1;
+
+    if (lang && *lang) {
+       /* See if the language is in header i18n table */
+       struct rpmtd_s langtd;
+       const char *s = NULL;
+       headerGet(h, RPMTAG_HEADERI18NTABLE, &langtd, HEADERGET_MINMEM);
+       while ((s = rpmtdNextString(&langtd)) != NULL) {
+           if (rstreq(s, lang)) {
+               langNum = rpmtdGetIndex(&langtd);
+               break;
+           }
+       }
+       rpmtdFreeData(&langtd);
+    } else {
+       /* C locale */
+       langNum = 0;
+    }
+
+    /* If locale is present, check the actual tag content */
+    if (langNum >= 0) {
+       struct rpmtd_s td;
+       headerGet(h, tag, &td, HEADERGET_MINMEM|HEADERGET_RAW);
+       if (rpmtdSetIndex(&td, langNum) == langNum) {
+           const char *s = rpmtdGetString(&td);
+           /* non-empty string means a dupe */
+           if (s && *s)
+               rc = 1;
+       }
+       rpmtdFreeData(&td);
+    };
+
+    return rc;
+}
+
+int addLangTag(rpmSpec spec, Header h, rpmTagVal tag,
+                     const char *field, const char *lang)
+{
+    int skip = 0;
+
+    if (haveLangTag(h, tag, lang)) {
+       /* Turn this into an error eventually */
+       rpmlog(RPMLOG_WARNING, _("line %d: second %s, please remove it\n"),
+               spec->lineNum, rpmTagGetName(tag));
+       return 0;
+    }
+
+    if (!*lang) {
+       headerPutString(h, tag, field);
+    } else {
+       skip = ((spec->flags & RPMSPEC_NOLANG) &&
+               !rstreq(lang, RPMBUILD_DEFAULT_LANG));
+       if (skip)
+           return 0;
+       headerAddI18NString(h, tag, field, lang);
+    }
+
+    return 0;
 }
 
 static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
@@ -669,14 +759,17 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
     switch (tag) {
     case RPMTAG_NAME:
        SINGLE_TOKEN_ONLY;
-       if (rpmCharCheck(spec, field, strlen(field), ".-_+%{}"))
+       if (rpmCharCheck(spec, field, WHITELIST_NAME))
           goto exit;
        headerPutString(pkg->header, tag, field);
+       /* Main pkg name is unknown at the start, populate as soon as we can */
+       if (pkg == spec->packages)
+           pkg->name = rpmstrPoolId(spec->pool, field, 1);
        break;
     case RPMTAG_VERSION:
     case RPMTAG_RELEASE:
        SINGLE_TOKEN_ONLY;
-       if (rpmCharCheck(spec, field, strlen(field), "._+%{}~"))
+       if (rpmCharCheck(spec, field, "._+%{}~"))
           goto exit;
        headerPutString(pkg->header, tag, field);
        break;
@@ -694,11 +787,8 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
     case RPMTAG_VENDOR:
     case RPMTAG_LICENSE:
     case RPMTAG_PACKAGER:
-       if (!*lang) {
-           headerPutString(pkg->header, tag, field);
-       } else if (!((spec->flags & RPMSPEC_NOLANG) &&
-                  !rstreq(lang, RPMBUILD_DEFAULT_LANG)))
-           headerAddI18NString(pkg->header, tag, field, lang);
+       if (addLangTag(spec, pkg->header, tag, field, lang))
+           goto exit;
        break;
     case RPMTAG_BUILDROOT:
        /* just silently ignore BuildRoot */
@@ -731,8 +821,8 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
            goto exit;
        }
        macro = NULL;
-       delMacro(NULL, "_docdir");
-       addMacro(NULL, "_docdir", NULL, field, RMIL_SPEC);
+       rpmPopMacro(NULL, "_docdir");
+       rpmPushMacro(NULL, "_docdir", NULL, field, RMIL_SPEC);
        break;
     case RPMTAG_EPOCH: {
        SINGLE_TOKEN_ONLY;
@@ -773,8 +863,8 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
        if (parseNoSource(spec, field, tag))
            goto exit;
        break;
-    case RPMTAG_ORDERFLAGS:
-    case RPMTAG_REQUIREFLAGS:
+    case RPMTAG_ORDERNAME:
+    case RPMTAG_REQUIRENAME:
        if (parseBits(lang, installScriptBits, &tagflags)) {
            rpmlog(RPMLOG_ERR, _("line %d: Bad %s: qualifiers: %s\n"),
                     spec->lineNum, rpmTagGetName(tag), spec->line);
@@ -782,17 +872,24 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
        }
        /* fallthrough */
     case RPMTAG_PREREQ:
+    case RPMTAG_RECOMMENDNAME:
+    case RPMTAG_SUGGESTNAME:
+    case RPMTAG_SUPPLEMENTNAME:
+    case RPMTAG_ENHANCENAME:
+    case RPMTAG_CONFLICTNAME:
+    case RPMTAG_OBSOLETENAME:
+    case RPMTAG_PROVIDENAME:
+       if (parseRCPOT(spec, pkg, field, tag, 0, tagflags, addReqProvPkg, NULL))
+           goto exit;
+       break;
     case RPMTAG_BUILDPREREQ:
     case RPMTAG_BUILDREQUIRES:
     case RPMTAG_BUILDCONFLICTS:
-    case RPMTAG_CONFLICTFLAGS:
-    case RPMTAG_OBSOLETEFLAGS:
-    case RPMTAG_PROVIDEFLAGS:
-       if (parseRCPOT(spec, pkg, field, tag, 0, tagflags))
+       if (parseRCPOT(spec, spec->sourcePackage, field, tag, 0, tagflags, addReqProvPkg, NULL))
            goto exit;
        break;
-    case RPMTAG_SUGGESTSFLAGS:
-    case RPMTAG_ENHANCESFLAGS:
+    case RPMTAG_OLDSUGGESTSFLAGS:
+    case RPMTAG_OLDENHANCESFLAGS:
     case RPMTAG_BUILDSUGGESTS:
     case RPMTAG_BUILDENHANCES:
        tagflags = RPMSENSE_MISSINGOK;
@@ -800,7 +897,7 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
            tagflags |= RPMSENSE_STRONG;
        if (macro && (!strcmp(macro, "supplements") || !strcmp(macro, "buildsupplements")))
            tagflags |= RPMSENSE_STRONG;
-       if ((rc = parseRCPOT(spec, pkg, field, tag, 0, tagflags)))
+       if (parseRCPOT(spec, pkg, field, tag, 0, tagflags, addReqProvPkg, NULL))
            return rc;
        break;
     case RPMTAG_EXCLUDEARCH:
@@ -820,6 +917,13 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
            goto exit;
        }
        if (spec->packages == pkg) {
+           if (spec->BANames) {
+               rpmlog(RPMLOG_ERR,
+                      _("line %d: Duplicate BuildArch entry: %s\n"),
+                      spec->lineNum, spec->line);
+               BANames = _free(BANames);
+               goto exit;
+           }
            spec->BACount = BACount;
            spec->BANames = BANames;
        } else {
@@ -836,7 +940,10 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
            spec->BANames = _free(spec->BANames);
        break;
     }
-    case RPMTAG_COLLECTIONS:
+    case RPMTAG_REMOVEPATHPOSTFIXES:
+       argvSplit(&pkg->removePostfixes, field, ":");
+       break;
+       case RPMTAG_BUILDINFO:
        if (addOrAppendListEntry(pkg->header, tag, field))
           goto exit;
        break;
@@ -845,8 +952,17 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
        goto exit;
     }
 
-    if (macro)
-       addMacro(spec->macros, macro, NULL, field, RMIL_SPEC);
+    if (macro) {
+       rpmPushMacro(spec->macros, macro, NULL, field, RMIL_SPEC);
+       /* Add a separate uppercase macro for tags from the main package */
+       if (pkg == spec->packages) {
+           char *m = xstrdup(macro);
+           for (char *p = m; *p; ++p)
+               *p = rtoupper(*p);
+           rpmPushMacro(spec->macros, m, NULL, field, RMIL_SPEC);
+           free(m);
+       }
+    }
     rc = RPMRC_OK;
 exit:
     return rc; 
@@ -880,7 +996,7 @@ static struct PreambleRec_s const preambleList[] = {
     {RPMTAG_GROUP,             1, 0, LEN_AND_STR("group")},
     {RPMTAG_PACKAGER,          0, 0, LEN_AND_STR("packager")},
     {RPMTAG_URL,               0, 0, LEN_AND_STR("url")},
-    {RPMTAG_VCS,        0, 0, LEN_AND_STR("vcs")},
+    {RPMTAG_VCS,               0, 0, LEN_AND_STR("vcs")},
     {RPMTAG_SOURCE,            0, 0, LEN_AND_STR("source")},
     {RPMTAG_PATCH,             0, 0, LEN_AND_STR("patch")},
     {RPMTAG_NOSOURCE,          0, 0, LEN_AND_STR("nosource")},
@@ -890,11 +1006,15 @@ static struct PreambleRec_s const preambleList[] = {
     {RPMTAG_EXCLUDEOS,         0, 0, LEN_AND_STR("excludeos")},
     {RPMTAG_EXCLUSIVEOS,       0, 0, LEN_AND_STR("exclusiveos")},
     {RPMTAG_ICON,              0, 0, LEN_AND_STR("icon")},
-    {RPMTAG_PROVIDEFLAGS,      0, 0, LEN_AND_STR("provides")},
-    {RPMTAG_REQUIREFLAGS,      2, 0, LEN_AND_STR("requires")},
+    {RPMTAG_PROVIDENAME,       0, 0, LEN_AND_STR("provides")},
+    {RPMTAG_REQUIRENAME,       2, 0, LEN_AND_STR("requires")},
+    {RPMTAG_RECOMMENDNAME,     0, 0, LEN_AND_STR("recommends")},
+    {RPMTAG_SUGGESTNAME,       0, 0, LEN_AND_STR("suggests")},
+    {RPMTAG_SUPPLEMENTNAME,    0, 0, LEN_AND_STR("supplements")},
+    {RPMTAG_ENHANCENAME,       0, 0, LEN_AND_STR("enhances")},
     {RPMTAG_PREREQ,            2, 1, LEN_AND_STR("prereq")},
-    {RPMTAG_CONFLICTFLAGS,     0, 0, LEN_AND_STR("conflicts")},
-    {RPMTAG_OBSOLETEFLAGS,     0, 0, LEN_AND_STR("obsoletes")},
+    {RPMTAG_CONFLICTNAME,      0, 0, LEN_AND_STR("conflicts")},
+    {RPMTAG_OBSOLETENAME,      0, 0, LEN_AND_STR("obsoletes")},
     {RPMTAG_PREFIXES,          0, 0, LEN_AND_STR("prefixes")},
     {RPMTAG_PREFIXES,          0, 0, LEN_AND_STR("prefix")},
     {RPMTAG_BUILDROOT,         0, 0, LEN_AND_STR("buildroot")},
@@ -909,17 +1029,19 @@ static struct PreambleRec_s const preambleList[] = {
     {RPMTAG_DOCDIR,            0, 0, LEN_AND_STR("docdir")},
     {RPMTAG_DISTTAG,           0, 0, LEN_AND_STR("disttag")},
     {RPMTAG_BUGURL,            0, 0, LEN_AND_STR("bugurl")},
-    {RPMTAG_COLLECTIONS,       0, 0, LEN_AND_STR("collections")},
     {RPMTAG_ORDERFLAGS,                2, 0, LEN_AND_STR("orderwithrequires")},
-    {RPMTAG_SUGGESTSFLAGS,     0, 0, LEN_AND_STR("recommends")},
-    {RPMTAG_SUGGESTSFLAGS,     0, 0, LEN_AND_STR("suggests")},
-    {RPMTAG_ENHANCESFLAGS,     0, 0, LEN_AND_STR("supplements")},
-    {RPMTAG_ENHANCESFLAGS,     0, 0, LEN_AND_STR("enhances")},
+    {RPMTAG_OLDSUGGESTSFLAGS,  0, 0, LEN_AND_STR("recommends")},
+    {RPMTAG_OLDSUGGESTSFLAGS,  0, 0, LEN_AND_STR("suggests")},
+    {RPMTAG_OLDENHANCESFLAGS,  0, 0, LEN_AND_STR("supplements")},
+    {RPMTAG_OLDENHANCESFLAGS,  0, 0, LEN_AND_STR("enhances")},
     {RPMTAG_BUILDSUGGESTS,     0, 0, LEN_AND_STR("buildrecommends")},
     {RPMTAG_BUILDSUGGESTS,     0, 0, LEN_AND_STR("buildsuggests")},
     {RPMTAG_BUILDENHANCES,     0, 0, LEN_AND_STR("buildsupplements")},
     {RPMTAG_BUILDENHANCES,     0, 0, LEN_AND_STR("buildenhances")},
     {RPMTAG_SECMANIFEST,       0, 0, LEN_AND_STR("manifest")},
+    {RPMTAG_ORDERNAME,         2, 0, LEN_AND_STR("orderwithrequires")},
+    {RPMTAG_REMOVEPATHPOSTFIXES,0, 0, LEN_AND_STR("removepathpostfixes")},
+    {RPMTAG_BUILDINFO,         0, 0, LEN_AND_STR("buildinfo")},
     {0, 0, 0, 0}
 };
 
@@ -993,8 +1115,6 @@ int parsePreamble(rpmSpec spec, int initialPackage)
     char *NVR = NULL;
     char lang[BUFSIZ];
 
-    pkg = newPackage(spec);
-       
     if (! initialPackage) {
        /* There is one option to %package: <pkg> or -n <pkg> */
        if (parseSimplePart(spec->line, &name, &flag)) {
@@ -1002,9 +1122,35 @@ int parsePreamble(rpmSpec spec, int initialPackage)
                        spec->line);
            goto exit;
        }
+
+       //if (rpmCharCheck(spec, name, WHITELIST_NAME))
+       //    goto exit;
        
        if (!lookupPackage(spec, name, flag, NULL)) {
-           rpmlog(RPMLOG_ERR, _("Package already exists: %s\n"), spec->line);
+               //exist %package debuginfo, need to ignore it, because there has been
+               //debuginfo package created by %debug_package macro.
+               if ((name != NULL) && (0 == strncmp(name, "debuginfo", 9)))
+               {
+                       rpmlog(RPMLOG_WARNING, _("debuginfo package has been in spec file, Don't write again this %s"), spec->line);
+                       if ((rc = readLine(spec, STRIP_TRAILINGSPACE | STRIP_COMMENTS)) > 0) {
+                               nextPart = PART_NONE;
+                       } else if (rc < 0) {
+                               free(name);
+                               goto exit;
+                       } else {
+                               while (! (nextPart = isPart(spec->line))) {
+                                       if ((rc = readLine(spec, STRIP_TRAILINGSPACE | STRIP_COMMENTS)) > 0) {
+                                               nextPart = PART_NONE;
+                                               break;
+                                       }
+                                       if (rc) {
+                                               free(name);
+                                               goto exit;
+                                       }
+                               }
+                       }
+                       res = nextPart;
+               }
            free(name);
            goto exit;
        }
@@ -1016,9 +1162,13 @@ int parsePreamble(rpmSpec spec, int initialPackage)
        } else
            NVR = xstrdup(name);
        free(name);
+       pkg = newPackage(NVR, spec->pool, &spec->packages);
        headerPutString(pkg->header, RPMTAG_NAME, NVR);
     } else {
        NVR = xstrdup("(main package)");
+       pkg = newPackage(NULL, spec->pool, &spec->packages);
+       spec->sourcePackage = newPackage(NULL, spec->pool, NULL);
+       
     }
 
     if ((rc = readLine(spec, STRIP_TRAILINGSPACE | STRIP_COMMENTS)) > 0) {
@@ -1035,16 +1185,24 @@ int parsePreamble(rpmSpec spec, int initialPackage)
            SKIPSPACE(linep);
            if (*linep != '\0') {
                if (findPreambleTag(spec, &tag, &macro, lang)) {
-                   rpmlog(RPMLOG_INFO, _("line %d: Unknown tag: %s\n"),
+                   if (spec->lineNum == 1 &&
+                       (unsigned char)(spec->line[0]) == 0xed &&
+                       (unsigned char)(spec->line[1]) == 0xab &&
+                       (unsigned char)(spec->line[2]) == 0xee &&
+                       (unsigned char)(spec->line[3]) == 0xdb) {
+                       rpmlog(RPMLOG_ERR, _("Binary rpm package found. Expected spec file!\n"));
+                       goto exit;
+                   }
+                   rpmlog(RPMLOG_ERR, _("line %d: Unknown tag: %s\n"),
                                spec->lineNum, spec->line);
-               } else {
-                       if (handlePreambleTag(spec, pkg, tag, macro, lang)) {
-                           goto exit;
-                       }
-                       if (spec->BANames && !spec->recursing) {
-                           res = PART_BUILDARCHITECTURES;
-                           goto exit;
-                       }
+                   goto exit;
+               }
+               if (handlePreambleTag(spec, pkg, tag, macro, lang)) {
+                   goto exit;
+               }
+               if (spec->BANames && !spec->recursing) {
+                   res = PART_BUILDARCHITECTURES;
+                   goto exit;
                }
            }
            if ((rc =
@@ -1076,7 +1234,7 @@ int parsePreamble(rpmSpec spec, int initialPackage)
        }
        free(spec->buildRoot);
        spec->buildRoot = buildRoot;
-       addMacro(spec->macros, "buildroot", NULL, spec->buildRoot, RMIL_SPEC);
+       rpmPushMacro(spec->macros, "buildroot", NULL, spec->buildRoot, RMIL_SPEC);
     }
 
     /* XXX Skip valid arch check if not building binary package */
@@ -1098,8 +1256,7 @@ int parsePreamble(rpmSpec spec, int initialPackage)
     }
 
     if (pkg != spec->packages) {
-       headerCopyTags(spec->packages->header, pkg->header,
-                       (rpmTagVal *)copyTagsDuringParse);
+       copyInheritedTags(pkg->header, spec->packages->header);
     }
 
     if (checkForRequired(pkg->header, NVR)) {
index fd4d30cdfcd7b12d2ced3c112af383d5054cea0c..a62123e2573d64094485a50cb170063f874e7e36 100644 (file)
@@ -6,6 +6,7 @@
 #include "system.h"
 
 #include <errno.h>
+#include <libgen.h>
 
 #include <rpm/header.h>
 #include <rpm/rpmlog.h>
@@ -29,10 +30,6 @@ static rpmRC checkOwners(const char * urlfn)
                urlfn, strerror(errno));
        return RPMRC_FAIL;
     }
-    if (!rpmugUname(sb.st_uid) || !rpmugGname(sb.st_gid)) {
-       rpmlog(RPMLOG_ERR, _("Bad owner/group: %s\n"), urlfn);
-       return RPMRC_FAIL;
-    }
 
     return RPMRC_OK;
 }
@@ -47,21 +44,25 @@ static rpmRC checkOwners(const char * urlfn)
  * @param removeEmpties        include -E?
  * @param fuzz         fuzz factor, fuzz<0 means no fuzz set
  * @param dir          dir to change to (i.e. patch -d argument)
+ * @param outfile      send output to this file (i.e. patch -o argument)
  * @return             expanded %patch macro (NULL on error)
  */
 
 static char *doPatch(rpmSpec spec, uint32_t c, int strip, const char *db,
-                    int reverse, int removeEmpties, int fuzz, const char *dir)
+                    int reverse, int removeEmpties, int fuzz, const char *dir,
+                    const char *outfile)
 {
     char *fn = NULL;
     char *buf = NULL;
     char *arg_backup = NULL;
     char *arg_fuzz = NULL;
     char *arg_dir = NULL;
+    char *arg_outfile = NULL;
     char *args = NULL;
     char *arg_patch_flags = rpmExpand("%{?_default_patch_flags}", NULL);
     struct Source *sp;
     char *patchcmd;
+    rpmCompressedMagic compressed = COMPRESSED_NOT;
 
     for (sp = spec->sources; sp != NULL; sp = sp->next) {
        if ((sp->flags & RPMBUILD_ISPATCH) && (sp->num == c)) {
@@ -80,7 +81,7 @@ static char *doPatch(rpmSpec spec, uint32_t c, int strip, const char *db,
     fn = rpmGetPath("%{_sourcedir}/", sp->source, NULL);
 
     /* On non-build parse's, file cannot be stat'd or read. */
-    if ((spec->flags & RPMSPEC_FORCE) || checkOwners(fn)) goto exit;
+    if ((spec->flags & RPMSPEC_FORCE) || rpmFileIsCompressed(fn, &compressed) || checkOwners(fn)) goto exit;
 
     if (db) {
        rasprintf(&arg_backup,
@@ -94,17 +95,28 @@ static char *doPatch(rpmSpec spec, uint32_t c, int strip, const char *db,
        rasprintf(&arg_dir, " -d %s", dir);
     } else arg_dir = xstrdup("");
 
+    if (outfile) {
+       rasprintf(&arg_outfile, " -o %s", outfile);
+    } else arg_outfile = xstrdup("");
+
     if (fuzz >= 0) {
        rasprintf(&arg_fuzz, " --fuzz=%d", fuzz);
     } else arg_fuzz = xstrdup("");
 
-    rasprintf(&args, "%s -p%d %s%s%s%s%s", arg_patch_flags, strip, arg_backup, arg_fuzz, arg_dir,
+    rasprintf(&args, "%s -p%d %s%s%s%s%s%s", arg_patch_flags, strip, arg_backup, arg_fuzz, arg_dir, arg_outfile,
                reverse ? " -R" : "", 
                removeEmpties ? " -E" : "");
 
-    patchcmd = rpmExpand("%{uncompress: ", fn, "} | %{__patch} ", args, NULL);
+    /* Avoid the extra cost of fork and pipe for uncompressed patches */
+    if (compressed != COMPRESSED_NOT) {
+       patchcmd = rpmExpand("{ %{uncompress: ", fn, "} || echo patch_fail ; } | "
+                             "%{__patch} ", args, NULL);
+    } else {
+       patchcmd = rpmExpand("%{__patch} ", args, " < ", fn, NULL);
+    }
 
     free(arg_fuzz);
+    free(arg_outfile);
     free(arg_dir);
     free(arg_backup);
     free(args);
@@ -138,7 +150,7 @@ static char *doUntar(rpmSpec spec, uint32_t c, int quietly)
     char *fn = NULL;
     char *buf = NULL;
     char *tar = NULL;
-    const char *taropts = ((rpmIsVerbose() && !quietly) ? "-xvvf" : "-xf");
+    const char *taropts = ((rpmIsVerbose() && !quietly) ? "-xvvof" : "-xof");
     struct Source *sp;
     rpmCompressedMagic compressed = COMPRESSED_NOT;
 
@@ -167,6 +179,7 @@ static char *doUntar(rpmSpec spec, uint32_t c, int quietly)
     if (compressed != COMPRESSED_NOT) {
        char *zipper, *t = NULL;
        int needtar = 1;
+       int needgemspec = 0;
 
        switch (compressed) {
        case COMPRESSED_NOT:    /* XXX can't happen */
@@ -197,6 +210,14 @@ static char *doUntar(rpmSpec spec, uint32_t c, int quietly)
            t = "%{__7zip} x";
            needtar = 0;
            break;
+       case COMPRESSED_ZSTD:
+           t = "%{__zstd} -dc";
+           break;
+       case COMPRESSED_GEM:
+           t = "%{__gem} unpack";
+           needtar = 0;
+           needgemspec = 1;
+           break;
        }
        zipper = rpmGetPath(t, NULL);
        if (needtar) {
@@ -205,6 +226,22 @@ static char *doUntar(rpmSpec spec, uint32_t c, int quietly)
                "if [ $STATUS -ne 0 ]; then\n"
                "  exit $STATUS\n"
                "fi", zipper, fn, tar, taropts);
+       } else if (needgemspec) {
+           char *gem = rpmGetPath("%{__gem}", NULL);
+           char *gemspec = NULL;
+           char gemnameversion[strlen(sp->source) - 3];
+
+           rstrlcpy(gemnameversion, sp->source, strlen(sp->source) - 3);
+           gemspec = rpmGetPath("%{_builddir}/", gemnameversion, ".gemspec", NULL);
+
+           rasprintf(&buf, "%s '%s' && %s spec '%s' --ruby > '%s'\n"
+               "STATUS=$?\n"
+               "if [ $STATUS -ne 0 ]; then\n"
+               "  exit $STATUS\n"
+               "fi", zipper, fn, gem, fn, gemspec);
+
+           free(gemspec);
+           free(gem);
        } else {
            rasprintf(&buf, "%s '%s'\n"
                "STATUS=$?\n"
@@ -225,7 +262,6 @@ exit:
 
 /**
  * Parse %setup macro.
- * @todo FIXME: Option -q broken when not immediately after %setup.
  * @param spec         build info
  * @param line         current line from spec file
  * @return             RPMRC_OK on success
@@ -245,6 +281,7 @@ static int doSetupMacro(rpmSpec spec, const char *line)
     uint32_t num;
     int leaveDirs = 0, skipDefaultAction = 0;
     int createDir = 0, quietly = 0;
+    int buildInPlace = 0;
     const char * dirName = NULL;
     struct poptOption optionsTable[] = {
            { NULL, 'a', POPT_ARG_STRING, NULL, 'a',    NULL, NULL},
@@ -257,6 +294,8 @@ static int doSetupMacro(rpmSpec spec, const char *line)
            { 0, 0, 0, 0, 0,    NULL, NULL}
     };
 
+    if (strstr(line+6, " -q")) quietly = 1;
+
     if ((xx = poptParseArgvString(line, &argc, &argv))) {
        rpmlog(RPMLOG_ERR, _("Error parsing %%setup: %s\n"), poptStrerror(xx));
        goto exit;
@@ -298,7 +337,16 @@ static int doSetupMacro(rpmSpec spec, const char *line)
                  headerGetString(spec->packages->header, RPMTAG_NAME),
                  headerGetString(spec->packages->header, RPMTAG_VERSION));
     }
-    addMacro(spec->macros, "buildsubdir", NULL, spec->buildSubdir, RMIL_SPEC);
+    /* Mer addition - support --build-in-place */
+    if (rpmExpandNumeric("%{_build_in_place}")) {
+       buildInPlace = 1;
+       spec->buildSubdir = NULL;
+    }
+    rpmPushMacro(spec->macros, "buildsubdir", NULL, spec->buildSubdir, RMIL_SPEC);
+    if (buildInPlace) {
+       rc = RPMRC_OK;
+       goto exit;
+    }
     
     /* cd to the build dir */
     {  char * buildDir = rpmGenPath(spec->rootDir, "%{_builddir}", "");
@@ -316,6 +364,8 @@ static int doSetupMacro(rpmSpec spec, const char *line)
        free(buf);
     }
 
+    appendStringBuf(spec->prep, getStringBuf(before));
+
     /* if necessary, create and cd into the proper dir */
     if (createDir) {
        buf = rpmExpand("%{__mkdir_p} ", spec->buildSubdir, "\n",
@@ -333,8 +383,6 @@ static int doSetupMacro(rpmSpec spec, const char *line)
        free(chptr);
     }
 
-    appendStringBuf(spec->prep, getStringBuf(before));
-
     if (!createDir) {
        rasprintf(&buf, "cd '%s'", spec->buildSubdir);
        appendLineStringBuf(spec->prep, buf);
@@ -372,12 +420,12 @@ exit:
 /**
  * Parse %patch line.
  * This supports too many crazy syntaxes:
- * - %patchN is equal to %patch -P<N>
- * - -P<N> -P<N+1>... can be used to apply several patch on a single line
+ * - %patchN is equal to %patch -P\<N\>
+ * - -P\<N\> -P\<N+1\>... can be used to apply several patch on a single line
  * - Any trailing arguments are treated as patch numbers
  * - Any combination of the above, except unless at least one -P is specified,
- *   %patch is treated as %patch -P0 so that "%patch 1" is actually
- *   equal to "%patch -P0 -P1".
+ *   %patch is treated as "numberless patch" so that "%patch 1" actually tries
+ *   to pull in numberless "Patch:" and numbered "Patch1:".
  *
  * @param spec         build info
  * @param line         current line from spec file
@@ -385,7 +433,7 @@ exit:
  */
 static rpmRC doPatchMacro(rpmSpec spec, const char *line)
 {
-    char *opt_b, *opt_P, *opt_d;
+    char *opt_b, *opt_P, *opt_d, *opt_o;
     char *buf = NULL;
     int opt_p, opt_R, opt_E, opt_F;
     int argc, c;
@@ -402,13 +450,14 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line)
        { NULL, 'z', POPT_ARG_STRING, &opt_b, 'z', NULL, NULL },
        { NULL, 'F', POPT_ARG_INT, &opt_F, 'F', NULL, NULL },
        { NULL, 'd', POPT_ARG_STRING, &opt_d, 'd', NULL, NULL },
+       { NULL, 'o', POPT_ARG_STRING, &opt_o, 'o', NULL, NULL },
        { NULL, 0, 0, NULL, 0, NULL, NULL }
     };
     poptContext optCon = NULL;
 
     opt_p = opt_R = opt_E = 0;
     opt_F = rpmExpandNumeric("%{_default_patch_fuzz}");                /* get default fuzz factor for %patch */
-    opt_b = opt_d = NULL;
+    opt_b = opt_d = opt_o = NULL;
 
     /* Convert %patchN to %patch -PN to simplify further processing */
     if (! strchr(" \t\n", line[6])) {
@@ -460,7 +509,7 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line)
                     *patch, line);
            goto exit;
        }
-       s = doPatch(spec, pnum, opt_p, opt_b, opt_R, opt_E, opt_F, opt_d);
+       s = doPatch(spec, pnum, opt_p, opt_b, opt_R, opt_E, opt_F, opt_d, opt_o);
        if (s == NULL) {
            goto exit;
        }
index 4fea960c368e543d128fd653e080f3047874b213..4d7e8e8bfbe2738e2ffc48055991a44c95c233df 100644 (file)
 #include "build/rpmbuild_misc.h"
 #include "debug.h"
 
-/**
- */
-static struct ReqComp {
-const char * token;
-    rpmsenseFlags sense;
-} const ReqComparisons[] = {
-    { "<=", RPMSENSE_LESS | RPMSENSE_EQUAL},
-    { "=<", RPMSENSE_LESS | RPMSENSE_EQUAL},
-    { "<", RPMSENSE_LESS},
-
-    { "==", RPMSENSE_EQUAL},
-    { "=", RPMSENSE_EQUAL},
-    
-    { ">=", RPMSENSE_GREATER | RPMSENSE_EQUAL},
-    { "=>", RPMSENSE_GREATER | RPMSENSE_EQUAL},
-    { ">", RPMSENSE_GREATER},
-
-    { NULL, 0 },
+
+#define        SKIPWHITE(_x)   {while (*(_x) && (risspace(*_x) || *(_x) == ',')) (_x)++;}
+#define        SKIPNONWHITE(_x){while (*(_x) &&!(risspace(*_x) || *(_x) == ',')) (_x)++;}
+
+static rpmRC checkSep(const char *s, char c, char **emsg)
+{
+    const char *sep = strchr(s, c);
+    if (sep && strchr(sep + 1, c)) {
+       rasprintf(emsg, "Invalid version (double separator '%c'): %s", c, s);
+       return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+static rpmRC checkEpoch(const char *s, char **emsg)
+{
+    const char *si, *sep = strchr(s, ':');
+
+    if (!sep)
+       return RPMRC_OK;
+
+    for (si = s; si != sep; si++) {
+       if (!risdigit(*si)) {
+           rasprintf(emsg, "Invalid version (epoch must be unsigned integer): %s", s);
+           return RPMRC_FAIL;
+       }
+    }
+    return RPMRC_OK;
+}
+
+static rpmRC checkDep(rpmSpec spec, char *N, char *EVR, char **emsg)
+{
+    /* 
+     * Tokens must begin with alphanumeric, _, or /, but we don't know
+     * the spec's encoding so we only check what we can: plain ascii.
+     */
+    if (isascii(N[0]) && !(risalnum(N[0]) || N[0] == '_' || N[0] == '/')) {
+        rasprintf(emsg, _("Dependency tokens must begin with alpha-numeric, '_' or '/'"));
+        return RPMRC_FAIL;
+    }
+    if (EVR) {
+        if (N[0] == '/') {
+            rasprintf(emsg, _("Versioned file name not permitted"));
+            return RPMRC_FAIL;
+        }
+      //  if (rpmCharCheck(spec, EVR, ".-_+:%{}~"))
+       //     return RPMRC_FAIL;
+       if (checkSep(EVR, '-', emsg) != RPMRC_OK ||
+           checkSep(EVR, ':', emsg) != RPMRC_OK ||
+           checkEpoch(EVR, emsg) != RPMRC_OK) {
+
+           if (rpmExpandNumeric("%{?_wrong_version_format_terminate_build}"))
+               return RPMRC_FAIL;
+       }
+    }
+    return RPMRC_OK;
+}
+
+struct parseRCPOTRichData {
+    rpmSpec spec;
+    StringBuf sb;
 };
 
-#define        SKIPWHITE(_x)   {while(*(_x) && (risspace(*_x) || *(_x) == ',')) (_x)++;}
-#define        SKIPNONWHITE(_x){while(*(_x) &&!(risspace(*_x) || *(_x) == ',')) (_x)++;}
+/* Callback for the rich dependency parser. We use this to do check for invalid
+ * characters and to build a normailzed version of the dependency */
+static rpmRC parseRCPOTRichCB(void *cbdata, rpmrichParseType type,
+               const char *n, int nl, const char *e, int el, rpmsenseFlags sense,
+               rpmrichOp op, char **emsg) {
+    struct parseRCPOTRichData *data = cbdata;
+    StringBuf sb = data->sb;
+    rpmRC rc = RPMRC_OK;
+
+    if (type == RPMRICH_PARSE_ENTER) {
+       appendStringBuf(sb, "(");
+    } else if (type == RPMRICH_PARSE_LEAVE) {
+       appendStringBuf(sb, ")");
+    } else if (type == RPMRICH_PARSE_SIMPLE) {
+       char *N = xmalloc(nl + 1);
+       char *EVR = NULL;
+       rstrlcpy(N, n, nl + 1);
+       appendStringBuf(sb, N);
+       if (el) {
+           char rel[6], *rp = rel;
+           EVR = xmalloc(el + 1);
+           rstrlcpy(EVR, e, el + 1);
+           *rp++ = ' ';
+           if (sense & RPMSENSE_LESS)
+               *rp++ = '<';
+           if (sense & RPMSENSE_GREATER)
+               *rp++ = '>';
+           if (sense & RPMSENSE_EQUAL)
+               *rp++ = '=';
+           *rp++ = ' ';
+           *rp = 0;
+           appendStringBuf(sb, rel);
+           appendStringBuf(sb, EVR);
+       }
+       rc = checkDep(data->spec, N, EVR, emsg);
+       _free(N);
+       _free(EVR);
+    } else if (type == RPMRICH_PARSE_OP) {
+       appendStringBuf(sb, " ");
+       appendStringBuf(sb, rpmrichOpStr(op));
+       appendStringBuf(sb, " ");
+    }
+    return rc;
+}
 
 rpmRC parseRCPOT(rpmSpec spec, Package pkg, const char *field, rpmTagVal tagN,
-              int index, rpmsenseFlags tagflags)
+              int index, rpmsenseFlags tagflags, addReqProvFunction cb, void *cbdata)
 {
-    const char *r, *re, *v, *ve;
-    const char *emsg = NULL;
-    char * N = NULL, * EVR = NULL;
-    rpmTagVal nametag = RPMTAG_NOT_FOUND;
-    rpmsenseFlags Flags;
-    Header h = pkg->header; /* everything except buildrequires go here */
-    rpmRC rc = RPMRC_FAIL; /* assume failure */
-
-    switch (tagN) {
-    default:
-    case RPMTAG_REQUIREFLAGS:
-       nametag = RPMTAG_REQUIRENAME;
+       const char *r, *re, *v, *ve;
+       char *emsg = NULL;
+       char * N = NULL, * EVR = NULL;
+       rpmTagVal nametag = RPMTAG_NOT_FOUND;
+       rpmsenseFlags Flags;
+       rpmRC rc = RPMRC_FAIL; /* assume failure */
+       int allow_richdeps = 0;
+
+       if (!cbdata)
+       cbdata = pkg;
+
+       switch (tagN) {
+       default:
+       case RPMTAG_REQUIRENAME:
        tagflags |= RPMSENSE_ANY;
+       /* fall through */
+       case RPMTAG_RECOMMENDNAME:
+       case RPMTAG_SUGGESTNAME:
+       case RPMTAG_SUPPLEMENTNAME:
+       case RPMTAG_ENHANCENAME:
+       case RPMTAG_CONFLICTNAME:
+       allow_richdeps = 1;
+       /* fall through */
+       case RPMTAG_PROVIDENAME:
+       case RPMTAG_OBSOLETENAME:
+       case RPMTAG_ORDERNAME:
+       nametag = tagN;
        break;
-    case RPMTAG_PROVIDEFLAGS:
-       nametag = RPMTAG_PROVIDENAME;
-       break;
-    case RPMTAG_OBSOLETEFLAGS:
-       nametag = RPMTAG_OBSOLETENAME;
-       break;
-    case RPMTAG_CONFLICTFLAGS:
-       nametag = RPMTAG_CONFLICTNAME;
-       break;
-    case RPMTAG_ORDERFLAGS:
-       nametag = RPMTAG_ORDERNAME;
-       break;
-    case RPMTAG_PREREQ:
+       case RPMTAG_PREREQ:
        /* XXX map legacy PreReq into Requires(pre,preun) */
        nametag = RPMTAG_REQUIRENAME;
        tagflags |= (RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_PREUN);
+       allow_richdeps = 1;
        break;
-    case RPMTAG_TRIGGERPREIN:
+       case RPMTAG_TRIGGERPREIN:
        nametag = RPMTAG_TRIGGERNAME;
        tagflags |= RPMSENSE_TRIGGERPREIN;
        break;
-    case RPMTAG_TRIGGERIN:
+       case RPMTAG_TRIGGERIN:
        nametag = RPMTAG_TRIGGERNAME;
        tagflags |= RPMSENSE_TRIGGERIN;
        break;
-    case RPMTAG_TRIGGERPOSTUN:
+       case RPMTAG_TRIGGERPOSTUN:
        nametag = RPMTAG_TRIGGERNAME;
        tagflags |= RPMSENSE_TRIGGERPOSTUN;
        break;
-    case RPMTAG_TRIGGERUN:
+       case RPMTAG_TRIGGERUN:
        nametag = RPMTAG_TRIGGERNAME;
        tagflags |= RPMSENSE_TRIGGERUN;
        break;
-    case RPMTAG_BUILDPREREQ:
-    case RPMTAG_BUILDREQUIRES:
+       case RPMTAG_BUILDPREREQ:
+       case RPMTAG_BUILDREQUIRES:
        nametag = RPMTAG_REQUIRENAME;
        tagflags |= RPMSENSE_ANY;
-       h = spec->buildRestrictions;
+       allow_richdeps = 1;
        break;
-    case RPMTAG_BUILDCONFLICTS:
+       case RPMTAG_BUILDCONFLICTS:
        nametag = RPMTAG_CONFLICTNAME;
-       h = spec->buildRestrictions;
+       allow_richdeps = 1;
        break;
-    case RPMTAG_SUGGESTSFLAGS:
-       nametag = RPMTAG_SUGGESTSNAME;
+       case RPMTAG_FILETRIGGERIN:
+       nametag = RPMTAG_FILETRIGGERNAME;
+       tagflags |= RPMSENSE_TRIGGERIN;
        break;
-    case RPMTAG_ENHANCESFLAGS:
-       nametag = RPMTAG_ENHANCESNAME;
+       case RPMTAG_FILETRIGGERUN:
+       nametag = RPMTAG_FILETRIGGERNAME;
+       tagflags |= RPMSENSE_TRIGGERUN;
        break;
-    case RPMTAG_BUILDSUGGESTS:
-       nametag = RPMTAG_SUGGESTSNAME;
-       h = spec->buildRestrictions;
+       case RPMTAG_FILETRIGGERPOSTUN:
+       nametag = RPMTAG_FILETRIGGERNAME;
+       tagflags |= RPMSENSE_TRIGGERPOSTUN;
        break;
-    case RPMTAG_BUILDENHANCES:
-       nametag = RPMTAG_ENHANCESNAME;
-       h = spec->buildRestrictions;
+       case RPMTAG_TRANSFILETRIGGERIN:
+       nametag = RPMTAG_TRANSFILETRIGGERNAME;
+       tagflags |= RPMSENSE_TRIGGERIN;
        break;
-    }
+       case RPMTAG_TRANSFILETRIGGERUN:
+       nametag = RPMTAG_TRANSFILETRIGGERNAME;
+       tagflags |= RPMSENSE_TRIGGERUN;
+       break;
+       case RPMTAG_TRANSFILETRIGGERPOSTUN:
+       nametag = RPMTAG_TRANSFILETRIGGERNAME;
+       tagflags |= RPMSENSE_TRIGGERPOSTUN;
+       break;
+       }
 
-    for (r = field; *r != '\0'; r = re) {
+       for (r = field; *r != '\0'; r = re) {
        SKIPWHITE(r);
        if (*r == '\0')
-           break;
+               break;
 
        Flags = (tagflags & ~RPMSENSE_SENSEMASK);
 
-       /* 
-        * Tokens must begin with alphanumeric, _, or /, but we don't know
-        * the spec's encoding so we only check what we can: plain ascii.
-        */
-       if (isascii(r[0]) && !(risalnum(r[0]) || r[0] == '_' || r[0] == '/')) {
-           rpmlog(RPMLOG_INFO,
-                  _("line %d: Dependency tokens must begin with alpha-numeric, '_' or '/': %s\n"),
-                  spec->lineNum, spec->line);
+       if (r[0] == '(') {
+               struct parseRCPOTRichData data;
+               if (!allow_richdeps) {
+               rasprintf(&emsg, _("No rich dependencies allowed for this type"));
+               goto exit;
+               }
+               data.spec = spec;
+               data.sb = newStringBuf();
+               if (rpmrichParseForTag(&r, &emsg, parseRCPOTRichCB, &data, nametag) != RPMRC_OK) {
+               freeStringBuf(data.sb);
+               goto exit;
+               }
+               if (cb && cb(cbdata, nametag, getStringBuf(data.sb), NULL, Flags, index) != RPMRC_OK) {
+               rasprintf(&emsg, _("invalid dependency"));
+               freeStringBuf(data.sb);
+               goto exit;
+               }
+               freeStringBuf(data.sb);
+               re = r;
+               continue;
        }
 
        re = r;
@@ -134,71 +244,106 @@ rpmRC parseRCPOT(rpmSpec spec, Package pkg, const char *field, rpmTagVal tagN,
        rstrlcpy(N, r, (re-r) + 1);
 
        /* Parse EVR */
+       EVR = NULL;
        v = re;
        SKIPWHITE(v);
        ve = v;
        SKIPNONWHITE(ve);
 
-       re = v; /* ==> next token (if no EVR found) starts here */
+       re = v; /* ==> next token (if no EVR found) starts here */
 
        /* Check for possible logical operator */
        if (ve > v) {
-         const struct ReqComp *rc;
-         for (rc = ReqComparisons; rc->token != NULL; rc++) {
-           if ((ve-v) != strlen(rc->token) || !rstreqn(v, rc->token, (ve-v)))
-               continue;
+               rpmsenseFlags sense = rpmParseDSFlags(v, ve - v);
+               if (sense) {
+               Flags |= sense;
+
+               /* now parse EVR */
+               v = ve;
+               SKIPWHITE(v);
+               ve = v;
+               SKIPNONWHITE(ve);
+               if (*v == '\0' || ve == v) {
+                       rasprintf(&emsg, _("Version required"));
+                       goto exit;
+               }
+               EVR = xmalloc((ve-v) + 1);
+               rstrlcpy(EVR, v, (ve-v) + 1);
+               re = ve;        /* ==> next token after EVR string starts here */
+               }
+       }
 
-           if (r[0] == '/') {
-               emsg = _("Versioned file name not permitted");
+       /* check that dependency is well-formed */
+       if (checkDep(spec, N, EVR, &emsg))
                goto exit;
-           }
 
-           Flags |= rc->sense;
+       if (nametag == RPMTAG_OBSOLETENAME) {
+               if (rpmCharCheck(spec, N, WHITELIST_NAME)) {
+               rasprintf(&emsg, _("Only package names are allowed in "
+                                  "Obsoletes"));
+               goto exit;
+               }
+               if (!EVR) {
+               rasprintf(&emsg, _("It's not recommended to have "
+                                  "unversioned Obsoletes"));
+               } else if (Flags & RPMSENSE_GREATER) {
+               rasprintf(&emsg, _("It's not recommended to use "
+                                  "'>' in Obsoletes"));
+               }
+       }
 
-           /* now parse EVR */
-           v = ve;
-           SKIPWHITE(v);
-           ve = v;
-           SKIPNONWHITE(ve);
-           break;
-         }
+       if (nametag == RPMTAG_FILETRIGGERNAME ||
+               nametag == RPMTAG_TRANSFILETRIGGERNAME) {
+               if (N[0] != '/') {
+               rasprintf(&emsg, _("Only absolute paths are allowed in "
+                                       "file triggers"));
+               }
        }
 
-       if (Flags & RPMSENSE_SENSEMASK) {
-           if (*v == '\0' || ve == v) {
-               emsg = _("Version required");
+
+       /* Deny more "normal" triggers fired by the same pakage. File triggers are ok */
+       if (nametag == RPMTAG_TRIGGERNAME) {
+               rpmds *pdsp = packageDependencies(pkg, nametag);
+               rpmds newds = rpmdsSingle(nametag, N, EVR, Flags);
+               rpmdsInit(*pdsp);
+               while (rpmdsNext(*pdsp) >= 0) {
+               if (rpmdsCompare(*pdsp, newds) && (rpmdsFlags(*pdsp) & tagflags )) {
+                       rasprintf(&emsg, _("Trigger fired by the same package "
+                       "is already defined in spec file"));
+                       break;
+               }
+               }
+               rpmdsFree(newds);
+               if (emsg)
+               goto exit;
+       }
+
+       if (cb && cb(cbdata, nametag, N, EVR, Flags, index) != RPMRC_OK) {
+               rasprintf(&emsg, _("invalid dependency"));
                goto exit;
-           }
-           EVR = xmalloc((ve-v) + 1);
-           rstrlcpy(EVR, v, (ve-v) + 1);
-           if (rpmCharCheck(spec, EVR, ve-v, ".-_+:%{}~")) goto exit;
-           re = ve;    /* ==> next token after EVR string starts here */
-       } else
-           EVR = NULL;
-
-       if (addReqProv(h, nametag, N, EVR, Flags, index)) {
-           emsg = _("invalid dependency");
-           goto exit;
        }
 
        N = _free(N);
        EVR = _free(EVR);
 
-    }
-    rc = RPMRC_OK;
+       }
+       rc = RPMRC_OK;
 
 exit:
-    if (emsg) {
+       if (emsg) {
+       int lvl = (rc == RPMRC_OK) ? RPMLOG_WARNING : RPMLOG_ERR;
        /* Automatic dependencies don't relate to spec lines */
        if (tagflags & (RPMSENSE_FIND_REQUIRES|RPMSENSE_FIND_PROVIDES)) {
-           rpmlog(RPMLOG_ERR, "%s: %s\n", emsg, r);
+               rpmlog(lvl, "%s: %s\n", emsg, r);
        } else {
-           rpmlog(RPMLOG_ERR, _("line %d: %s: %s\n"),
+               rpmlog(lvl, _("line %d: %s: %s\n"),
                   spec->lineNum, emsg, spec->line);
        }
-    }
-    free(N);
-    free(EVR);
+       free(emsg);
+       }
+       _free(N);
+       _free(EVR);
 
-    return rc;
+       return rc;
 }
+
index 87765a0c5fe2ca3c01c206a8fb91f6ba1f066344..bd0c2f072d4449b7e7b00988c28ecdbecda97525 100644 (file)
 
 #include "debug.h"
 
+#define SKIPSPACE(s) { while (*(s) && risspace(*(s))) (s)++; }
 
 /**
  */
 static int addTriggerIndex(Package pkg, const char *file,
-       const char *script, const char *prog, rpmscriptFlags flags)
+       const char *script, const char *prog, rpmscriptFlags flags,
+       rpmTagVal tag, uint32_t priority)
 {
     struct TriggerFileEntry *tfe;
-    struct TriggerFileEntry *list = pkg->triggerFiles;
+    struct TriggerFileEntry *list;
     struct TriggerFileEntry *last = NULL;
     int index = 0;
+    struct TriggerFileEntry **tfp;
+
+    if (tag == RPMTAG_FILETRIGGERSCRIPTS) {
+       tfp = &pkg->fileTriggerFiles;
+    } else if (tag == RPMTAG_TRANSFILETRIGGERSCRIPTS) {
+       tfp = &pkg->transFileTriggerFiles;
+    } else {
+       tfp = &pkg->triggerFiles;
+    }
+
+    list = *tfp;
 
     while (list) {
        last = list;
@@ -41,12 +54,13 @@ static int addTriggerIndex(Package pkg, const char *file,
     tfe->prog = xstrdup(prog);
     tfe->flags = flags;
     tfe->index = index;
+    tfe->priority = priority;
     tfe->next = NULL;
 
     if (last)
        last->next = tfe;
     else
-       pkg->triggerFiles = tfe;
+       *tfp = tfe;
 
     return index;
 }
@@ -90,6 +104,7 @@ int parseScript(rpmSpec spec, int parsePart)
     const char *name = NULL;
     const char *prog = "/bin/sh";
     const char *file = NULL;
+    int priority = 1000000;
     struct poptOption optionsTable[] = {
        { NULL, 'p', POPT_ARG_STRING, &prog, 'p',       NULL, NULL},
        { NULL, 'n', POPT_ARG_STRING, &name, 'n',       NULL, NULL},
@@ -98,6 +113,7 @@ int parseScript(rpmSpec spec, int parsePart)
          NULL, NULL},
        { NULL, 'q', POPT_BIT_SET, &scriptFlags, RPMSCRIPT_FLAG_QFORMAT,
          NULL, NULL},
+       { NULL, 'P', POPT_ARG_INT, &priority, 'P', NULL, NULL},
        { 0, 0, 0, 0, 0,        NULL, NULL}
     };
 
@@ -183,19 +199,82 @@ int parseScript(rpmSpec spec, int parsePart)
        flagtag = RPMTAG_TRIGGERSCRIPTFLAGS;
        partname = "%triggerpostun";
        break;
+      case PART_FILETRIGGERIN:
+       tag = RPMTAG_FILETRIGGERSCRIPTS;
+       tagflags = 0;
+       reqtag = RPMTAG_FILETRIGGERIN;
+       progtag = RPMTAG_FILETRIGGERSCRIPTPROG;
+       flagtag = RPMTAG_FILETRIGGERSCRIPTFLAGS;
+       partname = "%filetriggerin";
+       break;
+      case PART_FILETRIGGERUN:
+       tag = RPMTAG_FILETRIGGERSCRIPTS;
+       tagflags = 0;
+       reqtag = RPMTAG_FILETRIGGERUN;
+       progtag = RPMTAG_FILETRIGGERSCRIPTPROG;
+       flagtag = RPMTAG_FILETRIGGERSCRIPTFLAGS;
+       partname = "%filetriggerun";
+       break;
+      case PART_FILETRIGGERPOSTUN:
+       tag = RPMTAG_FILETRIGGERSCRIPTS;
+       tagflags = 0;
+       reqtag = RPMTAG_FILETRIGGERPOSTUN;
+       progtag = RPMTAG_FILETRIGGERSCRIPTPROG;
+       flagtag = RPMTAG_FILETRIGGERSCRIPTFLAGS;
+       partname = "%filetriggerpostun";
+       break;
+      case PART_TRANSFILETRIGGERIN:
+       tag = RPMTAG_TRANSFILETRIGGERSCRIPTS;
+       tagflags = 0;
+       reqtag = RPMTAG_TRANSFILETRIGGERIN;
+       progtag = RPMTAG_TRANSFILETRIGGERSCRIPTPROG;
+       flagtag = RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS;
+       partname = "%transfiletriggerin";
+       break;
+      case PART_TRANSFILETRIGGERUN:
+       tag = RPMTAG_TRANSFILETRIGGERSCRIPTS;
+       tagflags = 0;
+       reqtag = RPMTAG_TRANSFILETRIGGERUN;
+       progtag = RPMTAG_TRANSFILETRIGGERSCRIPTPROG;
+       flagtag = RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS;
+       partname = "%transfiletriggerun";
+       break;
+      case PART_TRANSFILETRIGGERPOSTUN:
+       tag = RPMTAG_TRANSFILETRIGGERSCRIPTS;
+       tagflags = 0;
+       reqtag = RPMTAG_TRANSFILETRIGGERPOSTUN;
+       progtag = RPMTAG_TRANSFILETRIGGERSCRIPTPROG;
+       flagtag = RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS;
+       partname = "%transfiletriggerpostun";
+       break;
     }
 
-    if (tag == RPMTAG_TRIGGERSCRIPTS) {
-       /* break line into two */
-       char *s = strstr(spec->line, "--");
-       if (!s) {
+    if (tag == RPMTAG_TRIGGERSCRIPTS || tag == RPMTAG_FILETRIGGERSCRIPTS ||
+       tag == RPMTAG_TRANSFILETRIGGERSCRIPTS) {
+       /* break line into two at the -- separator */
+       char *sep, *s = spec->line;
+       while ((s = strstr(s, "--")) != NULL) {
+           s += 2;
+           if (risblank(*(s-3)) && risblank(*s))
+               break;
+       }
+
+       if (s == NULL) {
            rpmlog(RPMLOG_ERR, _("line %d: triggers must have --: %s\n"),
                     spec->lineNum, spec->line);
-           return PART_ERROR;
+           goto exit;
        }
 
-       *s = '\0';
-       reqargs = xstrdup(s + 2);
+       sep = s;
+       SKIPSPACE(s);
+       if (*s == '\0') {
+           rpmlog(RPMLOG_ERR, _("line %d: missing trigger condition: %s\n"),
+                               spec->lineNum, spec->line);
+           goto exit;
+       }
+
+       *sep = '\0';
+       reqargs = xstrdup(s);
     }
     
     if ((rc = poptParseArgvString(spec->line, &argc, &argv))) {
@@ -225,9 +304,19 @@ int parseScript(rpmSpec spec, int parsePart)
        case 'n':
            flag = PART_NAME;
            break;
+       case 'P':
+           if (tag != RPMTAG_TRIGGERSCRIPTS &&
+               tag != RPMTAG_FILETRIGGERSCRIPTS &&
+               tag != RPMTAG_TRANSFILETRIGGERSCRIPTS) {
+
+               rpmlog(RPMLOG_ERR,
+                        _("line %d: Priorities are allowed only for file "
+                        "triggers : %s\n"), spec->lineNum, prog);
+               goto exit;
+           }
        }
     }
-    
+
     if (arg < -1) {
        rpmlog(RPMLOG_ERR, _("line %d: Bad option %s: %s\n"),
                 spec->lineNum,
@@ -247,11 +336,8 @@ int parseScript(rpmSpec spec, int parsePart)
        }
     }
     
-    if (lookupPackage(spec, name, flag, &pkg)) {
-       rpmlog(RPMLOG_ERR, _("line %d: Package does not exist: %s\n"),
-                spec->lineNum, spec->line);
+    if (lookupPackage(spec, name, flag, &pkg))
        goto exit;
-    }
 
     if (tag != RPMTAG_TRIGGERSCRIPTS) {
        if (headerIsEntry(pkg->header, progtag)) {
@@ -292,26 +378,33 @@ int parseScript(rpmSpec spec, int parsePart)
        if (rpmluaCheckScript(lua, p, partname) != RPMRC_OK) {
            goto exit;
        }
-       (void) rpmlibNeedsFeature(pkg->header,
-                                 "BuiltinLuaScripts", "4.2.2-1");
+       (void) rpmlibNeedsFeature(pkg, "BuiltinLuaScripts", "4.2.2-1");
     } else
 #endif
     if (progArgv[0][0] == '<') {
-       rpmlog(RPMLOG_INFO,
+       rpmlog(RPMLOG_ERR,
                 _("line %d: unsupported internal script: %s\n"),
                 spec->lineNum, progArgv[0]);
+       goto exit;
     } else {
-        (void) addReqProv(pkg->header, RPMTAG_REQUIRENAME,
+        (void) addReqProv(pkg, RPMTAG_REQUIRENAME,
                progArgv[0], NULL, (tagflags | RPMSENSE_INTERP), 0);
     }
 
     if (scriptFlags) {
-       rpmlibNeedsFeature(pkg->header, "ScriptletExpansion", "4.9.0-1");
+       rpmlibNeedsFeature(pkg, "ScriptletExpansion", "4.9.0-1");
     }
 
     /* Trigger script insertion is always delayed in order to */
     /* get the index right.                                   */
-    if (tag == RPMTAG_TRIGGERSCRIPTS) {
+    if (tag == RPMTAG_TRIGGERSCRIPTS || tag == RPMTAG_FILETRIGGERSCRIPTS ||
+       tag == RPMTAG_TRANSFILETRIGGERSCRIPTS) {
+       if (tag != RPMTAG_TRIGGERSCRIPTS && *reqargs != '/') {
+           rpmlog(RPMLOG_ERR,
+              _("line %d: file trigger condition must begin with '/': %s"),
+               spec->lineNum, reqargs);
+           goto exit;
+       }
        if (progArgc > 1) {
            rpmlog(RPMLOG_ERR,
              _("line %d: interpreter arguments not allowed in triggers: %s\n"),
@@ -319,10 +412,11 @@ int parseScript(rpmSpec spec, int parsePart)
            goto exit;
        }
        /* Add file/index/prog triple to the trigger file list */
-       index = addTriggerIndex(pkg, file, p, progArgv[0], scriptFlags);
+       index = addTriggerIndex(pkg, file, p, progArgv[0], scriptFlags, tag,
+                               priority);
 
        /* Generate the trigger tags */
-       if (parseRCPOT(spec, pkg, reqargs, reqtag, index, tagflags))
+       if (parseRCPOT(spec, pkg, reqargs, reqtag, index, tagflags, addReqProvPkg, NULL))
            goto exit;
     } else {
        struct rpmtd_s td;
@@ -338,7 +432,7 @@ int parseScript(rpmSpec spec, int parsePart)
            td.data = (void *) *progArgv;
            td.type = RPM_STRING_TYPE;
        } else {
-           (void) rpmlibNeedsFeature(pkg->header,
+           (void) rpmlibNeedsFeature(pkg,
                        "ScriptletInterpreterArgs", "4.0.3-1");
            td.data = progArgv;
            td.type = RPM_STRING_ARRAY_TYPE;
index fb137047a485bd6a3c59ef7e656f0852f6344151..d0c42a43e1e6cb42cf7b9206aef926d794061b99 100644 (file)
@@ -6,6 +6,9 @@
 #include "system.h"
 
 #include <errno.h>
+#ifdef HAVE_ICONV
+#include <iconv.h>
+#endif
 
 #include <rpm/rpmtypes.h>
 #include <rpm/rpmlib.h>                /* RPM_MACHTABLE & related */
@@ -28,7 +31,8 @@ typedef struct OpenFileInfo {
     char * fileName;
     FILE *fp;
     int lineNum;
-    char readBuf[BUFSIZ];
+    char *readBuf;
+    size_t readBufLen;
     const char * readPtr;
     struct OpenFileInfo * next;
 } OFI_t;
@@ -60,6 +64,16 @@ static const struct PartRec {
     { PART_TRIGGERIN,     LEN_AND_STR("%trigger")},
     { PART_VERIFYSCRIPT,  LEN_AND_STR("%verifyscript")},
     { PART_POLICIES,      LEN_AND_STR("%sepolicy")},
+    { PART_FILETRIGGERIN,          LEN_AND_STR("%filetriggerin")},
+    { PART_FILETRIGGERIN,          LEN_AND_STR("%filetrigger")},
+    { PART_FILETRIGGERUN,          LEN_AND_STR("%filetriggerun")},
+    { PART_FILETRIGGERPOSTUN,      LEN_AND_STR("%filetriggerpostun")},
+    { PART_TRANSFILETRIGGERIN,     LEN_AND_STR("%transfiletriggerin")},
+    { PART_TRANSFILETRIGGERIN,     LEN_AND_STR("%transfiletrigger")},
+    { PART_TRANSFILETRIGGERUN,     LEN_AND_STR("%transfiletriggerun")},
+    { PART_TRANSFILETRIGGERUN,     LEN_AND_STR("%transfiletriggerun")},
+    { PART_TRANSFILETRIGGERPOSTUN,  LEN_AND_STR("%transfiletriggerpostun")},
+    { PART_EMPTY,                  LEN_AND_STR("%end")},
     {0, 0, 0}
 };
 
@@ -102,11 +116,14 @@ static int matchTok(const char *token, const char *line)
     return rc;
 }
 
-void handleComments(char *s)
+int handleComments(char *s)
 {
     SKIPSPACE(s);
-    if (*s == '#')
+    if (*s == '#') {
        *s = '\0';
+       return 1;
+    }
+    return 0;
 }
 
 /* Push a file to spec's file stack, return the newly pushed entry */
@@ -117,6 +134,8 @@ static OFI_t * pushOFI(rpmSpec spec, const char *fn)
     ofi->fp = NULL;
     ofi->fileName = xstrdup(fn);
     ofi->lineNum = 0;
+    ofi->readBufLen = BUFSIZ;
+    ofi->readBuf = xmalloc(ofi->readBufLen);
     ofi->readBuf[0] = '\0';
     ofi->readPtr = NULL;
     ofi->next = spec->fileStack;
@@ -135,6 +154,7 @@ static OFI_t * popOFI(rpmSpec spec)
        if (ofi->fp)
            fclose(ofi->fp);
        free(ofi->fileName);
+       free(ofi->readBuf);
        free(ofi);
     }
     return spec->fileStack;
@@ -151,8 +171,57 @@ static int restoreFirstChar(rpmSpec spec)
     return 0;
 }
 
+static int expandMacrosInSpecBuf(rpmSpec spec, int strip)
+{
+    char *lbuf = NULL;
+    int isComment = 0;
+
+     /* Don't expand macros (eg. %define) in false branch of %if clause */
+    if (!spec->readStack->reading)
+       return 0;
+
+    lbuf = spec->lbuf;
+    SKIPSPACE(lbuf);
+    if (lbuf[0] == '#')
+       isComment = 1;
+
+
+    if (rpmExpandMacros(spec->macros, spec->lbuf, &lbuf, 0) < 0) {
+       rpmlog(RPMLOG_ERR, _("line %d: %s\n"),
+               spec->lineNum, spec->lbuf);
+       return 1;
+    }
+
+    if (strip & STRIP_COMMENTS && isComment) {
+       char *bufA = spec->lbuf;
+       char *bufB = lbuf;
+
+       while (*bufA != '\0' && *bufB != '\0') {
+           if (*bufA == '%' && *(bufA + 1) == '%')
+               bufA++;
+
+           if (*bufA != *bufB)
+               break;
+
+           bufA++;
+           bufB++;
+       }
+
+       if (*bufA != '\0' || *bufB != '\0')
+           rpmlog(RPMLOG_WARNING,
+               _("Macro expanded in comment on line %d: %s\n"),
+               spec->lineNum, bufA);
+    }
+
+    free(spec->lbuf);
+    spec->lbuf = lbuf;
+    spec->lbufSize = strlen(spec->lbuf) + 1;
+
+    return 0;
+}
+
 /* Return zero on success, 1 if we need to read more and -1 on errors. */
-static int copyNextLineFromOFI(rpmSpec spec, OFI_t *ofi)
+static int copyNextLineFromOFI(rpmSpec spec, OFI_t *ofi, int strip)
 {
     /* Expand next line from file into line buffer */
     if (!(spec->nextline && *spec->nextline)) {
@@ -203,13 +272,9 @@ static int copyNextLineFromOFI(rpmSpec spec, OFI_t *ofi)
        }
        spec->lbufOff = 0;
 
-       /* Don't expand macros (eg. %define) in false branch of %if clause */
-       if (spec->readStack->reading &&
-           expandMacros(spec, spec->macros, spec->lbuf, spec->lbufSize)) {
-               rpmlog(RPMLOG_ERR, _("line %d: %s\n"),
-                       spec->lineNum, spec->lbuf);
-               return -1;
-       }
+       if (expandMacrosInSpecBuf(spec, strip))
+           return -1;
+
        spec->nextline = spec->lbuf;
     }
     return 0;
@@ -258,7 +323,7 @@ retry:
 
     /* Make sure we have something in the read buffer */
     if (!(ofi->readPtr && *(ofi->readPtr))) {
-       if (!fgets(ofi->readBuf, BUFSIZ, ofi->fp)) {
+       if (getline(&ofi->readBuf, &ofi->readBufLen, ofi->fp) <= 0) {
            /* EOF, remove this file from the stack */
            ofi = popOFI(spec);
 
@@ -280,8 +345,8 @@ retry:
 do { \
     char *os = s; \
     char *exp = rpmExpand(token, NULL); \
-    while(*s && !risblank(*s)) s++; \
-    while(*s && risblank(*s)) s++; \
+    while (*s && !risblank(*s)) s++; \
+    while (*s && risblank(*s)) s++; \
     if (!*s) { \
        rpmlog(RPMLOG_ERR, _("%s:%d: Argument expected for %s\n"), ofi->fileName, ofi->lineNum, os); \
        free(exp); \
@@ -319,7 +384,7 @@ int readLine(rpmSpec spec, int strip)
        ofi = spec->fileStack;
 
        /* Copy next file line into the spec line buffer */
-       rc = copyNextLineFromOFI(spec, ofi);
+       rc = copyNextLineFromOFI(spec, ofi, strip);
        if (rc > 0) {
            if (startLine == 0)
                startLine = spec->lineNum;
@@ -349,12 +414,12 @@ int readLine(rpmSpec spec, int strip)
        match = !match;
     } else if (ISMACROWITHARG(s, "%if")) {
        s += 3;
-        match = parseExpressionBoolean(spec, s);
+        match = parseExpressionBoolean(s);
        if (match < 0) {
            rpmlog(RPMLOG_ERR,
-                       _("%s:%d: bad %%if condition, continuing nevertheless\n"),
+                       _("%s:%d: bad %%if condition\n"),
                        ofi->fileName, ofi->lineNum);
-           match = 0;
+           return PART_ERROR;
        }
     } else if (ISMACRO(s, "%else")) {
        if (! spec->readStack->next) {
@@ -385,10 +450,13 @@ int readLine(rpmSpec spec, int strip)
        fileName = s+8;
        SKIPSPACE(fileName);
        endFileName = fileName;
-       SKIPNONSPACE(endFileName);
-       p = endFileName;
-       SKIPSPACE(p);
-       if (*fileName == '\0' || *p != '\0') {
+       do {
+           SKIPNONSPACE(endFileName);
+           p = endFileName;
+           SKIPSPACE(p);
+           if (*p != '\0') endFileName = p;
+       } while (*p != '\0');
+       if (*fileName == '\0') {
            rpmlog(RPMLOG_ERR, _("%s:%d: malformed %%include statement\n"),
                                ofi->fileName, ofi->lineNum);
            return PART_ERROR;
@@ -453,22 +521,26 @@ static const rpmTagVal sourceTags[] = {
 
 static void initSourceHeader(rpmSpec spec)
 {
+    Package sourcePkg = spec->sourcePackage;
     struct Source *srcPtr;
 
-    if (spec->sourceHeader)
+    if (headerIsEntry(sourcePkg->header, RPMTAG_NAME))
        return;
 
-    spec->sourceHeader = headerNew();
     /* Only specific tags are added to the source package header */
-    headerCopyTags(spec->packages->header, spec->sourceHeader, sourceTags);
+    headerCopyTags(spec->packages->header, sourcePkg->header, sourceTags);
 
     /* Add the build restrictions */
+    for (int i=0; i<PACKAGE_NUM_DEPS; i++) {
+       rpmdsPutToHeader(sourcePkg->dependencies[i], sourcePkg->header);
+    }
+
     {
        HeaderIterator hi = headerInitIterator(spec->buildRestrictions);
        struct rpmtd_s td;
        while (headerNext(hi, &td)) {
            if (rpmtdCount(&td) > 0) {
-               (void) headerPut(spec->sourceHeader, &td, HEADERPUT_DEFAULT);
+               (void) headerPut(sourcePkg->header, &td, HEADERPUT_DEFAULT);
            }
            rpmtdFreeData(&td);
        }
@@ -476,23 +548,23 @@ static void initSourceHeader(rpmSpec spec)
     }
 
     if (spec->BANames && spec->BACount > 0) {
-       headerPutStringArray(spec->sourceHeader, RPMTAG_BUILDARCHS,
+       headerPutStringArray(sourcePkg->header, RPMTAG_BUILDARCHS,
                  spec->BANames, spec->BACount);
     }
 
     /* Add tags for sources and patches */
     for (srcPtr = spec->sources; srcPtr != NULL; srcPtr = srcPtr->next) {
        if (srcPtr->flags & RPMBUILD_ISSOURCE) {
-           headerPutString(spec->sourceHeader, RPMTAG_SOURCE, srcPtr->source);
+           headerPutString(sourcePkg->header, RPMTAG_SOURCE, srcPtr->source);
            if (srcPtr->flags & RPMBUILD_ISNO) {
-               headerPutUint32(spec->sourceHeader, RPMTAG_NOSOURCE,
+               headerPutUint32(sourcePkg->header, RPMTAG_NOSOURCE,
                                &srcPtr->num, 1);
            }
        }
        if (srcPtr->flags & RPMBUILD_ISPATCH) {
-           headerPutString(spec->sourceHeader, RPMTAG_PATCH, srcPtr->source);
+           headerPutString(sourcePkg->header, RPMTAG_PATCH, srcPtr->source);
            if (srcPtr->flags & RPMBUILD_ISNO) {
-               headerPutUint32(spec->sourceHeader, RPMTAG_NOPATCH,
+               headerPutUint32(sourcePkg->header, RPMTAG_NOPATCH,
                                &srcPtr->num, 1);
            }
        }
@@ -500,19 +572,17 @@ static void initSourceHeader(rpmSpec spec)
 }
 
 /* Add extra provides to package.  */
-static void addPackageProvides(Header h)
+void addPackageProvides(Package pkg)
 {
     const char *arch, *name;
     char *evr, *isaprov;
     rpmsenseFlags pflags = RPMSENSE_EQUAL;
 
     /* <name> = <evr> provide */
-    name = headerGetString(h, RPMTAG_NAME);
-    arch = headerGetString(h, RPMTAG_ARCH);
-    evr = headerGetAsString(h, RPMTAG_EVR);
-    headerPutString(h, RPMTAG_PROVIDENAME, name);
-    headerPutString(h, RPMTAG_PROVIDEVERSION, evr);
-    headerPutUint32(h, RPMTAG_PROVIDEFLAGS, &pflags, 1);
+    name = headerGetString(pkg->header, RPMTAG_NAME);
+    arch = headerGetString(pkg->header, RPMTAG_ARCH);
+    evr = headerGetAsString(pkg->header, RPMTAG_EVR);
+    addReqProv(pkg, RPMTAG_PROVIDENAME, name, evr, pflags, 0);
 
     /*
      * <name>(<isa>) = <evr> provide
@@ -521,9 +591,7 @@ static void addPackageProvides(Header h)
      */
     isaprov = rpmExpand(name, "%{?_isa}", NULL);
     if (!rstreq(arch, "noarch") && !rstreq(name, isaprov)) {
-       headerPutString(h, RPMTAG_PROVIDENAME, isaprov);
-       headerPutString(h, RPMTAG_PROVIDEVERSION, evr);
-       headerPutUint32(h, RPMTAG_PROVIDEFLAGS, &pflags, 1);
+       addReqProv(pkg, RPMTAG_PROVIDENAME, isaprov, evr, pflags, 0);
     }
     free(isaprov);
     free(evr);
@@ -545,8 +613,13 @@ static void addTargets(Package Pkgs)
        headerPutString(pkg->header, RPMTAG_PLATFORM, platform);
        headerPutString(pkg->header, RPMTAG_OPTFLAGS, optflags);
 
+       /* Add manual dependencies early for rpmspec etc to look at */
+       addPackageProvides(pkg);
+       for (int i=0; i<PACKAGE_NUM_DEPS; i++) {
+           rpmdsPutToHeader(pkg->dependencies[i], pkg->header);
+       }
+
        pkg->ds = rpmdsThis(pkg->header, RPMTAG_REQUIRENAME, RPMSENSE_EQUAL);
-       addPackageProvides(pkg->header);
     }
     free(platform);
     free(arch);
@@ -554,10 +627,134 @@ static void addTargets(Package Pkgs)
     free(optflags);
 }
 
+rpmRC checkForEncoding(Header h, int addtag)
+{
+    rpmRC rc = RPMRC_OK;
+#if HAVE_ICONV
+    const char *encoding = "utf-8";
+    rpmTagVal tag;
+    iconv_t ic;
+    char *dest = NULL;
+    size_t destlen = 0;
+    int strict = rpmExpandNumeric("%{_invalid_encoding_terminates_build}");
+    HeaderIterator hi = headerInitIterator(h);
+
+    ic = iconv_open(encoding, encoding);
+    if (ic == (iconv_t) -1) {
+       rpmlog(RPMLOG_WARNING,
+               _("encoding %s not supported by system\n"), encoding);
+       goto exit;
+    }
+
+    while ((tag = headerNextTag(hi)) != RPMTAG_NOT_FOUND) {
+       struct rpmtd_s td;
+       const char *src = NULL;
+
+       if (rpmTagGetClass(tag) != RPM_STRING_CLASS)
+           continue;
+
+       headerGet(h, tag, &td, (HEADERGET_RAW|HEADERGET_MINMEM));
+       while ((src = rpmtdNextString(&td)) != NULL) {
+           size_t srclen = strlen(src);
+           size_t outlen, inlen = srclen;
+           char *out, *in = (char *) src;
+
+           if (destlen < srclen) {
+               destlen = srclen * 2;
+               dest = xrealloc(dest, destlen);
+           }
+           out = dest;
+           outlen = destlen;
+
+           /* reset conversion state */
+           iconv(ic, NULL, &inlen, &out, &outlen);
+
+           if (iconv(ic, &in, &inlen, &out, &outlen) == (size_t) -1) {
+               rpmlog(strict ? RPMLOG_ERR : RPMLOG_WARNING,
+                       _("Package %s: invalid %s encoding in %s: %s - %s\n"),
+                       headerGetString(h, RPMTAG_NAME),
+                       encoding, rpmTagGetName(tag), src, strerror(errno));
+               rc = RPMRC_FAIL;
+           }
+
+       }
+       rpmtdFreeData(&td);
+    }
+
+    /* Stomp "known good utf" mark in header if requested */
+    if (rc == RPMRC_OK && addtag)
+       headerPutString(h, RPMTAG_ENCODING, encoding);
+    if (!strict)
+       rc = RPMRC_OK;
+
+exit:
+    if (ic != (iconv_t) -1)
+       iconv_close(ic);
+    headerFreeIterator(hi);
+    free(dest);
+#endif /* HAVE_ICONV */
+
+    return rc;
+}
+
+static int parseEmpty(rpmSpec spec, int prevParsePart)
+{
+    int res = PART_ERROR;
+    int nextPart, rc;
+    char *line;
+
+    line = spec->line + sizeof("%end") - 1;
+    SKIPSPACE(line);
+    if (line[0] != '\0') {
+       rpmlog(RPMLOG_ERR,
+           _("line %d: %%end doesn't take any arguments: %s\n"),
+           spec->lineNum, spec->line);
+       goto exit;
+    }
+
+    if (prevParsePart == PART_EMPTY) {
+       rpmlog(RPMLOG_ERR,
+           _("line %d: %%end not expected here, no section to close: %s\n"),
+           spec->lineNum, spec->line);
+       goto exit;
+    }
+
+    if ((rc = readLine(spec, STRIP_TRAILINGSPACE|STRIP_COMMENTS)) > 0) {
+       nextPart = PART_NONE;
+    } else if (rc < 0) {
+       goto exit;
+    } else {
+       while (! (nextPart = isPart(spec->line))) {
+           line = spec->line;
+           SKIPSPACE(line);
+
+           if (line[0] != '\0') {
+               rpmlog(RPMLOG_ERR,
+                   _("line %d doesn't belong to any section: %s\n"),
+                   spec->lineNum, spec->line);
+               goto exit;
+           }
+           if ((rc = readLine(spec, STRIP_TRAILINGSPACE|STRIP_COMMENTS)) > 0) {
+               nextPart = PART_NONE;
+               break;
+           } else if (rc < 0) {
+               goto exit;
+           }
+       }
+    }
+
+    res = nextPart;
+
+exit:
+    return res;
+}
+
 static rpmSpec parseSpec(const char *specFile, rpmSpecFlags flags,
                         const char *buildRoot, int recursing)
 {
     int parsePart = PART_PREAMBLE;
+    int prevParsePart = PART_EMPTY;
+    int storedParsePart;
     int initialPackage = 1;
     rpmSpec spec;
     
@@ -572,8 +769,8 @@ static rpmSpec parseSpec(const char *specFile, rpmSpecFlags flags,
     } else {
        spec->buildRoot = rpmGetPath("%{?buildroot:%{buildroot}}", NULL);
     }
-    addMacro(NULL, "_docdir", NULL, "%{_defaultdocdir}", RMIL_SPEC);
-    addMacro(NULL, "_licensedir", NULL, "%{_defaultlicensedir}", RMIL_SPEC);
+    rpmPushMacro(NULL, "_docdir", NULL, "%{_defaultdocdir}", RMIL_SPEC);
+    rpmPushMacro(NULL, "_licensedir", NULL, "%{_defaultlicensedir}", RMIL_SPEC);
     spec->recursing = recursing;
     spec->flags = flags;
 
@@ -583,11 +780,15 @@ static rpmSpec parseSpec(const char *specFile, rpmSpecFlags flags,
     
     while (parsePart != PART_NONE) {
        int goterror = 0;
+       storedParsePart = parsePart;
        switch (parsePart) {
        case PART_ERROR: /* fallthrough */
        default:
            goterror = 1;
            break;
+       case PART_EMPTY:
+           parsePart = parseEmpty(spec, prevParsePart);
+           break;
        case PART_PREAMBLE:
            parsePart = parsePreamble(spec, initialPackage);
            initialPackage = 0;
@@ -619,6 +820,12 @@ static rpmSpec parseSpec(const char *specFile, rpmSpecFlags flags,
        case PART_TRIGGERIN:
        case PART_TRIGGERUN:
        case PART_TRIGGERPOSTUN:
+       case PART_FILETRIGGERIN:
+       case PART_FILETRIGGERUN:
+       case PART_FILETRIGGERPOSTUN:
+       case PART_TRANSFILETRIGGERIN:
+       case PART_TRANSFILETRIGGERUN:
+       case PART_TRANSFILETRIGGERPOSTUN:
            parsePart = parseScript(spec, parsePart);
            break;
 
@@ -635,6 +842,7 @@ static rpmSpec parseSpec(const char *specFile, rpmSpecFlags flags,
        case PART_BUILDARCHITECTURES:
            break;
        }
+       prevParsePart = storedParsePart;
 
        if (goterror || parsePart >= PART_LAST) {
            goto errxit;
@@ -654,13 +862,13 @@ static rpmSpec parseSpec(const char *specFile, rpmSpecFlags flags,
                /* Skip if not arch is not compatible. */
                if (!rpmMachineScore(RPM_MACHTABLE_BUILDARCH, spec->BANames[x]))
                    continue;
-               addMacro(NULL, "_target_cpu", NULL, spec->BANames[x], RMIL_RPMRC);
+               rpmPushMacro(NULL, "_target_cpu", NULL, spec->BANames[x], RMIL_RPMRC);
                spec->BASpecs[index] = parseSpec(specFile, flags, buildRoot, 1);
                if (spec->BASpecs[index] == NULL) {
                        spec->BACount = index;
                        goto errxit;
                }
-               delMacro(NULL, "_target_cpu");
+               rpmPopMacro(NULL, "_target_cpu");
                index++;
            }
 
@@ -710,6 +918,18 @@ static rpmSpec parseSpec(const char *specFile, rpmSpecFlags flags,
     /* Add arch, os and platform, self-provides etc for each package */
     addTargets(spec->packages);
 
+    /* Check for encoding in each package unless disabled */
+    if (!(spec->flags & RPMSPEC_NOUTF8)) {
+       int badenc = 0;
+       for (Package pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
+           if (checkForEncoding(pkg->header, 0) != RPMRC_OK) {
+               badenc = 1;
+           }
+       }
+       if (badenc)
+           goto errxit;
+    }
+
     closeSpec(spec);
 exit:
     /* Assemble source header from parsed components */
index bc2f7ea26c518d6520d2f1b13c700b58d4600d03..5fa0a1c6b921c5b77dc4aa05370d1a18de738268 100644 (file)
 
 #include <rpm/header.h>
 #include <rpm/rpmstring.h>
-#include "build/rpmbuild_misc.h"
+#include <rpm/rpmlog.h>
+#include "build/rpmbuild_internal.h"
 #include "debug.h"
 
-static int isNewDep(Header h, rpmTagVal nametag,
-                 const char *N, const char *EVR, rpmsenseFlags Flags,
-                 rpmTagVal indextag, uint32_t index)
-{
-    int isnew = 1;
-    struct rpmtd_s idx;
-    rpmds ads = rpmdsNew(h, nametag, 0);
-    rpmds bds = rpmdsSingle(nametag, N, EVR, Flags);
-
-    if (indextag) {
-       headerGet(h, indextag, &idx, HEADERGET_MINMEM);
-    }
-
-    /* XXX there's no guarantee the ds is sorted here so rpmdsFind() wont do */
-    rpmdsInit(ads);
-    while (isnew && rpmdsNext(ads) >= 0) {
-       if (!rstreq(rpmdsN(ads), rpmdsN(bds))) continue;
-       if (!rstreq(rpmdsEVR(ads), rpmdsEVR(bds))) continue;
-       if (rpmdsFlags(ads) != rpmdsFlags(bds)) continue;
-       if (indextag && rpmtdSetIndex(&idx, rpmdsIx(ads)) >= 0 &&
-                       rpmtdGetNumber(&idx) != index) continue;
-       isnew = 0;
-    }
-    
-    if (indextag) {
-       rpmtdFreeData(&idx);
-    }
-    rpmdsFree(ads);
-    rpmdsFree(bds);
-    return isnew;
-}
-
-int addReqProv(Header h, rpmTagVal tagN,
+int addReqProv(Package pkg, rpmTagVal tagN,
                const char * N, const char * EVR, rpmsenseFlags Flags,
                uint32_t index)
 {
-    rpmTagVal versiontag = 0;
-    rpmTagVal flagtag = 0;
-    rpmTagVal indextag = 0;
-    rpmsenseFlags extra = RPMSENSE_ANY;
+    rpmds newds, *dsp = NULL;
 
-    switch (tagN) {
-    case RPMTAG_PROVIDENAME:
-       versiontag = RPMTAG_PROVIDEVERSION;
-       flagtag = RPMTAG_PROVIDEFLAGS;
-       extra = Flags & RPMSENSE_FIND_PROVIDES;
-       break;
-    case RPMTAG_OBSOLETENAME:
-       versiontag = RPMTAG_OBSOLETEVERSION;
-       flagtag = RPMTAG_OBSOLETEFLAGS;
-       break;
-    case RPMTAG_CONFLICTNAME:
-       versiontag = RPMTAG_CONFLICTVERSION;
-       flagtag = RPMTAG_CONFLICTFLAGS;
-       break;
-    case RPMTAG_ORDERNAME:
-       versiontag = RPMTAG_ORDERVERSION;
-       flagtag = RPMTAG_ORDERFLAGS;
-       break;
-    case RPMTAG_TRIGGERNAME:
-       versiontag = RPMTAG_TRIGGERVERSION;
-       flagtag = RPMTAG_TRIGGERFLAGS;
-       indextag = RPMTAG_TRIGGERINDEX;
-       extra = Flags & RPMSENSE_TRIGGER;
-       break;
-    case RPMTAG_SUGGESTSNAME:
-       versiontag = RPMTAG_SUGGESTSVERSION;
-       flagtag = RPMTAG_SUGGESTSFLAGS;
-       extra = Flags & _ALL_REQUIRES_MASK;
-       break;
-    case RPMTAG_ENHANCESNAME:
-       versiontag = RPMTAG_ENHANCESVERSION;
-       flagtag = RPMTAG_ENHANCESFLAGS;
-       extra = Flags & _ALL_REQUIRES_MASK;
-       break;
-    case RPMTAG_REQUIRENAME:
-    default:
-       tagN = RPMTAG_REQUIRENAME;
-       versiontag = RPMTAG_REQUIREVERSION;
-       flagtag = RPMTAG_REQUIREFLAGS;
-       extra = Flags & _ALL_REQUIRES_MASK;
-    }
+    dsp = packageDependencies(pkg, tagN);
 
     /* rpmlib() dependency sanity: only requires permitted, ensure sense bit */
     if (rstreqn(N, "rpmlib(", sizeof("rpmlib(")-1)) {
        if (tagN != RPMTAG_REQUIRENAME) return 1;
-       extra |= RPMSENSE_RPMLIB;
+       Flags |= RPMSENSE_RPMLIB;
     }
 
-    Flags = (Flags & RPMSENSE_SENSEMASK) | extra;
+    newds = rpmdsSinglePoolTix(pkg->pool, tagN, N, EVR,
+                              rpmSanitizeDSFlags(tagN, Flags), index);
 
-    if (EVR == NULL)
-       EVR = "";
-    
-    /* Avoid adding duplicate dependencies. */
-    if (isNewDep(h, tagN, N, EVR, Flags, indextag, index)) {
-       headerPutString(h, tagN, N);
-       headerPutString(h, versiontag, EVR);
-       headerPutUint32(h, flagtag, &Flags, 1);
-       if (indextag) {
-           headerPutUint32(h, indextag, &index, 1);
-       }
-    }
+    rpmdsMerge(dsp, newds);
+    rpmdsFree(newds);
 
     return 0;
 }
 
-int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR)
+rpmRC addReqProvPkg(void *cbdata, rpmTagVal tagN,
+                   const char * N, const char *EVR, rpmsenseFlags Flags,
+                   int index)
+{
+    Package pkg = cbdata;
+    return addReqProv(pkg, tagN, N, EVR, Flags, index) ? RPMRC_FAIL : RPMRC_OK;
+}
+
+int rpmlibNeedsFeature(Package pkg, const char * feature, const char * featureEVR)
 {
     char *reqname = NULL;
     int res;
 
     rasprintf(&reqname, "rpmlib(%s)", feature);
 
-    res = addReqProv(h, RPMTAG_REQUIRENAME, reqname, featureEVR,
+    res = addReqProv(pkg, RPMTAG_REQUIRENAME, reqname, featureEVR,
                     RPMSENSE_RPMLIB|(RPMSENSE_LESS|RPMSENSE_EQUAL), 0);
 
     free(reqname);
index 51a735d3dfbf3284e607ee7fa3507656e2bec7e9..4777f587eb046794d6849c354375a49321be6f0b 100644 (file)
@@ -15,7 +15,8 @@ extern "C" {
 #endif
 
 /** \ingroup rpmbuild
- * Bit(s) to control rpmSpecBuild() operation.
+ * Bit(s) to control rpmSpecBuild() operation. Also used as argument to
+ * rpmSpecGetSection and rpmSpecPkgGetSection.
  */
 enum rpmBuildFlags_e {
     RPMBUILD_NONE      = 0,
@@ -31,6 +32,9 @@ enum rpmBuildFlags_e {
     RPMBUILD_RMBUILD   = (1 <<  9),    /*!< Remove build sub-tree. */
     RPMBUILD_STRINGBUF = (1 << 10),    /*!< Internal use only */
     RPMBUILD_RMSPEC    = (1 << 11),    /*!< Remove spec file. */
+    RPMBUILD_FILE_FILE  = (1 << 16),    /*!< rpmSpecPkgGetSection: %files -f */
+    RPMBUILD_FILE_LIST  = (1 << 17),    /*!< rpmSpecPkgGetSection: %files */
+    RPMBUILD_POLICY     = (1 << 18),    /*!< rpmSpecPkgGetSection: %policy */
 
     RPMBUILD_NOBUILD   = (1 << 31)     /*!< Don't execute or package. */
 };
index fb6198d76e5675fe9adb20c3c3524d4fd6e068c7..86a4f6274846ab5483ed742ab00aa6455b813f99 100644 (file)
@@ -3,8 +3,22 @@
 
 #include <rpm/rpmbuild.h>
 #include <rpm/rpmutil.h>
+#include <rpm/rpmstrpool.h>
 #include "build/rpmbuild_misc.h"
 
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+#define HASHTYPE fileRenameHash
+#define HTKEYTYPE const char *
+#define HTDATATYPE const char *
+#include "lib/rpmhash.H"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+
+#define WHITELIST_NAME ".-_+%{}"
+
 struct TriggerFileEntry {
     int index;
     char * fileName;
@@ -12,6 +26,7 @@ struct TriggerFileEntry {
     char * prog;
     uint32_t flags;
     struct TriggerFileEntry * next;
+    uint32_t priority;
 };
 
 typedef struct ReadLevelEntry {
@@ -36,6 +51,9 @@ typedef struct Package_s * Package;
  * The structure used to store values parsed from a spec file.
  */
 struct rpmSpec_s {
+    char * buildHost;
+    rpm_time_t buildTime;
+
     char * specFile;   /*!< Name of the spec file. */
     char * buildRoot;
     char * buildSubdir;
@@ -66,10 +84,10 @@ struct rpmSpec_s {
 
     char * sourceRpmName;
     unsigned char * sourcePkgId;
-    Header sourceHeader;
-    rpmfi sourceCpioList;
+    Package sourcePackage;
 
     rpmMacroContext macros;
+    rpmstrPool pool;
 
     StringBuf prep;            /*!< %prep scriptlet. */
     StringBuf build;           /*!< %build scriptlet. */
@@ -82,13 +100,19 @@ struct rpmSpec_s {
     Package packages;          /*!< Package list. */
 };
 
+#define PACKAGE_NUM_DEPS 12
+
 /** \ingroup rpmbuild
  * The structure used to store values for a package.
  */
 struct Package_s {
+    rpmsid name;
+    rpmstrPool pool;
     Header header;
     rpmds ds;                  /*!< Requires: N = EVR */
-    rpmfi cpioList;
+    rpmds dependencies[PACKAGE_NUM_DEPS];
+    rpmfiles cpioList;
+    ARGV_t dpaths;
 
     struct Source * icon;
 
@@ -104,9 +128,14 @@ struct Package_s {
     char * verifyFile; /*!< %verifyscript scriptlet. */
 
     struct TriggerFileEntry * triggerFiles;
+    struct TriggerFileEntry * fileTriggerFiles;
+    struct TriggerFileEntry * transFileTriggerFiles;
 
     ARGV_t fileFile;
     ARGV_t fileList;           /* If NULL, package will not be written */
+    ARGV_t fileExcludeList;
+    ARGV_t removePostfixes;
+    fileRenameHash fileRenameMap;
     ARGV_t policyList;
 
     Package next;
@@ -114,6 +143,7 @@ struct Package_s {
 
 #define PART_SUBNAME  0
 #define PART_NAME     1
+#define PART_QUIET    2
 
 /** \ingroup rpmbuild
  * rpmSpec file parser states.
@@ -145,7 +175,14 @@ typedef enum rpmParseState_e {
     PART_TRIGGERPOSTUN  = 30+PART_BASE, /*!< */ 
     PART_TRIGGERPREIN   = 31+PART_BASE, /*!< */ 
     PART_POLICIES       = 32+PART_BASE, /*!< */
-    PART_LAST           = 33+PART_BASE  /*!< */
+    PART_FILETRIGGERIN         = 33+PART_BASE, /*!< */
+    PART_FILETRIGGERUN         = 34+PART_BASE, /*!< */
+    PART_FILETRIGGERPOSTUN     = 35+PART_BASE, /*!< */
+    PART_TRANSFILETRIGGERIN    = 36+PART_BASE, /*!< */
+    PART_TRANSFILETRIGGERUN    = 37+PART_BASE, /*!< */
+    PART_TRANSFILETRIGGERPOSTUN        = 38+PART_BASE, /*!< */
+    PART_EMPTY                 = 39+PART_BASE, /*!< */
+    PART_LAST                  = 40+PART_BASE  /*!< */
 } rpmParseState; 
 
 
@@ -259,12 +296,15 @@ int parseScript(rpmSpec spec, int parsePart);
  * Check for inappropriate characters. All alphanums are considered sane.
  * @param spec          spec
  * @param field         string to check
- * @param fsize         size of string to check
  * @param whitelist     string of permitted characters
  * @return              RPMRC_OK if OK
  */
 RPM_GNUC_INTERNAL
-rpmRC rpmCharCheck(rpmSpec spec, const char *field, size_t fsize, const char *whitelist);
+rpmRC rpmCharCheck(rpmSpec spec, const char *field, const char *whitelist);
+
+typedef rpmRC (*addReqProvFunction) (void *cbdata, rpmTagVal tagN,
+                                    const char * N, const char * EVR, rpmsenseFlags Flags,
+                                    int index);
 
 /** \ingroup rpmbuild
  * Parse dependency relations from spec file and/or autogenerated output buffer.
@@ -274,20 +314,21 @@ rpmRC rpmCharCheck(rpmSpec spec, const char *field, size_t fsize, const char *wh
  * @param tagN         tag, identifies type of dependency
  * @param index                (0 always)
  * @param tagflags     dependency flags already known from context
+ * @param cb           Callback for adding dependency (nullable)
+ * @param cbdata       Callback data (@pkg if NULL)
  * @return             RPMRC_OK on success, RPMRC_FAIL on failure
  */
 RPM_GNUC_INTERNAL
 rpmRC parseRCPOT(rpmSpec spec, Package pkg, const char * field, rpmTagVal tagN,
-               int index, rpmsenseFlags tagflags);
+               int index, rpmsenseFlags tagflags, addReqProvFunction cb, void *cbdata);
 
 /** \ingroup rpmbuild
  * Evaluate boolean expression.
- * @param spec         spec file control structure
  * @param expr         expression to parse
  * @return
  */
 RPM_GNUC_INTERNAL
-int parseExpressionBoolean(rpmSpec spec, const char * expr);
+int parseExpressionBoolean(const char * expr);
 
 /** \ingroup rpmbuild
  * Run a build script, assembled from spec file scriptlet section.
@@ -317,23 +358,35 @@ rpmRC lookupPackage(rpmSpec spec, const char * name, int flag,
 
 /** \ingroup rpmbuild
  * Create and initialize package control structure.
- * @param spec         spec file control structure
+ * @param name         package name for sub-packages (or NULL)
+ * @param pool         string pool
+ * @param pkglist      package list pointer to append to (or NULL)
  * @return             package control structure
  */
 RPM_GNUC_INTERNAL
-Package newPackage(rpmSpec spec);
+Package newPackage(const char *name, rpmstrPool pool, Package * pkglist);
+
+
+/** \ingroup rpmbuild
+ * Return rpmds containing the dependencies of a given type
+ * @param pkg          package
+ * @param tag          name tag denominating the dependency
+ * @return             pointer to dependency set
+ */
+RPM_GNUC_INTERNAL
+rpmds * packageDependencies(Package pkg, rpmTagVal tag);
 
 /** \ingroup rpmbuild
  * Post-build processing for binary package(s).
  * @param spec         spec file control structure
  * @param pkgFlags     bit(s) to control package generation
- * @param installSpecialDoc
+ * @param didInstall   was %install executed?
  * @param test         don't execute scripts or package if testing
  * @return             0 on success
  */
 RPM_GNUC_INTERNAL
 rpmRC processBinaryFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
-                       int installSpecialDoc, int test);
+                       int didInstall, int test);
 
 /** \ingroup rpmfc
  * Generate package dependencies.
@@ -393,6 +446,59 @@ rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating);
 RPM_GNUC_INTERNAL
 rpmRC packageSources(rpmSpec spec, char **cookie);
 
+RPM_GNUC_INTERNAL
+int addLangTag(rpmSpec spec, Header h, rpmTagVal tag,
+               const char *field, const char *lang);
+
+/** \ingroup rpmbuild
+ * Add dependency to package, filtering duplicates.
+ * @param pkg          package
+ * @param tagN         tag, identifies type of dependency
+ * @param N            (e.g. Requires: foo < 0:1.2-3, "foo")
+ * @param EVR          (e.g. Requires: foo < 0:1.2-3, "0:1.2-3")
+ * @param Flags                (e.g. Requires: foo < 0:1.2-3, both "Requires:" and "<")
+ * @param index         (# trigger script for triggers, 0 for others)
+ * @return             0 on success, 1 on error
+ */
+RPM_GNUC_INTERNAL
+int addReqProv(Package pkg, rpmTagVal tagN,
+              const char * N, const char * EVR, rpmsenseFlags Flags,
+              uint32_t index);
+
+RPM_GNUC_INTERNAL
+rpmRC addReqProvPkg(void *cbdata, rpmTagVal tagN,
+                   const char * N, const char * EVR, rpmsenseFlags Flags,
+                   int index);
+
+/** \ingroup rpmbuild
+ * Add self-provides to package.
+ * @param pkg          package
+ */
+RPM_GNUC_INTERNAL
+void addPackageProvides(Package pkg);
+
+/** \ingroup rpmbuild
+ * Add rpmlib feature dependency.
+ * @param pkg          package
+ * @param feature      rpm feature name (i.e. "rpmlib(Foo)" for feature Foo)
+ * @param featureEVR   rpm feature epoch/version/release
+ * @return             0 always
+ */
+RPM_GNUC_INTERNAL
+int rpmlibNeedsFeature(Package pkg, const char * feature, const char * featureEVR);
+
+RPM_GNUC_INTERNAL
+rpmRC checkForEncoding(Header h, int addtag);
+
+
+/** \ingroup rpmbuild
+ * Copy tags inherited by subpackages from the source header to the target header
+ * @param h            target header
+ * @param fromh                source header
+ */
+RPM_GNUC_INTERNAL
+void copyInheritedTags(Header h, Header fromh);
+
 #ifdef __cplusplus
 }
 #endif
index 9665c975fb886673feedba58721508a759a80b92..843dfea7818ae3f59aabb75ac69520545435a8de 100644 (file)
@@ -12,9 +12,10 @@ extern "C" {
 /** \ingroup rpmbuild
  * Truncate comment lines.
  * @param s            skip white space, truncate line at '#'
+ * @return             1 on comment lines, 0 otherwise
  */
 RPM_GNUC_INTERNAL
-void handleComments(char * s);
+int handleComments(char * s);
 
 /** \ingroup rpmstring
  */
@@ -62,31 +63,6 @@ void appendStringBufAux(StringBuf sb, const char * s, int nl);
 RPM_GNUC_INTERNAL
 uint32_t parseUnsignedNum(const char * line, uint32_t * res);
 
-/** \ingroup rpmbuild
- * Add dependency to header, filtering duplicates.
- * @param h            header
- * @param tagN         tag, identifies type of dependency
- * @param N            (e.g. Requires: foo < 0:1.2-3, "foo")
- * @param EVR          (e.g. Requires: foo < 0:1.2-3, "0:1.2-3")
- * @param Flags                (e.g. Requires: foo < 0:1.2-3, both "Requires:" and "<")
- * @param index                (0 always)
- * @return             0 on success, 1 on error
- */
-RPM_GNUC_INTERNAL
-int addReqProv(Header h, rpmTagVal tagN,
-               const char * N, const char * EVR, rpmsenseFlags Flags,
-               uint32_t index);
-
-/** \ingroup rpmbuild
- * Add rpmlib feature dependency.
- * @param h            header
- * @param feature      rpm feature name (i.e. "rpmlib(Foo)" for feature Foo)
- * @param featureEVR   rpm feature epoch/version/release
- * @return             0 always
- */
-RPM_GNUC_INTERNAL
-int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR);
-
 #ifdef __cplusplus
 }
 #endif
index f8e3402884e6f5cdfc6885978d149858cf51cc64..2fbfc69abd84cb7b5a4987baf2d54b819e8d1462 100644 (file)
@@ -1,6 +1,7 @@
 #include "system.h"
 
 #include <errno.h>
+#include <libgen.h>
 #include <sys/select.h>
 #include <sys/wait.h>
 #include <signal.h>
@@ -16,6 +17,7 @@
 #include <rpm/rpmfi.h>
 #include <rpm/rpmstrpool.h>
 
+#include "lib/rpmfi_internal.h"                /* rpmfiles stuff for now */
 #include "build/rpmbuild_internal.h"
 
 #include "debug.h"
@@ -32,13 +34,24 @@ typedef struct rpmfcAttr_s {
     struct matchRule excl;
 } * rpmfcAttr;
 
+typedef struct {
+    int fileIx;
+    rpmds dep;
+} rpmfcFileDep;
+
+typedef struct {
+    rpmfcFileDep *data;
+    int size;
+    int alloced;
+} rpmfcFileDeps;
+
 /**
  */
 struct rpmfc_s {
+    Package pkg;
     int nfiles;                /*!< no. of files */
     int fknown;                /*!< no. of classified files */
     int fwhite;                /*!< no. of "white" files */
-    int ix;            /*!< current file index */
     int skipProv;      /*!< Don't auto-generate Provides:? */
     int skipReq;       /*!< Don't auto-generate Requires:? */
     char *buildRoot;   /*!< (Build) root dir */
@@ -54,11 +67,9 @@ struct rpmfc_s {
     ARGI_t fddictn;    /*!< (no. files) file depends dictionary no. entries */
     ARGI_t ddictx;     /*!< (no. dependencies) file->dependency mapping */
     rpmstrPool cdict;  /*!< file class dictionary */
-    rpmstrPool ddict;  /*!< file depends dictionary */
+    rpmfcFileDeps fileDeps; /*!< file dependency mapping */
 
-    rpmds provides;    /*!< (no. provides) package provides */
-    rpmds requires;    /*!< (no. requires) package requires */
-    rpmds supplements; /*!< (no. supplements) package supplements */
+    rpmstrPool pool;   /*!< general purpose string storage */
 };
 
 struct rpmfcTokens_s {
@@ -87,22 +98,62 @@ static void ruleFree(struct matchRule *rule)
     argvFree(rule->flags);
 }
 
-static char *rpmfcAttrMacro(const char *name,
-                           const char *attr_prefix, const char *attr)
+static char *rpmfcAttrMacroV(const char *arg, va_list args)
 {
-    char *ret;
-    if (attr_prefix && attr_prefix[0] != '\0')
-       ret = rpmExpand("%{?__", name, "_", attr_prefix, "_", attr, "}", NULL);
-    else
-       ret = rpmExpand("%{?__", name, "_", attr, "}", NULL);
-    return rstreq(ret, "") ? _free(ret) : ret;
+    const char *s;
+    int blen;
+    char *buf = NULL, *obuf;
+    char *pe;
+    va_list args2;
+
+    if (arg == NULL || rstreq(arg, ""))
+       return NULL;
+
+    va_copy(args2, args);
+    blen = sizeof("%{?_") - 1;
+    for (s = arg; s != NULL; s = va_arg(args, const char *)) {
+       blen += sizeof("_") - 1 + strlen(s);
+    }
+    blen += sizeof("}") - 1;
+
+    buf = xmalloc(blen + 1);
+
+    pe = buf;
+    pe = stpcpy(pe, "%{?_");
+    for (s = arg; s != NULL; s = va_arg(args2, const char *)) {
+       *pe++ = '_';
+       pe = stpcpy(pe, s);
+    }
+    va_end(args2);
+    *pe++ = '}';
+    *pe = '\0';
+
+    obuf = rpmExpand(buf, NULL);
+    free(buf);
+
+    return rstreq(obuf, "") ? _free(obuf) : obuf;
 }
 
-static regex_t *rpmfcAttrReg(const char *name,
-                            const char *attr_prefix, const char *attr)
+static char *rpmfcAttrMacro(const char *arg, ...)
+{
+    va_list args;
+    char *s;
+
+    va_start(args, arg);
+    s = rpmfcAttrMacroV(arg, args);
+    va_end(args);
+    return s;
+}
+
+static regex_t *rpmfcAttrReg(const char *arg, ...)
 {
     regex_t *reg = NULL;
-    char *pattern = rpmfcAttrMacro(name, attr_prefix, attr);
+    char *pattern;
+    va_list args;
+
+    va_start(args, arg);
+    pattern = rpmfcAttrMacroV(arg, args);
+    va_end(args);
     if (pattern) {
        reg = xcalloc(1, sizeof(*reg));
        if (regcomp(reg, pattern, REG_EXTENDED) != 0) { 
@@ -122,10 +173,19 @@ static rpmfcAttr rpmfcAttrNew(const char *name)
     attr->name = xstrdup(name);
     for (struct matchRule **rule = rules; rule && *rule; rule++) {
        const char *prefix = (*rule == &attr->incl) ? NULL : "exclude";
-       char *flags = rpmfcAttrMacro(name, prefix, "flags");
+       char *flags;
+
+       if (prefix) {
+           flags = rpmfcAttrMacro(name, prefix, "flags", NULL);
 
-       (*rule)->path = rpmfcAttrReg(name, prefix, "path");
-       (*rule)->magic = rpmfcAttrReg(name, prefix, "magic");
+           (*rule)->path = rpmfcAttrReg(name, prefix, "path", NULL);
+           (*rule)->magic = rpmfcAttrReg(name, prefix, "magic", NULL);
+       } else {
+           flags = rpmfcAttrMacro(name, "flags", NULL);
+
+           (*rule)->path = rpmfcAttrReg(name, "path", NULL);
+           (*rule)->magic = rpmfcAttrReg(name, "magic", NULL);
+       }
        (*rule)->flags = argvSplitString(flags, ",", ARGV_SKIPEMPTY);
        argvSort((*rule)->flags, NULL);
 
@@ -163,16 +223,17 @@ static int rpmfcExpandAppend(ARGV_t * argvp, ARGV_const_t av)
     return 0;
 }
 
-static rpmds rpmdsSingleNS(rpmTagVal tagN, const char *namespace,
+static rpmds rpmdsSingleNS(rpmstrPool pool,
+                       rpmTagVal tagN, const char *namespace,
                        const char * N, const char * EVR, rpmsenseFlags Flags)
 {
     rpmds ds = NULL;
     if (namespace) {
        char *NSN = rpmExpand(namespace, "(", N, ")", NULL);
-       ds = rpmdsSingle(tagN, NSN, EVR, Flags);
+       ds = rpmdsSinglePool(pool, tagN, NSN, EVR, Flags);
        free(NSN);
     } else {
-       ds = rpmdsSingle(tagN, N, EVR, Flags);
+       ds = rpmdsSinglePool(pool, tagN, N, EVR, Flags);
     }
     return ds;
 }
@@ -208,8 +269,6 @@ static StringBuf getOutputFrom(ARGV_t argv,
     
     child = fork();
     if (child == 0) {
-       /* NSPR messes with SIGPIPE, reset to default for the kids */
-       signal(SIGPIPE, SIG_DFL);
        close(toProg[1]);
        close(fromProg[0]);
        
@@ -369,6 +428,12 @@ int rpmfcExec(ARGV_const_t av, StringBuf sb_stdin, StringBuf * sb_stdoutp,
        buf_stdin_len = strlen(buf_stdin);
     }
 
+    if (_rpmfc_debug) {
+       char *cmd = argvJoin(xav, " ");
+       rpmlog(RPMLOG_DEBUG, "Executing %s on %s\n", cmd, buf_stdin);
+       free(cmd);
+    }
+
     /* Read output from exec'd helper. */
     sb = getOutputFrom(xav, buf_stdin, buf_stdin_len, failnonzero, buildRoot);
 
@@ -397,15 +462,15 @@ static void argvAddUniq(ARGV_t * argvp, const char * key)
 
 #define hasAttr(_a, _n) (argvSearch((_a), (_n), NULL) != NULL)
 
-static void rpmfcAddFileDep(rpmstrPool ddict, int ix, rpmds ds, char deptype)
+static void rpmfcAddFileDep(rpmfcFileDeps *fileDeps, rpmds ds, int ix)
 {
-    if (ds) {
-       char *key = NULL;
-       rasprintf(&key, "%08d%c %s %s 0x%08x", ix, deptype,
-                 rpmdsN(ds), rpmdsEVR(ds), rpmdsFlags(ds));
-       rpmstrPoolId(ddict, key, 1);
-       free(key);
+    if (fileDeps->size == fileDeps->alloced) {
+       fileDeps->alloced <<= 2;
+       fileDeps->data  = xrealloc(fileDeps->data,
+           fileDeps->alloced * sizeof(fileDeps->data[0]));
     }
+    fileDeps->data[fileDeps->size].fileIx = ix;
+    fileDeps->data[fileDeps->size++].dep = ds;
 }
 
 static ARGV_t runCmd(const char *nsdep, const char *depname,
@@ -424,7 +489,7 @@ static ARGV_t runCmd(const char *nsdep, const char *depname,
 
        appendLineStringBuf(sb_stdin, fn);
        if (rpmfcExec(av, sb_stdin, &sb_stdout, 0, buildRoot) == 0) {
-           argvSplit(&output, getStringBuf(sb_stdout), " \t\n\r");
+           argvSplit(&output, getStringBuf(sb_stdout), "\n\r");
        }
 
        argvFree(av);
@@ -436,74 +501,77 @@ static ARGV_t runCmd(const char *nsdep, const char *depname,
     return output;
 }
 
+struct addReqProvDataFc {
+    rpmfc fc;
+    const char *namespace;
+    regex_t *exclude;
+};
+
+static rpmRC addReqProvFc(void *cbdata, rpmTagVal tagN,
+                         const char * N, const char * EVR, rpmsenseFlags Flags,
+                         int index)
+{
+    struct addReqProvDataFc *data = cbdata;
+    rpmfc fc = data->fc;
+    const char *namespace = data->namespace;
+    regex_t *exclude = data->exclude;
+
+    rpmds ds = rpmdsSingleNS(fc->pool, tagN, namespace, N, EVR, Flags);
+    /* Add to package and file dependencies unless filtered */
+    if (regMatch(exclude, rpmdsDNEVR(ds)+2) == 0)
+       rpmfcAddFileDep(&fc->fileDeps, ds, index);
+
+    return RPMRC_OK;
+}
+
 /**
  * Run per-interpreter dependency helper.
  * @param fc           file classifier
+ * @param ix           file index
  * @param nsdep                class name for interpreter (e.g. "perl")
  * @param depname      "provides" or "requires"
- * @param depsp                fc->provides or fc->requires
  * @param dsContext    RPMSENSE_FIND_PROVIDES or RPMSENSE_FIND_REQUIRES
  * @param tagN         RPMTAG_PROVIDENAME or RPMTAG_REQUIRENAME
- * @return             0
+ * @return             0 on success
  */
-static int rpmfcHelper(rpmfc fc, const char *nsdep, const char *depname,
-                      rpmds *depsp, rpmsenseFlags dsContext, rpmTagVal tagN)
+static int rpmfcHelper(rpmfc fc, int ix,
+                      const char *nsdep, const char *depname,
+                      rpmsenseFlags dsContext, rpmTagVal tagN)
 {
     ARGV_t pav = NULL;
-    const char * fn = fc->fn[fc->ix];
+    const char * fn = fc->fn[ix];
     char *namespace = NULL;
     int pac;
+    int rc = 0;
     regex_t *exclude = NULL;
     regex_t *exclude_from = NULL;
+    regex_t *global_exclude_from = NULL;
 
     /* If the entire path is filtered out, there's nothing more to do */
-    exclude_from = rpmfcAttrReg(depname, "exclude", "from");
+    exclude_from = rpmfcAttrReg(depname, "exclude", "from", NULL);
     if (regMatch(exclude_from, fn+fc->brlen))
        goto exit;
 
+    global_exclude_from = rpmfcAttrReg("global", depname, "exclude", "from", NULL);
+    if (regMatch(global_exclude_from, fn+fc->brlen))
+       goto exit;
+
     pav = runCmd(nsdep, depname, fc->buildRoot, fn);
     if (pav == NULL)
        goto exit;
 
     pac = argvCount(pav);
-    namespace = rpmfcAttrMacro(nsdep, NULL, "namespace");
-    exclude = rpmfcAttrReg(depname, NULL, "exclude");
-
-    for (int i = 0; i < pac; i++) {
-       rpmds ds = NULL;
-       const char *N = pav[i];
-       const char *EVR = "";
-       rpmsenseFlags Flags = dsContext;
-       if (pav[i+1] && strchr("=<>", *pav[i+1])) {
-           i++;
-           for (const char *s = pav[i]; *s; s++) {
-               switch(*s) {
-               default:
-                   break;
-               case '=':
-                   Flags |= RPMSENSE_EQUAL;
-                   break;
-               case '<':
-                   Flags |= RPMSENSE_LESS;
-                   break;
-               case '>':
-                   Flags |= RPMSENSE_GREATER;
-                   break;
-               }
-           }
-           i++;
-           EVR = pav[i];
-       }
-
-       ds = rpmdsSingleNS(tagN, namespace, N, EVR, Flags);
+    namespace = rpmfcAttrMacro(nsdep, "namespace", NULL);
+    exclude = rpmfcAttrReg(depname, "exclude", NULL);
 
-       /* Add to package and file dependencies unless filtered */
-       if (regMatch(exclude, rpmdsDNEVR(ds)+2) == 0) {
-           (void) rpmdsMerge(depsp, ds);
-           rpmfcAddFileDep(fc->ddict, fc->ix, ds, tagN == RPMTAG_PROVIDENAME ? 'P' : 'R');
-       }
+    struct addReqProvDataFc data;
+    data.fc = fc;
+    data.namespace = namespace;
+    data.exclude = exclude;
 
-       rpmdsFree(ds);
+    for (int i = 0; i < pac; i++) {
+       if (parseRCPOT(NULL, fc->pkg, pav[i], tagN, ix, dsContext, addReqProvFc, &data))
+           rc++;
     }
 
     argvFree(pav);
@@ -512,55 +580,8 @@ static int rpmfcHelper(rpmfc fc, const char *nsdep, const char *depname,
 
 exit:
     regFree(exclude_from);
-    return 0;
-}
-
-/**
- * Run per-interpreter Provides: dependency helper.
- * @param fc           file classifier
- * @param nsdep                class name for interpreter (e.g. "perl")
- * @return             0
- */
-static int rpmfcHelperProvides(rpmfc fc, const char * nsdep)
-{
-    if (fc->skipProv)
-       return 0;
-
-    rpmfcHelper(fc, nsdep, "provides", &fc->provides, RPMSENSE_FIND_PROVIDES, RPMTAG_PROVIDENAME);
-
-    return 0;
-}
-
-/**
- * Run per-interpreter Requires: dependency helper.
- * @param fc           file classifier
- * @param nsdep                class name for interpreter (e.g. "perl")
- * @return             0
- */
-static int rpmfcHelperRequires(rpmfc fc, const char * nsdep)
-{
-    if (fc->skipReq)
-       return 0;
-
-    rpmfcHelper(fc, nsdep, "requires", &fc->requires, RPMSENSE_FIND_REQUIRES, RPMTAG_REQUIRENAME);
-
-    return 0;
-}
-
-/**
- * Run per-interpreter Supplements: dependency helper.
- * @param fc           file classifier
- * @param nsdep                class name for interpreter (e.g. "perl")
- * @return             0
- */
-static int rpmfcHelperSupplements(rpmfc fc, const char * nsdep)
-{
-    if (fc->skipReq)
-       return 0;
-
-    rpmfcHelper(fc, nsdep, "supplements", &fc->supplements, RPMSENSE_FIND_REQUIRES|RPMSENSE_STRONG|RPMSENSE_MISSINGOK, RPMTAG_ENHANCESNAME);
-
-    return 0;
+    regFree(global_exclude_from);
+    return rc;
 }
 
 /* Only used for elf coloring and controlling RPMTAG_FILECLASS inclusion now */
@@ -635,7 +656,7 @@ static int matches(const struct matchRule *rule,
     }
 }
 
-static void rpmfcAttributes(rpmfc fc, const char *ftype, const char *fullpath)
+static void rpmfcAttributes(rpmfc fc, int ix, const char *ftype, const char *fullpath)
 {
     const char *path = fullpath + fc->brlen;
     int is_executable = 0;
@@ -652,7 +673,7 @@ static void rpmfcAttributes(rpmfc fc, const char *ftype, const char *fullpath)
 
        /* Add attributes on libmagic type & path pattern matches */
        if (matches(&(*attr)->incl, ftype, path, is_executable))
-           argvAddTokens(&fc->fattrs[fc->ix], (*attr)->name);
+           argvAddTokens(&fc->fattrs[ix], (*attr)->name);
     }
 }
 
@@ -676,39 +697,34 @@ static rpm_color_t rpmfcColor(const char * fmstr)
 
 void rpmfcPrint(const char * msg, rpmfc fc, FILE * fp)
 {
-    rpm_color_t fcolor;
     int ndx;
     int dx;
     int fx;
 
-int nprovides;
-int nrequires;
-
     if (fp == NULL) fp = stderr;
 
     if (msg)
        fprintf(fp, "===================================== %s\n", msg);
 
-nprovides = rpmdsCount(fc->provides);
-nrequires = rpmdsCount(fc->requires);
-
     if (fc)
     for (fx = 0; fx < fc->nfiles; fx++) {
-       rpmsid cx = fc->fcdictx[fx] + 1; /* id's are one off */
-       fcolor = fc->fcolor[fx];
-       ARGV_t fattrs = fc->fattrs[fx];
-
        fprintf(fp, "%3d %s", fx, fc->fn[fx]);
-       if (fcolor != RPMFC_BLACK)
+       if (_rpmfc_debug) {
+           rpmsid cx = fc->fcdictx[fx] + 1; /* id's are one off */
+           rpm_color_t fcolor = fc->fcolor[fx];
+           ARGV_t fattrs = fc->fattrs[fx];
+
+           if (fcolor != RPMFC_BLACK)
                fprintf(fp, "\t0x%x", fc->fcolor[fx]);
-       else
+           else
                fprintf(fp, "\t%s", rpmstrPoolStr(fc->cdict, cx));
-       if (fattrs) {
-           char *attrs = argvJoin(fattrs, ",");
-           fprintf(fp, " [%s]", attrs);
-           free(attrs);
-       } else {
-           fprintf(fp, " [none]");
+           if (fattrs) {
+               char *attrs = argvJoin(fattrs, ",");
+               fprintf(fp, " [%s]", attrs);
+               free(attrs);
+           } else {
+               fprintf(fp, " [none]");
+           }
        }
        fprintf(fp, "\n");
 
@@ -724,32 +740,16 @@ assert(fx < fc->fddictn->nvals);
            const char * depval;
            unsigned char deptype;
            unsigned ix;
+           rpmds ds;
 
            ix = fc->ddictx->vals[dx++];
            deptype = ((ix >> 24) & 0xff);
            ix &= 0x00ffffff;
            depval = NULL;
-           switch (deptype) {
-           default:
-assert(depval != NULL);
-               break;
-           case 'P':
-               if (nprovides > 0) {
-assert(ix < nprovides);
-                   (void) rpmdsSetIx(fc->provides, ix-1);
-                   if (rpmdsNext(fc->provides) >= 0)
-                       depval = rpmdsDNEVR(fc->provides);
-               }
-               break;
-           case 'R':
-               if (nrequires > 0) {
-assert(ix < nrequires);
-                   (void) rpmdsSetIx(fc->requires, ix-1);
-                   if (rpmdsNext(fc->requires) >= 0)
-                       depval = rpmdsDNEVR(fc->requires);
-               }
-               break;
-           }
+           ds = rpmfcDependencies(fc, rpmdsDToTagN(deptype));
+           (void) rpmdsSetIx(ds, ix-1);
+           if (rpmdsNext(ds) >= 0)
+               depval = rpmdsDNEVR(ds);
            if (depval)
                fprintf(fp, "\t%s\n", depval);
        }
@@ -771,16 +771,19 @@ rpmfc rpmfcFree(rpmfc fc)
        free(fc->fattrs);
        free(fc->fcolor);
        free(fc->fcdictx);
+       free(fc->pkg);
        argiFree(fc->fddictx);
        argiFree(fc->fddictn);
        argiFree(fc->ddictx);
 
-       rpmstrPoolFree(fc->ddict);
+       for (int i = 0; i < fc->fileDeps.size; i++) {
+           rpmdsFree(fc->fileDeps.data[i].dep);
+       }
+       free(fc->fileDeps.data);
+
        rpmstrPoolFree(fc->cdict);
 
-       rpmdsFree(fc->provides);
-       rpmdsFree(fc->requires);
-       rpmdsFree(fc->supplements);
+       rpmstrPoolFree(fc->pool);
        memset(fc, 0, sizeof(*fc)); /* trash and burn */
        free(fc);
     }
@@ -794,6 +797,11 @@ rpmfc rpmfcCreate(const char *buildRoot, rpmFlags flags)
        fc->buildRoot = xstrdup(buildRoot);
        fc->brlen = strlen(buildRoot);
     }
+    fc->pool = rpmstrPoolCreate();
+    fc->pkg = xcalloc(1, sizeof(*fc->pkg));
+    fc->fileDeps.alloced = 10;
+    fc->fileDeps.data = xmalloc(fc->fileDeps.alloced *
+       sizeof(fc->fileDeps.data[0]));
     return fc;
 }
 
@@ -802,97 +810,183 @@ rpmfc rpmfcNew(void)
     return rpmfcCreate(NULL, 0);
 }
 
+rpmds rpmfcDependencies(rpmfc fc, rpmTagVal tag)
+{
+    if (fc) {
+       return *packageDependencies(fc->pkg, tag);
+    }
+    return NULL;
+}
+
 rpmds rpmfcProvides(rpmfc fc)
 {
-    return (fc != NULL ? fc->provides : NULL);
+    return rpmfcDependencies(fc, RPMTAG_PROVIDENAME);
 }
 
 rpmds rpmfcRequires(rpmfc fc)
 {
-    return (fc != NULL ? fc->requires : NULL);
+    return rpmfcDependencies(fc, RPMTAG_REQUIRENAME);
+}
+
+rpmds rpmfcRecommends(rpmfc fc)
+{
+    return rpmfcDependencies(fc, RPMTAG_RECOMMENDNAME);
+}
+
+rpmds rpmfcSuggests(rpmfc fc)
+{
+    return rpmfcDependencies(fc, RPMTAG_SUGGESTNAME);
 }
 
 rpmds rpmfcSupplements(rpmfc fc)
 {
-    return (fc != NULL ? fc->supplements : NULL);
+    return rpmfcDependencies(fc, RPMTAG_SUPPLEMENTNAME);
 }
 
-rpmRC rpmfcApply(rpmfc fc)
+rpmds rpmfcEnhances(rpmfc fc)
 {
-    const char * s;
-    char * se;
-    rpmds ds;
-    const char * N;
-    const char * EVR;
-    rpmsenseFlags Flags;
-    unsigned char deptype;
-    int nddict;
+    return rpmfcDependencies(fc, RPMTAG_ENHANCENAME);
+}
+
+rpmds rpmfcConflicts(rpmfc fc)
+{
+    return rpmfcDependencies(fc, RPMTAG_CONFLICTNAME);
+}
+
+rpmds rpmfcObsoletes(rpmfc fc)
+{
+    return rpmfcDependencies(fc, RPMTAG_OBSOLETENAME);
+}
+
+
+/* Versioned deps are less than unversioned deps */
+static int cmpVerDeps(const void *a, const void *b)
+{
+    rpmfcFileDep *fDepA = (rpmfcFileDep *) a;
+    rpmfcFileDep *fDepB = (rpmfcFileDep *) b;
+
+    int aIsVersioned = rpmdsFlags(fDepA->dep) & RPMSENSE_SENSEMASK ? 1 : 0;
+    int bIsVersioned = rpmdsFlags(fDepB->dep) & RPMSENSE_SENSEMASK ? 1 : 0;
+
+    return bIsVersioned - aIsVersioned;
+}
+
+/* Sort by index */
+static int cmpIndexDeps(const void *a, const void *b)
+{
+    rpmfcFileDep *fDepA = (rpmfcFileDep *) a;
+    rpmfcFileDep *fDepB = (rpmfcFileDep *) b;
+
+    return fDepA->fileIx - fDepB->fileIx;
+}
+
+/*
+ * Remove unversioned deps if corresponding versioned deps exist but only
+ * if the versioned dependency has the same type and the same color as the versioned.
+ */
+static void rpmfcNormalizeFDeps(rpmfc fc)
+{
+    rpmstrPool versionedDeps = rpmstrPoolCreate();
+    rpmfcFileDep *normalizedFDeps = xmalloc(fc->fileDeps.size *
+       sizeof(normalizedFDeps[0]));
+    int ix = 0;
+    char *depStr;
+
+    /* Sort. Versioned dependencies first */
+    qsort(fc->fileDeps.data, fc->fileDeps.size, sizeof(fc->fileDeps.data[0]),
+       cmpVerDeps);
+
+    for (int i = 0; i < fc->fileDeps.size; i++) {
+       switch (rpmdsTagN(fc->fileDeps.data[i].dep)) {
+       case RPMTAG_REQUIRENAME:
+       case RPMTAG_RECOMMENDNAME:
+       case RPMTAG_SUGGESTNAME:
+           rasprintf(&depStr, "%08x_%c_%s",
+               fc->fcolor[fc->fileDeps.data[i].fileIx],
+               rpmdsD(fc->fileDeps.data[i].dep),
+               rpmdsN(fc->fileDeps.data[i].dep));
+
+           if (rpmdsFlags(fc->fileDeps.data[i].dep) & RPMSENSE_SENSEMASK) {
+               /* preserve versioned require dependency */
+               normalizedFDeps[ix++] = fc->fileDeps.data[i];
+               rpmstrPoolId(versionedDeps, depStr, 1);
+           } else if (!rpmstrPoolId(versionedDeps, depStr, 0)) {
+               /* preserve unversioned require dep only if versioned dep doesn't exist */
+                   normalizedFDeps[ix++] =fc-> fileDeps.data[i];
+           } else {
+               rpmdsFree(fc->fileDeps.data[i].dep);
+           }
+           free(depStr);
+           break;
+       default:
+           /* Preserve all non-require dependencies */
+           normalizedFDeps[ix++] = fc->fileDeps.data[i];
+           break;
+       }
+    }
+    rpmstrPoolFree(versionedDeps);
+
+    free(fc->fileDeps.data);
+    fc->fileDeps.data = normalizedFDeps;
+    fc->fileDeps.size = ix;
+}
+
+static rpmRC rpmfcApplyInternal(rpmfc fc)
+{
+    rpmds ds, * dsp;
     int previx;
     unsigned int val;
     int dix;
     int ix;
 
     /* Generate package and per-file dependencies. */
-    for (fc->ix = 0; fc->ix < fc->nfiles && fc->fn[fc->ix] != NULL; fc->ix++) {
-       for (ARGV_t fattr = fc->fattrs[fc->ix]; fattr && *fattr; fattr++) {
-           rpmfcHelperProvides(fc, *fattr);
-           rpmfcHelperRequires(fc, *fattr);
-           rpmfcHelperSupplements(fc, *fattr);
+    for (ix = 0; ix < fc->nfiles && fc->fn[ix] != NULL; ix++) {
+       for (ARGV_t fattr = fc->fattrs[ix]; fattr && *fattr; fattr++) {
+           if (!fc->skipProv) {
+               rpmfcHelper(fc, ix, *fattr, "provides",
+                           RPMSENSE_FIND_PROVIDES, RPMTAG_PROVIDENAME);
+           }
+           if (!fc->skipReq) {
+               rpmfcHelper(fc, ix, *fattr, "requires",
+                           RPMSENSE_FIND_REQUIRES, RPMTAG_REQUIRENAME);
+               rpmfcHelper(fc, ix, *fattr, "recommends",
+                           RPMSENSE_FIND_REQUIRES, RPMTAG_RECOMMENDNAME);
+               rpmfcHelper(fc, ix, *fattr, "suggests",
+                           RPMSENSE_FIND_REQUIRES, RPMTAG_SUGGESTNAME);
+               rpmfcHelper(fc, ix, *fattr, "supplements",
+                           RPMSENSE_FIND_REQUIRES, RPMTAG_SUPPLEMENTNAME);
+               rpmfcHelper(fc, ix, *fattr, "enhances",
+                           RPMSENSE_FIND_REQUIRES, RPMTAG_ENHANCENAME);
+               rpmfcHelper(fc, ix, *fattr, "conflicts",
+                           RPMSENSE_FIND_REQUIRES, RPMTAG_CONFLICTNAME);
+               rpmfcHelper(fc, ix, *fattr, "obsoletes",
+                           RPMSENSE_FIND_REQUIRES, RPMTAG_OBSOLETENAME);
+           }
        }
     }
     /* No more additions after this, freeze pool to minimize memory use */
-    rpmstrPoolFreeze(fc->ddict, 0);
+
+    rpmfcNormalizeFDeps(fc);
+    for (int i = 0; i < fc->fileDeps.size; i++) {
+       ds = fc->fileDeps.data[i].dep;
+       rpmdsMerge(packageDependencies(fc->pkg, rpmdsTagN(ds)), ds);
+    }
+
+    /* Sort by index */
+    qsort(fc->fileDeps.data, fc->fileDeps.size,
+       sizeof(fc->fileDeps.data[0]), cmpIndexDeps);
 
     /* Generate per-file indices into package dependencies. */
-    nddict = rpmstrPoolNumStr(fc->ddict);
     previx = -1;
-    for (rpmsid id = 1; id <= nddict; id++) {
-       s = rpmstrPoolStr(fc->ddict, id);
-
-       /* Parse out (file#,deptype,N,EVR,Flags) */
-       ix = strtol(s, &se, 10);
-       if ( se == NULL ) {
-               rpmlog(RPMLOG_ERR, _("Conversion of %s to long integer failed.\n"), s);
-               return RPMRC_FAIL;
-       }
-       
-       deptype = *se++;
-       se++;
-       N = se;
-       while (*se && *se != ' ')
-           se++;
-       *se++ = '\0';
-       EVR = se;
-       while (*se && *se != ' ')
-           se++;
-       *se++ = '\0';
-       Flags = strtol(se, NULL, 16);
-
-       dix = -1;
-       switch (deptype) {
-       default:
-           break;
-       case 'P':
-           ds = rpmdsSingle(RPMTAG_PROVIDENAME, N, EVR, Flags);
-           dix = rpmdsFind(fc->provides, ds);
-           rpmdsFree(ds);
-           break;
-       case 'R':
-           ds = rpmdsSingle(RPMTAG_REQUIRENAME, N, EVR, Flags);
-           dix = rpmdsFind(fc->requires, ds);
-           rpmdsFree(ds);
-           break;
-       case 'S':
-           ds = rpmdsSingle(RPMTAG_ENHANCESNAME, N, EVR, Flags);
-           dix = rpmdsFind(fc->supplements, ds);
-           ds = rpmdsFree(ds);
-           break;
-       }
-
+    for (int i = 0; i < fc->fileDeps.size; i++) {
+       ds = fc->fileDeps.data[i].dep;
+       ix = fc->fileDeps.data[i].fileIx;
+       dsp = packageDependencies(fc->pkg, rpmdsTagN(ds));
+       dix = rpmdsFind(*dsp, ds);
        if (dix < 0)
            continue;
 
-       val = (deptype << 24) | (dix & 0x00ffffff);
+       val = (rpmdsD(ds) << 24) | (dix & 0x00ffffff);
        argiAdd(&fc->ddictx, -1, val);
 
        if (previx != ix) {
@@ -901,8 +995,8 @@ rpmRC rpmfcApply(rpmfc fc)
        }
        if (fc->fddictn && fc->fddictn->vals)
            fc->fddictn->vals[ix]++;
-    }
 
+    }
     return RPMRC_OK;
 }
 
@@ -960,7 +1054,6 @@ rpmRC rpmfcClassify(rpmfc fc, ARGV_t argv, rpm_mode_t * fmode)
 
     /* Build (sorted) file class dictionary. */
     fc->cdict = rpmstrPoolCreate();
-    fc->ddict = rpmstrPoolCreate();
 
     ms = magic_open(msflags);
     if (ms == NULL) {
@@ -974,13 +1067,13 @@ rpmRC rpmfcClassify(rpmfc fc, ARGV_t argv, rpm_mode_t * fmode)
        goto exit;
     }
 
-    for (fc->ix = 0; fc->ix < fc->nfiles; fc->ix++) {
+    for (int ix = 0; ix < fc->nfiles; ix++) {
        rpmsid ftypeId;
        const char * ftype;
-       const char * s = argv[fc->ix];
+       const char * s = argv[ix];
        size_t slen = strlen(s);
        int fcolor = RPMFC_BLACK;
-       rpm_mode_t mode = (fmode ? fmode[fc->ix] : 0);
+       rpm_mode_t mode = (fmode ? fmode[ix] : 0);
        int is_executable = (mode & (S_IXUSR|S_IXGRP|S_IXOTH));
 
        switch (mode & S_IFMT) {
@@ -1026,15 +1119,15 @@ rpmRC rpmfcClassify(rpmfc fc, ARGV_t argv, rpm_mode_t * fmode)
        rpmlog(RPMLOG_DEBUG, "%s: %s\n", s, ftype);
 
        /* Save the path. */
-       fc->fn[fc->ix] = xstrdup(s);
+       fc->fn[ix] = xstrdup(s);
 
        /* Add (filtered) file coloring */
        fcolor |= rpmfcColor(ftype);
 
        /* Add attributes based on file type and/or path */
-       rpmfcAttributes(fc, ftype, s);
+       rpmfcAttributes(fc, ix, ftype, s);
 
-       fc->fcolor[fc->ix] = fcolor;
+       fc->fcolor[ix] = fcolor;
 
        /* Add to file class dictionary and index array */
        if (fcolor != RPMFC_WHITE && (fcolor & RPMFC_INCLUDE)) {
@@ -1045,7 +1138,7 @@ rpmRC rpmfcClassify(rpmfc fc, ARGV_t argv, rpm_mode_t * fmode)
            fc->fwhite++;
        }
        /* Pool id's start from 1, for headers we want it from 0 */
-       fc->fcdictx[fc->ix] = ftypeId - 1;
+       fc->fcdictx[ix] = ftypeId - 1;
     }
     rc = RPMRC_OK;
 
@@ -1101,6 +1194,12 @@ static struct DepMsg_s depMsgs[] = {
   { "Requires(postun)",        { NULL, "postun", NULL, NULL },
        -1, -1, RPMTAG_REQUIREFLAGS,
        RPMSENSE_SCRIPT_POSTUN, 0 },
+  { "Requires(pretrans)",      { NULL, "pretrans", NULL, NULL },
+       -1, -1, RPMTAG_REQUIREFLAGS,
+       RPMSENSE_PRETRANS, 0 },
+  { "Requires(posttrans)",     { NULL, "posttrans", NULL, NULL },
+       -1, -1, RPMTAG_REQUIREFLAGS,
+       RPMSENSE_POSTTRANS, 0 },
   { "Requires",                { "%{?__find_requires}", NULL, NULL, NULL },
        -1, -1, RPMTAG_REQUIREFLAGS,    /* XXX inherit name/version arrays */
        RPMSENSE_FIND_REQUIRES|RPMSENSE_TRIGGERIN|RPMSENSE_TRIGGERUN|RPMSENSE_TRIGGERPOSTUN|RPMSENSE_TRIGGERPREIN, 0 },
@@ -1110,12 +1209,18 @@ static struct DepMsg_s depMsgs[] = {
   { "Obsoletes",       { "%{?__find_obsoletes}", NULL, NULL, NULL },
        RPMTAG_OBSOLETENAME, RPMTAG_OBSOLETEVERSION, RPMTAG_OBSOLETEFLAGS,
        0, -1 },
-  { "Enhances",                { "%{?__find_enhances}", NULL, NULL, NULL },
-       RPMTAG_ENHANCESNAME, RPMTAG_ENHANCESVERSION, RPMTAG_ENHANCESFLAGS,
-       RPMSENSE_STRONG, RPMSENSE_STRONG },
+  { "Recommends",              { "%{?__find_recommends}", NULL, NULL, NULL },
+       RPMTAG_RECOMMENDNAME, RPMTAG_RECOMMENDVERSION, RPMTAG_RECOMMENDFLAGS,
+       0, -1 },
+  { "Suggests",        { "%{?__find_suggests}", NULL, NULL, NULL },
+       RPMTAG_SUGGESTNAME, RPMTAG_SUGGESTVERSION, RPMTAG_SUGGESTFLAGS,
+       0, -1 },
   { "Supplements",     { "%{?__find_supplements}", NULL, NULL, NULL },
-       RPMTAG_ENHANCESNAME, RPMTAG_ENHANCESVERSION, RPMTAG_ENHANCESFLAGS,
-       RPMSENSE_STRONG, 0 },
+       RPMTAG_SUPPLEMENTNAME, RPMTAG_SUPPLEMENTVERSION, RPMTAG_SUPPLEMENTFLAGS,
+       0, -1 },
+  { "Enhances",                { "%{?__find_enhances}", NULL, NULL, NULL },
+       RPMTAG_ENHANCENAME, RPMTAG_ENHANCEVERSION, RPMTAG_ENHANCEFLAGS,
+       0, -1 },
   { NULL,              { NULL, NULL, NULL, NULL },     0, 0, 0, 0, 0 }
 };
 
@@ -1123,7 +1228,7 @@ static DepMsg_t DepMsgs = depMsgs;
 
 /**
  */
-static void printDeps(Header h)
+static void printDeps(rpmfc fc)
 {
     DepMsg_t dm;
     rpmds ds = NULL;
@@ -1133,8 +1238,7 @@ static void printDeps(Header h)
 
     for (dm = DepMsgs; dm->msg != NULL; dm++) {
        if (dm->ntag != -1) {
-           rpmdsFree(ds);
-           ds = rpmdsNew(h, dm->ntag, 0);
+           ds = rpmfcDependencies(fc, dm->ntag);
        }
        if (dm->ftag == 0)
            continue;
@@ -1161,18 +1265,16 @@ static void printDeps(Header h)
        if (bingo)
            rpmlog(RPMLOG_NOTICE, "\n");
     }
-    rpmdsFree(ds);
 }
 
-static rpmRC rpmfcGenerateDependsHelper(const rpmSpec spec, Package pkg, rpmfi fi)
+static rpmRC rpmfcApplyExternal(rpmfc fc)
 {
     StringBuf sb_stdin = newStringBuf();
     rpmRC rc = RPMRC_OK;
 
     /* Create file manifest buffer to deliver to dependency finder. */
-    fi = rpmfiInit(fi, 0);
-    while (rpmfiNext(fi) >= 0)
-       appendLineStringBuf(sb_stdin, rpmfiFN(fi));
+    for (int i = 0; i < fc->nfiles; i++)
+       appendLineStringBuf(sb_stdin, fc->fn[i]);
 
     for (DepMsg_t dm = DepMsgs; dm->msg != NULL; dm++) {
        rpmTagVal tag = (dm->ftag > 0) ? dm->ftag : dm->ntag;
@@ -1181,25 +1283,23 @@ static rpmRC rpmfcGenerateDependsHelper(const rpmSpec spec, Package pkg, rpmfi f
        StringBuf sb_stdout = NULL;
        int failnonzero = (tag == RPMTAG_PROVIDEFLAGS);
 
-       switch(tag) {
+       switch (tag) {
        case RPMTAG_PROVIDEFLAGS:
-           if (!pkg->autoProv)
+           if (fc->skipProv)
                continue;
            tagflags = RPMSENSE_FIND_PROVIDES;
            break;
        case RPMTAG_REQUIREFLAGS:
-           if (!pkg->autoReq)
+       case RPMTAG_RECOMMENDFLAGS:
+       case RPMTAG_SUGGESTFLAGS:
+       case RPMTAG_SUPPLEMENTFLAGS:
+       case RPMTAG_ENHANCEFLAGS:
+       case RPMTAG_CONFLICTFLAGS:
+       case RPMTAG_OBSOLETEFLAGS:
+           if (fc->skipReq)
                continue;
            tagflags = RPMSENSE_FIND_REQUIRES;
            break;
-       case RPMTAG_ENHANCESFLAGS:
-           if (!pkg->autoProv)
-               continue;
-           failnonzero = 0;
-           tagflags = RPMSENSE_FIND_REQUIRES | RPMSENSE_MISSINGOK;
-           if (strcmp(dm->msg, "Supplements") == 0)
-               tagflags |= RPMSENSE_STRONG;
-           break;
        default:
            continue;
            break;
@@ -1210,7 +1310,7 @@ static rpmRC rpmfcGenerateDependsHelper(const rpmSpec spec, Package pkg, rpmfi f
        free(s);
 
        if (rpmfcExec(dm->argv, sb_stdin, &sb_stdout,
-                       failnonzero, spec->buildRoot) == -1)
+                       failnonzero, fc->buildRoot) == -1)
            continue;
 
        if (sb_stdout == NULL) {
@@ -1220,7 +1320,7 @@ static rpmRC rpmfcGenerateDependsHelper(const rpmSpec spec, Package pkg, rpmfi f
        }
 
        /* Parse dependencies into header */
-       rc = parseRCPOT(spec, pkg, getStringBuf(sb_stdout), tag, 0, tagflags);
+       rc = parseRCPOT(NULL, fc->pkg, getStringBuf(sb_stdout), dm->ntag != -1 ? dm->ntag : RPMTAG_REQUIRENAME, 0, tagflags, addReqProvPkg, NULL);
        freeStringBuf(sb_stdout);
 
        if (rc) {
@@ -1234,11 +1334,26 @@ static rpmRC rpmfcGenerateDependsHelper(const rpmSpec spec, Package pkg, rpmfi f
     return rc;
 }
 
+rpmRC rpmfcApply(rpmfc fc)
+{
+    rpmRC rc;
+    /* If new-fangled dependency generation is disabled ... */
+    if (!rpmExpandNumeric("%{?_use_internal_dependency_generator}")) {
+       /* ... then generate dependencies using %{__find_requires} et al. */
+       rpmlog(RPMLOG_WARNING,
+           _("Deprecated external dependency generator is used!\n"));
+       rc = rpmfcApplyExternal(fc);
+    } else {
+       /* ... otherwise generate per-file dependencies */
+       rc = rpmfcApplyInternal(fc);
+    }
+    return rc;
+}
+
 rpmRC rpmfcGenerateDepends(const rpmSpec spec, Package pkg)
 {
-    rpmfi fi = pkg->cpioList;
+    rpmfi fi = rpmfilesIter(pkg->cpioList, RPMFI_ITER_FWD);
     rpmfc fc = NULL;
-    ARGV_t av = NULL;
     rpm_mode_t * fmode = NULL;
     int ac = rpmfiFC(fi);
     int genConfigDeps = 0;
@@ -1250,82 +1365,46 @@ rpmRC rpmfcGenerateDepends(const rpmSpec spec, Package pkg)
     if (ac <= 0)
        goto exit;
 
-    /* Skip packages that have dependency generation disabled. */
-    if (! (pkg->autoReq || pkg->autoProv))
-       goto exit;
-
-    /* If new-fangled dependency generation is disabled ... */
-    if (!rpmExpandNumeric("%{?_use_internal_dependency_generator}")) {
-       /* ... then generate dependencies using %{__find_requires} et al. */
-       rc = rpmfcGenerateDependsHelper(spec, pkg, fi);
-       goto exit;
-    }
-
     /* Extract absolute file paths in argv format. */
-    av = xcalloc(ac+1, sizeof(*av));
     fmode = xcalloc(ac+1, sizeof(*fmode));
 
     fi = rpmfiInit(fi, 0);
     while ((idx = rpmfiNext(fi)) >= 0) {
        /* Does package have any %config files? */
        genConfigDeps |= (rpmfiFFlags(fi) & RPMFILE_CONFIG);
-
-       av[idx] = xstrdup(rpmfiFN(fi));
        fmode[idx] = rpmfiFMode(fi);
     }
-    av[ac] = NULL;
 
     fc = rpmfcCreate(spec->buildRoot, 0);
+    free(fc->pkg);
+    fc->pkg = pkg;
     fc->skipProv = !pkg->autoProv;
     fc->skipReq = !pkg->autoReq;
 
-    /* Copy (and delete) manually generated dependencies to dictionary. */
-    if (!fc->skipProv) {
-       rpmds ds = rpmdsNew(pkg->header, RPMTAG_PROVIDENAME, 0);
-       rpmdsMerge(&fc->provides, ds);
-       rpmdsFree(ds);
-
-       headerDel(pkg->header, RPMTAG_PROVIDENAME);
-       headerDel(pkg->header, RPMTAG_PROVIDEVERSION);
-       headerDel(pkg->header, RPMTAG_PROVIDEFLAGS);
-
+    if (!fc->skipProv && genConfigDeps) {
        /* Add config dependency, Provides: config(N) = EVR */
-       if (genConfigDeps) {
-           ds = rpmdsSingleNS(RPMTAG_PROVIDENAME, "config",
-                              rpmdsN(pkg->ds), rpmdsEVR(pkg->ds),
-                              (RPMSENSE_EQUAL|RPMSENSE_CONFIG));
-           rpmdsMerge(&fc->provides, ds);
-           rpmdsFree(ds);
-       }
+       rpmds ds = rpmdsSingleNS(fc->pool, RPMTAG_PROVIDENAME, "config",
+                                rpmdsN(pkg->ds), rpmdsEVR(pkg->ds),
+                                (RPMSENSE_EQUAL|RPMSENSE_CONFIG));
+       rpmdsMerge(packageDependencies(pkg, RPMTAG_PROVIDENAME), ds);
+       rpmdsFree(ds);
     }
-
-    if (!fc->skipReq) {
-       rpmds ds = rpmdsNew(pkg->header, RPMTAG_REQUIRENAME, 0);
-       rpmdsMerge(&fc->requires, ds);
+    if (!fc->skipReq && genConfigDeps) {
+       rpmds ds = rpmdsSingleNS(fc->pool, RPMTAG_REQUIRENAME, "config",
+                                rpmdsN(pkg->ds), rpmdsEVR(pkg->ds),
+                                (RPMSENSE_EQUAL|RPMSENSE_CONFIG));
+       rpmdsMerge(packageDependencies(pkg, RPMTAG_REQUIRENAME), ds);
        rpmdsFree(ds);
-
-       headerDel(pkg->header, RPMTAG_REQUIRENAME);
-       headerDel(pkg->header, RPMTAG_REQUIREVERSION);
-       headerDel(pkg->header, RPMTAG_REQUIREFLAGS);
-
-       /* Add config dependency,  Requires: config(N) = EVR */
-       if (genConfigDeps) {
-           ds = rpmdsSingleNS(RPMTAG_REQUIRENAME, "config",
-                              rpmdsN(pkg->ds), rpmdsEVR(pkg->ds),
-                              (RPMSENSE_EQUAL|RPMSENSE_CONFIG));
-           rpmdsMerge(&fc->requires, ds);
-           rpmdsFree(ds);
-       }
     }
 
     /* Build file class dictionary. */
-    rc = rpmfcClassify(fc, av, fmode);
+    rc = rpmfcClassify(fc, pkg->dpaths, fmode);
     if ( rc != RPMRC_OK )
        goto exit;
 
     /* Build file/package dependency dictionary. */
     rc = rpmfcApply(fc);
-    if ( rc != RPMRC_OK )
+    if (rc != RPMRC_OK)
        goto exit;
 
     /* Add per-file colors(#files) */
@@ -1343,54 +1422,18 @@ rpmRC rpmfcGenerateDepends(const rpmSpec spec, Package pkg)
     /* Add per-file classes(#files) */
     headerPutUint32(pkg->header, RPMTAG_FILECLASS, fc->fcdictx, fc->nfiles);
 
-    /* Add Provides: */
-    if (!fc->skipProv) {
-       rpmds pi = rpmdsInit(fc->provides);
-       while (rpmdsNext(pi) >= 0) {
-           rpmsenseFlags flags = rpmdsFlags(pi);
-       
-           headerPutString(pkg->header, RPMTAG_PROVIDENAME, rpmdsN(pi));
-           headerPutString(pkg->header, RPMTAG_PROVIDEVERSION, rpmdsEVR(pi));
-           headerPutUint32(pkg->header, RPMTAG_PROVIDEFLAGS, &flags, 1);
-       }
-    }
-
-    /* Add Requires: */
-    if (!fc->skipReq) {
-       rpmds pi = rpmdsInit(fc->requires);
-       while (rpmdsNext(pi) >= 0) {
-           rpmsenseFlags flags = rpmdsFlags(pi);
-       
-           headerPutString(pkg->header, RPMTAG_REQUIRENAME, rpmdsN(pi));
-           headerPutString(pkg->header, RPMTAG_REQUIREVERSION, rpmdsEVR(pi));
-           headerPutUint32(pkg->header, RPMTAG_REQUIREFLAGS, &flags, 1);
-       }
-    }
-
-    /* Add Supplements: */
-    if (!fc->skipReq) {
-       rpmds pi = rpmdsInit(fc->supplements);
-       while (rpmdsNext(pi) >= 0) {
-           rpmsenseFlags flags = rpmdsFlags(pi);
-       
-           headerPutString(pkg->header, RPMTAG_ENHANCESNAME, rpmdsN(pi));
-           headerPutString(pkg->header, RPMTAG_ENHANCESVERSION, rpmdsEVR(pi));
-           headerPutUint32(pkg->header, RPMTAG_ENHANCESFLAGS, &flags, 1);
-       }
-    }
-
     /* Add dependency dictionary(#dependencies) */
     if (rpmtdFromArgi(&td, RPMTAG_DEPENDSDICT, fc->ddictx)) {
        headerPut(pkg->header, &td, HEADERPUT_DEFAULT);
-    }
 
-    /* Add per-file dependency (start,number) pairs (#files) */
-    if (rpmtdFromArgi(&td, RPMTAG_FILEDEPENDSX, fc->fddictx)) {
-       headerPut(pkg->header, &td, HEADERPUT_DEFAULT);
-    }
+       /* Add per-file dependency (start,number) pairs (#files) */
+       if (rpmtdFromArgi(&td, RPMTAG_FILEDEPENDSX, fc->fddictx)) {
+           headerPut(pkg->header, &td, HEADERPUT_DEFAULT);
+       }
 
-    if (rpmtdFromArgi(&td, RPMTAG_FILEDEPENDSN, fc->fddictn)) {
-       headerPut(pkg->header, &td, HEADERPUT_DEFAULT);
+       if (rpmtdFromArgi(&td, RPMTAG_FILEDEPENDSN, fc->fddictn)) {
+           headerPut(pkg->header, &td, HEADERPUT_DEFAULT);
+       }
     }
 
 
@@ -1403,12 +1446,14 @@ rpmRC rpmfcGenerateDepends(const rpmSpec spec, Package pkg)
        free(msg);
     }
 exit:
-    printDeps(pkg->header);
+    printDeps(fc);
 
     /* Clean up. */
+    if (fc)
+       fc->pkg = NULL;
     free(fmode);
     rpmfcFree(fc);
-    argvFree(av);
+    rpmfiFree(fi);
 
     return rc;
 }
index a05fd0e7893457e8f0ea98c2e74328ba3a385f5b..3d87b31cff85361e759e9883a9508b521470efcf 100644 (file)
@@ -45,7 +45,6 @@ typedef const struct rpmfcTokens_s * rpmfcToken;
 
 /** \ingroup rpmfc
  * Print results of file classification.
- * @todo Remove debugging routine.
  * @param msg          message prefix (NULL for none)
  * @param fc           file classifier
  * @param fp           output file handle (NULL for stderr)
@@ -106,13 +105,56 @@ rpmds rpmfcProvides(rpmfc fc);
  */
 rpmds rpmfcRequires(rpmfc fc);
 
+/** \ingroup rpmfc
+ * Retrieve file classification recommends
+ * @param fc           file classifier
+ * @return             rpmds dependency set of fc recommends
+ */
+rpmds rpmfcRecommends(rpmfc fc);
+
+/** \ingroup rpmfc
+ * Retrieve file classification suggests
+ * @param fc           file classifier
+ * @return             rpmds dependency set of fc suggests
+ */
+rpmds rpmfcSuggests(rpmfc fc);
+
 /** \ingroup rpmfc
  * Retrieve file classification supplements
  * @param fc           file classifier
- * @return             rpmds dependency set of fc requires
+ * @return             rpmds dependency set of fc supplements
  */
 rpmds rpmfcSupplements(rpmfc fc);
 
+/** \ingroup rpmfc
+ * Retrieve file classification enhances
+ * @param fc           file classifier
+ * @return             rpmds dependency set of fc enhances
+ */
+rpmds rpmfcEnhances(rpmfc fc);
+
+/** \ingroup rpmfc
+ * Retrieve file classification conflicts
+ * @param fc           file classifier
+ * @return             rpmds dependency set of fc conflicts
+ */
+rpmds rpmfcConflicts(rpmfc fc);
+
+/** \ingroup rpmfc
+ * Retrieve file classification obsoletes
+ * @param fc           file classifier
+ * @return             rpmds dependency set of fc obsoletes
+ */
+rpmds rpmfcObsoletes(rpmfc fc);
+
+/** \ingroup rpmfc
+ * Retrieve file classification dependencies
+ * @param fc           file classifier
+ * @param tagN         name tag of the wanted dependency
+ * @return             rpmds dependency set of fc requires
+ */
+rpmds rpmfcDependencies(rpmfc fc, rpmTagVal tagN);
+
 #ifdef __cplusplus
 }
 #endif
index 195fc720c8f1d0ea01fd011af869dcc0ff04b1ec..164c9b6accb472d9efe96f7acedacc0fc3cd440e 100644 (file)
@@ -36,6 +36,7 @@ enum rpmSpecFlags_e {
     RPMSPEC_ANYARCH    = (1 << 0),
     RPMSPEC_FORCE      = (1 << 1),
     RPMSPEC_NOLANG     = (1 << 2),
+    RPMSPEC_NOUTF8     = (1 << 3),
 };
 
 typedef rpmFlags rpmSpecFlags;
@@ -55,6 +56,13 @@ rpmSpecPkgIter rpmSpecPkgIterFree(rpmSpecPkgIter iter);
 /* Getters for spec package attributes */
 Header rpmSpecPkgHeader(rpmSpecPkg pkg);
 
+/*
+ * Retrieve package specific parsed spec script section (RPMBUILD_FILE_LIST,
+ * RPMBUILD_FILE_FILE, RPMBUILD_POLICY) as a malloc'ed string.
+ */
+char * rpmSpecPkgGetSection(rpmSpecPkg pkg, int section);
+
+
 /* Iterator for spec sources */
 rpmSpecSrcIter rpmSpecSrcIterInit(rpmSpec spec);
 rpmSpecSrc rpmSpecSrcIterNext(rpmSpecSrcIter iter);
index 4b6b6805d23ed7be7b068d823604901eca93fff4..39599e284fec45875fc47fa7c5a6b86c63c5e202 100644 (file)
@@ -13,6 +13,7 @@
 #include <rpm/rpmfileutil.h>
 
 #include "rpmio/rpmlua.h"
+#include "lib/rpmfi_internal.h"                /* rpmfiles stuff */
 #include "build/rpmbuild_internal.h"
 
 #include "debug.h"
@@ -60,8 +61,8 @@ struct Source * freeSources(struct Source * s)
 
 rpmRC lookupPackage(rpmSpec spec, const char *name, int flag,Package *pkg)
 {
-    const char *pname;
     char *fullName = NULL;
+    rpmsid nameid = 0;
     Package p;
 
     /* "main" package */
@@ -71,46 +72,66 @@ rpmRC lookupPackage(rpmSpec spec, const char *name, int flag,Package *pkg)
        return RPMRC_OK;
     }
 
-    /* Construct package name */
-    if (flag == PART_SUBNAME) {
-       pname = headerGetString(spec->packages->header, RPMTAG_NAME);
-       rasprintf(&fullName, "%s-%s", pname, name);
-    } else {
-       fullName = xstrdup(name);
+    /* Construct partial package name */
+    if (!(flag & PART_NAME)) {
+       rasprintf(&fullName, "%s-%s",
+                headerGetString(spec->packages->header, RPMTAG_NAME), name);
+       name = fullName;
     }
+    nameid = rpmstrPoolId(spec->pool, name, 1);
 
-    /* Locate package with fullName */
+    /* Locate package the name */
     for (p = spec->packages; p != NULL; p = p->next) {
-       pname = headerGetString(p->header, RPMTAG_NAME);
-       if (pname && (rstreq(fullName, pname))) {
+       if (p->name && p->name == nameid) {
            break;
        }
     }
-    free(fullName);
+
+    if (!(flag & PART_QUIET)) {
+       if (p == NULL && pkg != NULL) {
+           rpmlog(RPMLOG_ERR, _("line %d: %s: package %s does not exist\n"),
+                                   spec->lineNum, spec->line, name);
+       } else if (p != NULL && pkg == NULL) {
+           rpmlog(RPMLOG_ERR, _("line %d: %s: package %s already exists\n"),
+                                   spec->lineNum, spec->line, name);
+       }
+    }
+
+    if (fullName == name)
+       free(fullName);
 
     if (pkg)
        *pkg = p;
     return ((p == NULL) ? RPMRC_FAIL : RPMRC_OK);
 }
 
-Package newPackage(rpmSpec spec)
+Package newPackage(const char *name, rpmstrPool pool, Package *pkglist)
 {
     Package p = xcalloc(1, sizeof(*p));
     p->header = headerNew();
     p->autoProv = 1;
     p->autoReq = 1;
     p->fileList = NULL;
+    p->fileExcludeList = NULL;
     p->fileFile = NULL;
     p->policyList = NULL;
-
-    if (spec->packages == NULL) {
-       spec->packages = p;
-    } else {
-       Package pp;
-       /* Always add package to end of list */
-       for (pp = spec->packages; pp->next != NULL; pp = pp->next)
-           {};
-       pp->next = p;
+    p->fileRenameMap = NULL;
+    p->pool = rpmstrPoolLink(pool);
+    p->dpaths = NULL;
+
+    if (name)
+       p->name = rpmstrPoolId(p->pool, name, 1);
+
+    if (pkglist) {
+       if (*pkglist == NULL) {
+           *pkglist = p;
+       } else {
+           Package pp;
+           /* Always add package to end of list */
+           for (pp = *pkglist; pp->next != NULL; pp = pp->next)
+               {};
+           pp->next = p;
+       }
     }
     p->next = NULL;
 
@@ -129,13 +150,25 @@ static Package freePackage(Package pkg)
 
     pkg->header = headerFree(pkg->header);
     pkg->ds = rpmdsFree(pkg->ds);
+
+    for (int i=0; i<PACKAGE_NUM_DEPS; i++) {
+       pkg->dependencies[i] = rpmdsFree(pkg->dependencies[i]);
+    }
+
     pkg->fileList = argvFree(pkg->fileList);
+    pkg->fileExcludeList = argvFree(pkg->fileExcludeList);
     pkg->fileFile = argvFree(pkg->fileFile);
     pkg->policyList = argvFree(pkg->policyList);
-    pkg->cpioList = rpmfiFree(pkg->cpioList);
+    pkg->removePostfixes = argvFree(pkg->removePostfixes);
+    pkg->fileRenameMap = fileRenameHashFree(pkg->fileRenameMap);
+    pkg->cpioList = rpmfilesFree(pkg->cpioList);
+    pkg->dpaths = argvFree(pkg->dpaths);
 
     pkg->icon = freeSources(pkg->icon);
     pkg->triggerFiles = freeTriggerFiles(pkg->triggerFiles);
+    pkg->fileTriggerFiles = freeTriggerFiles(pkg->fileTriggerFiles);
+    pkg->transFileTriggerFiles = freeTriggerFiles(pkg->transFileTriggerFiles);
+    pkg->pool = rpmstrPoolFree(pkg->pool);
 
     free(pkg);
     return NULL;
@@ -153,6 +186,21 @@ static Package freePackages(Package packages)
     return NULL;
 }
 
+rpmds * packageDependencies(Package pkg, rpmTagVal tag)
+{
+    for (int i=0; i<PACKAGE_NUM_DEPS; i++) {
+       if (pkg->dependencies[i] == NULL) {
+           return &pkg->dependencies[i];
+       }
+       rpmTagVal tagN = rpmdsTagN(pkg->dependencies[i]);
+       if (tagN == tag || tagN == 0) {
+           return &pkg->dependencies[i];
+       }
+    }
+    return NULL;
+}
+
+
 rpmSpec newSpec(void)
 {
     rpmSpec spec = xcalloc(1, sizeof(*spec));
@@ -186,8 +234,7 @@ rpmSpec newSpec(void)
 
     spec->sourceRpmName = NULL;
     spec->sourcePkgId = NULL;
-    spec->sourceHeader = NULL;
-    spec->sourceCpioList = NULL;
+    spec->sourcePackage = NULL;
     
     spec->buildRoot = NULL;
     spec->buildSubdir = NULL;
@@ -201,11 +248,14 @@ rpmSpec newSpec(void)
     spec->flags = RPMSPEC_NONE;
 
     spec->macros = rpmGlobalMacroContext;
+    spec->pool = rpmstrPoolCreate();
     
 #ifdef WITH_LUA
     {
     /* make sure patches and sources tables always exist */
     rpmlua lua = NULL; /* global state */
+    rpmluaDelVar(lua, "patches");
+    rpmluaDelVar(lua, "sources");
     rpmluaPushTable(lua, "patches");
     rpmluaPushTable(lua, "sources");
     rpmluaPop(lua);
@@ -243,8 +293,7 @@ rpmSpec rpmSpecFree(rpmSpec spec)
     
     spec->sourceRpmName = _free(spec->sourceRpmName);
     spec->sourcePkgId = _free(spec->sourcePkgId);
-    spec->sourceHeader = headerFree(spec->sourceHeader);
-    spec->sourceCpioList = rpmfiFree(spec->sourceCpioList);
+    spec->sourcePackage = freePackage(spec->sourcePackage);
 
     spec->buildRestrictions = headerFree(spec->buildRestrictions);
 
@@ -266,6 +315,7 @@ rpmSpec rpmSpecFree(rpmSpec spec)
 
     spec->sources = freeSources(spec->sources);
     spec->packages = freePackages(spec->packages);
+    spec->pool = rpmstrPoolFree(spec->pool);
     
     spec = _free(spec);
 
@@ -274,12 +324,12 @@ rpmSpec rpmSpecFree(rpmSpec spec)
 
 Header rpmSpecSourceHeader(rpmSpec spec)
 {
-       return spec->sourceHeader;
+    return (spec && spec->sourcePackage) ? spec->sourcePackage->header : NULL;
 }
 
 rpmds rpmSpecDS(rpmSpec spec, rpmTagVal tag)
 {
-    return (spec != NULL) ? rpmdsNew(spec->buildRestrictions, tag, 0) : NULL;
+    return (spec != NULL) ? rpmdsNew(spec->sourcePackage->header, tag, 0) : NULL;
 }
 
 rpmps rpmSpecCheckDeps(rpmts ts, rpmSpec spec)
@@ -341,6 +391,18 @@ Header rpmSpecPkgHeader(rpmSpecPkg pkg)
     return (pkg != NULL) ? pkg->header : NULL;
 }
 
+char* rpmSpecPkgGetSection(rpmSpecPkg pkg, int section)
+{
+    if (pkg) {
+        switch (section) {
+        case RPMBUILD_FILE_FILE: return argvJoin(pkg->fileFile, "");
+        case RPMBUILD_FILE_LIST: return argvJoin(pkg->fileList, "");
+        case RPMBUILD_POLICY:    return argvJoin(pkg->policyList, "");
+        }
+    }
+    return NULL;
+}
+
 rpmSpecSrcIter rpmSpecSrcIterInit(rpmSpec spec)
 {
     SPEC_LISTITER_INIT(rpmSpecSrcIter, sources);
@@ -405,21 +467,20 @@ int rpmspecQuery(rpmts ts, QVA_t qva, const char * arg)
        goto exit;
     }
 
-    if (qva->qva_source == RPMQV_SPECRPMS) {
+    if (qva->qva_source == RPMQV_SPECRPMS ||
+           qva->qva_source == RPMQV_SPECBUILTRPMS) {
+
        res = 0;
        for (Package pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
-#if 0
-           /*
-            * XXX FIXME: whether to show all or just the packages that
-            * would be built needs to be made caller specifiable, for now
-            * revert to "traditional" behavior as existing tools rely on this.
-            */
-           if (pkg->fileList == NULL) continue;
-#endif
+
+           if (qva->qva_source == RPMQV_SPECBUILTRPMS && pkg->fileList == NULL)
+               continue;
+
            res += qva->qva_showPackage(qva, ts, pkg->header);
        }
     } else {
-       res = qva->qva_showPackage(qva, ts, spec->sourceHeader);
+       Package sourcePkg = spec->sourcePackage;
+       res = qva->qva_showPackage(qva, ts, sourcePkg->header);
     }
 
 exit:
index 5edecc51e9794cbc963b08081156068017150db9..772a105ec2a7ee9c5616a10c08c2b3f2398423f8 100644 (file)
@@ -18,7 +18,7 @@ static pid_t pipeChild = 0;
 RPM_GNUC_NORETURN
 void argerror(const char * desc)
 {
-    fprintf(stderr, _("%s: %s\n"), __progname, desc);
+    fprintf(stderr, _("%s: %s\n"), xgetprogname(), desc);
     exit(EXIT_FAILURE);
 }
 
@@ -55,7 +55,6 @@ int initPipe(void)
     }
 
     if (!(pipeChild = fork())) {
-       (void) signal(SIGPIPE, SIG_DFL);
        (void) close(p[1]);
        (void) dup2(p[0], STDIN_FILENO);
        (void) close(p[0]);
index 35aa25285d53143217fd6a528ff627a06a5571de..b5deee1bacb255e7856ba27f3bdf3cb1b87eb466 100644 (file)
@@ -1,6 +1,11 @@
 #ifndef _CLIUTIL_H
 #define _CLIUTIL_H
 
+/** \file cliutils.h
+ *
+ *  Misc helpers for RPM CLI tools
+ */
+
 #include <stdio.h>
 #include <popt.h>
 #include <rpm/rpmutil.h>
diff --git a/compile b/compile
new file mode 100755 (executable)
index 0000000..a85b723
--- /dev/null
+++ b/compile
@@ -0,0 +1,347 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-10-14.11; # UTC
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# 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, 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, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""       $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv/,$2, in
+       *,$file_conv,*)
+         ;;
+       mingw/*)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin/*)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine/*)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+       -o)
+         # configure might choose to run compile as 'compile cc -o foo foo.c'.
+         eat=1
+         case $2 in
+           *.o | *.[oO][bB][jJ])
+             func_file_conv "$2"
+             set x "$@" -Fo"$file"
+             shift
+             ;;
+           *)
+             func_file_conv "$2"
+             set x "$@" -Fe"$file"
+             shift
+             ;;
+         esac
+         ;;
+       -I)
+         eat=1
+         func_file_conv "$2" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -I*)
+         func_file_conv "${1#-I}" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -l)
+         eat=1
+         func_cl_dashl "$2"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -l*)
+         func_cl_dashl "${1#-l}"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -L)
+         eat=1
+         func_cl_dashL "$2"
+         ;;
+       -L*)
+         func_cl_dashL "${1#-L}"
+         ;;
+       -static)
+         shared=false
+         ;;
+       -Wl,*)
+         arg=${1#-Wl,}
+         save_ifs="$IFS"; IFS=','
+         for flag in $arg; do
+           IFS="$save_ifs"
+           linker_opts="$linker_opts $flag"
+         done
+         IFS="$save_ifs"
+         ;;
+       -Xlinker)
+         eat=1
+         linker_opts="$linker_opts $2"
+         ;;
+       -*)
+         set x "$@" "$1"
+         shift
+         ;;
+       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+         func_file_conv "$1"
+         set x "$@" -Tp"$file"
+         shift
+         ;;
+       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+         func_file_conv "$1" mingw
+         set x "$@" "$file"
+         shift
+         ;;
+       *)
+         set x "$@" "$1"
+         shift
+         ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+       # configure might choose to run compile as 'compile cc -o foo foo.c'.
+       # So we strip '-o arg' only if arg is an object.
+       eat=1
+       case $2 in
+         *.o | *.obj)
+           ofile=$2
+           ;;
+         *)
+           set x "$@" -o "$2"
+           shift
+           ;;
+       esac
+       ;;
+      *.c)
+       cfile=$1
+       set x "$@" "$1"
+       shift
+       ;;
+      *)
+       set x "$@" "$1"
+       shift
+       ;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
index acdc5204c3c86e418493a866db4049763b6106ef..0c29311eb0af51ea52fc364d864dcb641fd7e3c2 100644 (file)
@@ -1,11 +1,11 @@
 AC_PREREQ(2.61)
-AC_INIT(rpm, 4.11.0.1, rpm-maint@lists.rpm.org)
+AC_INIT(rpm, 4.14.1, rpm-maint@lists.rpm.org)
 
 AC_CONFIG_SRCDIR([rpmqv.c])
 AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_MACRO_DIR([m4])
 
-AM_INIT_AUTOMAKE([1.10 foreign tar-ustar dist-bzip2 subdir-objects nostdinc])
+AM_INIT_AUTOMAKE([1.10 foreign tar-pax dist-bzip2 subdir-objects nostdinc])
 dnl Allow silent build on automake versions that support it
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES])
 
@@ -37,21 +37,24 @@ fi
 AS=${AS-as}
 AC_SUBST(AS)
 if test "$GCC" = yes; then
-    cflags_to_try="-fno-strict-aliasing -fstack-protector -Wempty-body"
+    cflags_to_try="-fno-strict-aliasing -fstack-protector-strong -Wempty-body"
     AC_MSG_CHECKING([supported compiler flags])
     old_cflags=$CFLAGS
     echo
     for flag in $cflags_to_try; do
         CFLAGS="$CFLAGS $flag -Werror"
-        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[return 0;]])],[
+        AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[#include <alloca.h>
+                                               alloca(100);]])],[
                 echo "   $flag"
                 RPMCFLAGS="$RPMCFLAGS $flag"
         ],[])
         CFLAGS=$old_cflags
     done
-    CFLAGS="$CFLAGS -fPIC -DPIC -D_REENTRANT -Wall -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes $RPMCFLAGS"
+    RPMCFLAGS="-fPIC -DPIC -D_REENTRANT -Wall -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes $RPMCFLAGS"
+    CFLAGS="$RPMCFLAGS"
 fi
 export CFLAGS
+AC_SUBST(RPMCFLAGS)
 
 AC_SYS_LARGEFILE
 
@@ -90,7 +93,7 @@ fi
 dnl
 dnl Find some common programs
 dnl
-AC_PATH_PROG(__7ZIP, 7zip, /usr/bin/7za, $MYPATH)
+AC_PATH_PROGS(__7ZIP, [7zip 7za 7z], /usr/bin/7za, $MYPATH)
 AC_PATH_PROG(__BZIP2, bzip2, /usr/bin/bzip2, $MYPATH)
 AC_PATH_PROG(__CAT, cat, /bin/cat, $MYPATH)
 AC_PATH_PROG(__CHGRP, chgrp, /bin/chgrp, $MYPATH)
@@ -100,7 +103,7 @@ AC_PATH_PROG(__CP, cp, /bin/cp, $MYPATH)
 AC_PATH_PROG(__CPIO, cpio, /bin/cpio, $MYPATH)
 AC_PATH_PROG(__CURL, curl, /usr/bin/curl, $MYPATH)
 AC_PATH_PROG(__FILE, file, /usr/bin/file, $MYPATH)
-AC_PATH_PROG(__GPG, gpg, /usr/bin/gpg, $MYPATH)
+AC_PATH_PROGS(__GPG, gpg2 gpg, /usr/bin/gpg2, $MYPATH)
 AC_PATH_PROG(__GREP, grep, /bin/grep, $MYPATH)
 AC_PATH_PROG(__GZIP, gzip, /bin/gzip, $MYPATH)
 AC_PATH_PROG(__UNZIP, unzip, /usr/bin/unzip, $MYPATH)
@@ -109,6 +112,7 @@ AC_PATH_PROG(__INSTALL, install, /usr/bin/install, $MYPATH)
 AC_PATH_PROG(__LRZIP, lrzip, /usr/bin/lrzip, $MYPATH)
 AC_PATH_PROG(__LZIP, lzip, /usr/bin/lzip, $MYPATH)
 AC_PATH_PROG(__XZ, xz, /usr/bin/xz, $MYPATH)
+AC_PATH_PROG(__GEM, gem, /usr/bin/gem, $MYPATH)
 AC_PATH_PROG(__MAKE, make, /usr/bin/make, $MYPATH)
 AC_PATH_PROG(__MKDIR, mkdir, /bin/mkdir, $MYPATH)
 AC_PATH_PROG(__MV, mv, /bin/mv, $MYPATH)
@@ -127,13 +131,14 @@ AC_MSG_CHECKING(old version of patch)
 
 AC_PATH_PROG(__PERL, perl, /usr/bin/perl, $MYPATH)
 AC_PATH_PROG(__PGP, pgp, /usr/bin/pgp, $MYPATH)
-AC_PATH_PROG(__PYTHON, python, /usr/bin/python3, $MYPATH) 
+AC_PATH_PROG(__PYTHON, python, /usr/bin/python, $MYPATH) 
 AC_PATH_PROG(__RM, rm, /bin/rm, $MYPATH)
 AC_PATH_PROG(__RSH, rsh, /usr/bin/rsh, $MYPATH)
 AC_PATH_PROG(__SED, sed, /bin/sed, $MYPATH)
 AC_PATH_PROG(__SEMODULE, semodule, /usr/bin/semodule, $MYPATH)
 AC_PATH_PROG(__SSH, ssh, /usr/bin/ssh, $MYPATH)
 AC_PATH_PROG(__TAR, tar, /bin/tar, $MYPATH)
+AC_PATH_PROG(__ZSTD, zstd, /usr/bin/zstd, $MYPATH)
 
 AC_PATH_PROG(__LD, ld, /usr/bin/ld, $MYPATH)
 AC_PATH_PROG(__NM, nm, /usr/bin/nm, $MYPATH)
@@ -200,6 +205,31 @@ AC_CHECK_HEADERS([lzma.h],[
 ])
 AC_SUBST(WITH_LZMA_LIB)
 
+#=================
+# Check for zstd.
+
+AC_ARG_ENABLE([zstd],
+              [AS_HELP_STRING([--enable-zstd=@<:@yes/no/auto@:>@],
+                              [build without zstd support (default=auto)])],
+              [enable_zstd="$enableval"],
+              [enable_zstd=auto])
+
+AS_IF([test "x$enable_zstd" != "xno"], [
+  PKG_CHECK_MODULES([ZSTD], [libzstd], [have_zstd=yes], [have_zstd=no])
+  AS_IF([test "$enable_zstd" = "yes"], [
+    if test "$have_zstd" = "no"; then
+      AC_MSG_ERROR([--enable-zstd specified, but not available])
+    fi
+  ])
+])
+
+if test "x$have_zstd" = "xyes"; then
+  AC_DEFINE([HAVE_ZSTD], [1], [Define if libzstd is available])
+  ZSTD_REQUIRES=libzstd
+  AC_SUBST(ZSTD_REQUIRES)
+fi
+AM_CONDITIONAL([HAVE_ZSTD], [test "x$have_zstd" = "xyes"])
+
 #=================
 
 dnl
@@ -243,18 +273,30 @@ AC_CHECK_HEADERS([dwarf.h], [
 AM_CONDITIONAL(LIBDWARF,[test "$WITH_LIBDWARF" = yes])
 
 #=================
+# Select crypto library
+AC_ARG_WITH(crypto,
+            [AC_HELP_STRING([--with-crypto=CRYPTO_LIB],
+                            [The cryptographic library to use (nss|beecrypt|openssl). The default is nss.])
+                            ],[],
+                            [with_crypto=nss])
+
+# Refuse to proceed if someone specified --with-beecrypt (removed)
+AC_ARG_WITH(beecrypt,
+    [AC_HELP_STRING([--with-beecrypt (OBSOLETE)], [Obsolete argument. Use --with-crypto=beecrypt])
+    ],[AC_MSG_ERROR([--with-beecrypt no longer supported. Use --with-crypto=beecrypt])],
+    [])
+
 # Check for beecrypt library if requested.
-AC_ARG_WITH(beecrypt, [  --with-beecrypt         build with beecrypt support ],,[with_beecrypt=no])
 AC_ARG_WITH(internal_beecrypt, [  --with-internal-beecrypt build with internal beecrypt library ],,[with_internal_beecrypt=no])
 AM_CONDITIONAL([WITH_INTERNAL_BEECRYPT],[test "$with_internal_beecrypt" = yes])
 if test "$with_internal_beecrypt" = yes ; then
-  with_beecrypt=yes
+  with_crypto=beecrypt
 fi
-AM_CONDITIONAL([WITH_BEECRYPT],[test "$with_beecrypt" = yes])
+AM_CONDITIONAL([WITH_BEECRYPT],[test "$with_crypto" = beecrypt])
 
 WITH_BEECRYPT_INCLUDE=
 WITH_BEECRYPT_LIB=
-if test "$with_beecrypt" = yes ; then
+if test "$with_crypto" = beecrypt ; then
   AC_DEFINE(WITH_BEECRYPT, 1, [Build with beecrypt instead of nss3 support?])
   if test "$with_internal_beecrypt" = yes ; then
     WITH_BEECRYPT_INCLUDE="-I\$(top_srcdir)/beecrypt"
@@ -263,7 +305,7 @@ if test "$with_beecrypt" = yes ; then
     AC_CHECK_LIB(beecrypt, mpfprintln, [
       WITH_BEECRYPT_LIB="-lbeecrypt"
     ],[
-      AC_MSG_ERROR([missing required library 'beecrypt']) 
+      AC_MSG_ERROR([missing required library 'beecrypt'])
     ])
     AC_CHECK_HEADER([beecrypt/api.h], [AC_DEFINE(HAVE_BEECRYPT_API_H, 1, [Define to 1 if you have the <beecrypt/api.h> header file.])
     ])
@@ -272,14 +314,101 @@ fi
 AC_SUBST(WITH_BEECRYPT_LIB)
 AC_SUBST(WITH_BEECRYPT_INCLUDE)
 
+#=================
+# Check for OpenSSL library.
+# We need evp.h from OpenSSL.
+
+WITH_OPENSSL_INCLUDE=
+WITH_OPENSSL_LIB=
+if test "$with_crypto" = openssl; then
+# If we have pkgconfig make sure CPPFLAGS are setup correctly for the OpenSSL
+# -I include path.
+AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no], [$PATH:/usr/bin:/usr/local/bin])
+if test "x$PKGCONFIG" != "xno"; then
+  CPPFLAGS="$CPPFLAGS $($PKGCONFIG --cflags libcrypto)"
+  WITH_OPENSSL_LIB=$($PKGCONFIG --libs libcrypto)
+else
+  WITH_OPENSSL_LIB=-lcrypto
+fi
+
+AC_CHECK_HEADERS([openssl/evp.h], [], [
+  AC_MSG_ERROR([missing required OpenSSL header])
+])
+AC_CHECK_HEADERS([openssl/rsa.h], [], [
+  AC_MSG_ERROR([missing required OpenSSL header])
+])
+AC_CHECK_HEADERS([openssl/dsa.h], [], [
+  AC_MSG_ERROR([missing required OpenSSL header])
+])
+
+AC_CHECK_LIB(crypto, EVP_DigestInit_ex, [], [
+  AC_MSG_ERROR([required OpenSSL library 'libcrypto' missing or too old])
+])
+
+AC_CHECK_LIB(crypto, EVP_MD_CTX_new, [
+    AC_DEFINE(HAVE_EVP_MD_CTX_NEW, 1, [Define to 1 if OpenSSL has EVP_MD_CTX_new])
+    AC_SUBST(HAVE_EVP_MD_CTX_NEW, [1])
+  ], [
+  AC_CHECK_LIB(crypto, EVP_MD_CTX_create, [], [
+      AC_MSG_ERROR([required OpenSSL library 'libcrypto' missing or too old])
+  ])
+])
+
+AC_CHECK_LIB(crypto, EVP_PKEY_CTX_new, [], [
+  AC_MSG_ERROR([required OpenSSL library 'libcrypto' missing or too old])
+])
+
+AC_CHECK_LIB(crypto, DSA_set0_key, [
+    AC_DEFINE(HAVE_DSA_SET0_KEY, 1, [Define to 1 if OpenSSL has DSA_set0_key])
+    AC_SUBST(HAVE_DSA_SET0_KEY, [1])
+    ], []
+)
+
+AC_CHECK_LIB(crypto, DSA_set0_pqg, [
+    AC_DEFINE(HAVE_DSA_SET0_PQG, 1, [Define to 1 if OpenSSL has DSA_set0_pqg])
+    AC_SUBST(HAVE_DSA_SET0_PQG, [1])
+    ], []
+)
+
+AC_CHECK_LIB(crypto, DSA_SIG_set0, [
+    AC_DEFINE(HAVE_DSA_SIG_SET0, 1, [Define to 1 if OpenSSL has DSA_SIG_set0])
+    AC_SUBST(HAVE_DSA_SIG_SET0, [1])
+    ], []
+)
+
+AC_CHECK_LIB(crypto, RSA_set0_key, [
+    AC_DEFINE(HAVE_RSA_SET0_KEY, 1, [Define to 1 if OpenSSL has RSA_set0_key])
+    AC_SUBST(HAVE_RSA_SET0_KEY, [1])
+    ], []
+)
+
+AC_CHECK_LIB(crypto, BN_bn2binpad, [
+    AC_DEFINE(HAVE_BN2BINPAD, 1, [Define to 1 if OpenSSL has BN_bn2binpad])
+    AC_SUBST(HAVE_BN2BINPAD, [1])
+    ], []
+)
+
+fi
+
+AM_CONDITIONAL([WITH_OPENSSL],[test "$with_crypto" = openssl])
+AC_SUBST(WITH_OPENSSL_INCLUDE)
+AC_SUBST(WITH_OPENSSL_LIB)
+
 #=================
 # Check for NSS library.
-# We need nss.h from NSS which needs nspr.h. Unfortunately both glibc and NSS 
-# have a header named nss.h... so make extra check for NSS's sechash.h 
+# We need nss.h from NSS which needs nspr.h. Unfortunately both glibc and NSS
+# have a header named nss.h... so make extra check for NSS's sechash.h
 # which we use too and hopefully is slightly more unique to NSS.
 WITH_NSS_INCLUDE=
 WITH_NSS_LIB=
-if test "$with_beecrypt" != yes ; then
+if test "$with_crypto" = nss; then
+# If we have pkgconfig make sure CPPFLAGS are setup correctly for the nss
+# -I include path. Otherwise the below checks will fail because nspr.h
+# cannot be found.
+AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no], [$PATH:/usr/bin:/usr/local/bin])
+if test "x$PKGCONFIG" != "xno"; then
+  CPPFLAGS="$CPPFLAGS $($PKGCONFIG --cflags nss)"
+fi
 AC_CHECK_HEADERS([nspr.h nss.h sechash.h], [], [
   AC_MSG_ERROR([missing required NSPR / NSS header])
 ])
@@ -334,6 +463,53 @@ AC_CHECK_HEADER([popt.h], [
 AC_SUBST(WITH_POPT_INCLUDE)
 AC_SUBST(WITH_POPT_LIB)
 
+#=================
+# Check for libarchive library.
+AC_ARG_WITH([archive], [AS_HELP_STRING([--with-archive], [build rpm2archive - requires libarchive])],
+            [],
+            [with_archive=yes])
+
+WITH_ARCHIVE_INCLUDE=
+WITH_ARCHIVE_LIB=
+AS_IF([test "$with_archive" != no],[
+  AC_CHECK_HEADER([archive.h], [
+    AC_CHECK_LIB(archive, archive_write_open_filename, [
+      WITH_ARCHIVE_INCLUDE=
+      WITH_ARCHIVE_LIB="-larchive"
+    ],[
+      AC_MSG_ERROR([missing required library 'libarchive'])
+    ])
+],[
+      AC_MSG_ERROR([missing required header archive.h])
+  ])
+])
+
+AC_SUBST(WITH_ARCHIVE_INCLUDE)
+AC_SUBST(WITH_ARCHIVE_LIB)
+AM_CONDITIONAL(WITH_ARCHIVE,[test "$with_archive" = yes])
+
+#=================
+# Check for elfutils libdw library with dwelf_elf_gnu_build_id.
+WITH_LIBDW_LIB=
+HAVE_LIBDW_STRTAB=
+AS_IF([test "$WITH_LIBELF" = yes],[
+  AC_CHECK_HEADERS([elfutils/libdwelf.h],[
+    # dwelf_elf_gnu_build_id was introduced in elfutils 0.159
+    AC_CHECK_LIB(dw, dwelf_elf_gnu_build_id, [
+      AC_DEFINE(HAVE_LIBDW, 1,
+                [Define to 1 if you have elfutils libdw library])
+      WITH_LIBDW_LIB="-ldw"
+      WITH_LIBDW=yes
+      # If possible we also want the strtab functions from elfutils 0.167.
+      # But we can fall back on the (unsupported) ebl alternatives if not.
+      AC_CHECK_LIB(dw, dwelf_strtab_init, [HAVE_LIBDW_STRTAB=yes])
+    ])
+  ])
+])
+AC_SUBST(WITH_LIBDW_LIB)
+AM_CONDITIONAL(LIBDW,[test "$WITH_LIBDW" = yes])
+AM_CONDITIONAL(HAVE_LIBDW_STRTAB,[test "$HAVE_LIBDW_STRTAB" = yes])
+
 #=================
 # Process --with/without-external-db
 AC_ARG_WITH(external_db, [AS_HELP_STRING([--with-external-db],[build against an external Berkeley db])],
@@ -359,25 +535,96 @@ yes )
   ],[
     AC_MSG_ERROR([missing required header db.h])
   ])
-  AC_DEFINE(WITH_EXTERNAL_DB, 1, [Use external db?])
   ;;
-* ) # Fall back to internal db if available
+no|maybe )
+  # Try internal database first, then fall back to external
+  # unless --without-external-db (no) was explicitly given.
   if [ test -x db/dist/configure ]; then
     AC_DEFINE(HAVE_DB_H, 1, [Define if you have the <db3/db.h> header file])
   else
-    AC_MSG_ERROR([internal Berkeley DB directory not present, see INSTALL])
+    case "$with_external_db" in
+    maybe)
+      AC_CHECK_HEADERS([db.h],[
+        AC_PREPROC_IFELSE([
+          AC_LANG_SOURCE([
+           #include <db.h>
+           #if ((DB_VERSION_MAJOR < 4) || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR < 5))
+           #error Berkeley DB too old
+           #endif
+          ])
+        ],[ WITH_DB_LIB=-ldb ],
+          [ AC_MSG_ERROR([Berkeley DB version >= 4.5 required])
+        ])
+      ],[
+        AC_MSG_ERROR([missing required header db.h])
+      ])
+    ;;
+    no)
+      AC_MSG_ERROR([internal Berkeley DB directory not present, see INSTALL])
+    ;;
+    esac
   fi
   ;;
 esac
 
 AC_SUBST([WITH_DB_LIB])
 
+#=================
+# Process --enable-ndb
+AC_ARG_ENABLE([ndb], [AS_HELP_STRING([--enable-ndb (EXPERIMENTAL)],[enable the new rpm database format])],
+[case "$enable_ndb" in
+yes|no) ;;
+*) AC_MSG_ERROR([invalid argument to --enable-ndb])
+  ;;
+esac],
+[enable_ndb=no])
+AS_IF([test "$enable_ndb" = yes],[
+  AC_CHECK_FUNCS([mremap],
+    [AC_DEFINE(ENABLE_NDB, 1, [Enable new rpm database format?])],
+    [AC_MSG_ERROR([mremap function required by ndb])],
+    [#include <sys/mman.h>])
+])
+AM_CONDITIONAL([NDB], [test "$enable_ndb" = yes])
+
+#=================
+# Check for LMDB support
+AC_ARG_ENABLE([lmdb],
+              [AS_HELP_STRING([--enable-lmdb=@<:@yes/no/auto@:>@ (EXPERIMENTAL)],
+                              [build with LMDB rpm database format support (default=auto)])],
+              [enable_lmdb="$enableval"],
+              [enable_lmdb=auto])
+
+AS_IF([test "x$enable_lmdb" != "xno"], [
+  PKG_CHECK_MODULES([LMDB], [lmdb], [have_lmdb=yes], [have_lmdb=no])
+  AS_IF([test "$enable_lmdb" = "yes"], [
+    if test "$have_lmdb" = "no"; then
+      AC_MSG_ERROR([--enable-lmdb specified, but not available])
+    fi
+  ])
+])
+
+if test "x$have_lmdb" = "xyes"; then
+  AC_DEFINE([WITH_LMDB], [1], [Define if LMDB is available])
+  LMDB_REQUIRES=lmdb
+  AC_SUBST(LMDB_REQUIRES)
+fi
+AM_CONDITIONAL([LMDB], [test "x$have_lmdb" = "xyes"])
+
 AM_GNU_GETTEXT_VERSION([0.16.1])
 AM_GNU_GETTEXT([external])
+AM_ICONV
 
 dnl Checks for header files we can live without.
 AC_HEADER_STDC
+dnl glibc and autoconf don't really play well together.
+dnl glibc will produce a warning when including the wrong header.
+dnl but still define major and minor. Causing us to include the header
+dnl that produces a giant warning for each major/minor use.
+dnl Use -Werror to work around that.
+old_CFLAGS=$CFLAGS
+CFLAGS="$CFLAGS -Werror"
 AC_HEADER_MAJOR
+CFLAGS=$old_CFLAGS
 AC_STRUCT_DIRENT_D_TYPE
 
 AC_CHECK_HEADERS(limits.h)
@@ -387,6 +634,7 @@ AC_CHECK_HEADERS(sys/utsname.h)
 
 AC_CHECK_HEADERS(sys/systemcfg.h)
 AC_CHECK_HEADERS(sys/param.h)
+AC_CHECK_HEADERS(sys/auxv.h)
 
 dnl statfs portability fiddles.
 dnl
@@ -401,25 +649,25 @@ dnl
 found_struct_statfs=no
 
 if test X$found_struct_statfs = Xno ; then
-dnl first try including sys/vfs.h
+dnl Solaris 2.6+ wants to use statvfs
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
-#include <sys/vfs.h> ]], [[struct statfs sfs;]])],[AC_MSG_RESULT(in sys/vfs.h)
-       AC_DEFINE(STATFS_IN_SYS_VFS, 1, [statfs in <sys/vfs.h> (for linux systems)])
+#include <sys/statvfs.h> ]], [[struct statvfs sfs;]])],[AC_MSG_RESULT(in sys/statvfs.h)
+       AC_DEFINE(STATFS_IN_SYS_STATVFS, 1,
+               [statfs in <sys/statvfs.h> (for solaris 2.6+ systems)])
        found_struct_statfs=yes],[])
 fi
 
 if test X$found_struct_statfs = Xno ; then
-dnl Solaris 2.6+ wants to use statvfs
+dnl first try including sys/vfs.h
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
-#include <sys/statvfs.h> ]], [[struct statvfs sfs;]])],[AC_MSG_RESULT(in sys/statvfs.h)
-       AC_DEFINE(STATFS_IN_SYS_STATVFS, 1,
-               [statfs in <sys/statvfs.h> (for solaris 2.6+ systems)])
+#include <sys/vfs.h> ]], [[struct statfs sfs;]])],[AC_MSG_RESULT(in sys/vfs.h)
+       AC_DEFINE(STATFS_IN_SYS_VFS, 1, [statfs in <sys/vfs.h> (for linux systems)])
        found_struct_statfs=yes],[])
 fi
 
@@ -519,13 +767,26 @@ dnl Checks for library functions.
 AC_CHECK_FUNCS(putenv)
 AC_CHECK_FUNCS(mempcpy)
 AC_CHECK_FUNCS(fdatasync)
+AC_CHECK_DECLS(fdatasync, [], [], [#include <unistd.h>])
+AC_CHECK_FUNCS(lutimes)
+AC_CHECK_FUNCS(mergesort)
+AC_CHECK_FUNCS(getauxval)
+AC_CHECK_FUNCS(setprogname, [], [], [#include <stdlib.h>])
+
+AC_MSG_CHECKING([whether __progname is defined])
+AC_LINK_IFELSE([AC_LANG_PROGRAM([extern const char *__progname;],
+          [if (*__progname == 0) return 0;])],
+          AC_DEFINE([HAVE___PROGNAME], [1], [Define if __progname is defined])
+          AC_MSG_RESULT([yes]),
+          AC_MSG_RESULT([no]))
 
 AC_REPLACE_FUNCS(stpcpy stpncpy)
 
 AC_CHECK_FUNCS([secure_getenv __secure_getenv])
 
 AC_CHECK_FUNCS(
-   [mkstemp getcwd basename dirname realpath setenv unsetenv regcomp lchown],
+   [mkstemp getcwd basename dirname realpath setenv unsetenv regcomp lchown \
+    utimes getline],
    [], [AC_MSG_ERROR([function required by rpm])])
 
 AC_LIBOBJ(fnmatch)
@@ -539,33 +800,15 @@ yes|no) ;;
 esac],
 [enable_python=no])
 
+WITH_PYTHON_SUBPACKAGE=0
 AS_IF([test "$enable_python" = yes],[
-  AM_PATH_PYTHON([3.2],[
-    WITH_PYTHON_INCLUDE=`${PYTHON} -c 'from distutils.sysconfig import *; import sys; sys.stdout.write(get_python_inc())'`
-    WITH_PYTHON_SUBPACKAGE=1
-    save_CPPFLAGS="$CPPFLAGS"
-    CPPFLAGS="$CPPFLAGS -I$WITH_PYTHON_INCLUDE"
-    AC_CHECK_HEADER([Python.h],[],
-      [AC_MSG_ERROR([missing Python.h])
-      ])
-    CPPFLAGS="$save_CPPFLAGS"
-    save_LIBS="$LIBS"
-
-    AC_SEARCH_LIBS([Py_Main],[python${PYTHON_VERSION} python3.6m],[
-      WITH_PYTHON_LIB="$ac_res"
-    ],[AC_MSG_ERROR([missing python library, ${PYTHON_VERSION}    vvv${PYTHON_ABI}vvv])
-    ])
-    LIBS="$save_LIBS"
+  AM_PATH_PYTHON([2.6],[
+    PKG_CHECK_MODULES([PYTHON], [python-${PYTHON_VERSION}], [WITH_PYTHON_SUBPACKAGE=1])
+    AC_SUBST(PYTHON_CFLAGS)
+    AC_SUBST(PYTHON_LIB)
   ])
-],[
-    WITH_PYTHON_INCLUDE=
-    WITH_PYTHON_LIB=
-    WITH_PYTHON_SUBPACKAGE=0
 ])
 
-AC_SUBST(WITH_PYTHON_INCLUDE)
-AC_SUBST(WITH_PYTHON_LIB)
-
 AM_CONDITIONAL(ENABLE_PYTHON,[test "$WITH_PYTHON_SUBPACKAGE" = 1])
 
 AC_PATH_PROG(DOXYGEN, doxygen, no)
@@ -603,6 +846,8 @@ AS_IF([test "$with_selinux" = yes],[
       AC_MSG_ERROR([--with-selinux given, but selinux_getpolicytype not found in libselinux])])
     AC_CHECK_LIB([selinux],[selinux_reset_config],[],[
       AC_MSG_ERROR([--with-selinux given, but selinux_reset_config not found in libselinux])])
+    AC_CHECK_LIB([selinux],[setexecfilecon],[
+      AC_DEFINE([HAVE_SETEXECFILECON],[1],[Define to 1 if SELinux setexecfilecon is present])])
     LIBS="$save_LIBS"
   ],[
     AC_MSG_ERROR([--with-selinux given, but selinux/selinux.h not found])
@@ -620,48 +865,11 @@ AS_IF([test "$with_selinux" = yes],[
   ],[
     AC_MSG_ERROR([--with-selinux given, but selinux/label.h not found])
   ])
-
-  dnl FIXME: semanage is only needed for the sepolicy plugin
-  AC_CHECK_HEADER([semanage/semanage.h],[
-    save_LIBS="$LIBS"
-    AC_CHECK_LIB([semanage],[semanage_begin_transaction],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_begin_transaction missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_commit],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_commit missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_connect],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_connect missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_disconnect],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_disconnect missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_handle_create],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_handle_create missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_handle_destroy],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_handle_destroy missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_is_connected],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_is_connected missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_module_install_base_file],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_module_install_base_file missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_module_install_file],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_module_install_file missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_module_remove],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_module_remove missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_select_store],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_select_store missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_set_check_contexts],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_set_check_contexts missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_set_create_store],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_set_create_store missing in libsemanage])])
-    AC_CHECK_LIB([semanage],[semanage_set_reload],[],[
-      AC_MSG_ERROR([--with-selinux given, but semanage_set_reload missing in libsemanage])])
-    LIBS="$save_LIBS"
-  ],[
-    AC_MSG_ERROR([--with-selinux given, but semanage/semanage.h not found])
-  ])
 ])
 
 AS_IF([test "$with_selinux" = yes],[
   AC_DEFINE(WITH_SELINUX, 1, [Build with selinux support?])
   WITH_SELINUX_LIB="-lselinux"
-  WITH_SEMANAGE_LIB="-lsemanage"
 ])
 AC_SUBST(WITH_SELINUX_LIB)
 AC_SUBST(WITH_SEMANAGE_LIB)
@@ -700,13 +908,13 @@ AS_IF([test "$with_msm" = yes],[
   AC_SUBST(LIBXML2_CFLAGS)
   AC_SUBST(LIBXML2_LIBS)
 
-  AC_CHECK_HEADER([attr/xattr.h],[
+  AC_CHECK_HEADER([sys/xattr.h],[
     save_LIBS="$LIBS"
     AC_CHECK_LIB([attr],[setxattr],[],[
       AC_MSG_ERROR([--with-msm given, but setxattr not found in libattr])])
     LIBS="$save_LIBS"
   ],[
-    AC_MSG_ERROR([--with-msm given, but attr/xattr.h not found])
+    AC_MSG_ERROR([--with-msm given, but sys/xattr.h not found])
   ])
   AC_CHECK_HEADER([uthash.h],[
     save_LIBS="$LIBS"
@@ -731,6 +939,27 @@ AC_SUBST(WITH_MSM_LIB)
 AC_SUBST(WITH_MSM_INCLUDE)
 AM_CONDITIONAL(MSM,[test "$with_msm" = yes])
 
+
+# libimaevm
+with_iamevm=no
+AC_ARG_WITH(imaevm, [AS_HELP_STRING([--with-imaevm],[build with imaevm support])])
+if test "$with_imaevm" = yes ; then
+  AC_MSG_CHECKING([libimaevm >= 1.0])
+  AC_COMPILE_IFELSE(
+    [AC_LANG_PROGRAM(
+      [[#include <imaevm.h>]],
+      [[return sign_hash(NULL, NULL, 0, NULL, NULL, NULL);]]
+    )],
+    [AC_MSG_RESULT(yes)
+     AC_DEFINE(WITH_IMAEVM, 1, [Build with imaevm support?])
+     WITH_IMAEVM_LIB="-limaevm"
+    ],
+    [AC_MSG_ERROR([libimaevm not present or too old (< 1.0)])]
+  )
+fi
+AM_CONDITIONAL(WITH_IMAEVM,[test "$with_imaevm" = yes])
+AC_SUBST(WITH_IMAEVM_LIB)
+
 # libcap
 WITH_CAP_LIB=
 AC_ARG_WITH(cap, [AS_HELP_STRING([--with-cap],[build with capability support])],
@@ -794,12 +1023,9 @@ AC_ARG_WITH([lua], [AS_HELP_STRING([--with-lua], [build with lua support])],
             [],
             [with_lua=yes])
 
-if test X"$LUA_PKGCONFIG_NAME" = X ; then
-    LUA_PKGCONFIG_NAME=lua
-fi
 AS_IF([test "$with_lua" != no],[
   PKG_CHECK_MODULES([LUA],
-    [${LUA_PKGCONFIG_NAME} >= 5.1],
+    [lua >= 5.1],
     [AC_DEFINE(WITH_LUA, 1, [Build with lua support?])],
     [AC_MSG_ERROR([lua not present (--without-lua to disable)])])
   AC_SUBST(LUA_CFLAGS)
@@ -813,6 +1039,21 @@ AS_IF([test "$enable_plugins" = yes],[
 ])
 AM_CONDITIONAL(ENABLE_PLUGINS,[test "$enable_plugins" = yes])
 
+with_dbus=no
+AS_IF([test "$enable_plugins" != no],[
+  PKG_CHECK_MODULES([DBUS],
+    [dbus-1 >= 1.3],
+    [AC_DEFINE(DBUS, 1, [Build with dbus support?]) with_dbus=yes],
+    [with_dbus=no])
+  AC_SUBST(DBUS_CFLAGS)
+  AC_SUBST(DBUS_LIBS)
+])
+AM_CONDITIONAL(DBUS, [test "$with_dbus" = yes])
+
+AS_IF([test "$enable_plugins" != no],[
+  AC_CHECK_FUNCS(lsetxattr, [], [], [#include <sys/xattr.h>])
+])
+AM_CONDITIONAL(IMA, [test "x$ac_cv_func_lsetxattr" = xyes])
 
 with_dmalloc=no
 AC_ARG_WITH(dmalloc, [AS_HELP_STRING([--with-dmalloc],[build with dmalloc debugging support])])
@@ -821,7 +1062,10 @@ if test "$with_dmalloc" = yes ; then
   LIBS="$LIBS -ldmalloc"
 fi
 
-AC_CHECK_FUNCS(getpassphrase)
+user_with_uid0=$(awk -F: '$3==0 {print $1;exit}' /etc/passwd)
+group_with_gid0=$(awk -F: '$3==0 {print $1;exit}' /etc/group)
+AC_DEFINE_UNQUOTED([UID_0_USER],["$user_with_uid0"],[Get the user name having userid 0])
+AC_DEFINE_UNQUOTED([GID_0_GROUP],["$group_with_gid0"],[Get the group name having groupid 0])
 
 #
 # get rid of the 4-th tuple, if config.guess returned "linux-gnu" for host_os
@@ -830,6 +1074,10 @@ host_os_gnu=-gnu
 if echo "$host_os" | grep '.*-gnulibc1' > /dev/null ; then
        host_os=`echo "${host_os}" | sed 's/-gnulibc1$//'`
 fi
+if echo "$host_os" | grep '.*-gnueabihf' > /dev/null ; then
+       host_os=`echo "${host_os}" | sed 's/-gnueabihf$//'`
+       host_os_gnu=-gnueabihf
+fi
 if echo "$host_os" | grep '.*-gnueabi' > /dev/null ; then
        host_os=`echo "${host_os}" | sed 's/-gnueabi$//'`
        host_os_gnu=-gnueabi
@@ -837,6 +1085,9 @@ fi
 if echo "$host_os" | grep '.*-gnu' > /dev/null ; then
        host_os=`echo "${host_os}" | sed 's/-gnu$//'`
 fi
+if echo "$host_os" | grep '.*-uclibc' > /dev/null ; then
+  host_os=`echo "${host_os}" | sed 's/-uclibc$//'`
+fi
 
 changequote(<, >)
 host_os_exact="${host_os}"
@@ -882,13 +1133,26 @@ AC_SUBST(RPMCANONVENDOR)
 AC_SUBST(RPMCANONOS)
 AC_SUBST(RPMCANONGNU)
 
+RUNDIR="/run"
+AC_ARG_WITH([rundir], 
+  AS_HELP_STRING([--with-rundir=RUNDIR], [specify run-time variable directory]),
+  [RUNDIR=$withval])
+AC_DEFINE_UNQUOTED([RUNDIR],["${RUNDIR}"],[run-time variable directory])
+AC_SUBST(RUNDIR)
+
 if test X"$prefix" = XNONE ; then
     usrprefix="$ac_default_prefix"
 else
     usrprefix=$prefix
 fi
 
-RPMCONFIGDIR="`echo ${libdir}/rpm`"
+RPMCONFIGDIR=
+AC_ARG_WITH([rpmconfigdir],
+            [AS_HELP_STRING([--with-rpmconfigdir],
+              [Set up rpm config not into /usr/lib/rpm @<:@default=check@:>@])],
+            [RPMCONFIGDIR=$withval],
+            [RPMCONFIGDIR="`echo ${usrprefix}/lib/rpm`"])
+
 AC_SUBST(RPMCONFIGDIR)
 
 AC_SUBST(OBJDUMP)
@@ -901,14 +1165,6 @@ AM_CONDITIONAL([WITH_INTERNAL_DB],[test "$with_external_db" = no])
 AM_CONDITIONAL([DOXYGEN],[test "$DOXYGEN" != no])
 AM_CONDITIONAL([HACKINGDOCS],[test "$with_hackingdocs" = yes])
 
-AC_ARG_VAR([PYTHON_MODULENAME], [Name of the rpm python module. Defaults to 'rpm'])
-if test X"$PYTHON_MODULENAME" = X ; then
-    PYTHON_MODULENAME="$PACKAGE"
-fi
-AC_DEFINE_UNQUOTED(PYTHON_MODULENAME, ["$PYTHON_MODULENAME"],[python module name])
-AC_SUBST(PYTHON_MODULENAME)
-
-
 AC_PATH_PROG(AUTOM4TE,autom4te,:)
 
 AC_SUBST([dirstamp],[\${am__leading_dot}dirstamp])
@@ -919,8 +1175,6 @@ AC_CONFIG_FILES([Makefile
        misc/Makefile 
        doc/Makefile
        python/Makefile
-       python/rpm/__init__.py
-       python/rpm/transaction.py
        luaext/Makefile
        tests/Makefile
        plugins/Makefile
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644 (file)
index 9194bd2..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-librpm-tizen (4.11.0.1.tizen20140530-tizen20231101) unstable; urgency=low
-
-  * Fix build error with Ubuntu22.04
-
- -- Biao Wang  <biao716.wang@samsung.com>  Wed, 01 Nov 2023 13:40:30 +0300
-
-librpm-tizen (4.11.0.1.tizen20140530-tizen20140723) unstable; urgency=low
-
-  * Rebase on latest Tizen 3.0
-
- -- Markus Lehtonen <markus.lehtonen@linux.intel.com>  Wed, 23 Jul 2014 19:50:46 +0300
-
-librpm-tizen (4.11.0.1.tizen20130618-tizen20140306) unstable; urgency=low
-
-  [ Markus Lehtonen ]
-  * Fix build against Lua 5.2
-
- -- Markus Lehtonen <markus.lehtonen@linux.intel.com>  Thu, 06 Mar 2014 12:43:43 +0200
-
-librpm-tizen (4.11.0.1.tizen20130618-tizen20131001) unstable; urgency=low
-
-  * Ignore bad expressions in %if conditionals
-  * lua: Enable Lua
-  * lua: fall through failed lua scripts
-
- -- Markus Lehtonen <markus.lehtonen@linux.intel.com>  Tue, 01 Oct 2013 12:12:43 +0300
-
-librpm-tizen (4.11.0.1.tizen20130618-tizen20130821) unstable; urgency=low
-
-  [ Zhang Qiang ]
-  * fix segmentation fault error while parsing spec
-
-  [ Markus Lehtonen ]
-  * Prevent execution of arbitrary scripts
-  * Bump the log level of "unexpanded script" msg
-
- -- Markus Lehtonen <markus.lehtonen@linux.intel.com>  Wed, 21 Aug 2013 14:31:24 +0300
-
-librpm-tizen (4.11.0.1.tizen20130618-tizen20130619) unstable; urgency=low
-
-  * Version bump to latest from Tizen 3.0
-
- -- Markus Lehtonen <markus.lehtonen@linux.intel.com>  Tue, 18 Jun 2013 14:07:13 +0300
-
-librpm-tizen (4.11.0.1.tizen20130304-tizen20130307) unstable; urgency=low
-
-  * Version bump to latest from Tizen
-
- -- Markus Lehtonen <markus.lehtonen@linux.intel.com>  Thu, 07 Mar 2013 09:27:00 +0200
-
-librpm-tizen (4.10.91.tizen20121215-tizen20130226) unstable; urgency=low
-
-  * Enable lua
-  * Add a provide tag to make gbs depend on new changes
-  * Install Tizen macros
-  * Ignore unknown internal scripts
-
- -- Markus Lehtonen <markus.lehtonen@linux.intel.com>  Wed, 27 Feb 2013 10:12:00 +0200
-
-librpm-tizen (4.10.91.tizen20121215-tizen20130226) unstable; urgency=low
-
-  * Initial packaging
-
- -- Markus Lehtonen <markus.lehtonen@linux.intel.com>  Tue, 17 Dec 2012 13:22:00 +0200
-
diff --git a/debian/compat b/debian/compat
deleted file mode 100644 (file)
index 7f8f011..0000000
+++ /dev/null
@@ -1 +0,0 @@
-7
diff --git a/debian/control b/debian/control
deleted file mode 100644 (file)
index 5aac236..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-Source: librpm-tizen
-Section: vcs
-Priority: optional
-Build-Depends: debhelper,
-               dh-python,
-               dpkg-dev,
-               dh-autoreconf,
-               libtool,
-               autoconf,
-               automake,
-               autotools-dev,
-               autopoint,
-               zlib1g-dev,
-               libpopt-dev,
-               libxml2-dev,
-               libreadline-dev,
-               libsqlite3-dev,
-               python3-all-dev,
-               python3,
-               pkg-config,
-               libnspr4-dev,
-               libnss3-dev,
-               liblzma-dev,
-               libmagic-dev,
-               libelf-dev,
-               libdw-dev,
-               libdb-dev,
-               liblua5.1-dev
-Maintainer: Markus Lehtonen <markus.lehtonen@linux.intel.com>
-Standards-Version: 3.9.3
-Homepage: http://rpm.org/
-X-Python-Version: >= 3
-
-Package: librpm-tizen
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, ${python3:Depends}
-Description:  The RPM libraries for git-buildpackage
- RPM Package Manager is the main tool for managing the software packages
- of Tizen.
- .
- RPM can be used to install and remove software packages. With rpm, it
- is easy to update packages.  RPM keeps track of all these manipulations
- in a central database.»·This way it is possible to get an overview of
- all installed packages.  RPM also supports database queries.
- .
- This is a special stripped-down version of RPM, only intended to be used by the
- git-buildpackage tool. Doesn't interfere with the RPM libraries of the host system.
- This package only contains rpmlib and rpm-python.
-
diff --git a/debian/librpm-tizen.install b/debian/librpm-tizen.install
deleted file mode 100644 (file)
index 84594ba..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-usr/lib*/*/*.so.*
-usr/lib*/*/rpm/*
-usr/lib/python*/*packages/*/*.so
-usr/lib/python*/*packages/*/*.py*
diff --git a/debian/rules b/debian/rules
deleted file mode 100755 (executable)
index c396cb4..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/make -f
-
-python_mod_name := rpm_tizen
-
-CPPFLAGS += $(shell pkg-config --cflags nss)
-
-%:
-       dh $@ --with python3,autoreconf,autotools_dev
-override_dh_auto_configure:
-       dh_auto_configure -- --disable-dependency-tracking \
-                       --libdir=/usr/lib/librpm-tizen \
-                       --with-lua \
-                       --without-acl \
-                       --without-cap \
-                       --enable-shared \
-                       --enable-python \
-                       --with-external-db \
-                       --build=${DEB_BUILD_GNU_CPU}-tizen-linux \
-                       PYTHON_MODULENAME=$(python_mod_name) \
-                       LUA_PKGCONFIG_NAME=lua5.1 \
-                       CPPFLAGS="$(CPPFLAGS)"
-
-override_dh_auto_install:
-       dh_auto_install --destdir=debian/tmp
-       # Install extra sources
-       install -m644 packaging/rpm-tizen_macros debian/tmp/usr/lib/librpm-tizen/rpm/tizen_macros
-       install -d debian/tmp/usr/lib/librpm-tizen/rpm/tizen
-       ln -s ../tizen_macros debian/tmp/usr/lib/librpm-tizen/rpm/tizen/macros
-
index 3921f24720b1bd1533f80ed0bb3043d1558b5778..d2f520d64afe3d49a7f58ee9e7e4fddac2976c7a 100644 (file)
@@ -7,8 +7,9 @@ man_man1_DATA = gendiff.1
 EXTRA_DIST += $(man_man1_DATA)
 
 man_man8dir = $(mandir)/man8
-man_man8_DATA = rpm.8 rpmbuild.8 rpmdeps.8 rpmgraph.8 rpm2cpio.8
-man_man8_DATA += rpmdb.8 rpmkeys.8 rpmsign.8 rpmspec.8 rpmqpack.8
+man_man8_DATA = rpm.8 rpm-misc.8 rpmbuild.8 rpmdeps.8 rpmgraph.8 rpm2cpio.8
+man_man8_DATA += rpmdb.8 rpmkeys.8 rpmsign.8 rpmspec.8
+man_man8_DATA += rpm-plugin-systemd-inhibit.8
 EXTRA_DIST += $(man_man8_DATA)
 
 man_fr_man8dir = $(mandir)/fr/man8
index 257aae6a4e2c57646d13f1ff1dd675bcd007a85c..728415a43491c7391aeda278557124b1b46a1263 100644 (file)
-# Doxyfile 1.5.2
+# Doxyfile 1.8.8
 
 # This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
+# doxygen (www.doxygen.org) for a project.
 #
-# All text after a hash (#) is considered a comment and will be ignored
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
 # The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# This tag specifies the encoding used for all characters in the config file that 
-# follow. The default is UTF-8 which is also the encoding used for all text before 
-# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into 
-# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of 
-# possible encodings.
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
 
 DOXYFILE_ENCODING      = UTF-8
 
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
 
 PROJECT_NAME           = @PACKAGE@
 
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
 
 PROJECT_NUMBER         = @VERSION@
 
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
 
 OUTPUT_DIRECTORY       = doc/hacking
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
 
 CREATE_SUBDIRS         = NO
 
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
-# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, 
-# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, 
-# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, 
-# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
 
 OUTPUT_LANGUAGE        = English
 
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
 # brief descriptions will be completely suppressed.
+# The default value is: YES.
 
 REPEAT_BRIEF           = YES
 
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
 
-ABBREVIATE_BRIEF       = 
+ABBREVIATE_BRIEF       =
 
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
 # description.
+# The default value is: NO.
 
 ALWAYS_DETAILED_SEC    = NO
 
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
 # operators of the base classes will not be shown.
+# The default value is: NO.
 
 INLINE_INHERITED_MEMB  = NO
 
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
 
 FULL_PATH_NAMES        = YES
 
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
 
 STRIP_FROM_PATH        = @top_srcdir@/
 
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
 
-STRIP_FROM_INC_PATH    = 
+STRIP_FROM_INC_PATH    =
 
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
 
 SHORT_NAMES            = NO
 
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
 
 JAVADOC_AUTOBRIEF      = YES
 
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
 
 MULTILINE_CPP_IS_BRIEF = NO
 
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
 
 INHERIT_DOCS           = YES
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
 
 SEPARATE_MEMBER_PAGES  = NO
 
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
 
 TAB_SIZE               = 8
 
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
 
-ALIASES                = 
+TCL_SUBST              =
 
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_FOR_C  = YES
 
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_JAVA   = NO
 
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
-# include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also make the inheritance and collaboration 
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
 # diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
 
 BUILTIN_STL_SUPPORT    = NO
 
 # If you use Microsoft's C++/CLI language, you should set this option to YES to
 # enable parsing support.
+# The default value is: NO.
 
 CPP_CLI_SUPPORT        = NO
 
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
+# The default value is: NO.
 
 DISTRIBUTE_GROUP_DOC   = NO
 
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
 
 SUBGROUPING            = YES
 
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
 
 EXTRACT_ALL            = YES
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
 
 EXTRACT_PRIVATE        = NO
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
 
 EXTRACT_STATIC         = YES
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
 
 EXTRACT_LOCAL_CLASSES  = YES
 
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
 
 EXTRACT_LOCAL_METHODS  = NO
 
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_MEMBERS     = NO
 
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = NO
 
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
 
 HIDE_IN_BODY_DOCS      = NO
 
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
 
 INTERNAL_DOCS          = YES
 
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
 # and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
 
 CASE_SENSE_NAMES       = YES
 
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
 
 SHOW_INCLUDE_FILES     = YES
 
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
 
 INLINE_INFO            = YES
 
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
 
 SORT_BRIEF_DOCS        = NO
 
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
 # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
 
 SORT_BY_SCOPE_NAME     = NO
 
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
 
 GENERATE_TESTLIST      = YES
 
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
 
 GENERATE_BUGLIST       = YES
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
 
 GENERATE_DEPRECATEDLIST= YES
 
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
 
-ENABLED_SECTIONS       = 
+ENABLED_SECTIONS       =
 
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
 
 MAX_INITIALIZER_LINES  = 30
 
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
 
 SHOW_USED_FILES        = YES
 
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is NO.
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
 
-SHOW_DIRECTORIES       = NO
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
 
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from the 
-# version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
+SHOW_NAMESPACES        = YES
 
-FILE_VERSION_FILTER    = 
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
 
 #---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
 
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
 
 QUIET                  = NO
 
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
 
 WARNINGS               = YES
 
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
 
 WARN_IF_UNDOCUMENTED   = YES
 
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
 
 WARN_IF_DOC_ERROR      = YES
 
-# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
 
 WARN_NO_PARAMDOC       = NO
 
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
 
 WARN_FORMAT            = "$file:$line: $text"
 
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
 
-WARN_LOGFILE           = 
+WARN_LOGFILE           =
 
 #---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
 #---------------------------------------------------------------------------
 
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
 
-INPUT                  = @top_srcdir@/doc/hacking/Doxyheader \
-                         @top_srcdir@/build.c \
-                         @top_srcdir@/build.h \
+INPUT                  = @top_srcdir@/doc/hacking/Doxyheader.h \
                          @top_srcdir@/config.h \
                          @top_srcdir@/debug.h \
                          @top_srcdir@/macros \
@@ -465,6 +761,12 @@ INPUT                  = @top_srcdir@/doc/hacking/Doxyheader \
                          @top_srcdir@/rpmpopt-@VERSION@ \
                          @top_srcdir@/rpmrc \
                          @top_srcdir@/rpm2cpio.c \
+                         @top_srcdir@/rpm2archive.c \
+                         @top_srcdir@/rpmbuild.c \
+                         @top_srcdir@/rpmdb.c \
+                         @top_srcdir@/rpmkeys.c \
+                         @top_srcdir@/rpmsign.c \
+                         @top_srcdir@/rpmspec.c \
                          @top_srcdir@/system.h \
                          @top_srcdir@/build/ \
                          @top_srcdir@/doc/manual/builddependencies \
@@ -483,800 +785,1583 @@ INPUT                  = @top_srcdir@/doc/hacking/Doxyheader \
                          @top_srcdir@/doc/manual/tsort \
                          @top_srcdir@/lib/ \
                          @top_srcdir@/lua/ \
-                         @top_srcdir@/rpmdb/ \
                          @top_srcdir@/rpmio/ \
                          @top_srcdir@/python/ \
                          @top_srcdir@/tools/
 
-# This tag can be used to specify the character encoding of the source files that 
-# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
-# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. 
-# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
 
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
 
 FILE_PATTERNS          = *.c \
                          *.h
 
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
 
 RECURSIVE              = NO
 
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
 # subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
 
-EXCLUDE                = @top_srcdir@/db @top_srcdir@/db.h
+EXCLUDE                = @top_srcdir@/db \
+                         @top_srcdir@/db.h
 
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
 # from the input.
+# The default value is: NO.
 
 EXCLUDE_SYMLINKS       = NO
 
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
 
-EXCLUDE_PATTERNS       = 
+EXCLUDE_PATTERNS       =
 
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
-# (namespaces, classes, functions, etc.) that should be excluded from the output. 
-# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, 
-# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
 
-EXCLUDE_SYMBOLS        = 
+EXCLUDE_SYMBOLS        =
 
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
 
 EXAMPLE_PATH           = @top_srcdir@/doc/manual
 
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
 
-EXAMPLE_PATTERNS       = 
+EXAMPLE_PATTERNS       =
 
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
 
 EXAMPLE_RECURSIVE      = NO
 
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
 
-IMAGE_PATH             = 
+IMAGE_PATH             =
 
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
 
-INPUT_FILTER           = 
+INPUT_FILTER           =
 
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-# is applied to all files.
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
 
-FILTER_PATTERNS        = 
+FILTER_PATTERNS        =
 
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
 
 FILTER_SOURCE_FILES    = NO
 
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
 #---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
 #---------------------------------------------------------------------------
 
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
 
 SOURCE_BROWSER         = YES
 
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
 
 INLINE_SOURCES         = NO
 
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
 
 STRIP_CODE_COMMENTS    = YES
 
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
 
 REFERENCED_BY_RELATION = YES
 
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
 
 REFERENCES_RELATION    = YES
 
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.  Otherwise they will link to the documentstion.
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
 
 REFERENCES_LINK_SOURCE = YES
 
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
 
 USE_HTAGS              = NO
 
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
 
 VERBATIM_HEADERS       = YES
 
 #---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
 
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
 
 ALPHABETICAL_INDEX     = NO
 
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 COLS_IN_ALPHA_INDEX    = 5
 
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
-IGNORE_PREFIX          = 
+IGNORE_PREFIX          =
 
 #---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: NO.
 
 GENERATE_HTML          = YES
 
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_OUTPUT            = html
 
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_FILE_EXTENSION    = .html
 
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
 # standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra stylesheet files is of importance (e.g. the last
+# stylesheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_HEADER            = 
+GENERATE_HTMLHELP      = NO
 
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HTML_FOOTER            = 
+CHM_FILE               =
 
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HTML_STYLESHEET        = 
+HHC_LOCATION           =
 
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HTML_ALIGN_MEMBERS     = YES
+GENERATE_CHI           = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-GENERATE_HTMLHELP      = NO
+CHM_INDEX_ENCODING     =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-CHM_FILE               = 
+BINARY_TOC             = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HHC_LOCATION           = 
+TOC_EXPAND             = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-GENERATE_CHI           = NO
+DISABLE_INDEX          = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-BINARY_TOC             = NO
+GENERATE_TREEVIEW      = NO
 
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-TOC_EXPAND             = NO
+ENUM_VALUES_PER_LINE   = 4
 
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-DISABLE_INDEX          = NO
+TREEVIEW_WIDTH         = 250
 
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-ENUM_VALUES_PER_LINE   = 4
+EXT_LINKS_IN_WINDOW    = NO
 
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-GENERATE_TREEVIEW      = NO
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
+SEARCHENGINE           = NO
 
-TREEVIEW_WIDTH         = 250
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
 
 #---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
 
 GENERATE_LATEX         = NO
 
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_OUTPUT           = latex
 
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_CMD_NAME         = latex
 
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 COMPACT_LATEX          = NO
 
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PAPER_TYPE             = letter
 
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
+# for the replacement values of the other commands the user is referred to
+# HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-EXTRA_PACKAGES         = 
+LATEX_FOOTER           =
 
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_HEADER           = 
+LATEX_EXTRA_FILES      =
 
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PDF_HYPERLINKS         = NO
 
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
 # higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 USE_PDFLATEX           = NO
 
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BATCHMODE        = NO
 
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HIDE_INDICES     = NO
 
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
 #---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
 
 GENERATE_RTF           = NO
 
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 COMPACT_RTF            = NO
 
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_HYPERLINKS         = NO
 
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_STYLESHEET_FILE    = 
+RTF_STYLESHEET_FILE    =
 
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_EXTENSIONS_FILE    = 
+RTF_EXTENSIONS_FILE    =
 
 #---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
 
 GENERATE_MAN           = NO
 
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_OUTPUT             = man
 
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_EXTENSION          = .3
 
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_LINKS              = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
 
 GENERATE_XML           = NO
 
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
 XML_OUTPUT             = xml
 
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
-XML_SCHEMA             = 
+XML_PROGRAMLISTING     = YES
 
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
 
-XML_DTD                = 
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
 
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
+GENERATE_DOCBOOK       = NO
 
-XML_PROGRAMLISTING     = YES
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
 
 #---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_PRETTY         = YES
 
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
-PERLMOD_MAKEVAR_PREFIX = 
+PERLMOD_MAKEVAR_PREFIX =
 
 #---------------------------------------------------------------------------
-# Configuration options related to the preprocessor   
+# Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 MACRO_EXPANSION        = YES
 
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 EXPAND_ONLY_PREDEF     = NO
 
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SEARCH_INCLUDES        = YES
 
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
 
-INCLUDE_PATH           = 
+INCLUDE_PATH           =
 
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-INCLUDE_FILE_PATTERNS  = 
+INCLUDE_FILE_PATTERNS  =
 
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-PREDEFINED             = 
+PREDEFINED             =
 
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-EXPAND_AS_DEFINED      = 
+EXPAND_AS_DEFINED      =
 
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse 
-# the parser if not removed.
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SKIP_FUNCTION_MACROS   = YES
 
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references   
+# Configuration options related to external references
 #---------------------------------------------------------------------------
 
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
 
 GENERATE_TAGFILE       = Doxytags
 
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
 
 EXTERNAL_GROUPS        = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
 
 PERL_PATH              = /usr/bin/perl
 
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool   
+# Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option is superseded by the HAVE_DOT option below. This is only a 
-# fallback. It is recommended to install and use dot, since it yields more 
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
 # powerful graphs.
+# The default value is: YES.
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc 
-# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to 
-# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to 
-# specify the directory where the mscgen tool resides. If left empty the tool is assumed to 
-# be found in the default search path.
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
 
-MSCGEN_PATH            = 
+DIA_PATH               =
 
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
 
 HIDE_UNDOC_RELATIONS   = YES
 
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
 
 HAVE_DOT               = @HAVE_DOT@
 
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CLASS_GRAPH            = YES
 
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 COLLABORATION_GRAPH    = YES
 
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 UML_LOOK               = NO
 
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 TEMPLATE_RELATIONS     = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDE_GRAPH          = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDED_BY_GRAPH      = YES
 
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
 # functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CALL_GRAPH             = NO
 
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a caller dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable caller graphs for selected 
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
 # functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CALLER_GRAPH           = NO
 
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GRAPHICAL_HIERARCHY    = YES
 
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DIRECTORY_GRAPH        = YES
 
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_IMAGE_FORMAT       = png
 
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
 # found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
 
-DOT_PATH               = 
+MSCFILE_DIRS           =
 
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
 
-DOTFILE_DIRS           = 
+DIAFILE_DIRS           =
 
-# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
-# nodes that will be shown in the graph. If the number of nodes in a graph 
-# becomes larger than this value, doxygen will truncate the graph, which is 
-# visualized by representing a node as a red box. Note that doxygen will always 
-# show the root nodes and its direct children regardless of this setting.
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+PLANTUML_JAR_PATH      =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_GRAPH_MAX_NODES    = 50
 
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, which results in a white background. 
-# Warning: Depending on the platform used, enabling this option may lead to 
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
 # read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_TRANSPARENT        = NO
 
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_MULTI_TARGETS      = NO
 
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine   
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE           = NO
diff --git a/doc/hacking/Doxyheader b/doc/hacking/Doxyheader
deleted file mode 100644 (file)
index 0b254d0..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*! \mainpage RPM Annotated Source Code.
- */
-/** \defgroup  python  PYTHON API.
- */
-/** \defgroup  py_c    PYTHON-C Language Bindings.
- */
-/** \defgroup  rpmcli  Command Line API.
- */
-/** \defgroup  rpmbuild        Build API.
- */
-/** \defgroup  rpmrc   RPMRC.
- */
-/** \defgroup  rpmtypes        RPM data types.
- */
-/** \defgroup  rpmts   Transaction Set API.
- */
-/** \defgroup  rpmte   Transaction Element API.
- */
-/** \defgroup  rpmds   Dependency Set API.
- */
-/** \defgroup  rpmfi   File Info API.
- */
-/** \defgroup  rpmfc   File Classification API.
- */
-/** \defgroup  rpmps   Problem Set API.
- */
-/** \defgroup  rpmkeyring      RPM keyring API.
- */
-/** \defgroup  rpmgi   Generalized Iterator API.
- */
-/** \defgroup  rpmmacro        Macro API.
- */
-/** \defgroup  rpmlog  Logging API.
- */
-/** \defgroup  rpmpgp  OpenPGP API.
- */
-/** \defgroup  rpmsq   Signal Queue API.
- */
-/** \defgroup  rpmsw   Statistics API.
- */
-/** \defgroup  lead    Lead API.
- */
-/** \defgroup  signature       Signature API.
- */
-/** \defgroup  header  Header API.
- */
-/** \defgroup   rpmtag  RPM Tag API.
- */
-/** \defgroup   rpmtd   RPM Tag Data Container API.
- */
-/** \defgroup  payload Payload API.
- */
-/** \defgroup  rpmdb   Database API.
- */
-/** \defgroup  dbi     DataBase Index Element API.
- */
-/** \defgroup  db3     Berkeley DB API.
- */
-/** \defgroup  rpmlua  Embedded Lua.
- */
-/** \defgroup  rpmio   RPM IO API.
- */
-/** \defgroup  rpmfileutil     File and Path Manipulation API.
- */
-/** \defgroup  rpmurl  URL Manipulation API.
- */
-/** \defgroup  rpmstring       String Manipulation API.
- */
-/** \defgroup  rpmargv Argument Manipulation API.
- */
diff --git a/doc/hacking/Doxyheader.h b/doc/hacking/Doxyheader.h
new file mode 100644 (file)
index 0000000..0b254d0
--- /dev/null
@@ -0,0 +1,70 @@
+/*! \mainpage RPM Annotated Source Code.
+ */
+/** \defgroup  python  PYTHON API.
+ */
+/** \defgroup  py_c    PYTHON-C Language Bindings.
+ */
+/** \defgroup  rpmcli  Command Line API.
+ */
+/** \defgroup  rpmbuild        Build API.
+ */
+/** \defgroup  rpmrc   RPMRC.
+ */
+/** \defgroup  rpmtypes        RPM data types.
+ */
+/** \defgroup  rpmts   Transaction Set API.
+ */
+/** \defgroup  rpmte   Transaction Element API.
+ */
+/** \defgroup  rpmds   Dependency Set API.
+ */
+/** \defgroup  rpmfi   File Info API.
+ */
+/** \defgroup  rpmfc   File Classification API.
+ */
+/** \defgroup  rpmps   Problem Set API.
+ */
+/** \defgroup  rpmkeyring      RPM keyring API.
+ */
+/** \defgroup  rpmgi   Generalized Iterator API.
+ */
+/** \defgroup  rpmmacro        Macro API.
+ */
+/** \defgroup  rpmlog  Logging API.
+ */
+/** \defgroup  rpmpgp  OpenPGP API.
+ */
+/** \defgroup  rpmsq   Signal Queue API.
+ */
+/** \defgroup  rpmsw   Statistics API.
+ */
+/** \defgroup  lead    Lead API.
+ */
+/** \defgroup  signature       Signature API.
+ */
+/** \defgroup  header  Header API.
+ */
+/** \defgroup   rpmtag  RPM Tag API.
+ */
+/** \defgroup   rpmtd   RPM Tag Data Container API.
+ */
+/** \defgroup  payload Payload API.
+ */
+/** \defgroup  rpmdb   Database API.
+ */
+/** \defgroup  dbi     DataBase Index Element API.
+ */
+/** \defgroup  db3     Berkeley DB API.
+ */
+/** \defgroup  rpmlua  Embedded Lua.
+ */
+/** \defgroup  rpmio   RPM IO API.
+ */
+/** \defgroup  rpmfileutil     File and Path Manipulation API.
+ */
+/** \defgroup  rpmurl  URL Manipulation API.
+ */
+/** \defgroup  rpmstring       String Manipulation API.
+ */
+/** \defgroup  rpmargv Argument Manipulation API.
+ */
index 440e8265b5265a5cc9a91f8056e389c590478df1..407e55cddf6120af9fa6ca5c1f4f67e36f7f820a 100644 (file)
-# Doxyfile 1.5.2
+# Doxyfile 1.8.8
 
 # This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
+# doxygen (www.doxygen.org) for a project.
 #
-# All text after a hash (#) is considered a comment and will be ignored
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
 # The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# This tag specifies the encoding used for all characters in the config file that 
-# follow. The default is UTF-8 which is also the encoding used for all text before 
-# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into 
-# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of 
-# possible encodings.
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
 
 DOXYFILE_ENCODING      = UTF-8
 
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
 
 PROJECT_NAME           = @PACKAGE@
 
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
 
 PROJECT_NUMBER         = @VERSION@
 
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
 
 OUTPUT_DIRECTORY       = doc/librpm
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
 
 CREATE_SUBDIRS         = NO
 
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
-# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, 
-# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, 
-# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, 
-# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
 
 OUTPUT_LANGUAGE        = English
 
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
 # brief descriptions will be completely suppressed.
+# The default value is: YES.
 
 REPEAT_BRIEF           = YES
 
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
 
-ABBREVIATE_BRIEF       = 
+ABBREVIATE_BRIEF       =
 
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
 # description.
+# The default value is: NO.
 
 ALWAYS_DETAILED_SEC    = NO
 
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
 # operators of the base classes will not be shown.
+# The default value is: NO.
 
 INLINE_INHERITED_MEMB  = NO
 
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
 
-# FULL_PATH_NAMES        = YES
-FULL_PATH_NAMES        = NO 
+FULL_PATH_NAMES        = NO
 
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
 
-# STRIP_FROM_PATH        = @top_srcdir@/
 STRIP_FROM_PATH        =
 
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
 
-STRIP_FROM_INC_PATH    = 
+STRIP_FROM_INC_PATH    =
 
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
 
 SHORT_NAMES            = NO
 
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
 
 JAVADOC_AUTOBRIEF      = YES
 
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
 
 MULTILINE_CPP_IS_BRIEF = NO
 
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
 
 INHERIT_DOCS           = YES
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
 
 SEPARATE_MEMBER_PAGES  = NO
 
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
 
 TAB_SIZE               = 8
 
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
 
-ALIASES                = 
+TCL_SUBST              =
 
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_FOR_C  = YES
 
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_JAVA   = NO
 
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
-# include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also make the inheritance and collaboration 
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
 # diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
 
 BUILTIN_STL_SUPPORT    = NO
 
 # If you use Microsoft's C++/CLI language, you should set this option to YES to
 # enable parsing support.
+# The default value is: NO.
 
 CPP_CLI_SUPPORT        = NO
 
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
+# The default value is: NO.
 
 DISTRIBUTE_GROUP_DOC   = NO
 
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
 
 SUBGROUPING            = YES
 
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
 
 EXTRACT_ALL            = YES
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
 
 EXTRACT_PRIVATE        = NO
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
 
 EXTRACT_STATIC         = YES
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
 
 EXTRACT_LOCAL_CLASSES  = YES
 
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
 
 EXTRACT_LOCAL_METHODS  = NO
 
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_MEMBERS     = NO
 
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = NO
 
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
 
 HIDE_IN_BODY_DOCS      = NO
 
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
 
 INTERNAL_DOCS          = YES
 
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
 # and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
 
 CASE_SENSE_NAMES       = YES
 
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
 
 SHOW_INCLUDE_FILES     = YES
 
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
 
 INLINE_INFO            = YES
 
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
 
 SORT_BRIEF_DOCS        = NO
 
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
 # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
 
 SORT_BY_SCOPE_NAME     = NO
 
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
 
 GENERATE_TESTLIST      = YES
 
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
 
 GENERATE_BUGLIST       = YES
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
 
 GENERATE_DEPRECATEDLIST= YES
 
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
 
-ENABLED_SECTIONS       = 
+ENABLED_SECTIONS       =
 
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
 
 MAX_INITIALIZER_LINES  = 30
 
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
 
 SHOW_USED_FILES        = YES
 
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is NO.
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
 
-SHOW_DIRECTORIES       = NO
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
 
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from the 
-# version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
+SHOW_NAMESPACES        = YES
 
-FILE_VERSION_FILTER    = 
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
 
 #---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
 
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
 
 QUIET                  = NO
 
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
 
 WARNINGS               = YES
 
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
 
 WARN_IF_UNDOCUMENTED   = YES
 
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
 
 WARN_IF_DOC_ERROR      = YES
 
-# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
 
 WARN_NO_PARAMDOC       = NO
 
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
 
 WARN_FORMAT            = "$file:$line: $text"
 
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
 
-WARN_LOGFILE           = 
+WARN_LOGFILE           =
 
 #---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
 #---------------------------------------------------------------------------
 
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
 
-INPUT                  = \
-       @top_srcdir@/doc/librpm/Doxyheader \
-       @pkginclude_HEADERS@
+INPUT                  = @top_srcdir@/doc/librpm/Doxyheader.h \
+                         @pkginclude_HEADERS@
 
-# This tag can be used to specify the character encoding of the source files that 
-# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
-# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. 
-# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
 
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
 
-FILE_PATTERNS          = *.c \
-                         *.h
+FILE_PATTERNS          = *.h
 
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
 
 RECURSIVE              = NO
 
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
 # subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
 
-EXCLUDE                = 
+EXCLUDE                =
 
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
 # from the input.
+# The default value is: NO.
 
 EXCLUDE_SYMLINKS       = NO
 
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
 
-EXCLUDE_PATTERNS       = 
+EXCLUDE_PATTERNS       =
 
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
-# (namespaces, classes, functions, etc.) that should be excluded from the output. 
-# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, 
-# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
 
-EXCLUDE_SYMBOLS        = 
+EXCLUDE_SYMBOLS        =
 
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
 
 EXAMPLE_PATH           = @top_srcdir@/doc/manual
 
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
 
-EXAMPLE_PATTERNS       = 
+EXAMPLE_PATTERNS       =
 
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
 
 EXAMPLE_RECURSIVE      = NO
 
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
 
-IMAGE_PATH             = 
+IMAGE_PATH             =
 
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
 
-INPUT_FILTER           = 
+INPUT_FILTER           =
 
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-# is applied to all files.
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
 
-FILTER_PATTERNS        = 
+FILTER_PATTERNS        =
 
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
 
 FILTER_SOURCE_FILES    = NO
 
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
 #---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
 #---------------------------------------------------------------------------
 
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
 
 SOURCE_BROWSER         = YES
 
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
 
 INLINE_SOURCES         = NO
 
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
 
 STRIP_CODE_COMMENTS    = YES
 
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
 
 REFERENCED_BY_RELATION = YES
 
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
 
 REFERENCES_RELATION    = YES
 
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.  Otherwise they will link to the documentstion.
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
 
 REFERENCES_LINK_SOURCE = YES
 
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
 
 USE_HTAGS              = NO
 
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
 
 VERBATIM_HEADERS       = YES
 
 #---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
 
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
 
 ALPHABETICAL_INDEX     = NO
 
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 COLS_IN_ALPHA_INDEX    = 5
 
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
-IGNORE_PREFIX          = 
+IGNORE_PREFIX          =
 
 #---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: NO.
 
 GENERATE_HTML          = YES
 
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_OUTPUT            = html
 
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_FILE_EXTENSION    = .html
 
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
 # standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra stylesheet files is of importance (e.g. the last
+# stylesheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_HEADER            = 
+GENERATE_HTMLHELP      = NO
 
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HTML_FOOTER            = 
+CHM_FILE               =
 
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HTML_STYLESHEET        = 
+HHC_LOCATION           =
 
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HTML_ALIGN_MEMBERS     = YES
+GENERATE_CHI           = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-GENERATE_HTMLHELP      = NO
+CHM_INDEX_ENCODING     =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-CHM_FILE               = 
+BINARY_TOC             = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HHC_LOCATION           = 
+TOC_EXPAND             = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-GENERATE_CHI           = NO
+DISABLE_INDEX          = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-BINARY_TOC             = NO
+GENERATE_TREEVIEW      = NO
 
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-TOC_EXPAND             = NO
+ENUM_VALUES_PER_LINE   = 4
 
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-DISABLE_INDEX          = NO
+TREEVIEW_WIDTH         = 250
 
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-ENUM_VALUES_PER_LINE   = 4
+EXT_LINKS_IN_WINDOW    = NO
 
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-GENERATE_TREEVIEW      = NO
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
+SEARCHENGINE           = NO
 
-TREEVIEW_WIDTH         = 250
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
 
 #---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
 
 GENERATE_LATEX         = NO
 
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_OUTPUT           = latex
 
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_CMD_NAME         = latex
 
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 COMPACT_LATEX          = NO
 
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PAPER_TYPE             = letter
 
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
+# for the replacement values of the other commands the user is referred to
+# HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-EXTRA_PACKAGES         = 
+LATEX_FOOTER           =
 
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_HEADER           = 
+LATEX_EXTRA_FILES      =
 
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PDF_HYPERLINKS         = NO
 
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
 # higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 USE_PDFLATEX           = NO
 
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BATCHMODE        = NO
 
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HIDE_INDICES     = NO
 
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
 #---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
 
 GENERATE_RTF           = NO
 
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 COMPACT_RTF            = NO
 
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_HYPERLINKS         = NO
 
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_STYLESHEET_FILE    = 
+RTF_STYLESHEET_FILE    =
 
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_EXTENSIONS_FILE    = 
+RTF_EXTENSIONS_FILE    =
 
 #---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
 
 GENERATE_MAN           = NO
 
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_OUTPUT             = man
 
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_EXTENSION          = .3
 
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_LINKS              = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
 
 GENERATE_XML           = NO
 
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
 XML_OUTPUT             = xml
 
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
-XML_SCHEMA             = 
+XML_PROGRAMLISTING     = YES
 
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
 
-XML_DTD                = 
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
 
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
+GENERATE_DOCBOOK       = NO
 
-XML_PROGRAMLISTING     = YES
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
 
 #---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_PRETTY         = YES
 
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
-PERLMOD_MAKEVAR_PREFIX = 
+PERLMOD_MAKEVAR_PREFIX =
 
 #---------------------------------------------------------------------------
-# Configuration options related to the preprocessor   
+# Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 MACRO_EXPANSION        = YES
 
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 EXPAND_ONLY_PREDEF     = NO
 
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SEARCH_INCLUDES        = YES
 
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
 
-INCLUDE_PATH           = 
+INCLUDE_PATH           =
 
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-INCLUDE_FILE_PATTERNS  = 
+INCLUDE_FILE_PATTERNS  =
 
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-PREDEFINED             = 
+PREDEFINED             =
 
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-EXPAND_AS_DEFINED      = 
+EXPAND_AS_DEFINED      =
 
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse 
-# the parser if not removed.
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SKIP_FUNCTION_MACROS   = YES
 
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references   
+# Configuration options related to external references
 #---------------------------------------------------------------------------
 
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
 
 GENERATE_TAGFILE       = Doxytags
 
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
 
 EXTERNAL_GROUPS        = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
 
 PERL_PATH              = /usr/bin/perl
 
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool   
+# Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option is superseded by the HAVE_DOT option below. This is only a 
-# fallback. It is recommended to install and use dot, since it yields more 
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
 # powerful graphs.
+# The default value is: YES.
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc 
-# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to 
-# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to 
-# specify the directory where the mscgen tool resides. If left empty the tool is assumed to 
-# be found in the default search path.
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
 
-MSCGEN_PATH            = 
+DIA_PATH               =
 
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
 
 HIDE_UNDOC_RELATIONS   = YES
 
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
 
 HAVE_DOT               = @HAVE_DOT@
 
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CLASS_GRAPH            = YES
 
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 COLLABORATION_GRAPH    = YES
 
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 UML_LOOK               = NO
 
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 TEMPLATE_RELATIONS     = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDE_GRAPH          = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDED_BY_GRAPH      = YES
 
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
 # functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CALL_GRAPH             = NO
 
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a caller dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable caller graphs for selected 
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
 # functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CALLER_GRAPH           = NO
 
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GRAPHICAL_HIERARCHY    = YES
 
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DIRECTORY_GRAPH        = YES
 
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_IMAGE_FORMAT       = png
 
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
 # found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
 
-DOT_PATH               = 
+MSCFILE_DIRS           =
 
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
 
-DOTFILE_DIRS           = 
+DIAFILE_DIRS           =
 
-# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
-# nodes that will be shown in the graph. If the number of nodes in a graph 
-# becomes larger than this value, doxygen will truncate the graph, which is 
-# visualized by representing a node as a red box. Note that doxygen will always 
-# show the root nodes and its direct children regardless of this setting.
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+PLANTUML_JAR_PATH      =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_GRAPH_MAX_NODES    = 50
 
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, which results in a white background. 
-# Warning: Depending on the platform used, enabling this option may lead to 
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
 # read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_TRANSPARENT        = NO
 
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_MULTI_TARGETS      = NO
 
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine   
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE           = NO
diff --git a/doc/librpm/Doxyheader b/doc/librpm/Doxyheader
deleted file mode 100644 (file)
index c8456c3..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*! \mainpage librpm API Documentation.
- */
-/** \defgroup  rpmcli  Command Line API.
- */
-/** \defgroup  rpmbuild        Build API.
- */
-/** \defgroup  rpmrc   RPMRC.
- */
-/** \defgroup  rpmtypes        RPM data types.
- */
-/** \defgroup  rpmts   Transaction Set API.
- */
-/** \defgroup  rpmte   Transaction Element API.
- */
-/** \defgroup  rpmds   Dependency Set API.
- */
-/** \defgroup  rpmfi   File Info API.
- */
-/** \defgroup  rpmfc   File Classification API.
- */
-/** \defgroup  rpmps   Problem Set API.
- */
-/** \defgroup  rpmprob Problem Element API.
- */
-/** \defgroup  rpmkeyring      RPM keyring API.
- */
-/** \defgroup  rpmmacro        Macro API.
- */
-/** \defgroup  rpmlog  Logging API.
- */
-/** \defgroup  rpmpgp  OpenPGP API.
- */
-/** \defgroup  rpmsq   Signal Queue API.
- */
-/** \defgroup  rpmsw   Statistics API.
- */
-/** \defgroup  signature       Signature API.
- */
-/** \defgroup  header  Header API.
- */
-/** \defgroup  rpmtag  RPM Tag API.
- */
-/** \defgroup  rpmtd   RPM Tag Data Container API.
- */
-/** \defgroup  rpmdb   Database API.
- */
-/** \defgroup  rpmio   RPM IO API.
- */
-/** \defgroup  rpmfileutil     File and Path Manipulation API.
- */
-/** \defgroup  rpmurl  URL Manipulation API.
- */
-/** \defgroup  rpmstring       String Manipulation API.
- */
-/** \defgroup  rpmstrpool      String Pool API.
- */
-/** \defgroup  rpmargv Argument Manipulation API.
- */
diff --git a/doc/librpm/Doxyheader.h b/doc/librpm/Doxyheader.h
new file mode 100644 (file)
index 0000000..365075a
--- /dev/null
@@ -0,0 +1,136 @@
+/*! \mainpage librpm API Documentation.
+     This documents the librpm API as available to rpm itself and to the
+     various depsolvers or language bindings that rely upon it.
+
+    It enables to build tools for:
+    - \link rpmbuild   creating \endlink,
+    - \link rpmsign    signing \endlink,
+    - \link rpmtd      querying \endlink,
+    - or \link rpmts   (un)installing \endlink RPM packages.
+
+ */
+/** \defgroup buildsign Building & signing packages:
+ *
+ * @{
+ */
+/** \defgroup  rpmbuild        Build API.
+    \brief API for building packages.
+ */
+/** \defgroup  signature       Signature Tags API.
+    \brief List of signature tags.
+ */
+/** \defgroup  rpmsign Signature API.
+    \brief How to add or remove a signature from a package header.
+ */
+/** @}*/
+
+/** \defgroup datatypes Data types:
+ *
+ * @{
+ */
+/** \defgroup  rpmtypes        RPM data types.
+    \brief The abstract RPM data types.
+ */
+/** \defgroup  rpmstring       String Manipulation API.
+    \brief String Manipulation API.
+ */
+/** \defgroup  rpmstrpool      String Pool API.
+    \brief How to store strings in pools.
+ */
+/** @} */
+/** \defgroup install (un)Installing packages:
+ *
+ * @{
+ */
+/** \defgroup  rpmds   Dependency Set API.
+    \brief How to compare dependencies.
+ */
+/** \defgroup  rpmcallback     Callback signature & types.
+    \brief The signature of function to register as callback and the cases where it can be called
+ */
+/** \defgroup  rpmts   Transaction Set API.
+    \brief How to create, run & destroy a package transaction.
+ */
+/** \defgroup  rpmte   Transaction Element API.
+    \brief How to retrieve information from a transaction element.
+ */
+/** \defgroup  rpmps   Problem Set API.
+    \brief Problem Set API.
+ */
+/** \defgroup  rpmprob Problem Element API.
+    \brief Problem Element API.
+ */
+/** \defgroup  rpmvf   Verify API.
+    \brief How to verify a package
+ */
+/** @} */
+
+/** \defgroup  rpmfiles        File Info Set API.
+    \brief File Info Set API.
+ */
+/** \defgroup  rpmfi   File Info Set Iterator API.
+    \brief File Info Set Iterator API.
+ */
+/** \defgroup  rpmfc   File Classification API.
+    \brief Structures and methods for build-time file classification
+ */
+/** \defgroup  rpmkeyring      RPM keyring API.
+    \brief RPM keyring API.
+ */
+/** \defgroup  rpmmacro        Macro API.
+    \brief Macro API.
+ */
+/** \defgroup  rpmlog  Logging API.
+    \brief RPM Logging facilities.
+ */
+/** \defgroup  rpmpgp  OpenPGP API.
+    \brief OpenPGP constants and structures from RFC-2440.
+ */
+/** \defgroup headquery Querying package headers:
+ *
+ * @{
+ */
+/** \defgroup  header  Header API.
+    \brief How to manipulate package headers (which carries all information about a package).
+ */
+/** \defgroup  rpmtag  RPM Tag API.
+    \brief Manipulating RPM tags (accessing values, types, ...)
+ */
+/** \defgroup  rpmtd   RPM Tag Data Container API.
+    \brief How to retrieve data from package headers.
+ */
+/** @} */
+/** \defgroup io I/O
+ *
+ * @{
+ */
+/** \defgroup  header  Header API.
+/** \defgroup  rpmdb   Database API.
+    \brief Opening & accessing the RPM indices using Berkeley DB (the so called rpmdb)
+ */
+/** \defgroup  rpmio   RPM IO API.
+    \brief The RPM IO API (Fd_t is RPM equivalent to libc's FILE).
+ */
+/** \defgroup  rpmfileutil     File and Path Manipulation API.
+    \brief File and path manipulation helper functions.
+ */
+/** \defgroup  rpmurl  URL Manipulation API.
+    \brief A couple utils for URL Manipulation.
+ */
+/** \defgroup  rpmargv Argument Manipulation API.
+    \brief Argument Manipulation API.
+ */
+/** \defgroup  rpmcli  Command Line API.
+    \brief Parsing RPM command line arguments.
+ */
+/** @} */
+/** \defgroup  rpmsq   Signal Queue API.
+    \brief Signal Queue API.
+ */
+/** \defgroup  rpmsw   Statistics API.
+    \brief Statistics API.
+ */
+/** \defgroup  rpmrc   RPMRC.
+    \brief Reading config files and getting some important configuration values.
+ */
+/** @} */
index 90d45299ac9d3692365229b5fb6f47b6acb51a37..1faf424dc999e74eedf5f584b65178833d45d16b 100644 (file)
@@ -66,21 +66,35 @@ to perform useful operations. The current list is
        %trace          toggle print of debugging information before/after
                        expansion
        %dump           print the active (i.e. non-covered) macro table
+       %verbose        is rpm in verbose mode?
 
-       %{echo:...}     print ... to stderr
-       %{warn:...}     print ... to stderr
-       %{error:...}    print ... to stderr and return BADSPEC
+       %{echo:...}     print ... to stdout
+       %{warn:...}     print warning: ... to stderr
+       %{error:...}    print error: ... to stderr and return an error
  
        %define ...     define a macro
        %undefine ...   undefine a macro
        %global ...     define a macro whose body is available in global context
 
+       %{basename:...} basename(1) macro analogue
+       %{dirname:...}  dirname(1) macro analogue
+       %{suffix:...}   expand to suffix part of a file name
+       %{url2path:...} convert url to a local path
+       %{getenv:...}   getenv(3) macro analogue
+       %{getconfdir:...}       expand to rpm "home" directory (typically /usr/lib/rpm)
        %{uncompress:...} expand ... to <file> and test to see if <file> is
                        compressed.  The expansion is
                                cat <file>              # if not compressed
                                gzip -dc <file>         # if gzip'ed
                                bzip2 -dc <file>        # if bzip'ed
+
+       %{load:...}     load a macro file
+       %{lua:...}      expand using the embedded Lua interpreter
        %{expand:...}   like eval, expand ... to <body> and (re-)expand <body>
+       %{shrink:...}   trim leading and trailing whitespace, reduce
+                       intermediate whitespace to a single space
+       %{quote:...}    quote a parametric macro argument, needed to pass
+                       empty strings or strings with whitespace
 
        %{S:...}        expand ... to <source> file name
        %{P:...}        expand ... to <patch> file name
diff --git a/doc/rpm-misc.8 b/doc/rpm-misc.8
new file mode 100644 (file)
index 0000000..f9bcdbc
--- /dev/null
@@ -0,0 +1,64 @@
+.TH "RPM misc options" 8
+.SH NAME rpm \- lesser need options for rpm(8)
+
+.SH OPTIONS
+.TP
+\fB\-\-predefine\fR='\fIMACRO EXPR\fB'\fR
+Defines \fIMACRO\fR with value \fIEXPR\fR. before loading macro files.
+
+.SH Switching off features
+.TP
+\fB\-\-color [never|auto|always]\fR
+Use terminal colors for highlighting error and debug message. Default is  turning colors on for ttys only (\fBauto\fR).
+.TP
+
+\fB\-\-nocontexts\fR
+Disable the SELinux plugin if available. This stops the plugin from setting SELinux contexts for files and scriptlets.
+.TP
+\fB\-\-noglob\fR
+Do not glob arguments when installing package files.
+.TP
+\fB\-\-nocaps\fR
+Don't verify capabilities of files.
+.TP
+\fB\-\-excludeconfigs, \-\-noconfigs\fR
+Do not install configuration files.
+.TP
+\fB\-\-nohdrchk\fR
+Don't verify database header(s) when retrieved.
+
+.SH Debugging
+
+.TP
+\fB-d, \-\-debug\fR
+Print debugging information.
+.TP
+\fB\-\-deploops\fR
+Print dependency loops as warning.
+.TP
+\fB\-\-fsmdebug\fR
+Print debuging information of payload handling code.
+.TP
+\fB\-\-rpmfcdebug\fR
+Print debug information about files packaged.
+.TP
+\fB\-\-rpmiodebug\fR
+Print debug information about file IO.
+.TP
+\fB\-\-stats\fR
+Print runtime statistics of often used functions. 
+
+.SH Obsolete Options
+.TP
+\fB-K, \-\-checksig\fR
+See and use rpmkeys(8).
+.TP
+\fB\-\-nodocs\fR
+Do not install documentation.
+Use \fB\-\-excludedocs\fR instead.
+.TP
+\fB\-\-promoteepoch\fR
+Enable obsolete epoch handling used in rpm 3.x time frame.
+.TP
+\fB\-\-prtpkts\fR
+OBSOLETE! Used to print the packages containing and representing the pgp keys for debugging purposes.
diff --git a/doc/rpm-plugin-systemd-inhibit.8 b/doc/rpm-plugin-systemd-inhibit.8
new file mode 100644 (file)
index 0000000..372f1be
--- /dev/null
@@ -0,0 +1,36 @@
+.TH "RPM-SYSTEMD-INHIBIT" "8" "14 Apr 2016" "Red Hat, Inc."
+.SH NAME
+rpm-plugin-systemd-inhibit \- Plugin for the RPM Package Manager
+
+.SH Description
+
+This plugin for RPM prevents the system to enter shutdown, sleep or idle
+mode while there is a rpm transaction running to prevent system corruption
+that can occur if the transaction is interrupted by a reboot.
+
+This is achieved by using the inhibit DBUS interface of systemd. The call is
+roughly equivalent to executing
+
+\fBsystemd-inhibit --mode=block --what=idle:sleep:shutdown --who=RPM --why="Transaction running"\fR
+
+See \fBsystemd-inhibit(1)\fR for the details of this mechanism.
+
+It is strongly advised to have the plugin installed on all systemd
+based systems.
+
+.SH Prerequisites
+
+For the plugin to work systemd has to be used as init system and
+though the DBUS system bus must be available. If the plugin cannot access the
+interface it gives a warning but does not stop the transaction.
+
+.SH Configuration
+
+The plugin currently does not have any configuration option other than
+turning it on and off. It can be disabled by commenting out the
+\fI%__transaction_systemd_inhibit\fR macro in main macros file
+(typically located at \fI/usr/lib/rpm/macros\fR) or otherwise change
+the value of the macro.
+
+Another option is to remove the plugin from the system if it is
+packaged in its own sub package.
index ee72665046a67bf4fcb79c4562a3926054bc91d8..f5cba29193c1b91b67a08d5dff96edc923940b5f 100644 (file)
--- a/doc/rpm.8
+++ b/doc/rpm.8
@@ -13,15 +13,10 @@ rpm \- RPM Package Manager
 
 \fBrpm\fR {\fB-q|--query\fR} [\fBselect-options\fR] [\fBquery-options\fR]
 
-
+\fBrpm\fR \fB--querytags\fR
 
 \fBrpm\fR {\fB-V|--verify\fR} [\fBselect-options\fR] [\fBverify-options\fR]
 
-
-
-\fBrpm\fR [\fB--nosignature\fR] [\fB--nodigest\fR]
-    \fB\fIPACKAGE_FILE\fB\fR\fI ...\fR
-
 .SS "INSTALLING, UPGRADING, AND REMOVING PACKAGES:"
 .PP
 
@@ -38,38 +33,51 @@ rpm \- RPM Package Manager
 
 
 
-\fBrpm\fR {\fB-e|--erase\fR} [\fB--allmatches\fR] [\fB--nodeps\fR] [\fB--noscripts\fR]
+\fBrpm\fR {\fB--reinstall\fR} [\fBinstall-options\fR] \fB\fIPACKAGE_FILE\fB\fR\fI ...\fR
+
+
+
+\fBrpm\fR {\fB-e|--erase\fR} [\fB--allmatches\fR] [\fB--justdb] [\fB--nodeps\fR] [\fB--noscripts\fR]
     [\fB--notriggers\fR] [\fB--test\fR] \fB\fIPACKAGE_NAME\fB\fR\fI\ ...\fR
 
 .SS "MISCELLANEOUS:"
 .PP
 
+\fBrpm\fR \fB--showrc\fR
 
-\fBrpm\fR {\fB--querytags|--showrc\fR}
-
-
+\fBrpm\fR \fB--setperms\fR \fB\fIPACKAGE_NAME\fB\fR\fI ...\fR
 
-\fBrpm\fR {\fB--setperms|--setugids\fR} \fB\fIPACKAGE_NAME\fB\fR\fI ...\fR
+\fBrpm\fR \fB--setugids\fR \fB\fIPACKAGE_NAME\fB\fR\fI ...\fR
 
 .SS "select-options"
 .PP
 
-
  [\fB\fIPACKAGE_NAME\fB\fR] [\fB-a,--all\fR] [\fB-f,--file \fIFILE\fB\fR]
  [\fB-g,--group \fIGROUP\fB\fR] {\fB-p,--package \fIPACKAGE_FILE\fB\fR]
  [\fB--hdrid \fISHA1\fB\fR] [\fB--pkgid \fIMD5\fB\fR] [\fB--tid \fITID\fB\fR]
  [\fB--querybynumber \fIHDRNUM\fB\fR] [\fB--triggeredby \fIPACKAGE_NAME\fB\fR]
  [\fB--whatprovides \fICAPABILITY\fB\fR] [\fB--whatrequires \fICAPABILITY\fB\fR]
+ [\fB--whatrecommends \fICAPABILITY\fB\fR] [\fB--whatsuggests \fICAPABILITY\fB\fR]
+ [\fB--whatsupplements \fICAPABILITY\fB\fR] [\fB--whatenhances \fICAPABILITY\fB\fR]
 
 .SS "query-options"
 .PP
-
-
- [\fB--changelog\fR] [\fB-c,--configfiles\fR] [\fB--conflicts\fR]
- [\fB-d,--docfiles\fR] [\fB--dump\fR] [\fB--filesbypkg\fR] [\fB-i,--info\fR]
- [\fB--last\fR] [\fB-l,--list\fR] [\fB--obsoletes\fR] [\fB--provides\fR]
- [\fB--qf,--queryformat \fIQUERYFMT\fB\fR] [\fB-R,--requires\fR]
- [\fB--scripts\fR] [\fB-s,--state\fR] [\fB--triggers,--triggerscripts\fR]
+General:
+ [\fB--changelog\fR] [\fB--changes\fR]  [\fB--dupes\fR] [\fB-i,--info\fR]
+ [\fB--last\fR] [\fB--qf,--queryformat \fIQUERYFMT\fB\fR] [\fB--xml\fR]
+.PP
+Dependencies:
+ [\fB--conflicts\fR] [\fB--enhances\fR] [\fB--obsoletes\fR] [\fB--provides\fR]
+ [\fB--recommends\fR] [\fB-R,--requires\fR] [\fB--suggests\fR] [\fB--supplements\fR]
+.PP
+Files:
+ [\fB-c,--configfiles\fR] [\fB-d,--docfiles\fR] [\fB--dump\fR] [\fB--fileclass\fR]
+ [\fB--filecolor\fR] [\fB--fileprovide\fR][\fB--filerequire\fR] [\fB--filecaps\fR]
+ [\fB--filesbypkg\fR] [\fB-l,--list\fR] [\fB-s,--state\fR]
+ [\fB--noartifact\fR] [\fB--noghost\fR] [\fB--noconfig\fR
+.PP
+Scripts and triggers:
+ [\fB--filetriggers\fR] [\fB--scripts\fR] [\fB--triggers,--triggerscripts\fR]
 
 .SS "verify-options"
 .PP
@@ -88,9 +96,10 @@ rpm \- RPM Package Manager
  [\fB--allfiles\fR] [\fB--badreloc\fR] [\fB--excludepath \fIOLDPATH\fB\fR]
  [\fB--excludedocs\fR] [\fB--force\fR] [\fB-h,--hash\fR]
  [\fB--ignoresize\fR] [\fB--ignorearch\fR] [\fB--ignoreos\fR]
- [\fB--includedocs\fR] [\fB--justdb\fR] [\fB--nocollections\fR]
- [\fB--nodeps\fR] [\fB--nodigest\fR] [\fB--nosignature\fR]
- [\fB--noorder\fR] [\fB--noscripts\fR] [\fB--notriggers\fR] 
+ [\fB--includedocs\fR] [\fB--justdb\fR]
+ [\fB--nodeps\fR] [\fB--nodigest\fR] [\fB--noplugins\fR]
+ [\fB--nocaps\fR] [\fB--noorder\fR]
+ [\fB--nosignature\fR] [\fB--noscripts\fR] [\fB--notriggers\fR]
  [\fB--oldpackage\fR] [\fB--percent\fR] [\fB--prefix \fINEWPATH\fB\fR]
  [\fB--relocate \fIOLDPATH\fB=\fINEWPATH\fB\fR]
  [\fB--replacefiles\fR] [\fB--replacepkgs\fR]
@@ -113,7 +122,7 @@ packages.
 One of the following basic modes must be selected:
 \fBQuery\fR,
 \fBVerify\fR,
-\fBInstall/Upgrade/Freshen\fR,
+\fBInstall/Upgrade/Freshen/Reinstall\fR,
 \fBUninstall\fR,
 \fBSet Owners/Groups\fR,
 \fBShow Querytags\fR, and
@@ -133,7 +142,7 @@ being used.
 Print as little as possible - normally only error messages will
 be displayed.
 .TP
-\fB-v\fR
+\fB-v, --verbose\fR
 Print verbose information - normally routine progress messages will be
 displayed.
 .TP
@@ -141,14 +150,25 @@ displayed.
 Print lots of ugly debugging information.
 .TP
 \fB--rcfile \fIFILELIST\fB\fR
-Each of the files in the colon separated
+Replace the list of configuration files to be read. Each of the files in the colon separated
 \fIFILELIST\fR
 is read sequentially by \fBrpm\fR for configuration
 information.
 Only the first file in the list must exist, and tildes will be
 expanded to the value of \fB$HOME\fR.
 The default \fIFILELIST\fR is
-\fI/usr/lib/rpm/rpmrc\fR:\fI/usr/lib/rpm/redhat/rpmrc\fR:\fI/etc/rpmrc\fR:\fI~/.rpmrc\fR.
+\fI/usr/\:lib/\:rpm/\:rpmrc\fR:\:\fI/usr/\:lib/\:rpm/\:redhat/\:rpmrc\fR:\:\fI/etc/\:rpmrc\fR:\:\fI~/.rpmrc\fR.
+
+.TP
+\fB--macros \fIFILELIST\fB\fR
+Replace the list of macro files to be loaded. Each of the files in the colon separated
+\fIFILELIST\fR
+is read sequentially by \fBrpm\fR for macro definitions.
+Only the first file in the list must exist, and tildes will be
+expanded to the value of \fB$HOME\fR.
+The default \fIFILELIST\fR is
+\fI/usr/\:lib/\:rpm/\:macros\fR:\:\fI/usr/\:lib/\:rpm/\:macros.d/\:macros.*\fR:\:\fI/usr/\:lib/\:rpm/\:platform/\:%{_target}/\:macros\fR:\:\fI/usr/\:lib/\:rpm/\:fileattrs/\:*.attr\fR:\:\fI/usr/\:lib/\:rpm/\:redhat/\:macros\fR:\:\fI/etc/\:rpm/\:macros.*\fR:\:\fI/etc/\:rpm/\:macros\fR:\:\fI/etc/\:rpm/\:%{_target}/\:macros\fR:\:\fI~/.rpmmacros
+
 .TP
 \fB--pipe \fICMD\fB\fR
 Pipes the output of \fBrpm\fR to the command \fICMD\fR.
@@ -175,6 +195,9 @@ Undefines \fIMACRO\fR.
 .TP
 \fB-E, --eval='\fIEXPR\fB'\fR
 Prints macro expansion of \fIEXPR\fR.
+
+.PP
+More - less often needed - options can be found on the \fBrpm-misc(8)\fR man page.
 .SS "INSTALL AND UPGRADE OPTIONS"
 .PP
 In these options, \fIPACKAGE_FILE\fR can be either \fBrpm\fR binary
@@ -209,6 +232,13 @@ new package is installed.
 This will upgrade packages, but only ones for which an earlier version is
 installed.
 .PP
+The general form of an rpm reinstall command is 
+.PP
+\fBrpm\fR {\fB--reinstall\fR} [\fBinstall-options\fR] \fB\fIPACKAGE_FILE\fB\fR\fI ...\fR
+.PP
+This reinstalls a previously installed package.
+.PP
+.PP
 .TP
 \fB--allfiles\fR
 Installs or upgrades all the missingok files in the package,
@@ -268,19 +298,17 @@ Don't verify package or header signatures when reading.
 Don't do a dependency check before installing or upgrading
 a package.
 .TP
+\fB--nocaps\fR
+Don't set file capabilities.
+.TP
 \fB--noorder\fR
 Don't reorder the packages for an install. The list of
 packages would normally be reordered to satisfy dependencies.
 .TP
-\fB--noscripts\fR
-.TP
-\fB--nopre\fR
+\fB--noplugins\fR
+Do not load and execute plugins.
 .TP
-\fB--nopost\fR
-.TP
-\fB--nopreun\fR
-.TP
-\fB--nopostun\fR
+\fB--noscripts\fR, \fB--nopre\fR, \fB--nopost\fR, \fB--nopreun\fR, \fB--nopostun\fR, \fB--nopretrans\fR, \fB--noposttrans\fR
 Don't execute the scriptlet of the same name.
 The \fB--noscripts\fR option is equivalent to
 
@@ -288,23 +316,20 @@ The \fB--noscripts\fR option is equivalent to
 \fB--nopost\fR
 \fB--nopreun\fR
 \fB--nopostun\fR
+\fB--nopretrans\fR
+\fB--noposttrans\fR
 
 and turns off the execution of the corresponding
 \fB%pre\fR,
 \fB%post\fR,
-\fB%preun\fR, and
+\fB%preun\fR,
 \fB%postun\fR
+\fB%pretrans\fR, and
+\fB%posttrans\fR
 scriptlet(s).
+
 .TP
-\fB--notriggers\fR
-.TP
-\fB--notriggerin\fR
-.TP
-\fB--notriggerun\fR
-.TP
-\fB--notriggerprein\fR
-.TP
-\fB--notriggerpostun\fR
+\fB--notriggers\fR, \fB--notriggerin\fR, \fB--notriggerun\fR, \fB--notriggerprein\fR, \fB--notriggerpostun\fR
 Don't execute any trigger scriptlet of the named type.
 The \fB--notriggers\fR option is equivalent to
 
@@ -357,7 +382,7 @@ potential conflicts.
 The general form of an rpm erase command is 
 .PP
 
-\fBrpm\fR {\fB-e|--erase\fR} [\fB--allmatches\fR] [\fB--nodeps\fR] [\fB--noscripts\fR] [\fB--notriggers\fR] [\fB--test\fR] \fB\fIPACKAGE_NAME\fB\fR\fI ...\fR
+\fBrpm\fR {\fB-e|--erase\fR} [\fB--allmatches\fR] [\fB--justdb] [\fB--nodeps\fR] [\fB--noscripts\fR] [\fB--notriggers\fR] [\fB--test\fR] \fB\fIPACKAGE_NAME\fB\fR\fI ...\fR
 
 .PP
 The following options may also be used:
@@ -368,14 +393,13 @@ Remove all versions of the package which match
 error is issued if \fIPACKAGE_NAME\fR
 matches multiple packages.
 .TP
+\fB--justdb\fR
+Update only the database, not the filesystem.
+.TP
 \fB--nodeps\fR
 Don't check dependencies before uninstalling the packages.
 .TP
-\fB--noscripts\fR
-.TP
-\fB--nopreun\fR
-.TP
-\fB--nopostun\fR
+\fB--noscripts\fR, \fB--nopreun\fR, \fB--nopostun\fR
 Don't execute the scriptlet of the same name.
 The \fB--noscripts\fR option during package erase is
 equivalent to
@@ -388,11 +412,7 @@ and turns off the execution of the corresponding
 \fB%postun\fR
 scriptlet(s).
 .TP
-\fB--notriggers\fR
-.TP
-\fB--notriggerun\fR
-.TP
-\fB--notriggerpostun\fR
+\fB--notriggers\fR, \fB--notriggerun\fR, \fB--notriggerpostun\fR
 Don't execute any trigger scriptlet of the named type.
 The \fB--notriggers\fR option is equivalent to
 
@@ -508,14 +528,34 @@ and information selection.
 .PP
 .TP
 \fB\fIPACKAGE_NAME\fB\fR
-Query installed package named \fIPACKAGE_NAME\fR.
+Query installed package named \fIPACKAGE_NAME\fR. To specify the package more precisely the package name may be followed by the version or version and release
+both separated by a dash or an architecture name separated by a dot. See the output of \fBrpm -qa\fR or \fBrpm -qp \fIPACKAGE_FILE\fB\fR as an example.
+
 .TP
 \fB-a, --all\fR
 Query all installed packages.
 .TP
+\fB--dupes\fB
+List duplicated packages.
+.TP
 \fB-f, --file \fIFILE\fB\fR
 Query package owning \fIFILE\fR.
 .TP
+\fB--filecaps\fR
+List file names with POSIX1.e capabilities.
+.TP
+\fB--fileclass\fR
+List file names with their classes (libmagic classification).
+.TP
+\fB--filecolor\fR
+List file names with their colors (0 for noarch, 1 for 32bit, 2 for 64 bit).
+.TP
+\fB--fileprovide\fR
+List file names with their provides.
+.TP
+\fB--filerequire\fR
+List file names with their requires.
+.TP
 \fB-g, --group \fIGROUP\fB\fR
 Query packages with the group of \fIGROUP\fR.
 .TP
@@ -573,12 +613,30 @@ Query all packages that provide the \fICAPABILITY\fR capability.
 .TP
 \fB--whatrequires \fICAPABILITY\fB\fR
 Query all packages that require \fICAPABILITY\fR for proper functioning.
+.TP
+\fB--whatrecommends \fICAPABILITY\fB\fR
+Query all packages that recommend \fICAPABILITY\fR.
+.TP
+\fB--whatsuggests \fICAPABILITY\fB\fR
+Query all packages that suggest \fICAPABILITY\fR.
+.TP
+\fB--whatsupplements \fICAPABILITY\fB\fR
+Query all packages that supplement \fICAPABILITY\fR.
+.TP
+\fB--whatenhances \fICAPABILITY\fB\fR
+Query all packages that enhance \fICAPABILITY\fR.
 .SS "PACKAGE QUERY OPTIONS:"
 .PP
 .TP
+\fB-d, --artifactfiles\fR
+List only artifact files (implies \fB-l\fR).
+.TP
 \fB--changelog\fR
 Display change information for the package.
 .TP
+\fB--changes\fR
+Display change information for the package with full time stamps.
+.TP
 \fB-c, --configfiles\fR
 List only configuration files (implies \fB-l\fR).
 .TP
@@ -599,9 +657,15 @@ path size mtime digest mode owner group isconfig isdoc rdev symlink
 .fi
 .RE
 .TP
+\fB--enhances\fR
+List capabilities enhanced by package(s)
+.TP
 \fB--filesbypkg\fR
 List all the files in each selected package.
 .TP
+\fB--filetriggers\fR
+List filetrigger scriptlets from package(s).
+.TP
 \fB-i, --info\fR
 Display package information, including name, version, and description.
 This uses the \fB--queryformat\fR if one was specified.
@@ -622,9 +686,18 @@ List packages this package obsoletes.
 \fB--provides\fR
 List capabilities this package provides.
 .TP
+\fB--recommends\fR
+List capabilities recommended by package(s)
+.TP
 \fB-R, --requires\fR
 List capabilities on which this package depends.
 .TP
+\fB--suggests\fR
+List capabilities suggested by package(s)
+.TP
+\fB--supplements\fR
+List capabilities supplemented by package(s)
+.TP
 \fB--scripts\fR
 List the package specific scriptlet(s) that are used as part
 of the installation and uninstallation processes.
@@ -639,6 +712,18 @@ Display the \fIstates\fR of files in the package
 \fB--triggers, --triggerscripts\fR
 Display the trigger scripts, if any, which are contained in
 the package.
+.TP
+\fB--noartifact\fR
+Don't display artifact files.
+\fB--noghost\fR
+Don't display ghost files. Useful in combination with option --list.
+.TP
+\fB--noconfig\fR
+Don't display config files.
+.TP
+\fB--xml\fR
+Format package headers as XML.
+
 .SS "VERIFY OPTIONS"
 .PP
 The general form of an rpm verify command is 
@@ -670,6 +755,12 @@ Don't verify package or header digests when reading.
 \fB--nofiles\fR
 Don't verify any attributes of package files.
 .TP
+\fB--noghost\fR
+Don't verify ghost files.
+.TP
+\fB--noconfig\fR
+Don't verify config files.
+.TP
 \fB--noscripts\fR
 Don't execute the \fB%verifyscript\fR scriptlet (if any).
 .TP
@@ -692,6 +783,9 @@ Don't verify package or header signatures when reading.
 .TP
 \fB--nordev\fR
 Don't verify the corresponding file attribute.
+.TP
+\fB--nocaps\fR
+Don't verify file capabilities.
 .PP
 The format of the output is a string of 9 characters, a possible
 attribute marker:
@@ -742,7 +836,12 @@ configuration file(s).
 sets permissions of files in the given package.
 .TP
 \fBrpm\fR \fB--setugids\fR \fIPACKAGE_NAME\fR
-sets user/group ownership of files in the given package.
+sets user/group ownership of files in the given package. This command can
+change permissions of files in that package. It is caused by calling command
+\fBchmod\fR that can clear SUID and SGID bits in some situations. So it is
+safer to call also \fB--setperms\fR after calling \fB--setugids\fR.
+.TP
+Options \fB--setperms\fR and \fB--setugids\fR are mutually exclusive.
 
 .SS "FTP/HTTP OPTIONS"
 .PP
@@ -838,6 +937,7 @@ Install the package containing \fBrpmbuild\fR (usually \fBrpm-build\fR) and see
 .SH "SEE ALSO"
 
 .nf
+\fBrpm-misc(8)\fR(3),
 \fBpopt\fR(3),
 \fBrpm2cpio\fR(8),
 \fBrpmbuild\fR(8),
index fca4250173c6ce64bc461b0efe242b0292ea9661..6793f4d102545a7e37235ed4eef27b0952bcfe3b 100644 (file)
@@ -14,6 +14,8 @@ rpmbuild \- Build RPM Package(s)
 \fBrpmbuild\fR {\fB-ba|-bb|-bp|-bc|-bi|-bl|-bs\fR} [\fBrpmbuild-options\fR] \fB\fISPECFILE\fB\fR\fI ...\fR
 
 
+\fBrpmbuild\fR {\fB-ra|-rb|-rp|-rc|-ri|-rl|-rs\fR} [\fBrpmbuild-options\fR] \fB\fISOURCEPACKAGE\fB\fR\fI ...\fR
+
 
 \fBrpmbuild\fR {\fB-ta|-tb|-tp|-tc|-ti|-tl|-ts\fR} [\fBrpmbuild-options\fR] \fB\fITARBALL\fB\fR\fI ...\fR
 
@@ -32,9 +34,11 @@ rpmbuild \- Build RPM Package(s)
 
 
  [\fB--buildroot \fIDIRECTORY\fB\fR] [\fB--clean\fR] [\fB--nobuild\fR]
- [\fB--rmsource\fR] [\fB--rmspec\fR] [\fB--short-circuit\fR]
- [\fB--noclean\fR] [\fB--nocheck\fR]
+ [\fB--rmsource\fR] [\fB--rmspec\fR] [\fB--short-circuit\fR] [\fB--build-in-place\fR]
+ [\fB--noprep\fR] [\fB--noclean\fR] [\fB--nocheck\fR]
+ [\fB--rpmfcdebug\fR]
  [\fB--target \fIPLATFORM\fB\fR]
+ [\fB--with \fIOPTION\fB\fR] [\fB--without \fIOPTION\fB\fR]
 
 .SH "DESCRIPTION"
 .PP
@@ -75,6 +79,9 @@ displayed.
 \fB-vv\fR
 Print lots of ugly debugging information.
 .TP
+\fB--rpmfcdebug\fR
+Enables to debug dependencies generation.
+.TP
 \fB--rcfile \fIFILELIST\fB\fR
 Each of the files in the colon separated
 \fIFILELIST\fR
@@ -109,12 +116,13 @@ Defines \fIMACRO\fR with value \fIEXPR\fR.
 The general form of an rpm build command is 
 .PP
 
-\fBrpmbuild\fR \fB-b\fISTAGE\fB|-t\fISTAGE\fB\fR [ \fB     rpmbuild-options
+\fBrpmbuild\fR \fB-b\fISTAGE\fB|-r\fISTAGE\fB|-t\fISTAGE\fB\fR [ \fB     rpmbuild-options
 \fR ] \fB\fIFILE\fB\fR\fI ...\fR
 
 .PP
 The argument used is \fB-b\fR if a spec file is being
-used to build the package and \fB-t\fR if \fBrpmbuild\fR
+used to build the package, \fB-r\fR if a source package is to be rebuild
+and \fB-t\fR if \fBrpmbuild\fR
 should look inside of a (possibly compressed) tar file for
 the spec file to use. After the first argument, the next
 character (\fISTAGE\fR) specifies the stages
@@ -161,6 +169,9 @@ Remove the build tree after the packages are made.
 \fB--nobuild\fR
 Do not execute any build stages. Useful for testing out spec files.
 .TP
+\fB--noprep\fR
+Do not execute %prep build stage even if present in spec.
+.TP
 \fB--noclean\fR
 Do not execute %clean build stage even if present in spec.
 .TP
@@ -185,6 +196,11 @@ and \fB-bb\fR.  Useful for local testing only.  Packages built this
 way will be marked with an unsatisfiable dependency to prevent
 their accidental use.
 .TP
+\fB--build-in-place\fR
+Build from locally checked out sources. Sets _builddir to current working
+directory. Skips handling of -n and untar in the %setup and the deletion of
+the buildSubdir.
+.TP
 \fB--target \fIPLATFORM\fB\fR
 When building the package, interpret \fIPLATFORM\fR
 as \fBarch-vendor-os\fR and set the macros
@@ -192,6 +208,12 @@ as \fBarch-vendor-os\fR and set the macros
 \fB%_target_cpu\fR, and
 \fB%_target_os\fR
 accordingly.
+.TP
+\fB--with \fIOPTION\fB\fR
+Enable configure \fIOPTION\fR for build.
+.TP
+\fB--without \fIOPTION\fB\fR
+Disable configure \fIOPTION\fR for build.
 .SS "REBUILD AND RECOMPILE OPTIONS"
 .PP
 There are two other ways to invoke building with rpm:
@@ -206,6 +228,8 @@ package, and does a prep, compile and install.  In addition,
 has completed, the build directory is removed (as in
 \fB--clean\fR) and the the sources and spec file for
 the package are removed.
+
+These options are noaways superseded by the \fB-r*\fR options which allow more more fine control over what stages of the build to run. 
 .SS "SHOWRC"
 .PP
 The command
index 79adcc56968369ce1ae2bb0a4c479eccd3550221..29ada0340cd10fdd77a77333cb44de28aee57660 100644 (file)
@@ -10,7 +10,7 @@ rpmdeps \- Generate RPM Package Dependencies
 .PP
 
 
-\fBrpmdeps\fR \fB{-P|--provides}\fR \fB{-R|--requires}\fR \fB\fIFILE\fB\fR\fI ...\fR
+\fBrpmdeps\fR \fB{-P|--provides}\fR \fB{-R|--requires}\fR \fB{--rpmfcdebug}\fR \fB\fIFILE\fB\fR\fI ...\fR
 
 .SH "DESCRIPTION"
 .PP
index 53f2d70bd9c9391ed5d9a19ade94370895c8c175..80ffb6a322f5920ef51be4d3d6d7ce2fb8c9d942 100644 (file)
@@ -2,11 +2,17 @@
 .SH NAME
 rpmsign \- RPM Package Signing
 .SH SYNOPSIS
+.SS "SIGNING PACKAGES:"
+.PP
 
-\fBrpm\fR \fB--addsign|--resign\fR \fB\fIPACKAGE_FILE\fB\fR\fI ...\fR
+\fBrpm\fR \fB--addsign|--resign\fR [\fBrpmsign-options\fR] \fB\fIPACKAGE_FILE\fB\fR\fI ...\fR
 
 \fBrpm\fR \fB--delsign\fR \fB\fIPACKAGE_FILE\fB\fR\fI ...\fR
 
+.SS "rpmsign-options"
+.PP
+[\fb--fskpath \fIKEY\fb\fR] [\fB--signfiles\fR]
+
 .SH DESCRIPTION
 .PP
 Both of the \fB--addsign\fR and \fB--resign\fR
@@ -20,6 +26,19 @@ there is no difference in behavior currently.
 .PP
 Delete all signatures from each package \fIPACKAGE_FILE\fR given.
 
+.SS "SIGN OPTIONS"
+.PP
+.TP
+\fB--fskpath \fIKEY\fB\fR
+Used with \fB--signfiles\fR, use file signing key \fIKey\fR.
+.TP
+\fB--signfiles\fR
+Sign package files. The macro \fB%_binary_filedigest_algorithm\fR must
+be set to a supported algorithm before building the package. The
+supported algorithms are SHA1, SHA256, SHA384, and SHA512, which are
+represented as 2, 8, 9, and 10 respectively.  The file signing key (RSA
+private key) must be set before signing the package, it can be configured on the command line with \fB--fskpath\fR or the macro %_file_signing_key.
+
 .SS "USING GPG TO SIGN PACKAGES"
 .PP
 In order to sign packages using GPG, \fBrpm\fR
@@ -52,7 +71,7 @@ using the executable \fI/usr/bin/gpg\fR you would include
 in a macro configuration file. Use \fI/etc/rpm/macros\fR
 for per-system configuration and \fI~/.rpmmacros\fR
 for per-user configuration. Typically it's sufficient to set just %_gpg_name.
-
+.PP
 .SH "SEE ALSO"
 .nf
 \fBpopt\fR(3),
@@ -78,4 +97,5 @@ Marc Ewing <marc@redhat.com>
 Jeff Johnson <jbj@redhat.com>
 Erik Troan <ewt@redhat.com>
 Panu Matilainen <pmatilai@redhat.com>
+Fionnuala Gunter <fin@linux.vnet.ibm.com>
 .fi
index a3912375b857f48f980a24b23763b8854c086e64..85b7b66398437606a37d9a3dcf1275db663f4405 100644 (file)
@@ -7,11 +7,20 @@ rpmspec \- RPM Spec Tool
 
 \fBrpmspec\fR {\fB-q|--query\fR} [\fBselect-options\fR] [\fBquery-options\fR] \fB\fISPEC_FILE\fB\fR\fI ...\fR
 
+.SS "PARSING SPEC FILES TO STDOUT:"
+.PP
+
+\fBrpmspec\fR {\fB-P|--parse\fR} \fB\fISPEC_FILE\fB\fR\fI ...\fR
+
+.SH DESCRIPTION
+.PP
+\fBrpmspec\fR is a tool for querying a spec file. More specifically for querying hypothetical packages which would be created from the given spec file. So querying a spec file with \fBrpmspec\fR is similar to querying a package built from that spec file. But is is not identical. With \fBrpmspec\fR you can't query all fields which you can query from a built package. E. g. you can't query BUILDTIME with \fBrpmspec\fR for obvious reasons. You also cannot query other fields automatically generated during a build of a package like auto generated dependencies.
+
 .SS "select-options"
 .PP
 
  [\fB\--rpms\fB\fR]
- [\fB\--srpms\fB\fR]
+ [\fB\--srpm\fB\fR]
 
 .SS "query-options"
 .PP
@@ -39,10 +48,54 @@ See \fBrpm(8)\fR for details.
 .SS "SELECT OPTIONS"
 .PP
  \fB--rpms\fR
-Operate on the binary package header(s).
+Operate on the all binary package headers generated from spec.
+ \fB--builtrpms\fR
+Operate only on the binary package headers of packages which would be built from spec. That means ignoring package headers of packages that won't be built from spec i. e. ignoring package headers of packages without file section.
  \fB--srpm\fR
-Operate on the source package header(s).
+Operate on the source package header(s) generated from spec.
 
+.SH EXAMPLES
+.PP
+Get list of binary packages which would be generated from the rpm spec file:
+.PP
+.RS 4
+.nf
+ $ rpmspec -q rpm.spec
+ rpm-4.11.3-3.fc20.x86_64
+ rpm-libs-4.11.3-3.fc20.x86_64
+ rpm-build-libs-4.11.3-3.fc20.x86_64
+ ...
+.RE
+.PP
+Get summary infos for single binary packages generated from the rpm spec file:
+.PP
+.RS 4
+.nf
+ $ rpmspec -q --qf "%{name}: %{summary}\\n" rpm.spec
+ rpm: The RPM package management system
+ rpm-libs: Libraries for manipulating RPM packages
+ rpm-build-libs: Libraries for building and signing RPM packages
+ ...
+.RE
+.PP
+Get the source package which would be generated from the rpm spec file:
+.PP
+.RS 4
+.nf
+ $ rpmspec -q --srpm rpm.spec
+ rpm-4.11.3-3.fc20.x86_64
+.RE
+.PP
+Parse the rpm spec file to stdout:
+.PP
+.RS 4
+.nf
+ $ rpmspec -P rpm.spec
+ Summary: The RPM package management system
+ Name: rpm
+ Version: 4.14.0
+ ...
+.RE
 .SH "SEE ALSO"
 .nf
 \fBpopt\fR(3),
index 3d1b7e712f97c8eb74b2740434caae99167f1dbd..c3f1b053da87e791970a35c695920c8a6a179dfa 100644 (file)
@@ -1,12 +1,13 @@
 # Makefile for rpm file attributes
 
 include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
 
 fattrsdir = $(rpmconfigdir)/fileattrs
 
 fattrs_DATA = \
-       desktop.attr elf.attr font.attr libtool.attr perl.attr perllib.attr \
-       pkgconfig.attr python.attr ocaml.attr script.attr mono.attr \
-       debuginfo.attr elflib.attr firmware.attr ksyms.attr sysvinit.attr
+       debuginfo.attr desktop.attr elf.attr font.attr libtool.attr metainfo.attr \
+       perl.attr perllib.attr pkgconfig.attr python.attr ocaml.attr script.attr \
+       mono.attr elflib.attr firmware.attr kernel.attr kmp.attr sysvinit.attr
 
 EXTRA_DIST = $(fattrs_DATA)
index 91fd995f0abb8a039122d444fa38b70179ed1275..4777df8a5c93920b145cb1144164b5e7c582e47e 100644 (file)
@@ -1,2 +1,4 @@
-%__debuginfo_provides  %{_rpmconfigdir}/debuginfo.prov
+# Change how to add "package provide" to debuginfo package : add "package provide" using addPackageProvides_for_debuginfo_pkg
+#comment the below commond, no need to show provides debuginfo, build id info, for example: Provides: debuginfo(build-id) = XXX
+#%__debuginfo_provides %{_rpmconfigdir}/debuginfo.prov
 %__debuginfo_path      ^/usr/lib/debug/
diff --git a/fileattrs/kernel.attr b/fileattrs/kernel.attr
new file mode 100644 (file)
index 0000000..a79fde5
--- /dev/null
@@ -0,0 +1,2 @@
+%__kernel_provides     %{_rpmconfigdir}/find-provides.ksyms --opensuse 0%{?is_opensuse}
+%__kernel_path         ^(/lib/modules/[^/]*/kernel/.*\.ko(\.gz)?|/boot/vmlinu[xz].*)$
diff --git a/fileattrs/kmp.attr b/fileattrs/kmp.attr
new file mode 100644 (file)
index 0000000..772ea30
--- /dev/null
@@ -0,0 +1,4 @@
+%__kmp_provides                %{_rpmconfigdir}/find-provides.ksyms --opensuse 0%{?is_opensuse}
+%__kmp_requires                %{_rpmconfigdir}/find-requires.ksyms --opensuse 0%{?is_opensuse}
+%__kmp_supplements     %{_rpmconfigdir}/find-supplements.ksyms
+%__kmp_path            ^/lib/modules/[^/]*/(updates|extra)/.*\.ko(\.gz)?
diff --git a/fileattrs/metainfo.attr b/fileattrs/metainfo.attr
new file mode 100644 (file)
index 0000000..f016d45
--- /dev/null
@@ -0,0 +1,2 @@
+%__metainfo_provides   %{_rpmconfigdir}/metainfo.prov
+%__metainfo_path       ^%{_datadir}/(appdata|metainfo)/.*\\.(appdata|metainfo)\\.xml$
index 99723546eda167e52a859a79e0bbd6decb16dea4..77463c84152e5455ed9eb1997a5b0fd61e64c00a 100644 (file)
@@ -2,3 +2,5 @@
 #disabled for now
 #%__perllib_requires   %{_rpmconfigdir}/perl.req
 %__perllib_magic       ^Perl[[:digit:]] module source.*
+%__perllib_path                \\.pm$
+%__perllib_flags       magic_and_path
index a68b3c06af14fc0cac71e2df27b84a164a9f243f..79209e0807df1b82671ad2a406ac9e0dcba0c696 100755 (executable)
@@ -6,9 +6,10 @@ platformdir="${pkglibdir}/platform"
 
 RPMRC="${1:-rpmrc}"
 PLATFORM="${2:-platform}"
-VENDOR="${3}"
-OS="${4}"
-RPMRC_GNU="${5}"
+MACROS="${3:-macros}"
+VENDOR="${4}"
+OS="${5}"
+RPMRC_GNU="${6}"
 
 for ARCH in noarch `grep ^arch_canon $RPMRC | cut -d: -f2`; do
   RPMRC_OPTFLAGS="`sed -n 's/^optflags: '$ARCH' //p' $RPMRC`"
@@ -53,12 +54,18 @@ for ARCH in noarch `grep ^arch_canon $RPMRC | cut -d: -f2`; do
        CANONARCH=s390x
        CANONCOLOR=3
        ;;
-    ppc64*)
+    ppc64|ppc64p7)
        ISANAME=ppc
        ISABITS=64
        CANONARCH=ppc64
        CANONCOLOR=3
        ;;
+    ppc64le)
+       ISANAME=ppc
+        ISABITS=64
+        CANONARCH=ppc64le
+        CANONCOLOR=3
+       ;;
     ppc*)
        ISANAME=ppc
        ISABITS=32
@@ -89,6 +96,12 @@ for ARCH in noarch `grep ^arch_canon $RPMRC | cut -d: -f2`; do
        CANONARCH=${ARCH}
        CANONCOLOR=0
        ;;
+    armv7h*)
+       ISANAME=armv7hl
+       ISABITS=32
+       CANONARCH=arm
+       CANONCOLOR=0
+       ;;
     arm*)
        ISANAME=`echo ${ARCH} | sed "s/^\([^-]*\)-.*/\1/"`
        ISABITS=32
@@ -101,6 +114,72 @@ for ARCH in noarch `grep ^arch_canon $RPMRC | cut -d: -f2`; do
        CANONARCH=alpha
        CANONCOLOR=0
        ;;
+    aarch64)
+       ISANAME=aarch
+       ISABITS=64
+       CANONARCH=aarch64
+       CANONCOLOR=3
+       ;;
+    mips)
+       ISANAME=mips
+       ISABITS=32
+       CANONARCH=mips
+       CANONCOLOR=0
+       ;;
+    mipsel)
+       ISANAME=mips
+       ISABITS=32
+       CANONARCH=mipsel
+       CANONCOLOR=0
+       ;;
+    mips64)
+       ISANAME=mips
+       ISABITS=64
+       CANONARCH=mips64
+       CANONCOLOR=3
+       ;;
+    mips64el)
+       ISANAME=mips
+       ISABITS=64
+       CANONARCH=mips64el
+       CANONCOLOR=3
+       ;;
+    mipsr6)
+       ISANAME=mipsr6
+       ISABITS=32
+       CANONARCH=mipsr6
+       CANONCOLOR=0
+       ;;
+    mipsr6el)
+       ISANAME=mipsr6
+       ISABITS=32
+       CANONARCH=mipsr6el
+       CANONCOLOR=0
+       ;;
+    mips64r6)
+       ISANAME=mipsr6
+       ISABITS=64
+       CANONARCH=mips64r6
+       CANONCOLOR=3
+       ;;
+    mips64r6el)
+       ISANAME=mipsr6
+       ISABITS=64
+       CANONARCH=mips64r6el
+       CANONCOLOR=3
+       ;;
+    m68k)
+       ISANAME=m68k
+       ISABITS=32
+       CANONARCH=m68k
+       CANONCOLOR=0
+       ;;
+    riscv64)
+       ISANAME=riscv
+       ISABITS=64
+       CANONARCH=riscv64
+       CANONCOLOR=3
+       ;;
     noarch)
        CANONARCH=noarch
        CANONCOLOR=0
@@ -111,6 +190,53 @@ for ARCH in noarch `grep ^arch_canon $RPMRC | cut -d: -f2`; do
   # skip architectures for which we dont have full config parameters
   [ -z "$CANONARCH" ] && continue
 
+  for macro in $(rpm --showrc | grep _host_cpu | cut -f2 );do
+    case "$macro" in
+      sparc64*) 
+      CANONCOLOR=3
+      ;;
+      sparc*) 
+      CANONCOLOR=0
+      ;;
+      s390)
+      CANONCOLOR=0
+      ;;
+      s390x)
+      CANONCOLOR=3
+      ;;
+      ppc64*)
+      CANONCOLOR=3
+      ;;
+      ppc*)
+      CANONCOLOR=0
+      ;;
+      i?86|pentium?|athlon|geode)
+      CANONCOLOR=0
+      ;;
+      x86_64|amd64|ia32e)
+      CANONCOLOR=3
+      ;;
+      ia64)
+      CANONCOLOR=2
+      ;;
+      sh*)
+      CANONCOLOR=0
+      ;;
+      arm*)
+      CANONCOLOR=0
+      ;;
+      alpha*)
+      CANONCOLOR=0
+      ;;
+      aarch64)
+      CANONCOLOR=3
+      ;;
+      noarch)
+      CANONCOLOR=0
+      ;;
+    esac
+  done
+
   if [ "$OS" = "linux" ] && [ "$CANONCOLOR" = 3 ]; then
       LIB=${LIB}64
   fi
@@ -119,7 +245,7 @@ for ARCH in noarch `grep ^arch_canon $RPMRC | cut -d: -f2`; do
   [ -d $PPD ] || mkdir -p $PPD
 
   cat $PLATFORM \
-  | sed -e "s,@RPMRC_OPTFLAGS@,$RPMRC_OPTFLAGS," \
+  | sed -e "s#@RPMRC_OPTFLAGS@#$RPMRC_OPTFLAGS#" \
        -e "s,@RPMCANONARCH@,$CANONARCH,g" \
        -e "s,@RPMCANONCOLOR@,$CANONCOLOR," \
        -e "s,@RPMRC_GNU@,$RPMRC_GNU," \
@@ -134,3 +260,6 @@ for ARCH in noarch `grep ^arch_canon $RPMRC | cut -d: -f2`; do
   > ${PPD}/macros
 
 done
+
+# gently adjust undefined autoconf variables to rpm macros...
+cat $MACROS | sed -e 's,${prefix},%{_prefix},g' > ${DESTDIR}/${pkglibdir}/macros
diff --git a/lib/.gitignore b/lib/.gitignore
deleted file mode 100644 (file)
index 1fb7263..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/tagtbl.C
index 9e725b36da39dd59a6ccb0acfc2779c4910fa12c..baf3238eed90904dbe4deb2ec8f61444c3452c7c 100644 (file)
@@ -1,10 +1,13 @@
 # Makefile for rpm library.
 
 include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
 
 AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -I$(top_builddir)/include/
+AM_CPPFLAGS += @WITH_BEECRYPT_INCLUDE@
 AM_CPPFLAGS += @WITH_NSS_INCLUDE@
 AM_CPPFLAGS += @WITH_POPT_INCLUDE@
+AM_CPPFLAGS += $(LMDB_CFLAGS)
 AM_CPPFLAGS += -I$(top_srcdir)/misc
 AM_CPPFLAGS += -DLOCALEDIR="\"$(localedir)\""
 AM_CPPFLAGS += -DSYSCONFDIR="\"$(sysconfdir)\""
@@ -21,7 +24,8 @@ EXTRA_PROGRAMS =
 
 usrlib_LTLIBRARIES = librpm.la
 librpm_la_SOURCES = \
-       backend/dbconfig.c backend/db3.c backend/dbi.h \
+       backend/db3.c backend/dbi.c backend/dbi.h \
+       backend/dbiset.c backend/dbiset.h \
        headerutil.c header.c headerfmt.c header_internal.h \
        rpmdb.c rpmdb_internal.h \
        fprint.c fprint.h tagname.c rpmtd.c \
@@ -34,17 +38,17 @@ librpm_la_SOURCES = \
        rpmlead.c rpmlead.h rpmps.c rpmprob.c rpmrc.c \
        rpmte.c rpmte_internal.h rpmts.c rpmfs.h rpmfs.c \
        rpmvercmp.c signature.c signature.h transaction.c \
-       verify.c rpmlock.c rpmlock.h misc.h \
-       rpmscript.h rpmscript.c legacy.c merge.c \
+       verify.c rpmlock.c rpmlock.h misc.h relocation.c \
+       rpmscript.h rpmscript.c \
        rpmchroot.c rpmchroot.h \
-       rpmplugins.c rpmplugins.h rpmug.c rpmug.h
+       rpmplugins.c rpmplugins.h rpmplugin.h rpmug.c rpmug.h \
+       rpmtriggers.h rpmtriggers.c rpmvs.c rpmvs.h
 
-librpm_la_LDFLAGS = -version-info 4:0:1
+librpm_la_LDFLAGS = -version-info $(rpm_version_info)
 
 librpm_la_LIBADD = \
        $(top_builddir)/rpmio/librpmio.la \
        @WITH_POPT_LIB@ \
-       @WITH_SELINUX_LIB@ \
        @WITH_CAP_LIB@ \
        @WITH_ACL_LIB@ \
        @LIBINTL@
@@ -61,6 +65,24 @@ else
 librpm_la_LIBADD += @WITH_DB_LIB@
 endif
 
+if NDB
+librpm_la_SOURCES += \
+       backend/ndb/glue.c \
+       backend/ndb/rpmpkg.c \
+       backend/ndb/rpmpkg.h \
+       backend/ndb/rpmidx.c \
+       backend/ndb/rpmidx.h \
+       backend/ndb/rpmxdb.c \
+       backend/ndb/rpmxdb.h
+endif
+
+if LMDB
+AM_CPPFLAGS += $(LMDB_CFLAGS)
+librpm_la_LIBADD += $(LMDB_LIBS)
+librpm_la_SOURCES += \
+       backend/lmdb.c
+endif
+
 tagtbl.C: Makefile.am $(srcdir)/rpmtag.h gentagtbl.sh
        @AWK=${AWK} ${SHELL} $(srcdir)/gentagtbl.sh \
                             $(srcdir)/rpmtag.h > $@.new && \
index a55a608cf5fa0dc71ca1cedaae723e4507bcbcca..77101846736ab2e4b68e45017c666c4514335f2e 100644 (file)
@@ -8,6 +8,9 @@ static int _debug = 1;  /* XXX if < 0 debugging, > 0 unusual error returns */
 
 #include <errno.h>
 #include <sys/wait.h>
+#include <popt.h>
+#include <db.h>
+#include <signal.h>
 
 #include <rpm/rpmtypes.h>
 #include <rpm/rpmmacro.h>
@@ -22,19 +25,80 @@ static const char * _errpfx = "rpmdb";
 
 struct dbiCursor_s {
     dbiIndex dbi;
+    const void *key;
+    unsigned int keylen;
+    int flags;
     DBC *cursor;
 };
 
+static struct dbiConfig_s staticdbicfg;
+static struct dbConfig_s staticcfg;
+
+/** \ingroup dbi
+ */
+static const struct poptOption rdbOptions[] = {
+ /* Environment options */
+   
+ { "cdb",      0,POPT_BIT_SET, &staticcfg.db_eflags, DB_INIT_CDB,
+       NULL, NULL },
+ { "lock",     0,POPT_BIT_SET, &staticcfg.db_eflags, DB_INIT_LOCK,
+       NULL, NULL },
+ { "log",      0,POPT_BIT_SET, &staticcfg.db_eflags, DB_INIT_LOG,
+       NULL, NULL },
+ { "txn",      0,POPT_BIT_SET, &staticcfg.db_eflags, DB_INIT_TXN,
+       NULL, NULL },
+ { "recover",  0,POPT_BIT_SET, &staticcfg.db_eflags, DB_RECOVER,
+       NULL, NULL },
+ { "recover_fatal", 0,POPT_BIT_SET,    &staticcfg.db_eflags, DB_RECOVER_FATAL,
+       NULL, NULL },
+ { "lockdown", 0,POPT_BIT_SET, &staticcfg.db_eflags, DB_LOCKDOWN,
+       NULL, NULL },
+ { "private",  0,POPT_BIT_SET, &staticcfg.db_eflags, DB_PRIVATE,
+       NULL, NULL },
+
+ { "deadlock", 0,POPT_BIT_SET, &staticcfg.db_verbose, DB_VERB_DEADLOCK,
+       NULL, NULL },
+ { "recovery", 0,POPT_BIT_SET, &staticcfg.db_verbose, DB_VERB_RECOVERY,
+       NULL, NULL },
+ { "waitsfor", 0,POPT_BIT_SET, &staticcfg.db_verbose, DB_VERB_WAITSFOR,
+       NULL, NULL },
+ { "verbose",  0,POPT_ARG_VAL,         &staticcfg.db_verbose, -1,
+       NULL, NULL },
+
+ { "cachesize",        0,POPT_ARG_INT,         &staticcfg.db_cachesize, 0,
+       NULL, NULL },
+ { "mmapsize", 0,POPT_ARG_INT,         &staticcfg.db_mmapsize, 0,
+       NULL, NULL },
+ { "mp_mmapsize", 0,POPT_ARG_INT,      &staticcfg.db_mmapsize, 0,
+       NULL, NULL },
+ { "mp_size",  0,POPT_ARG_INT,         &staticcfg.db_cachesize, 0,
+       NULL, NULL },
+
+ { "nofsync",  0,POPT_ARG_NONE,        &staticcfg.db_no_fsync, 0,
+       NULL, NULL },
+
+ /* Per-dbi options */
+ { "nommap",   0,POPT_BIT_SET,         &staticdbicfg.dbi_oflags, DB_NOMMAP,
+       NULL, NULL },
+
+ { "nodbsync", 0,POPT_ARG_NONE,        &staticdbicfg.dbi_no_dbsync, 0,
+       NULL, NULL },
+ { "lockdbfd", 0,POPT_ARG_NONE,        &staticdbicfg.dbi_lockdbfd, 0,
+       NULL, NULL },
+
+    POPT_TABLEEND
+};
+
+
 static int dbapi_err(rpmdb rdb, const char * msg, int error, int printit)
 {
     if (printit && error) {
-       int db_api = rdb->db_ver;
        if (msg)
-           rpmlog(RPMLOG_ERR, _("db%d error(%d) from %s: %s\n"),
-               db_api, error, msg, db_strerror(error));
+           rpmlog(RPMLOG_ERR, _("%s error(%d) from %s: %s\n"),
+               rdb->db_descr, error, msg, db_strerror(error));
        else
-           rpmlog(RPMLOG_ERR, _("db%d error(%d): %s\n"),
-               db_api, error, db_strerror(error));
+           rpmlog(RPMLOG_ERR, _("%s error(%d): %s\n"),
+               rdb->db_descr, error, db_strerror(error));
     }
     return error;
 }
@@ -49,6 +113,11 @@ static void errlog(const DB_ENV * env, const char *errpfx, const char *msg)
     rpmlog(RPMLOG_ERR, "%s: %s\n", errpfx, msg);
 }
 
+static void warnlog(const DB_ENV *env, const char *msg)
+{
+    rpmlog(RPMLOG_WARNING, "%s: %s\n", _errpfx, msg);
+}
+
 static uint32_t db_envflags(DB * db)
 {
     DB_ENV * env = db->get_env(db);
@@ -57,10 +126,42 @@ static uint32_t db_envflags(DB * db)
     return eflags;
 }
 
+/*
+ * Try to acquire db environment open/close serialization lock.
+ * Return the open, locked fd on success, -1 on failure.
+ */
+static int serialize_env(const char *dbhome)
+{
+    char *lock_path = rstrscat(NULL, dbhome, "/.dbenv.lock", NULL);
+    mode_t oldmask = umask(022);
+    int fd = open(lock_path, (O_RDWR|O_CREAT), 0644);
+    umask(oldmask);
+
+    if (fd >= 0) {
+       int rc;
+       struct flock info;
+       memset(&info, 0, sizeof(info));
+       info.l_type = F_WRLCK;
+       info.l_whence = SEEK_SET;
+       do {
+           rc = fcntl(fd, F_SETLKW, &info);
+       } while (rc == -1 && errno == EINTR);
+           
+       if (rc == -1) {
+           close(fd);
+           fd = -1;
+       }
+    }
+
+    free(lock_path);
+    return fd;
+}
+
 static int db_fini(rpmdb rdb, const char * dbhome)
 {
     DB_ENV * dbenv = rdb->db_dbenv;
     int rc;
+    int lockfd = -1;
     uint32_t eflags = 0;
 
     if (dbenv == NULL)
@@ -72,6 +173,9 @@ static int db_fini(rpmdb rdb, const char * dbhome)
     }
 
     (void) dbenv->get_open_flags(dbenv, &eflags);
+    if (!(eflags & DB_PRIVATE))
+       lockfd = serialize_env(dbhome);
+
     rc = dbenv->close(dbenv, 0);
     rc = dbapi_err(rdb, "dbenv->close", rc, _debug);
 
@@ -89,6 +193,10 @@ static int db_fini(rpmdb rdb, const char * dbhome)
        rpmlog(RPMLOG_DEBUG, "removed  db environment %s\n", dbhome);
 
     }
+
+    if (lockfd >= 0)
+       close(lockfd);
+
     return rc;
 }
 
@@ -117,18 +225,200 @@ static int isalive(DB_ENV *dbenv, pid_t pid, db_threadid_t tid, uint32_t flags)
     return alive;
 }
 
+
+static void dbConfigure(rpmDbiTagVal rpmtag, struct dbConfig_s *cfg, struct dbiConfig_s  *dbicfg)
+{
+    char *dbOpts;
+
+    dbOpts = rpmExpand("%{_dbi_config_", rpmTagGetName(rpmtag), "}", NULL);
+    
+    if (!(dbOpts && *dbOpts && *dbOpts != '%')) {
+       dbOpts = _free(dbOpts);
+       dbOpts = rpmExpand("%{_dbi_config}", NULL);
+       if (!(dbOpts && *dbOpts && *dbOpts != '%')) {
+           dbOpts = _free(dbOpts);
+       }
+    }
+
+    /* Parse the options for the database element(s). */
+    if (dbOpts && *dbOpts && *dbOpts != '%') {
+       char *o, *oe;
+       char *p, *pe;
+
+       memset(&staticdbicfg, 0, sizeof(staticdbicfg));
+/*=========*/
+       for (o = dbOpts; o && *o; o = oe) {
+           const struct poptOption *opt;
+           const char * tok;
+           unsigned int argInfo;
+
+           /* Skip leading white space. */
+           while (*o && risspace(*o))
+               o++;
+
+           /* Find and terminate next key=value pair. Save next start point. */
+           for (oe = o; oe && *oe; oe++) {
+               if (risspace(*oe))
+                   break;
+               if (oe[0] == ':' && !(oe[1] == '/' && oe[2] == '/'))
+                   break;
+           }
+           if (oe && *oe)
+               *oe++ = '\0';
+           if (*o == '\0')
+               continue;
+
+           /* Separate key from value, save value start (if any). */
+           for (pe = o; pe && *pe && *pe != '='; pe++)
+               {};
+           p = (pe ? *pe++ = '\0', pe : NULL);
+
+           /* Skip over negation at start of token. */
+           for (tok = o; *tok == '!'; tok++)
+               {};
+
+           /* Find key in option table. */
+           for (opt = rdbOptions; opt->longName != NULL; opt++) {
+               if (!rstreq(tok, opt->longName))
+                   continue;
+               break;
+           }
+           if (opt->longName == NULL) {
+               rpmlog(RPMLOG_ERR,
+                       _("unrecognized db option: \"%s\" ignored.\n"), o);
+               continue;
+           }
+
+           /* Toggle the flags for negated tokens, if necessary. */
+           argInfo = opt->argInfo;
+           if (argInfo == POPT_BIT_SET && *o == '!' && ((tok - o) % 2))
+               argInfo = POPT_BIT_CLR;
+
+           /* Save value in template as appropriate. */
+           switch (argInfo & POPT_ARG_MASK) {
+
+           case POPT_ARG_NONE:
+               (void) poptSaveInt((int *)opt->arg, argInfo, 1L);
+               break;
+           case POPT_ARG_VAL:
+               (void) poptSaveInt((int *)opt->arg, argInfo, (long)opt->val);
+               break;
+           case POPT_ARG_STRING:
+           {   char ** t = opt->arg;
+               if (t) {
+/* FIX: opt->arg annotation in popt.h */
+                   *t = _free(*t);
+                   *t = xstrdup( (p ? p : "") );
+               }
+           }   break;
+
+           case POPT_ARG_INT:
+           case POPT_ARG_LONG:
+             { long aLong = strtol(p, &pe, 0);
+               if (pe) {
+                   if (!rstrncasecmp(pe, "Mb", 2))
+                       aLong *= 1024 * 1024;
+                   else if (!rstrncasecmp(pe, "Kb", 2))
+                       aLong *= 1024;
+                   else if (*pe != '\0') {
+                       rpmlog(RPMLOG_ERR,
+                               _("%s has invalid numeric value, skipped\n"),
+                               opt->longName);
+                       continue;
+                   }
+               }
+
+               if ((argInfo & POPT_ARG_MASK) == POPT_ARG_LONG) {
+                   if (aLong == LONG_MIN || aLong == LONG_MAX) {
+                       rpmlog(RPMLOG_ERR,
+                               _("%s has too large or too small long value, skipped\n"),
+                               opt->longName);
+                       continue;
+                   }
+                   (void) poptSaveLong((long *)opt->arg, argInfo, aLong);
+                   break;
+               } else {
+                   if (aLong > INT_MAX || aLong < INT_MIN) {
+                       rpmlog(RPMLOG_ERR,
+                               _("%s has too large or too small integer value, skipped\n"),
+                               opt->longName);
+                       continue;
+                   }
+                   (void) poptSaveInt((int *)opt->arg, argInfo, aLong);
+               }
+             } break;
+           default:
+               break;
+           }
+       }
+/*=========*/
+    }
+
+    dbOpts = _free(dbOpts);
+    if (cfg) {
+       *cfg = staticcfg;       /* structure assignment */
+       /* Throw in some defaults if configuration didn't set any */
+       if (!cfg->db_mmapsize)
+           cfg->db_mmapsize = 16 * 1024 * 1024;
+       if (!cfg->db_cachesize)
+           cfg->db_cachesize = 8 * 1024 * 1024;
+    }
+    if (dbicfg) {
+       *dbicfg = staticdbicfg;
+    }
+}
+
+static char * prDbiOpenFlags(int dbflags, int print_dbenv_flags)
+{
+    ARGV_t flags = NULL;
+    const struct poptOption *opt;
+    char *buf;
+
+    for (opt = rdbOptions; opt->longName != NULL; opt++) {
+        if (opt->argInfo != POPT_BIT_SET)
+            continue;
+        if (print_dbenv_flags) {
+            if (!(opt->arg == &staticcfg.db_eflags))
+                continue;
+        } else {
+            if (!(opt->arg == &staticdbicfg.dbi_oflags))
+                continue;
+        }
+        if ((dbflags & opt->val) != opt->val)
+            continue;
+        argvAdd(&flags, opt->longName);
+        dbflags &= ~opt->val;
+    }   
+    if (dbflags) {
+        char *df = NULL;
+        rasprintf(&df, "0x%x", (unsigned)dbflags);
+        argvAdd(&flags, df);
+        free(df);
+    }   
+    buf = argvJoin(flags, ":");
+    argvFree(flags);
+            
+    return buf ? buf : xstrdup("(none)");
+}
+
 static int db_init(rpmdb rdb, const char * dbhome)
 {
     DB_ENV *dbenv = NULL;
     int rc, xx;
     int retry_open = 2;
+    int lockfd = -1;
+    int rdonly = ((rdb->db_mode & O_ACCMODE) == O_RDONLY);
     struct dbConfig_s * cfg = &rdb->cfg;
     /* This is our setup, thou shall not have other setups before us */
-    uint32_t eflags = (DB_CREATE|DB_INIT_MPOOL|DB_INIT_CDB);
+    uint32_t eflags = (DB_CREATE|DB_INIT_MPOOL|DB_INIT_CDB|DB_PRIVATE);
 
     if (rdb->db_dbenv != NULL) {
        rdb->db_opens++;
        return 0;
+    } else {
+       /* On first call, set backend description to something... */
+       free(rdb->db_descr);
+       rasprintf(&rdb->db_descr, "db%u", DB_VERSION_MAJOR);
     }
 
     /*
@@ -150,6 +440,7 @@ static int db_init(rpmdb rdb, const char * dbhome)
     dbenv->set_alloc(dbenv, rmalloc, rrealloc, NULL);
     dbenv->set_errcall(dbenv, NULL);
     dbenv->set_errpfx(dbenv, _errpfx);
+    dbenv->set_msgcall(dbenv, warnlog);
 
     /* 
      * These enable automatic stale lock removal. 
@@ -175,6 +466,24 @@ static int db_init(rpmdb rdb, const char * dbhome)
        xx = dbapi_err(rdb, "dbenv->set_cachesize", xx, _debug);
     }
 
+    /*
+     * Serialize shared environment open (and clock) via fcntl() lock.
+     * Otherwise we can end up calling dbenv->failchk() while another
+     * process is joining the environment, leading to transient
+     * DB_RUNRECOVER errors. Also prevents races wrt removing the
+     * environment (eg chrooted operation). Silently fall back to
+     * private environment on failure to allow non-privileged queries
+     * to "work", broken as it might be.
+     */
+    if (!(eflags & DB_PRIVATE)) {
+       lockfd = serialize_env(dbhome);
+       if (lockfd < 0 && rdonly) {
+           eflags |= DB_PRIVATE;
+           retry_open--;
+           rpmlog(RPMLOG_DEBUG, "serialize failed, using private dbenv\n");
+       }
+    }
+
     /*
      * Actually open the environment. Fall back to private environment
      * if we dont have permission to join/create shared environment or
@@ -186,7 +495,10 @@ static int db_init(rpmdb rdb, const char * dbhome)
        free(fstr);
 
        rc = (dbenv->open)(dbenv, dbhome, eflags, rdb->db_perms);
-       if ((rc == EACCES || rc == EROFS || rc == EINVAL) && errno == rc) {
+       if (rc == EINVAL && errno == rc) {
+           eflags |= DB_PRIVATE;
+           retry_open--;
+       } else if (rdonly && (rc == EACCES || rc == EROFS || rc == DB_VERSION_MISMATCH)) {
            eflags |= DB_PRIVATE;
            retry_open--;
        } else {
@@ -208,6 +520,8 @@ static int db_init(rpmdb rdb, const char * dbhome)
     rdb->db_dbenv = dbenv;
     rdb->db_opens = 1;
 
+    if (lockfd >= 0)
+       close(lockfd);
     return 0;
 
 errxit:
@@ -216,10 +530,12 @@ errxit:
        xx = dbenv->close(dbenv, 0);
        xx = dbapi_err(rdb, "dbenv->close", xx, _debug);
     }
+    if (lockfd >= 0)
+       close(lockfd);
     return rc;
 }
 
-void dbSetFSync(void *dbenv, int enable)
+static void db3_dbSetFSync(rpmdb rdb, int enable)
 {
 #ifdef HAVE_FDATASYNC
     db_env_set_func_fsync(enable ? fdatasync : fsync_disable);
@@ -228,19 +544,24 @@ void dbSetFSync(void *dbenv, int enable)
 #endif
 }
 
-int dbiSync(dbiIndex dbi, unsigned int flags)
+static int db3_Ctrl(rpmdb rdb, dbCtrlOp ctrl)
+{
+    return 0;
+}
+
+static int dbiSync(dbiIndex dbi, unsigned int flags)
 {
     DB * db = dbi->dbi_db;
     int rc = 0;
 
-    if (db != NULL && !dbi->dbi_no_dbsync) {
+    if (db != NULL && !dbi->cfg.dbi_no_dbsync) {
        rc = db->sync(db, flags);
        rc = cvtdberr(dbi, "db->sync", rc, _debug);
     }
     return rc;
 }
 
-dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags)
+static dbiCursor db3_dbiCursorInit(dbiIndex dbi, unsigned int flags)
 {
     dbiCursor dbc = NULL;
     
@@ -248,33 +569,52 @@ dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags)
        DB * db = dbi->dbi_db;
        DBC * cursor;
        int cflags;
-       int rc;
+       int rc = 0;
        uint32_t eflags = db_envflags(db);
        
        /* DB_WRITECURSOR requires CDB and writable db */
-       if ((flags & DB_WRITECURSOR) &&
-           (eflags & DB_INIT_CDB) && !(dbi->dbi_oflags & DB_RDONLY))
+       if ((flags & DBC_WRITE) &&
+           (eflags & DB_INIT_CDB) && !(dbi->dbi_flags & DBI_RDONLY))
        {
            cflags = DB_WRITECURSOR;
        } else
            cflags = 0;
 
-       rc = db->cursor(db, NULL, &cursor, cflags);
-       rc = cvtdberr(dbi, "db->cursor", rc, _debug);
+       /*
+        * Check for stale locks which could block writes "forever".
+        * XXX: Should we also do this on reads? Reads are less likely
+        *      to get blocked so it seems excessive...
+        * XXX: On DB_RUNRECOVER, we should abort everything. Now
+        *      we'll just fail to open a cursor again and again and again.
+        */
+       if (cflags & DB_WRITECURSOR) {
+           DB_ENV *dbenv = db->get_env(db);
+           rc = dbenv->failchk(dbenv, 0);
+           rc = cvtdberr(dbi, "dbenv->failchk", rc, _debug);
+       }
+
+       if (rc == 0) {
+           rc = db->cursor(db, NULL, &cursor, cflags);
+           rc = cvtdberr(dbi, "db->cursor", rc, _debug);
+       }
 
        if (rc == 0) {
            dbc = xcalloc(1, sizeof(*dbc));
            dbc->cursor = cursor;
            dbc->dbi = dbi;
+           dbc->flags = flags;
        }
     }
 
     return dbc;
 }
 
-dbiCursor dbiCursorFree(dbiCursor dbc)
+static dbiCursor db3_dbiCursorFree(dbiIndex dbi, dbiCursor dbc)
 {
     if (dbc) {
+       /* Automatically sync on write-cursor close */
+       if (dbc->flags & DBC_WRITE)
+           dbiSync(dbc->dbi, 0);
        DBC * cursor = dbc->cursor;
        int rc = cursor->c_close(cursor);
        cvtdberr(dbc->dbi, "dbcursor->c_close", rc, _debug);
@@ -283,7 +623,7 @@ dbiCursor dbiCursorFree(dbiCursor dbc)
     return NULL;
 }
 
-int dbiCursorPut(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags)
+static int dbiCursorPut(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags)
 {
     int rc = EINVAL;
     int sane = (key->data != NULL && key->size > 0 &&
@@ -302,7 +642,7 @@ int dbiCursorPut(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags)
     return rc;
 }
 
-int dbiCursorGet(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags)
+static int dbiCursorGet(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags)
 {
     int rc = EINVAL;
     int sane = ((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
@@ -319,12 +659,21 @@ int dbiCursorGet(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags)
        _printit = (rc == DB_NOTFOUND ? 0 : _debug);
        rc = cvtdberr(dbc->dbi, "dbcursor->c_get", rc, _printit);
 
+       /* Remember the last key fetched */
+       if (rc == 0) {
+           dbc->key = key->data;
+           dbc->keylen = key->size;
+       } else {
+           dbc->key = NULL;
+           dbc->keylen = 0;
+       }
+
        rpmswExit(&rdb->db_getops, data->size);
     }
     return rc;
 }
 
-int dbiCursorDel(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags)
+static int dbiCursorDel(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags)
 {
     int rc = EINVAL;
     int sane = (key->data != NULL && key->size > 0);
@@ -350,23 +699,7 @@ int dbiCursorDel(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags)
     return rc;
 }
 
-unsigned int dbiCursorCount(dbiCursor dbc)
-{
-    db_recno_t count = 0;
-    if (dbc) {
-       DBC * cursor = dbc->cursor;
-       int rc = cursor->c_count(cursor, &count, 0);
-       cvtdberr(dbc->dbi, "dbcursor->c_count", rc, _debug);
-    }
-    return count;
-}
-
-dbiIndex dbiCursorIndex(dbiCursor dbc)
-{
-    return (dbc != NULL) ? dbc->dbi : NULL;
-}
-
-int dbiByteSwapped(dbiIndex dbi)
+static int dbiByteSwapped(dbiIndex dbi)
 {
     DB * db = dbi->dbi_db;
     int rc = 0;
@@ -383,32 +716,7 @@ int dbiByteSwapped(dbiIndex dbi)
     return rc;
 }
 
-dbiIndexType dbiType(dbiIndex dbi)
-{
-    return dbi->dbi_type;
-}
-
-int dbiFlags(dbiIndex dbi)
-{
-    DB *db = dbi->dbi_db;
-    int flags = DBI_NONE;
-    uint32_t oflags = 0;
-
-    if (db && db->get_open_flags(db, &oflags) == 0) {
-       if (oflags & DB_CREATE)
-           flags |= DBI_CREATED;
-       if (oflags & DB_RDONLY)
-           flags |= DBI_RDONLY;
-    }
-    return flags;
-}
-
-const char * dbiName(dbiIndex dbi)
-{
-    return dbi->dbi_file;
-}
-
-int dbiVerify(dbiIndex dbi, unsigned int flags)
+static int db3_dbiVerify(dbiIndex dbi, unsigned int flags)
 {
     int rc = 0;
 
@@ -426,9 +734,7 @@ int dbiVerify(dbiIndex dbi, unsigned int flags)
     return rc;
 }
 
-static int _lockdbfd = 0;
-
-int dbiClose(dbiIndex dbi, unsigned int flags)
+static int db3_dbiClose(dbiIndex dbi, unsigned int flags)
 {
     rpmdb rdb = dbi->dbi_rpmdb;
     const char * dbhome = rpmdbHome(rdb);
@@ -445,8 +751,6 @@ int dbiClose(dbiIndex dbi, unsigned int flags)
 
        rpmlog(RPMLOG_DEBUG, "closed   db index       %s/%s\n",
                dbhome, dbi->dbi_file);
-       if (dbi->dbi_lockdbfd && _lockdbfd)
-           _lockdbfd--;
     }
 
     db_fini(rdb, dbhome ? dbhome : "");
@@ -486,7 +790,6 @@ static int dbiFlock(dbiIndex dbi, int mode)
        rc = 1;
     } else {
        const char *dbhome = rpmdbHome(dbi->dbi_rpmdb);
-       int tries;
        struct flock l;
        memset(&l, 0, sizeof(l));
        l.l_whence = 0;
@@ -496,44 +799,26 @@ static int dbiFlock(dbiIndex dbi, int mode)
                    ? F_RDLCK : F_WRLCK;
        l.l_pid = 0;
 
-       for (tries = 0; ; tries++) {
-           rc = fcntl(fdno, F_SETLK, (void *) &l);
-           if (rc) {
-               uint32_t eflags = db_envflags(db);
-               /* Warning iff using non-private CDB locking. */
-               rc = (((eflags & DB_INIT_CDB) && !(eflags & DB_PRIVATE)) ? 0 : 1);
-               if (errno == EAGAIN && rc) {
-                   struct timespec ts;
-                   if (tries == 0)
-                       rpmlog(RPMLOG_WARNING,
-                               _("waiting for %s lock on %s/%s\n"),
-                               ((mode & O_ACCMODE) == O_RDONLY)
-                                       ? _("shared") : _("exclusive"),
-                               dbhome, dbi->dbi_file);
-                   ts.tv_sec = (time_t)0;
-                   ts.tv_nsec = 100000000;     /* .1 seconds */
-                   if (tries < 10*60*3) {      /* 3 minutes */
-                       nanosleep(&ts, (struct timespec *)0);
-                       continue;
-                   }
-               }
-               rpmlog( (rc ? RPMLOG_ERR : RPMLOG_WARNING),
-                       _("cannot get %s lock on %s/%s\n"),
-                       ((mode & O_ACCMODE) == O_RDONLY)
-                               ? _("shared") : _("exclusive"),
-                       dbhome, dbi->dbi_file);
-           } else {
-               rpmlog(RPMLOG_DEBUG,
-                       "locked   db index       %s/%s\n",
-                       dbhome, dbi->dbi_file);
-           }
-           break;
+       rc = fcntl(fdno, F_SETLK, (void *) &l);
+       if (rc) {
+           uint32_t eflags = db_envflags(db);
+           /* Warning iff using non-private CDB locking. */
+           rc = (((eflags & DB_INIT_CDB) && !(eflags & DB_PRIVATE)) ? 0 : 1);
+           rpmlog( (rc ? RPMLOG_ERR : RPMLOG_WARNING),
+                   _("cannot get %s lock on %s/%s\n"),
+                   ((mode & O_ACCMODE) == O_RDONLY)
+                           ? _("shared") : _("exclusive"),
+                   dbhome, dbi->dbi_file);
+       } else {
+           rpmlog(RPMLOG_DEBUG,
+                   "locked   db index       %s/%s\n",
+                   dbhome, dbi->dbi_file);
        }
     }
     return rc;
 }
 
-int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
+static int db3_dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
 {
     const char *dbhome = rpmdbHome(rdb);
     dbiIndex dbi = NULL;
@@ -544,22 +829,25 @@ int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
     DB * db = NULL;
     DBTYPE dbtype = DB_UNKNOWN;
     uint32_t oflags;
+    static int _lockdbfd = 0;
 
     if (dbip)
        *dbip = NULL;
 
-    /*
-     * Parse db configuration parameters.
-     */
     if ((dbi = dbiNew(rdb, rpmtag)) == NULL)
        return 1;
 
-    oflags = dbi->dbi_oflags;
+    /*
+     * Parse db configuration parameters.
+     */
+    dbConfigure(rpmtag, rdb->db_dbenv == NULL ? &rdb->cfg : NULL, &dbi->cfg);
 
     /*
      * Map open mode flags onto configured database/environment flags.
      */
-    if ((rdb->db_mode & O_ACCMODE) == O_RDONLY) oflags |= DB_RDONLY;
+    oflags = dbi->cfg.dbi_oflags;
+    if ((rdb->db_mode & O_ACCMODE) == O_RDONLY)
+       oflags |= DB_RDONLY;
 
     rc = db_init(rdb, dbhome);
 
@@ -587,7 +875,7 @@ int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
            if (rc == ENOENT) {
                oflags |= DB_CREATE;
                oflags &= ~DB_RDONLY;
-               dbtype = (dbiType(dbi) == DBI_PRIMARY) ?  DB_HASH : DB_BTREE;
+               dbtype = (rpmtag == RPMDBI_PACKAGES) ?  DB_HASH : DB_BTREE;
                retry_open--;
            } else {
                retry_open = 0;
@@ -615,12 +903,14 @@ int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
     }
 
     dbi->dbi_db = db;
-    dbi->dbi_oflags = oflags;
 
-    if (verifyonly)
-       dbi->dbi_lockdbfd = 0;  /* disable locking in verify mode */
+    dbi->dbi_flags = 0;
+    if (oflags & DB_CREATE)
+       dbi->dbi_flags |= DBI_CREATED;
+    if (oflags & DB_RDONLY)
+       dbi->dbi_flags |= DBI_RDONLY;
 
-    if (rc == 0 && dbi->dbi_lockdbfd && _lockdbfd++ == 0) {
+    if (!verifyonly && rc == 0 && dbi->cfg.dbi_lockdbfd && _lockdbfd++ == 0) {
        rc = dbiFlock(dbi, rdb->db_mode);
     }
 
@@ -633,58 +923,456 @@ int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
     return rc;
 }
 
-int dbiSuspendDBLock(dbiIndex dbi, unsigned int flags)
+/**
+ * Convert retrieved data to index set.
+ * @param dbi          index database handle
+ * @param data         retrieved data
+ * @retval setp                (malloc'ed) index set
+ * @return             0 on success
+ */
+static int dbt2set(dbiIndex dbi, DBT * data, dbiIndexSet * setp)
 {
-    struct flock l;
-    int rc = 0;
-    int fdno = -1;
+    int _dbbyteswapped = dbiByteSwapped(dbi);
+    const char * sdbir;
+    dbiIndexSet set;
+    unsigned int i;
 
-    if (!dbi->dbi_lockdbfd)
-       return 0;
-    if (!(dbi->dbi_rpmdb->db_mode & (O_RDWR|O_WRONLY)))
+    if (dbi == NULL || data == NULL || setp == NULL)
+       return -1;
+
+    if ((sdbir = data->data) == NULL) {
+       *setp = NULL;
        return 0;
-    if (_lockdbfd == 0)
+    }
+
+    set = dbiIndexSetNew(data->size / (2 * sizeof(int32_t)));
+    set->count = data->size / (2 * sizeof(int32_t));
+
+    for (i = 0; i < set->count; i++) {
+       union _dbswap hdrNum, tagNum;
+
+       memcpy(&hdrNum.ui, sdbir, sizeof(hdrNum.ui));
+       sdbir += sizeof(hdrNum.ui);
+       memcpy(&tagNum.ui, sdbir, sizeof(tagNum.ui));
+       sdbir += sizeof(tagNum.ui);
+       if (_dbbyteswapped) {
+           _DBSWAP(hdrNum);
+           _DBSWAP(tagNum);
+       }
+       set->recs[i].hdrNum = hdrNum.ui;
+       set->recs[i].tagNum = tagNum.ui;
+    }
+    *setp = set;
+    return 0;
+}
+
+/**
+ * Convert index set to database representation.
+ * @param dbi          index database handle
+ * @param data         retrieved data
+ * @param set          index set
+ * @return             0 on success
+ */
+static int set2dbt(dbiIndex dbi, DBT * data, dbiIndexSet set)
+{
+    int _dbbyteswapped = dbiByteSwapped(dbi);
+    char * tdbir;
+    unsigned int i;
+
+    if (dbi == NULL || data == NULL || set == NULL)
+       return -1;
+
+    data->size = set->count * (2 * sizeof(int32_t));
+    if (data->size == 0) {
+       data->data = NULL;
        return 0;
-    if (!(dbi->dbi_db->fd(dbi->dbi_db, &fdno) == 0 && fdno >= 0))
-       return 1;
-    memset(&l, 0, sizeof(l));
-    l.l_whence = 0;
-    l.l_start = 0;
-    l.l_len = 0;
-    l.l_type = F_RDLCK;
-    rc = fcntl(fdno, F_SETLK, (void *)&l);
+    }
+    tdbir = data->data = xmalloc(data->size);
+
+    for (i = 0; i < set->count; i++) {
+       union _dbswap hdrNum, tagNum;
+
+       memset(&hdrNum, 0, sizeof(hdrNum));
+       memset(&tagNum, 0, sizeof(tagNum));
+       hdrNum.ui = set->recs[i].hdrNum;
+       tagNum.ui = set->recs[i].tagNum;
+       if (_dbbyteswapped) {
+           _DBSWAP(hdrNum);
+           _DBSWAP(tagNum);
+       }
+       memcpy(tdbir, &hdrNum.ui, sizeof(hdrNum.ui));
+       tdbir += sizeof(hdrNum.ui);
+       memcpy(tdbir, &tagNum.ui, sizeof(tagNum.ui));
+       tdbir += sizeof(tagNum.ui);
+    }
+    return 0;
+}
+
+static rpmRC db3_idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+                         dbiIndexSet *set, int searchType)
+{
+    rpmRC rc = RPMRC_FAIL; /* assume failure */
+    if (dbi != NULL && dbc != NULL && set != NULL) {
+       int cflags = DB_NEXT;
+       int dbrc;
+       DBT data, key;
+       memset(&data, 0, sizeof(data));
+       memset(&key, 0, sizeof(key));
+
+       if (keyp) {
+           if (keylen == 0) {          /* XXX "/" fixup */ 
+               keyp = "";
+               keylen = 1;
+           }
+           key.data = (void *) keyp; /* discards const */
+           key.size = keylen;
+           cflags = searchType == DBC_PREFIX_SEARCH ? DB_SET_RANGE : DB_SET;
+       }
+
+       for (;;) {
+           dbiIndexSet newset = NULL;
+           dbrc = dbiCursorGet(dbc, &key, &data, cflags);
+           if (dbrc != 0)
+               break;
+           if (searchType == DBC_PREFIX_SEARCH &&
+                   (key.size < keylen || memcmp(key.data, keyp, keylen) != 0))
+               break;
+           dbt2set(dbi, &data, &newset);
+           if (*set == NULL) {
+               *set = newset;
+           } else {
+               dbiIndexSetAppendSet(*set, newset, 0);
+               dbiIndexSetFree(newset);
+           }
+           if (searchType != DBC_PREFIX_SEARCH)
+               break;
+           key.data = NULL;
+           key.size = 0;
+           cflags = DB_NEXT;
+       }
+
+       /* fixup result status for prefix search */
+       if (searchType == DBC_PREFIX_SEARCH) {
+           if (dbrc == DB_NOTFOUND && *set != NULL && (*set)->count > 0)
+               dbrc = 0;
+           else if (dbrc == 0 && (*set == NULL || (*set)->count == 0))
+               dbrc = DB_NOTFOUND;
+       }
+
+       if (dbrc == 0) {
+           rc = RPMRC_OK;
+       } else if (dbrc == DB_NOTFOUND) {
+           rc = RPMRC_NOTFOUND;
+       } else {
+           rpmlog(RPMLOG_ERR,
+                  _("error(%d) getting \"%s\" records from %s index: %s\n"),
+                  dbrc, keyp ? keyp : "???", dbiName(dbi), db_strerror(dbrc));
+       }
+    }
+    return rc;
+}
+
+/* Update secondary index. NULL set deletes the key */
+static rpmRC updateIndex(dbiCursor dbc, const char *keyp, unsigned int keylen,
+                        dbiIndexSet set)
+{
+    rpmRC rc = RPMRC_FAIL;
+
+    if (dbc && keyp) {
+       dbiIndex dbi = dbc->dbi;
+       int dbrc;
+       DBT data, key;
+       memset(&key, 0, sizeof(data));
+       memset(&data, 0, sizeof(data));
+
+       key.data = (void *) keyp; /* discards const */
+       key.size = keylen;
+
+       if (set)
+           set2dbt(dbi, &data, set);
+
+       if (dbiIndexSetCount(set) > 0) {
+           dbrc = dbiCursorPut(dbc, &key, &data, DB_KEYLAST);
+           if (dbrc) {
+               rpmlog(RPMLOG_ERR,
+                      _("error(%d) storing record \"%s\" into %s\n"),
+                      dbrc, (char*)key.data, dbiName(dbi));
+           }
+           free(data.data);
+       } else {
+           dbrc = dbiCursorDel(dbc, &key, &data, 0);
+           if (dbrc) {
+               rpmlog(RPMLOG_ERR,
+                      _("error(%d) removing record \"%s\" from %s\n"),
+                      dbrc, (char*)key.data, dbiName(dbi));
+           }
+       }
+
+       if (dbrc == 0)
+           rc = RPMRC_OK;
+    }
+
+    return rc;
+}
+
+static rpmRC db3_idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+              dbiIndexItem rec)
+{
+    dbiIndexSet set = NULL;
+    rpmRC rc;
+
+    if (keyp && keylen == 0) {         /* XXX "/" fixup */
+       keyp = "";
+       keylen++;
+    }
+    rc = idxdbGet(dbi, dbc, keyp, keylen, &set, DBC_NORMAL_SEARCH);
+
+    /* Not found means a new key and is not an error. */
+    if (rc && rc != RPMRC_NOTFOUND)
+       return rc;
+
+    if (set == NULL)
+       set = dbiIndexSetNew(1);
+    dbiIndexSetAppend(set, rec, 1, 0);
+
+    rc = updateIndex(dbc, keyp, keylen, set);
+
+    dbiIndexSetFree(set);
+    return rc;
+}
+
+static rpmRC db3_idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+              dbiIndexItem rec)
+{
+    dbiIndexSet set = NULL;
+    rpmRC rc;
+
+    if (keyp && keylen == 0) {         /* XXX "/" fixup */
+       keyp = "";
+       keylen++;
+    }
+    rc = idxdbGet(dbi, dbc, keyp, keylen, &set, DBC_NORMAL_SEARCH);
     if (rc)
-       rpmlog(RPMLOG_WARNING, _("could not suspend database lock\n"));
+       return rc;
+
+    if (dbiIndexSetPrune(set, rec, 1, 1)) {
+       /* Nothing was pruned. XXX: Can this actually happen? */
+       rc = RPMRC_OK;
+    } else {
+       /* If there's data left, update data. Otherwise delete the key. */
+       if (dbiIndexSetCount(set) > 0) {
+           rc = updateIndex(dbc, keyp, keylen, set);
+       } else {
+           rc = updateIndex(dbc, keyp, keylen, NULL);
+       }
+    };
+    dbiIndexSetFree(set);
+
     return rc;
 }
 
-int dbiResumeDBLock(dbiIndex dbi, unsigned int flags)
+static const void * db3_idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen)
 {
-    struct flock l;
+    const void *key = NULL;
+    if (dbc) {
+       key = dbc->key;
+       if (key && keylen)
+           *keylen = dbc->keylen;
+    }
+    return key;
+}
+
+
+/* Update primary Packages index. NULL hdr means remove */
+static rpmRC updatePackages(dbiCursor dbc, unsigned int hdrNum, DBT *hdr)
+{
+    union _dbswap mi_offset;
     int rc = 0;
-    int tries;
-    int fdno = -1;
+    DBT key;
 
-    if (!dbi->dbi_lockdbfd)
-       return 0;
-    if (!(dbi->dbi_rpmdb->db_mode & (O_RDWR|O_WRONLY)))
-       return 0;
-    if (_lockdbfd == 0)
-       return 0;
-    if (!(dbi->dbi_db->fd(dbi->dbi_db, &fdno) == 0 && fdno >= 0))
-       return 1;
-    for (tries = 0; tries < 2; tries++) {
-       memset(&l, 0, sizeof(l));
-       l.l_whence = 0;
-       l.l_start = 0;
-       l.l_len = 0;
-       l.l_type = F_WRLCK;
-       rc = fcntl(fdno, tries ? F_SETLKW : F_SETLK, (void *)&l);
-       if (!rc)
-           break;
-       if (tries == 0)
-           rpmlog(RPMLOG_WARNING, _("waiting to reestablish exclusive database lock\n"));
+    if (dbc == NULL || hdrNum == 0)
+       return RPMRC_FAIL;
+
+    memset(&key, 0, sizeof(key));
+
+    mi_offset.ui = hdrNum;
+    if (dbiByteSwapped(dbc->dbi) == 1)
+       _DBSWAP(mi_offset);
+    key.data = (void *) &mi_offset;
+    key.size = sizeof(mi_offset.ui);
+
+    if (hdr) {
+       rc = dbiCursorPut(dbc, &key, hdr, DB_KEYLAST);
+       if (rc) {
+           rpmlog(RPMLOG_ERR,
+                  _("error(%d) adding header #%d record\n"), rc, hdrNum);
+       }
+    } else {
+       DBT data;
+
+       memset(&data, 0, sizeof(data));
+       rc = dbiCursorGet(dbc, &key, &data, DB_SET);
+       if (rc) {
+           rpmlog(RPMLOG_ERR,
+                  _("error(%d) removing header #%d record\n"), rc, hdrNum);
+       } else
+           rc = dbiCursorDel(dbc, &key, &data, 0);
     }
-    return rc;
+
+    return rc == 0 ? RPMRC_OK : RPMRC_FAIL;
 }
 
+/* Get current header instance number or try to allocate a new one */
+static unsigned int pkgInstance(dbiIndex dbi, int alloc)
+{
+    unsigned int hdrNum = 0;
+
+    if (dbi != NULL && dbi->dbi_type == DBI_PRIMARY) {
+       dbiCursor dbc;
+       DBT key, data;
+       unsigned int firstkey = 0;
+       union _dbswap mi_offset;
+       int ret;
+
+       memset(&key, 0, sizeof(key));
+       memset(&data, 0, sizeof(data));
+
+       dbc = dbiCursorInit(dbi, alloc ? DBC_WRITE : 0);
+
+       /* Key 0 holds the current largest instance, fetch it */
+       key.data = &firstkey;
+       key.size = sizeof(firstkey);
+       ret = dbiCursorGet(dbc, &key, &data, DB_SET);
+
+       if (ret == 0 && data.data) {
+           memcpy(&mi_offset, data.data, sizeof(mi_offset.ui));
+           if (dbiByteSwapped(dbi) == 1)
+               _DBSWAP(mi_offset);
+           hdrNum = mi_offset.ui;
+       }
+
+       if (alloc) {
+           /* Rather complicated "increment by one", bswapping as needed */
+           ++hdrNum;
+           mi_offset.ui = hdrNum;
+           if (dbiByteSwapped(dbi) == 1)
+               _DBSWAP(mi_offset);
+           if (ret == 0 && data.data) {
+               memcpy(data.data, &mi_offset, sizeof(mi_offset.ui));
+           } else {
+               data.data = &mi_offset;
+               data.size = sizeof(mi_offset.ui);
+           }
+
+           /* Unless we manage to insert the new instance number, we failed */
+           ret = dbiCursorPut(dbc, &key, &data, DB_KEYLAST);
+           if (ret) {
+               hdrNum = 0;
+               rpmlog(RPMLOG_ERR,
+                   _("error(%d) allocating new package instance\n"), ret);
+           }
+       }
+       dbiCursorFree(dbi, dbc);
+    }
+    
+    return hdrNum;
+}
+
+static rpmRC db3_pkgdbPut(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum,
+               unsigned char *hdrBlob, unsigned int hdrLen)
+{
+    DBT hdr;
+    memset(&hdr, 0, sizeof(hdr));
+    hdr.data = hdrBlob;
+    hdr.size = hdrLen;
+    return updatePackages(dbc, hdrNum, &hdr);
+}
+
+static rpmRC db3_pkgdbDel(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum)
+{
+    return updatePackages(dbc, hdrNum, NULL);
+}
+
+static rpmRC db3_pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum,
+            unsigned char **hdrBlob, unsigned int *hdrLen)
+{
+    DBT key, data;
+    union _dbswap mi_offset;
+    int rc;
+
+    if (dbc == NULL)
+       return RPMRC_FAIL;
+
+    memset(&key, 0, sizeof(key));
+    memset(&data, 0, sizeof(data));
+
+    if (hdrNum) {
+       mi_offset.ui = hdrNum;
+       if (dbiByteSwapped(dbc->dbi) == 1)
+           _DBSWAP(mi_offset);
+       key.data = (void *) &mi_offset;
+       key.size = sizeof(mi_offset.ui);
+    }
+
+#if !defined(_USE_COPY_LOAD)
+    data.flags |= DB_DBT_MALLOC;
+#endif
+    rc = dbiCursorGet(dbc, &key, &data, hdrNum ? DB_SET : DB_NEXT);
+    if (rc == 0) {
+       if (hdrBlob)
+           *hdrBlob = data.data;
+       if (hdrLen)
+           *hdrLen = data.size;
+       return RPMRC_OK;
+    } else if (rc == DB_NOTFOUND)
+       return RPMRC_NOTFOUND;
+    else
+       return RPMRC_FAIL;
+}
+
+static unsigned int db3_pkgdbKey(dbiIndex dbi, dbiCursor dbc)
+{
+    union _dbswap mi_offset;
+
+    if (dbc == NULL || dbc->key == NULL)
+       return 0;
+    memcpy(&mi_offset, dbc->key, sizeof(mi_offset.ui));
+    if (dbiByteSwapped(dbc->dbi) == 1)
+       _DBSWAP(mi_offset);
+    return mi_offset.ui;
+}
+
+static rpmRC db3_pkgdbNew(dbiIndex dbi, dbiCursor dbc, unsigned int *hdrNum)
+{
+    unsigned int num;
+    if (dbc == NULL)
+       return RPMRC_FAIL;
+    num = pkgInstance(dbc->dbi, 1);
+    if (!num)
+       return RPMRC_FAIL;
+    *hdrNum = num;
+    return RPMRC_OK;
+}
+
+struct rpmdbOps_s db3_dbops = {
+    .open   = db3_dbiOpen,
+    .close  = db3_dbiClose,
+    .verify = db3_dbiVerify,
+
+    .setFSync = db3_dbSetFSync,
+    .ctrl = db3_Ctrl,
+
+    .cursorInit = db3_dbiCursorInit,
+    .cursorFree = db3_dbiCursorFree,
+
+    .pkgdbGet = db3_pkgdbGet,
+    .pkgdbPut = db3_pkgdbPut,
+    .pkgdbDel = db3_pkgdbDel,
+    .pkgdbNew = db3_pkgdbNew,
+    .pkgdbKey = db3_pkgdbKey,
+
+    .idxdbGet = db3_idxdbGet,
+    .idxdbPut = db3_idxdbPut,
+    .idxdbDel = db3_idxdbDel,
+    .idxdbKey = db3_idxdbKey
+};
index 446be13f92568f8448079f2c99996f8afa061030..fe7c01e81465e33258b54fb6f5f78fecb7c3f832 100644 (file)
@@ -71,10 +71,8 @@ static const struct poptOption rdbOptions[] = {
        NULL, NULL },
  { "lockdbfd", 0,POPT_ARG_NONE,        &staticdbi.dbi_lockdbfd, 0,
        NULL, NULL },
-#ifndef WITH_EXTERNAL_DB
  { "nofsync",  0,POPT_BIT_SET,         &staticdbi.dbi_oflags, DB_NOFSYNC,
        NULL, NULL },
-#endif
 
     POPT_TABLEEND
 };
diff --git a/lib/backend/dbi.c b/lib/backend/dbi.c
new file mode 100644 (file)
index 0000000..e99a5f2
--- /dev/null
@@ -0,0 +1,184 @@
+/** \ingroup rpmdb
+ * \file lib/dbi.c
+ */
+
+#include "system.h"
+
+#include <stdlib.h>
+#include <rpm/rpmtypes.h>
+#include <rpm/rpmstring.h>
+#include <rpm/rpmmacro.h>
+#include <rpm/rpmlog.h>
+#include "lib/rpmdb_internal.h"
+#include "debug.h"
+
+
+dbiIndex dbiFree(dbiIndex dbi)
+{
+    if (dbi) {
+       free(dbi);
+    }
+    return NULL;
+}
+
+dbiIndex dbiNew(rpmdb rdb, rpmDbiTagVal rpmtag)
+{
+    dbiIndex dbi = xcalloc(1, sizeof(*dbi));
+    /* FIX: figger lib/dbi refcounts */
+    dbi->dbi_rpmdb = rdb;
+    dbi->dbi_file = rpmTagGetName(rpmtag);
+    dbi->dbi_type = (rpmtag == RPMDBI_PACKAGES) ? DBI_PRIMARY : DBI_SECONDARY;
+    dbi->dbi_byteswapped = -1; /* -1 unknown, 0 native order, 1 alien order */
+    return dbi;
+}
+
+static void
+dbDetectBackend(rpmdb rdb)
+{
+    const char *dbhome = rpmdbHome(rdb);
+    char *db_backend = rpmExpand("%{?_db_backend}", NULL);
+    char *path = NULL;
+
+#if defined(WITH_LMDB)
+    if (!strcmp(db_backend, "lmdb")) {
+       rdb->db_ops = &lmdb_dbops;
+    } else
+#endif
+#ifdef ENABLE_NDB
+    if (!strcmp(db_backend, "ndb")) {
+       rdb->db_ops = &ndb_dbops;
+    } else
+#endif
+    {
+       rdb->db_ops = &db3_dbops;
+       if (*db_backend == '\0') {
+           free(db_backend);
+           db_backend = xstrdup("bdb");
+       }
+    }
+
+#if defined(WITH_LMDB)
+    path = rstrscat(NULL, dbhome, "/data.mdb", NULL);
+    if (access(path, F_OK) == 0 && rdb->db_ops != &lmdb_dbops) {
+       rdb->db_ops = &lmdb_dbops;
+       rpmlog(RPMLOG_WARNING, _("Found LMDB data.mdb database while attempting %s backend: using lmdb backend.\n"), db_backend);
+    }
+    free(path);
+#endif
+
+#ifdef ENABLE_NDB
+    path = rstrscat(NULL, dbhome, "/Packages.db", NULL);
+    if (access(path, F_OK) == 0 && rdb->db_ops != &ndb_dbops) {
+       rdb->db_ops = &ndb_dbops;
+       rpmlog(RPMLOG_WARNING, _("Found NDB Packages.db database while attempting %s backend: using ndb backend.\n"), db_backend);
+    }
+    free(path);
+#endif
+
+    path = rstrscat(NULL, dbhome, "/Packages", NULL);
+    if (access(path, F_OK) == 0 && rdb->db_ops != &db3_dbops) {
+       rdb->db_ops = &db3_dbops;
+       rpmlog(RPMLOG_WARNING, _("Found BDB Packages database while attempting %s backend: using bdb backend.\n"), db_backend);
+    }
+    free(path);
+
+    if (db_backend)
+       free(db_backend);
+}
+
+const char * dbiName(dbiIndex dbi)
+{
+    return dbi->dbi_file;
+}
+
+int dbiFlags(dbiIndex dbi)
+{
+    return dbi->dbi_flags;
+}
+
+void dbSetFSync(rpmdb rdb, int enable)
+{
+    if (!rdb->db_ops)
+       dbDetectBackend(rdb);
+    rdb->db_ops->setFSync(rdb, enable);
+}
+
+int dbCtrl(rpmdb rdb, dbCtrlOp ctrl)
+{
+    if (!rdb->db_ops)
+       dbDetectBackend(rdb);
+    return rdb->db_ops->ctrl(rdb, ctrl);
+}
+
+int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
+{
+    if (!rdb->db_ops)
+       dbDetectBackend(rdb);
+    return rdb->db_ops->open(rdb, rpmtag, dbip, flags);
+}
+
+int dbiClose(dbiIndex dbi, unsigned int flags)
+{
+    return dbi ? dbi->dbi_rpmdb->db_ops->close(dbi, flags) : 0;
+}
+
+int dbiVerify(dbiIndex dbi, unsigned int flags)
+{
+    return dbi->dbi_rpmdb->db_ops->verify(dbi, flags);
+}
+
+dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags)
+{
+    return dbi->dbi_rpmdb->db_ops->cursorInit(dbi, flags);
+}
+
+dbiCursor dbiCursorFree(dbiIndex dbi, dbiCursor dbc)
+{
+    return dbi->dbi_rpmdb->db_ops->cursorFree(dbi, dbc);
+}
+
+rpmRC pkgdbPut(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char *hdrBlob, unsigned int hdrLen)
+{
+    return dbi->dbi_rpmdb->db_ops->pkgdbPut(dbi, dbc, hdrNum, hdrBlob, hdrLen);
+}
+
+rpmRC pkgdbDel(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum)
+{
+    return dbi->dbi_rpmdb->db_ops->pkgdbDel(dbi, dbc, hdrNum);
+}
+
+rpmRC pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char **hdrBlob, unsigned int *hdrLen)
+{
+    return dbi->dbi_rpmdb->db_ops->pkgdbGet(dbi, dbc, hdrNum, hdrBlob, hdrLen);
+}
+
+rpmRC pkgdbNew(dbiIndex dbi, dbiCursor dbc,  unsigned int *hdrNum)
+{
+    return dbi->dbi_rpmdb->db_ops->pkgdbNew(dbi, dbc, hdrNum);
+}
+
+unsigned int pkgdbKey(dbiIndex dbi, dbiCursor dbc)
+{
+    return dbi->dbi_rpmdb->db_ops->pkgdbKey(dbi, dbc);
+}
+
+rpmRC idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexSet *set, int curFlags)
+{
+    return dbi->dbi_rpmdb->db_ops->idxdbGet(dbi, dbc, keyp, keylen, set, curFlags);
+}
+
+rpmRC idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec)
+{
+    return dbi->dbi_rpmdb->db_ops->idxdbPut(dbi, dbc, keyp, keylen, rec);
+}
+
+rpmRC idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec)
+{
+    return dbi->dbi_rpmdb->db_ops->idxdbDel(dbi, dbc, keyp, keylen, rec);
+}
+
+const void * idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen)
+{
+    return dbi->dbi_rpmdb->db_ops->idxdbKey(dbi, dbc, keylen);
+}
+
index 3d848a8a08c1f4082782fe20be13b6de0e12e20d..1833da2633f45818bb2425e106d8cd1598a7ee48 100644 (file)
@@ -1,12 +1,25 @@
 #ifndef _DBI_H
 #define _DBI_H
 
+#include "dbiset.h"
+
+/* XXX: make this backend-specific, eliminate or something... */
+#define        _USE_COPY_LOAD
+
 enum rpmdbFlags {
     RPMDB_FLAG_JUSTCHECK       = (1 << 0),
     RPMDB_FLAG_REBUILD         = (1 << 1),
     RPMDB_FLAG_VERIFYONLY      = (1 << 2),
 };
 
+typedef enum dbCtrlOp_e {
+    DB_CTRL_LOCK_RO            = 1,
+    DB_CTRL_UNLOCK_RO          = 2,
+    DB_CTRL_LOCK_RW            = 3,
+    DB_CTRL_UNLOCK_RW          = 4,
+    DB_CTRL_INDEXSYNC          = 5
+} dbCtrlOp;
+
 typedef struct dbiIndex_s * dbiIndex;
 typedef struct dbiCursor_s * dbiCursor;
 
@@ -15,8 +28,17 @@ struct dbConfig_s {
     int        db_cachesize;   /*!< (128Kb) */
     int        db_verbose;
     int        db_no_fsync;    /*!< no-op fsync for db */
+    int db_eflags;     /*!< obsolete */
+};
+
+struct dbiConfig_s {
+    int        dbi_oflags;             /*!< open flags */
+    int        dbi_no_dbsync;          /*!< don't call dbiSync */
+    int        dbi_lockdbfd;           /*!< do fcntl lock on db fd */
 };
 
+struct rpmdbOps_s;
+
 /** \ingroup rpmdb
  * Describes the collection of index databases used by rpm.
  */
@@ -27,16 +49,20 @@ struct rpmdb_s {
     int                db_flags;
     int                db_mode;        /*!< open mode */
     int                db_perms;       /*!< open permissions */
-    int                db_ver;         /*!< Berkeley DB version */
+    char       * db_descr;     /*!< db backend description (for error msgs) */
     struct dbChk_s * db_checked;/*!< headerCheck()'ed package instances */
     rpmdb      db_next;
     int                db_opens;
+    dbiIndex   db_pkgs;        /*!< Package db */
+    const rpmDbiTag * db_tags;
     int                db_ndbi;        /*!< No. of tag indices. */
-    dbiIndex * _dbi;           /*!< Tag indices. */
+    dbiIndex   * db_indexes;   /*!< Tag indices. */
     int                db_buildindex;  /*!< Index rebuild indicator */
 
+    struct rpmdbOps_s * db_ops;        /*!< backend ops */
+
     /* dbenv and related parameters */
-    void * db_dbenv;           /*!< Berkeley DB_ENV handle. */
+    void * db_dbenv;           /*!< Backend private handle */
     struct dbConfig_s cfg;
     int db_remove_env;
 
@@ -59,24 +85,44 @@ enum dbiFlags_e {
     DBI_RDONLY         = (1 << 1),
 };
 
+enum dbcFlags_e {
+    DBC_READ   = 0,
+    DBC_WRITE  = (1 << 0),
+};
+
+enum dbcSearchType_e {
+    DBC_NORMAL_SEARCH   = 0,
+    DBC_PREFIX_SEARCH   = (1 << 0),
+};
+
 /** \ingroup dbi
  * Describes an index database (implemented on Berkeley db functionality).
  */
 struct dbiIndex_s {
+    rpmdb dbi_rpmdb;           /*!< the parent rpm database */
+    dbiIndexType dbi_type;     /*! Type of dbi (primary / index) */
     const char * dbi_file;     /*!< file component of path */
-
-    int        dbi_oflags;             /*!< db->open flags */
-    int        dbi_permit_dups;        /*!< permit duplicate entries? */
-    int        dbi_no_dbsync;          /*!< don't call dbiSync */
-    int        dbi_lockdbfd;           /*!< do fcntl lock on db fd */
+    int dbi_flags;
     int        dbi_byteswapped;
 
-    rpmdb dbi_rpmdb;           /*!< the parent rpm database */
-    dbiIndexType dbi_type;     /*! Type of dbi (primary / index) */
+    struct dbiConfig_s cfg;
+
+    void * dbi_db;             /*!< Backend private handle */
+};
 
-    DB * dbi_db;               /*!< Berkeley DB * handle */
+union _dbswap {
+    unsigned int ui;
+    unsigned char uc[4];
 };
 
+#define        _DBSWAP(_a) \
+\
+  { unsigned char _b, *_c = (_a).uc; \
+    _b = _c[3]; _c[3] = _c[0]; _c[0] = _b; \
+    _b = _c[2]; _c[2] = _c[1]; _c[1] = _b; \
+\
+  }
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -102,7 +148,10 @@ int dbiResumeDBLock(dbiIndex dbi, unsigned int flags);
 
 RPM_GNUC_INTERNAL
 /* Globally enable/disable fsync in the backend */
-void dbSetFSync(void *dbenv, int enable);
+void dbSetFSync(rpmdb rdb, int enable);
+
+RPM_GNUC_INTERNAL
+int dbCtrl(rpmdb rdb, dbCtrlOp ctrl);
 
 /** \ingroup dbi
  * Return new configured index database handle instance.
@@ -121,15 +170,6 @@ dbiIndex dbiNew(rpmdb rdb, rpmDbiTagVal rpmtag);
 RPM_GNUC_INTERNAL
 dbiIndex dbiFree( dbiIndex dbi);
 
-/** \ingroup dbi
- * Format dbi open flags for debugging print.
- * @param dbflags              db open flags
- * @param print_dbenv_flags    format db env flags instead?
- * @return                     formatted flags (malloced)
- */
-RPM_GNUC_INTERNAL
-char * prDbiOpenFlags(int dbflags, int print_dbenv_flags);
-
 /** \ingroup dbi
  * Actually open the database of the index.
  * @param db           rpm database
@@ -150,15 +190,6 @@ int dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags);
 RPM_GNUC_INTERNAL
 int dbiClose(dbiIndex dbi, unsigned int flags);
 
-/** \ingroup dbi
- * Flush pending operations to disk.
- * @param dbi          index database handle
- * @param flags                (unused)
- * @return             0 on success
- */
-RPM_GNUC_INTERNAL
-int dbiSync (dbiIndex dbi, unsigned int flags);
-
 /** \ingroup dbi
  * Verify (and close) index database.
  * @param dbi          index database handle
@@ -168,22 +199,6 @@ int dbiSync (dbiIndex dbi, unsigned int flags);
 RPM_GNUC_INTERNAL
 int dbiVerify(dbiIndex dbi, unsigned int flags);
 
-/** \ingroup dbi
- * Is database byte swapped?
- * @param dbi          index database handle
- * @return             0 same order, 1 swapped order
- */
-RPM_GNUC_INTERNAL
-int dbiByteSwapped(dbiIndex dbi);
-
-/** \ingroup dbi
- * Type of dbi (primary data / index)
- * @param dbi          index database handle
- * @return             type of dbi
- */
-RPM_GNUC_INTERNAL
-dbiIndexType dbiType(dbiIndex dbi);
-
 /** \ingroup dbi
  * Retrieve index control flags (new/existing, read-only etc)
  * @param dbi          index database handle
@@ -203,7 +218,7 @@ const char * dbiName(dbiIndex dbi);
 /** \ingroup dbi
  * Open a database cursor.
  * @param dbi          index database handle
- * @param flags                DB_WRITECURSOR if writing, or 0
+ * @param flags                DBC_WRITE if writing, or 0 (DBC_READ) for reading
  * @return             database cursor handle
  */
 RPM_GNUC_INTERNAL
@@ -215,56 +230,69 @@ dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags);
  * @return             NULL always
  */
 RPM_GNUC_INTERNAL
-dbiCursor dbiCursorFree(dbiCursor dbc);
+dbiCursor dbiCursorFree(dbiIndex dbi, dbiCursor dbc);
 
-/** \ingroup dbi
- * Store (key,data) pair in index database.
- * @param dbcursor     database cursor handle
- * @param key          store key value/length/flags
- * @param data         store data value/length/flags
- * @param flags                flags
- * @return             0 on success
- */
+
+RPM_GNUC_INTERNAL
+rpmRC pkgdbPut(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum,
+               unsigned char *hdrBlob, unsigned int hdrLen);
+RPM_GNUC_INTERNAL
+rpmRC pkgdbDel(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum);
 RPM_GNUC_INTERNAL
-int dbiCursorPut(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags);
+rpmRC pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum,
+               unsigned char **hdrBlob, unsigned int *hdrLen);
+RPM_GNUC_INTERNAL
+rpmRC pkgdbNew(dbiIndex dbi, dbiCursor dbc,  unsigned int *hdrNum);
+RPM_GNUC_INTERNAL
+unsigned int pkgdbKey(dbiIndex dbi, dbiCursor dbc);
 
-/** \ingroup dbi
- * Retrieve (key,data) pair from index database.
- * @param dbc          database cursor handle
- * @param key          retrieve key value/length/flags
- * @param data         retrieve data value/length/flags
- * @param flags                flags
- * @return             0 on success
- */
 RPM_GNUC_INTERNAL
-int dbiCursorGet(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags);
+rpmRC idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+               dbiIndexSet *set, int curFlags);
+RPM_GNUC_INTERNAL
+rpmRC idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+               dbiIndexItem rec);
+RPM_GNUC_INTERNAL
+rpmRC idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+               dbiIndexItem rec);
+RPM_GNUC_INTERNAL
+const void * idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen);
+
+struct rpmdbOps_s {
+    int (*open)(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags);
+    int (*close)(dbiIndex dbi, unsigned int flags);
+    int (*verify)(dbiIndex dbi, unsigned int flags);
+    void (*setFSync)(rpmdb rdb, int enable);
+    int (*ctrl)(rpmdb rdb, dbCtrlOp ctrl);
+
+    dbiCursor (*cursorInit)(dbiIndex dbi, unsigned int flags);
+    dbiCursor (*cursorFree)(dbiIndex dbi, dbiCursor dbc);
+
+    rpmRC (*pkgdbGet)(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char **hdrBlob, unsigned int *hdrLen);
+    rpmRC (*pkgdbPut)(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char *hdrBlob, unsigned int hdrLen);
+    rpmRC (*pkgdbDel)(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum);
+    rpmRC (*pkgdbNew)(dbiIndex dbi, dbiCursor dbc,  unsigned int *hdrNum);
+    unsigned int (*pkgdbKey)(dbiIndex dbi, dbiCursor dbc);
+
+    rpmRC (*idxdbGet)(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexSet *set, int curFlags);
+    rpmRC (*idxdbPut)(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec);
+    rpmRC (*idxdbDel)(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec);
+    const void * (*idxdbKey)(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen);
+};
 
-/** \ingroup dbi
- * Delete (key,data) pair(s) from index database.
- * @param dbc          database cursor handle
- * @param key          delete key value/length/flags
- * @param data         delete data value/length/flags
- * @param flags                flags
- * @return             0 on success
- */
 RPM_GNUC_INTERNAL
-int dbiCursorDel(dbiCursor dbc, DBT * key, DBT * data, unsigned int flags);
+extern struct rpmdbOps_s db3_dbops;
 
-/** \ingroup dbi
- * Retrieve count of (possible) duplicate items.
- * @param dbcursor     database cursor
- * @return             number of duplicates
- */
+#ifdef ENABLE_NDB
 RPM_GNUC_INTERNAL
-unsigned int dbiCursorCount(dbiCursor dbc);
+extern struct rpmdbOps_s ndb_dbops;
+#endif
 
-/** \ingroup dbi
- * Retrieve underlying index database handle.
- * @param dbcursor     database cursor
- * @return             index database handle
- */
+#if defined(WITH_LMDB)
 RPM_GNUC_INTERNAL
-dbiIndex dbiCursorIndex(dbiCursor dbc);
+extern struct rpmdbOps_s lmdb_dbops;
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/backend/dbiset.c b/lib/backend/dbiset.c
new file mode 100644 (file)
index 0000000..8fb922e
--- /dev/null
@@ -0,0 +1,214 @@
+#include "system.h"
+#include <string.h>
+#include <stdlib.h>
+#include "dbiset.h"
+#include "debug.h"
+
+dbiIndexSet dbiIndexSetNew(unsigned int sizehint)
+{
+    dbiIndexSet set = xcalloc(1, sizeof(*set));
+    if (sizehint > 0)
+       dbiIndexSetGrow(set, sizehint);
+    return set;
+}
+
+/* 
+ * Ensure sufficient memory for nrecs of new records in dbiIndexSet.
+ * Allocate in power of two sizes to avoid memory fragmentation, so
+ * realloc is not always needed.
+ */
+void dbiIndexSetGrow(dbiIndexSet set, unsigned int nrecs)
+{
+    size_t need = (set->count + nrecs) * sizeof(*(set->recs));
+    size_t alloced = set->alloced ? set->alloced : 1 << 4;
+
+    while (alloced < need)
+       alloced <<= 1;
+
+    if (alloced != set->alloced) {
+       set->recs = xrealloc(set->recs, alloced);
+       set->alloced = alloced;
+    }
+}
+
+static int hdrNumCmp(const void * one, const void * two)
+{
+    const struct dbiIndexItem_s *a = one, *b = two;
+    if (a->hdrNum - b->hdrNum != 0)
+       return a->hdrNum - b->hdrNum;
+    return a->tagNum - b->tagNum;
+}
+
+void dbiIndexSetSort(dbiIndexSet set)
+{
+    /*
+     * mergesort is much (~10x with lots of identical basenames) faster
+     * than pure quicksort, but glibc uses msort_with_tmp() on stack.
+     */
+    if (set && set->recs && set->count > 1) {
+#if HAVE_MERGESORT
+       mergesort(set->recs, set->count, sizeof(*set->recs), hdrNumCmp);
+#else
+       qsort(set->recs, set->count, sizeof(*set->recs), hdrNumCmp);
+#endif
+    }
+}
+
+void dbiIndexSetUniq(dbiIndexSet set, int sorted)
+{
+    unsigned int from;
+    unsigned int to = 0;
+    unsigned int num = set->count;
+
+    if (set->count < 2)
+       return;
+
+    if (!sorted)
+       dbiIndexSetSort(set);
+
+    for (from = 0; from < num; from++) {
+       if (from > 0 && set->recs[from - 1].hdrNum == set->recs[from].hdrNum) {
+           set->count--;
+           continue;
+       }
+       if (from != to)
+           set->recs[to] = set->recs[from]; /* structure assignment */
+       to++;
+    }
+}
+
+int dbiIndexSetAppend(dbiIndexSet set, dbiIndexItem recs,
+                     unsigned int nrecs, int sortset)
+{
+    if (set == NULL || recs == NULL)
+       return 1;
+
+    if (nrecs) {
+       dbiIndexSetGrow(set, nrecs);
+       memcpy(set->recs + set->count, recs, nrecs * sizeof(*(set->recs)));
+       set->count += nrecs;
+    }
+    
+    if (sortset && set->count > 1)
+       qsort(set->recs, set->count, sizeof(*(set->recs)), hdrNumCmp);
+
+    return 0;
+}
+
+int dbiIndexSetAppendSet(dbiIndexSet set, dbiIndexSet oset, int sortset)
+{
+    if (oset == NULL)
+       return 1;
+    return dbiIndexSetAppend(set, oset->recs, oset->count, sortset);
+}
+
+int dbiIndexSetAppendOne(dbiIndexSet set, unsigned int hdrNum,
+                        unsigned int tagNum, int sortset)
+{
+    if (set == NULL)
+       return 1;
+    dbiIndexSetGrow(set, 1);
+
+    set->recs[set->count].hdrNum = hdrNum;
+    set->recs[set->count].tagNum = tagNum;
+    set->count += 1;
+
+    if (sortset && set->count > 1)
+       qsort(set->recs, set->count, sizeof(*(set->recs)), hdrNumCmp);
+
+    return 0;
+}
+
+int dbiIndexSetPrune(dbiIndexSet set, dbiIndexItem recs,
+                    unsigned int nrecs, int sorted)
+{
+    unsigned int from;
+    unsigned int to = 0;
+    unsigned int num = set->count;
+    unsigned int numCopied = 0;
+    size_t recsize = sizeof(*recs);
+
+    if (num == 0 || nrecs == 0)
+       return 1;
+
+    if (nrecs > 1 && !sorted)
+       qsort(recs, nrecs, recsize, hdrNumCmp);
+
+    for (from = 0; from < num; from++) {
+       if (bsearch(&set->recs[from], recs, nrecs, recsize, hdrNumCmp)) {
+           set->count--;
+           continue;
+       }
+       if (from != to)
+           set->recs[to] = set->recs[from]; /* structure assignment */
+       to++;
+       numCopied++;
+    }
+    return (numCopied == num);
+}
+
+int dbiIndexSetPruneSet(dbiIndexSet set, dbiIndexSet oset, int sortset)
+{
+    if (oset == NULL)
+       return 1;
+    return dbiIndexSetPrune(set, oset->recs, oset->count, sortset);
+}
+
+int dbiIndexSetFilter(dbiIndexSet set, dbiIndexItem recs,
+                        unsigned int nrecs, int sorted)
+{
+    unsigned int from;
+    unsigned int to = 0;
+    unsigned int num = set->count;
+    unsigned int numCopied = 0;
+    size_t recsize = sizeof(*recs);
+
+    if (num == 0 || nrecs == 0) {
+       set->count = 0;
+       return num ? 0 : 1;
+    }
+    if (nrecs > 1 && !sorted)
+       qsort(recs, nrecs, recsize, hdrNumCmp);
+    for (from = 0; from < num; from++) {
+       if (!bsearch(&set->recs[from], recs, nrecs, recsize, hdrNumCmp)) {
+           set->count--;
+           continue;
+       }
+       if (from != to)
+           set->recs[to] = set->recs[from]; /* structure assignment */
+       to++;
+       numCopied++;
+    }
+    return (numCopied == num);
+}
+
+int dbiIndexSetFilterSet(dbiIndexSet set, dbiIndexSet oset, int sorted)
+{
+    return dbiIndexSetFilter(set, oset->recs, oset->count, sorted);
+}
+
+unsigned int dbiIndexSetCount(dbiIndexSet set)
+{
+    return (set != NULL) ? set->count : 0;
+}
+
+unsigned int dbiIndexRecordOffset(dbiIndexSet set, unsigned int recno)
+{
+    return set->recs[recno].hdrNum;
+}
+
+unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, unsigned int recno)
+{
+    return set->recs[recno].tagNum;
+}
+
+dbiIndexSet dbiIndexSetFree(dbiIndexSet set)
+{
+    if (set) {
+       free(set->recs);
+       memset(set, 0, sizeof(*set)); /* trash and burn */
+       free(set);
+    }
+    return NULL;
+}
+
diff --git a/lib/backend/dbiset.h b/lib/backend/dbiset.h
new file mode 100644 (file)
index 0000000..da196c8
--- /dev/null
@@ -0,0 +1,130 @@
+#ifndef _DBISET_H
+#define _DBISET_H
+
+#include <rpm/rpmutil.h>
+
+/* A single item from an index database (i.e. the "data returned"). */
+typedef struct dbiIndexItem_s {
+    unsigned int hdrNum;               /*!< header instance in db */
+    unsigned int tagNum;               /*!< tag index in header */
+} * dbiIndexItem;
+
+/* Items retrieved from the index database.*/
+typedef struct dbiIndexSet_s {
+    dbiIndexItem recs;                 /*!< array of records */
+    unsigned int count;                        /*!< number of records */
+    size_t alloced;                    /*!< alloced size */
+} * dbiIndexSet;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Create an empty index set, optionally with sizehint reservation for recs */
+RPM_GNUC_INTERNAL
+dbiIndexSet dbiIndexSetNew(unsigned int sizehint);
+
+/* Reserve space for at least nrecs new records */
+RPM_GNUC_INTERNAL
+void dbiIndexSetGrow(dbiIndexSet set, unsigned int nrecs);
+
+/* Sort an index set */
+RPM_GNUC_INTERNAL
+void dbiIndexSetSort(dbiIndexSet set);
+
+/* Uniq an index set */
+RPM_GNUC_INTERNAL
+void dbiIndexSetUniq(dbiIndexSet set, int sorted);
+
+/* Append an index set to another */
+RPM_GNUC_INTERNAL
+int dbiIndexSetAppendSet(dbiIndexSet set, dbiIndexSet oset, int sortset);
+
+/**
+ * Append element(s) to set of index database items.
+ * @param set          set of index database items
+ * @param recs         array of items to append to set
+ * @param nrecs                number of items
+ * @param sortset      should resulting set be sorted?
+ * @return             0 success, 1 failure (bad args)
+ */
+RPM_GNUC_INTERNAL
+int dbiIndexSetAppend(dbiIndexSet set, dbiIndexItem recs,
+                     unsigned int nrecs, int sortset);
+
+/**
+  * Append a single element to a set of index database items.
+  * @param set          set of index database items
+  * @param hdrNum       header instance in db
+  * @param tagNum       tag index in header
+  * @param sortset      should resulting set be sorted?
+  * @return             0 success, 1 failure (bad args)
+  */
+RPM_GNUC_INTERNAL
+int dbiIndexSetAppendOne(dbiIndexSet set, unsigned int hdrNum,
+                        unsigned int tagNum, int sortset);
+
+/**
+ * Remove element(s) from set of index database items.
+ * @param set          set of index database items
+ * @param recs         array of items to remove from set
+ * @param nrecs                number of items
+ * @param sorted       array is already sorted?
+ * @return             0 success, 1 failure (no items found)
+ */
+RPM_GNUC_INTERNAL
+int dbiIndexSetPrune(dbiIndexSet set, dbiIndexItem recs,
+                    unsigned int nrecs, int sorted);
+
+/**
+ * Remove an index set from another.
+ * @param set          set of index database items
+ * @param oset         set of entries that should be removed
+ * @param sorted       oset is already sorted?
+ * @return             0 success, 1 failure (no items found)
+ */
+RPM_GNUC_INTERNAL
+int dbiIndexSetPruneSet(dbiIndexSet set, dbiIndexSet oset, int sorted);
+
+/**
+ * Filter element(s) from set of index database items.
+ * @param set          set of index database items
+ * @param recs         array of items to remove from set
+ * @param nrecs                number of items
+ * @param sorted       recs array is already sorted?
+ * @return             0 success, 1 failure (no items removed)
+ */
+RPM_GNUC_INTERNAL
+int dbiIndexSetFilter(dbiIndexSet set, dbiIndexItem recs,
+                     unsigned int nrecs, int sorted);
+
+/**
+ * Filter (intersect) an index set with another.
+ * @param set          set of index database items
+ * @param oset         set of entries that should be intersected
+ * @param sorted       oset is already sorted?
+ * @return             0 success, 1 failure (no items removed)
+ */
+RPM_GNUC_INTERNAL
+int dbiIndexSetFilterSet(dbiIndexSet set, dbiIndexSet oset, int sorted);
+
+/* Count items in index database set. */
+RPM_GNUC_INTERNAL
+unsigned int dbiIndexSetCount(dbiIndexSet set);
+
+/* Return record offset of header from element in index database set. */
+RPM_GNUC_INTERNAL
+unsigned int dbiIndexRecordOffset(dbiIndexSet set, unsigned int recno);
+
+/* Return file index from element in index database set. */
+RPM_GNUC_INTERNAL
+unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, unsigned int recno);
+
+/* Destroy set of index database items */
+RPM_GNUC_INTERNAL
+dbiIndexSet dbiIndexSetFree(dbiIndexSet set);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/lib/backend/lmdb.c b/lib/backend/lmdb.c
new file mode 100644 (file)
index 0000000..db1270e
--- /dev/null
@@ -0,0 +1,939 @@
+/** \ingroup rpmdb
+ * \file lib/lmdb.c
+ */
+
+#include "system.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <sys/wait.h>
+#include <popt.h>
+#include <lmdb.h>
+#include <signal.h>
+
+#include <rpm/rpmtypes.h>
+#include <rpm/rpmmacro.h>
+#include <rpm/rpmfileutil.h>
+#include <rpm/rpmlog.h>
+
+#include "lib/rpmdb_internal.h"
+
+#include "debug.h"
+
+static int _debug = 1; /* XXX if < 0 debugging, > 0 unusual error returns */
+
+struct dbiCursor_s {
+    dbiIndex dbi;
+    const void *key;
+    unsigned int keylen;
+    int flags;
+    MDB_cursor * cursor;
+    MDB_txn * txn;
+};
+
+static const char * _EnvF(unsigned eflags)
+{
+    static char t[256];
+    char *te = t;
+
+    *te = '\0';
+#define        _EF(_v) if (eflags & MDB_##_v) te = stpcpy(stpcpy(te,"|"),#_v)
+    _EF(FIXEDMAP);
+    _EF(NOSUBDIR);
+    _EF(NOSYNC);
+    _EF(RDONLY);
+    _EF(NOMETASYNC);
+    _EF(WRITEMAP);
+    _EF(MAPASYNC);
+    _EF(NOTLS);
+    _EF(NOLOCK);
+    _EF(NORDAHEAD);
+    _EF(NOMEMINIT);
+#undef _EF
+    if (t[0] == '\0') te += sprintf(te, "|0x%x", eflags);
+    *te = '\0';
+    return t+1;
+}
+
+static const char * _OpenF(unsigned oflags)
+{
+    static char t[256];
+    char *te = t;
+
+    *te = '\0';
+#define        _OF(_v) if (oflags & MDB_##_v) te = stpcpy(stpcpy(te,"|"),#_v)
+    _OF(REVERSEKEY);
+    _OF(DUPSORT);
+    _OF(INTEGERKEY);
+    _OF(DUPFIXED);
+    _OF(INTEGERDUP);
+    _OF(REVERSEDUP);
+    _OF(CREATE);
+#undef _OF
+    if (t[0] == '\0') te += sprintf(te, "|0x%x", oflags);
+    *te = '\0';
+    return t+1;
+}
+
+static int dbapi_err(rpmdb rdb, const char * msg, int rc, int printit)
+{
+    if (printit && rc) {
+       int lvl = RPMLOG_ERR;
+       if (msg)
+           rpmlog(lvl, _("%s:\trc(%d) = %s(): %s\n"),
+               rdb->db_descr, rc, msg, (rc ? mdb_strerror(rc) : ""));
+       else
+           rpmlog(lvl, _("%s:\trc(%d) = %s()\n"),
+               rdb->db_descr, rc, (rc ? mdb_strerror(rc) : ""));
+    }
+    return rc;
+}
+
+static int cvtdberr(dbiIndex dbi, const char * msg, int rc, int printit)
+{
+    return dbapi_err(dbi->dbi_rpmdb, msg, rc, printit);
+}
+
+static void lmdb_assert(MDB_env *env, const char *msg)
+{
+    rpmlog(RPMLOG_ERR, "%s: %s\n", __FUNCTION__, msg);
+}
+
+static void lmdb_dbSetFSync(rpmdb rdb, int enable)
+{
+}
+
+static int lmdb_Ctrl(rpmdb rdb, dbCtrlOp ctrl)
+{
+    return 0;
+}
+
+static int db_fini(rpmdb rdb, const char * dbhome)
+{
+    int rc = 0;
+    MDB_env * env = rdb->db_dbenv;
+
+    if (env == NULL)
+       goto exit;
+    if (--rdb->db_opens > 0)
+       goto exit;
+
+    mdb_env_close(env);
+    rdb->db_dbenv = env = NULL;
+
+    rpmlog(RPMLOG_DEBUG, "closed   db environment %s\n", dbhome);
+
+exit:
+    return rc;
+}
+
+static int db_init(rpmdb rdb, const char * dbhome)
+{
+    int rc = EINVAL;
+    MDB_env * env = NULL;
+    int retry_open = 2;
+    uint32_t eflags = 0;
+
+    if (rdb->db_dbenv != NULL) {
+       rdb->db_opens++;
+       return 0;
+    } else {
+       /* On first call, set backend description to something... */
+       free(rdb->db_descr);
+       rdb->db_descr = xstrdup("lmdb");
+    }
+
+    MDB_dbi maxdbs = 32;
+    unsigned int maxreaders = 16;
+    size_t mapsize = 256 * 1024 * 1024;
+
+    if ((rc = mdb_env_create(&env))
+     || (rc = mdb_env_set_maxreaders(env, maxreaders))
+     || (rc = mdb_env_set_mapsize(env, mapsize))
+     || (rc = mdb_env_set_maxdbs(env, maxdbs))
+     || (rc = mdb_env_set_assert(env, lmdb_assert))
+     || (rc = mdb_env_set_userctx(env, rdb))
+    ) {
+       rc = dbapi_err(rdb, "mdb_env_create", rc, _debug);
+       goto exit;
+    }
+
+    /*
+     * Actually open the environment. Fall back to private environment
+     * if we dont have permission to join/create shared environment or
+     * system doesn't support it..
+     */
+    while (retry_open) {
+       rpmlog(RPMLOG_DEBUG, "opening  db environment %s eflags=%s perms=0%o\n", dbhome, _EnvF(eflags), rdb->db_perms);
+
+       eflags = 0;
+       eflags |= MDB_WRITEMAP;
+       eflags |= MDB_MAPASYNC;
+       eflags |= MDB_NOTLS;
+
+       if (access(dbhome, W_OK) && (rdb->db_mode & O_ACCMODE) == O_RDONLY)
+           eflags |= MDB_RDONLY;
+
+       rc = mdb_env_open(env, dbhome, eflags, rdb->db_perms);
+       if (rc) {
+           rc = dbapi_err(rdb, "mdb_env_open", rc, _debug);
+           if (rc == EPERM)
+               rpmlog(RPMLOG_ERR, "lmdb: %s(%s/lock.mdb): %s\n", __FUNCTION__, dbhome, mdb_strerror(rc));
+       }
+       retry_open = 0;         /* XXX EAGAIN might need a retry */
+    }
+    if (rc)
+       goto exit;
+
+    rdb->db_dbenv = env;
+    rdb->db_opens = 1;
+
+exit:
+    if (rc && env) {
+       mdb_env_close(env);
+       rdb->db_dbenv = env = NULL;
+    }
+    return rc;
+}
+
+static int dbiSync(dbiIndex dbi, unsigned int flags)
+{
+    int rc = 0;
+    MDB_dbi db = (unsigned long) dbi->dbi_db;
+
+    if (db != 0xdeadbeef && !dbi->cfg.dbi_no_dbsync) {
+       MDB_env * env = dbi->dbi_rpmdb->db_dbenv;
+       unsigned eflags = 0;
+       rc = mdb_env_get_flags(env, &eflags);
+       if (rc) {
+           rc = cvtdberr(dbi, "mdb_env_get_flags", rc, _debug);
+           eflags |= MDB_RDONLY;
+       }
+       if (!(eflags & MDB_RDONLY)) {
+           int force = 0;
+           rc = mdb_env_sync(env, force);
+           if (rc)
+               rc = cvtdberr(dbi, "mdb_env_sync", rc, _debug);
+       }
+    }
+    return rc;
+}
+
+static dbiCursor lmdb_dbiCursorInit(dbiIndex dbi, unsigned int flags)
+{
+    dbiCursor dbc = NULL;
+
+    if (dbi && dbi->dbi_db != (void *)0xdeadbeefUL) {
+       MDB_env * env = dbi->dbi_rpmdb->db_dbenv;
+       MDB_txn * parent = NULL;
+       unsigned tflags = !(flags & DBC_WRITE) ? MDB_RDONLY : 0;
+       MDB_txn * txn = NULL;
+       MDB_cursor * cursor = NULL;
+       int rc = EINVAL;
+
+       rc = mdb_txn_begin(env, parent, tflags, &txn);
+       if (rc)
+           rc = cvtdberr(dbi, "mdb_txn_begin", rc, _debug);
+
+       if (rc == 0) {
+           MDB_dbi db = (unsigned long) dbi->dbi_db;
+           rc = mdb_cursor_open(txn, db, &cursor);
+           if (rc)
+               rc = cvtdberr(dbi, "mdb_cursor_open", rc, _debug);
+       }
+
+       if (rc == 0) {
+           dbc = xcalloc(1, sizeof(*dbc));
+           dbc->dbi = dbi;
+           dbc->flags = flags;
+           dbc->cursor = cursor;
+           dbc->txn = txn;
+       }
+    }
+
+    return dbc;
+}
+
+static dbiCursor lmdb_dbiCursorFree(dbiIndex dbi, dbiCursor dbc)
+{
+    if (dbc) {
+       int rc = 0;
+       MDB_cursor * cursor = dbc->cursor;
+       MDB_txn * txn = dbc->txn;
+       dbiIndex dbi = dbc->dbi;
+       unsigned flags = dbc->flags;
+
+       mdb_cursor_close(cursor);
+       dbc->cursor = cursor = NULL;
+       if (rc)
+           cvtdberr(dbc->dbi, "mdb_cursor_close", rc, _debug);
+
+       /* Automatically commit close */
+       if (txn) {
+           rc = mdb_txn_commit(txn);
+           dbc->txn = txn = NULL;
+           if (rc)
+               rc = cvtdberr(dbc->dbi, "mdb_txn_commit", rc, _debug);
+       }
+
+       /* Automatically sync on write-cursor close */
+       if (flags & DBC_WRITE)
+           dbiSync(dbi, 0);
+
+       free(dbc);
+       rc = 0;
+    }
+    return NULL;
+}
+
+static int dbiCursorPut(dbiCursor dbc, MDB_val * key, MDB_val * data, unsigned flags)
+{
+    int rc = EINVAL;
+    int sane = (key->mv_data != NULL && key->mv_size > 0 &&
+               data->mv_data != NULL && data->mv_size > 0);
+
+    if (dbc && sane) {
+       MDB_cursor * cursor = dbc->cursor;
+       rpmdb rdb = dbc->dbi->dbi_rpmdb;
+       rpmswEnter(&rdb->db_putops, (ssize_t) 0);
+
+       rc = mdb_cursor_put(cursor, key, data, flags);
+       if (rc) {
+           rc = cvtdberr(dbc->dbi, "mdb_cursor_put", rc, _debug);
+           if (dbc->txn) {
+               mdb_txn_abort(dbc->txn);
+               dbc->txn = NULL;
+           }
+       }
+
+       rpmswExit(&rdb->db_putops, (ssize_t) data->mv_size);
+    }
+    return rc;
+}
+
+static int dbiCursorGet(dbiCursor dbc, MDB_val *key, MDB_val *data, unsigned op)
+{
+    int rc = EINVAL;
+    int sane = ((op == MDB_NEXT) || (key->mv_data != NULL && key->mv_size > 0));
+
+    if (dbc && sane) {
+       MDB_cursor * cursor = dbc->cursor;
+       rpmdb rdb = dbc->dbi->dbi_rpmdb;
+
+       rpmswEnter(&rdb->db_getops, 0);
+
+       /* XXX db4 does DB_FIRST on uninitialized cursor */
+       rc = mdb_cursor_get(cursor, key, data, op);
+       if (rc && rc != MDB_NOTFOUND) {
+           rc = cvtdberr(dbc->dbi, "mdb_cursor_get", rc, _debug);
+           if (dbc->txn) {
+               mdb_txn_abort(dbc->txn);
+               dbc->txn = NULL;
+           }
+       }
+
+       /* Remember the last key fetched */
+       if (rc == 0) {
+           dbc->key = key->mv_data;
+           dbc->keylen = key->mv_size;
+       } else {
+           dbc->key = NULL;
+           dbc->keylen = 0;
+       }
+
+       rpmswExit(&rdb->db_getops, data->mv_size);
+    }
+    return rc;
+}
+
+static int dbiCursorDel(dbiCursor dbc, MDB_val *key, MDB_val *data, unsigned int flags)
+{
+    int rc = EINVAL;
+    int sane = (key->mv_data != NULL && key->mv_size > 0);
+
+    if (dbc && sane) {
+       MDB_cursor * cursor = dbc->cursor;
+       rpmdb rdb = dbc->dbi->dbi_rpmdb;
+       rpmswEnter(&rdb->db_delops, 0);
+
+       /* XXX TODO: ensure that cursor is positioned with duplicates */
+       rc = mdb_cursor_get(cursor, key, data, MDB_SET);
+       if (rc && rc != MDB_NOTFOUND) {
+           rc = cvtdberr(dbc->dbi, "mdb_cursor_get", rc, _debug);
+           if (dbc->txn)
+               dbc->txn = NULL;
+       }
+
+       if (rc == 0) {
+           rc = mdb_cursor_del(cursor, flags);
+           if (rc)
+               rc = cvtdberr(dbc->dbi, "mdb_cursor_del", rc, _debug);
+       }
+       rpmswExit(&rdb->db_delops, data->mv_size);
+    }
+    return rc;
+}
+
+static int lmdb_dbiVerify(dbiIndex dbi, unsigned int flags)
+{
+    return 0;
+}
+
+static int lmdb_dbiClose(dbiIndex dbi, unsigned int flags)
+{
+    int rc = 0;
+    rpmdb rdb = dbi->dbi_rpmdb;
+    const char * dbhome = rpmdbHome(rdb);
+    MDB_dbi db = (unsigned long) dbi->dbi_db;
+
+    if (db != 0xdeadbeef) {
+       MDB_env * env = dbi->dbi_rpmdb->db_dbenv;
+       mdb_dbi_close(env, db);
+       dbi->dbi_db = (void *) 0xdeadbeefUL;
+
+       rpmlog(RPMLOG_DEBUG, "closed   db index       %s/%s\n",
+               dbhome, dbi->dbi_file);
+    }
+
+    db_fini(rdb, dbhome ? dbhome : "");
+
+    dbi = dbiFree(dbi);
+
+    return rc;
+}
+
+static int lmdb_dbiOpen(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
+{
+    int rc = 1;
+    const char *dbhome = rpmdbHome(rdb);
+    dbiIndex dbi = NULL;
+    int retry_open;
+
+    MDB_dbi db = 0;
+    uint32_t oflags;
+
+    if (dbip)
+       *dbip = NULL;
+
+    if ((dbi = dbiNew(rdb, rpmtag)) == NULL)
+       goto exit;
+    dbi->dbi_flags = 0;
+    dbi->dbi_db = (void *) 0xdeadbeefUL;
+
+    rc = db_init(rdb, dbhome);
+
+    retry_open = (rc == 0) ? 2 : 0;
+
+    do {
+       MDB_env * env = rdb->db_dbenv;
+       MDB_txn * parent = NULL;
+       unsigned tflags = access(dbhome, W_OK) ? MDB_RDONLY : 0;
+       MDB_txn * txn = NULL;
+
+       if (tflags & MDB_RDONLY)
+           dbi->dbi_flags |= DBI_RDONLY;
+
+       rc = mdb_txn_begin(env, parent, tflags, &txn);
+       if (rc)
+           rc = cvtdberr(dbi, "mdb_txn_begin", rc, _debug);
+
+       const char * name = dbi->dbi_file;
+       oflags = 0;
+       if (!(tflags & MDB_RDONLY))
+           oflags |= MDB_CREATE;
+       if (!strcmp(dbi->dbi_file, "Packages"))
+           oflags |= MDB_INTEGERKEY;
+
+       rpmlog(RPMLOG_DEBUG, "opening  db index       %s/%s oflags=%s\n",
+               dbhome, dbi->dbi_file, _OpenF(oflags));
+
+       db = 0xdeadbeef;
+       rc = mdb_dbi_open(txn, name, oflags, &db);
+       if (rc && rc != MDB_NOTFOUND) {
+           rc = cvtdberr(dbi, "mdb_dbi_open", rc, _debug);
+           if (txn) {
+               mdb_txn_abort(txn);
+               txn = NULL;
+               db = 0xdeadbeef;
+           }
+       }
+
+       if (txn) {
+           rc = mdb_txn_commit(txn);
+           if (rc)
+               rc = cvtdberr(dbi, "mdb_txn_commit", rc, _debug);
+       }
+       retry_open = 0;
+    } while (--retry_open > 0);
+
+    dbi->dbi_db = (void *) ((unsigned long)db);
+
+    if (!rc && dbip)
+       *dbip = dbi;
+    else
+       (void) dbiClose(dbi, 0);
+
+exit:
+    return rc;
+}
+
+/* The LMDB btree implementation needs BIGENDIAN primary keys. */
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+static int _dbibyteswapped = 1;
+#else
+static int _dbibyteswapped = 0;
+#endif
+
+/**
+ * Convert retrieved data to index set.
+ * @param dbi          index database handle
+ * @param data         retrieved data
+ * @retval setp                (malloc'ed) index set
+ * @return             0 on success
+ */
+static rpmRC dbt2set(dbiIndex dbi, MDB_val * data, dbiIndexSet * setp)
+{
+    rpmRC rc = RPMRC_FAIL;
+    const char * sdbir;
+    dbiIndexSet set = NULL;
+    unsigned int i;
+
+    if (dbi == NULL || data == NULL || setp == NULL)
+       goto exit;
+
+    rc = RPMRC_OK;
+    if ((sdbir = data->mv_data) == NULL) {
+       *setp = NULL;
+       goto exit;
+    }
+
+    set = dbiIndexSetNew(data->mv_size / (2 * sizeof(int32_t)));
+    set->count = data->mv_size / (2 * sizeof(int32_t));
+
+    for (i = 0; i < set->count; i++) {
+       union _dbswap hdrNum, tagNum;
+
+       memcpy(&hdrNum.ui, sdbir, sizeof(hdrNum.ui));
+       sdbir += sizeof(hdrNum.ui);
+       memcpy(&tagNum.ui, sdbir, sizeof(tagNum.ui));
+       sdbir += sizeof(tagNum.ui);
+       if (_dbibyteswapped) {
+           _DBSWAP(hdrNum);
+           _DBSWAP(tagNum);
+       }
+       set->recs[i].hdrNum = hdrNum.ui;
+       set->recs[i].tagNum = tagNum.ui;
+    }
+    *setp = set;
+
+exit:
+    return rc;
+}
+
+/**
+ * Convert index set to database representation.
+ * @param dbi          index database handle
+ * @param data         retrieved data
+ * @param set          index set
+ * @return             0 on success
+ */
+static rpmRC set2dbt(dbiIndex dbi, MDB_val * data, dbiIndexSet set)
+{
+    rpmRC rc = RPMRC_FAIL;
+    char * tdbir;
+    unsigned int i;
+
+    if (dbi == NULL || data == NULL || set == NULL)
+       goto exit;
+
+    rc = RPMRC_OK;
+    data->mv_size = set->count * (2 * sizeof(int32_t));
+    if (data->mv_size == 0) {
+       data->mv_data = NULL;
+       goto exit;
+    }
+    tdbir = data->mv_data = xmalloc(data->mv_size);
+
+    for (i = 0; i < set->count; i++) {
+       union _dbswap hdrNum, tagNum;
+
+       memset(&hdrNum, 0, sizeof(hdrNum));
+       memset(&tagNum, 0, sizeof(tagNum));
+       hdrNum.ui = set->recs[i].hdrNum;
+       tagNum.ui = set->recs[i].tagNum;
+       if (_dbibyteswapped) {
+           _DBSWAP(hdrNum);
+           _DBSWAP(tagNum);
+       }
+       memcpy(tdbir, &hdrNum.ui, sizeof(hdrNum.ui));
+       tdbir += sizeof(hdrNum.ui);
+       memcpy(tdbir, &tagNum.ui, sizeof(tagNum.ui));
+       tdbir += sizeof(tagNum.ui);
+    }
+exit:
+    return rc;
+}
+
+static rpmRC lmdb_idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+                         dbiIndexSet *set, int searchType)
+{
+    rpmRC rc = RPMRC_FAIL; /* assume failure */
+    if (dbi != NULL && dbc != NULL && set != NULL) {
+       int cflags = MDB_NEXT;
+       int dbrc;
+       MDB_val key = { 0, NULL };
+       MDB_val data = { 0, NULL };
+
+       if (keyp) {
+           if (keylen == 0) {          /* XXX "/" fixup */ 
+               keyp = "";
+               keylen = 1;
+           }
+           key.mv_data = (void *) keyp; /* discards const */
+           key.mv_size = keylen;
+           cflags = searchType == DBC_PREFIX_SEARCH ? MDB_SET_RANGE : MDB_SET;
+       }
+
+       for (;;) {
+           dbiIndexSet newset = NULL;
+           dbrc = dbiCursorGet(dbc, &key, &data, cflags);
+           if (dbrc != 0)
+               break;
+           if (searchType == DBC_PREFIX_SEARCH &&
+                   (key.mv_size < keylen || memcmp(key.mv_data, keyp, keylen) != 0))
+               break;
+           dbt2set(dbi, &data, &newset);
+           if (*set == NULL) {
+               *set = newset;
+           } else {
+               dbiIndexSetAppendSet(*set, newset, 0);
+               dbiIndexSetFree(newset);
+           }
+           if (searchType != DBC_PREFIX_SEARCH)
+               break;
+           key.mv_data = NULL;
+           key.mv_size = 0;
+           cflags = MDB_NEXT;
+       }
+
+       /* fixup result status for prefix search */
+       if (searchType == DBC_PREFIX_SEARCH) {
+           if (dbrc == MDB_NOTFOUND && *set != NULL && (*set)->count > 0)
+               dbrc = 0;
+           else if (dbrc == 0 && (*set == NULL || (*set)->count == 0))
+               dbrc = MDB_NOTFOUND;
+       }
+
+       if (dbrc == 0) {
+           rc = RPMRC_OK;
+       } else if (dbrc == MDB_NOTFOUND) {
+           rc = RPMRC_NOTFOUND;
+       } else {
+           rpmlog(RPMLOG_ERR,
+                  _("rc(%d) getting \"%s\" records from %s index: %s\n"),
+                  dbrc, keyp ? keyp : "???", dbiName(dbi), mdb_strerror(dbrc));
+       }
+    }
+    return rc;
+}
+
+/* Update secondary index. NULL set deletes the key */
+static rpmRC updateIndex(dbiCursor dbc, const char *keyp, unsigned int keylen,
+                        dbiIndexSet set)
+{
+    rpmRC rc = RPMRC_FAIL;
+
+    if (dbc && keyp) {
+       dbiIndex dbi = dbc->dbi;
+       int dbrc;
+       MDB_val key = { 0, NULL };
+       MDB_val data = { 0, NULL };
+
+       key.mv_data = (void *) keyp; /* discards const */
+       key.mv_size = keylen;
+
+       if (set)
+           set2dbt(dbi, &data, set);
+
+       if (dbiIndexSetCount(set) > 0) {
+           dbrc = dbiCursorPut(dbc, &key, &data, 0);
+           if (dbrc) {
+               rpmlog(RPMLOG_ERR,
+                      _("rc(%d) storing record \"%s\" into %s index: %s\n"),
+                      dbrc, (char*)key.mv_data, dbiName(dbi), mdb_strerror(dbrc));
+           }
+           free(data.mv_data);
+       } else {
+           dbrc = dbiCursorDel(dbc, &key, &data, 0);
+           if (dbrc) {
+               rpmlog(RPMLOG_ERR,
+                      _("rc(%d) removing record \"%s\" from %s index: %s\n"),
+                      dbrc, (char*)key.mv_data, dbiName(dbi), mdb_strerror(dbrc));
+           }
+       }
+
+       if (dbrc == 0)
+           rc = RPMRC_OK;
+    }
+
+    return rc;
+}
+
+static rpmRC lmdb_idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+              dbiIndexItem rec)
+{
+    dbiIndexSet set = NULL;
+    rpmRC rc;
+
+    if (keyp && keylen == 0) {         /* XXX "/" fixup */
+       keyp = "";
+       keylen++;
+    }
+    rc = idxdbGet(dbi, dbc, keyp, keylen, &set, DBC_NORMAL_SEARCH);
+
+    /* Not found means a new key and is not an error. */
+    if (rc && rc != RPMRC_NOTFOUND)
+       goto exit;
+
+    if (set == NULL)
+       set = dbiIndexSetNew(1);
+    dbiIndexSetAppend(set, rec, 1, 0);
+
+    rc = updateIndex(dbc, keyp, keylen, set);
+
+    dbiIndexSetFree(set);
+
+exit:
+    return rc;
+}
+
+static rpmRC lmdb_idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+              dbiIndexItem rec)
+{
+    rpmRC rc = RPMRC_FAIL;
+    dbiIndexSet set = NULL;
+
+    if (keyp && keylen == 0) {         /* XXX "/" fixup */
+       keyp = "";
+       keylen++;
+    }
+    rc = idxdbGet(dbi, dbc, keyp, keylen, &set, DBC_NORMAL_SEARCH);
+    if (rc)
+       goto exit;
+
+    if (dbiIndexSetPrune(set, rec, 1, 1)) {
+       /* Nothing was pruned. XXX: Can this actually happen? */
+       rc = RPMRC_OK;
+    } else {
+       /* If there's data left, update data. Otherwise delete the key. */
+       if (dbiIndexSetCount(set) > 0) {
+           rc = updateIndex(dbc, keyp, keylen, set);
+       } else {
+           rc = updateIndex(dbc, keyp, keylen, NULL);
+       }
+    };
+    dbiIndexSetFree(set);
+
+exit:
+    return rc;
+}
+
+static const void * lmdb_idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen)
+{
+    const void *key = NULL;
+    if (dbc) {
+       key = dbc->key;
+       if (key && keylen)
+           *keylen = dbc->keylen;
+    }
+    return key;
+}
+
+/* Update primary Packages index. NULL hdr means remove */
+static rpmRC updatePackages(dbiCursor dbc, unsigned int hdrNum, MDB_val *hdr)
+{
+    int rc = RPMRC_FAIL;
+    int dbrc = EINVAL;
+
+    if (dbc == NULL || hdrNum == 0)
+       goto exit;
+
+    union _dbswap mi_offset;
+    mi_offset.ui = hdrNum;
+    if (_dbibyteswapped)
+       _DBSWAP(mi_offset);
+
+    MDB_val key = { 0, NULL };
+    key.mv_data = (void *) &mi_offset;
+    key.mv_size = sizeof(mi_offset.ui);
+
+    MDB_val data = { 0, NULL };
+
+    dbrc = dbiCursorGet(dbc, &key, &data, MDB_SET);
+    if (dbrc && dbrc != MDB_NOTFOUND) {
+       rpmlog(RPMLOG_ERR,
+                  _("rc(%d) positioning header #%d record: %s\n"), dbrc, hdrNum, mdb_strerror(dbrc));
+       goto exit;
+    }
+
+    if (hdr) {
+       dbrc = dbiCursorPut(dbc, &key, hdr, 0);
+       if (dbrc) {
+           rpmlog(RPMLOG_ERR,
+                  _("rc(%d) adding header #%d record: %s\n"), dbrc, hdrNum, mdb_strerror(dbrc));
+       }
+    } else {
+       dbrc = dbiCursorDel(dbc, &key, &data, 0);
+       if (dbrc) {
+           rpmlog(RPMLOG_ERR,
+                  _("rc(%d) deleting header #%d record: %s\n"), dbrc, hdrNum, mdb_strerror(dbrc));
+       }
+    }
+
+exit:
+    rc = dbrc == 0 ? RPMRC_OK : RPMRC_FAIL;
+    return rc;
+}
+
+/* Get current header instance number or try to allocate a new one */
+static unsigned int pkgInstance(dbiCursor dbc, int alloc)
+{
+    unsigned int hdrNum = 0;
+
+    MDB_val key = { 0, NULL };
+    MDB_val data = { 0, NULL };
+    unsigned int firstkey = 0;
+    union _dbswap mi_offset;
+    int rc;
+
+    /* Key 0 holds the current largest instance, fetch it */
+    key.mv_data = &firstkey;
+    key.mv_size = sizeof(firstkey);
+    rc = dbiCursorGet(dbc, &key, &data, MDB_SET);
+
+    if (!rc && data.mv_data) {
+       memcpy(&mi_offset, data.mv_data, sizeof(mi_offset.ui));
+       if (_dbibyteswapped)
+           _DBSWAP(mi_offset);
+       hdrNum = mi_offset.ui;
+    }
+
+    if (alloc) {
+       /* Rather complicated "increment by one", bswapping as needed */
+       ++hdrNum;
+       mi_offset.ui = hdrNum;
+       if (_dbibyteswapped)
+           _DBSWAP(mi_offset);
+       data.mv_data = &mi_offset;
+       data.mv_size = sizeof(mi_offset.ui);
+
+       /* Unless we manage to insert the new instance number, we failed */
+       rc = dbiCursorPut(dbc, &key, &data, 0);
+       if (rc) {
+           hdrNum = 0;
+           rpmlog(RPMLOG_ERR,
+                   _("rc(%d) allocating new package instance: %s\n"), rc, mdb_strerror(rc));
+       }
+    }
+
+    return hdrNum;
+}
+
+static rpmRC lmdb_pkgdbPut(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum,
+               unsigned char *hdrBlob, unsigned int hdrLen)
+{
+    MDB_val hdr;
+    hdr.mv_data = hdrBlob;
+    hdr.mv_size = hdrLen;
+    return updatePackages(dbc, hdrNum, &hdr);
+}
+
+static rpmRC lmdb_pkgdbDel(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum)
+{
+    return updatePackages(dbc, hdrNum, NULL);
+}
+
+static rpmRC lmdb_pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum,
+            unsigned char **hdrBlob, unsigned int *hdrLen)
+{
+    union _dbswap mi_offset;
+    MDB_val key = { 0, NULL };
+    MDB_val data = { 0, NULL };
+    rpmRC rc = RPMRC_FAIL;
+
+    if (dbc == NULL)
+       goto exit;
+
+    if (hdrNum) {
+       mi_offset.ui = hdrNum;
+       if (_dbibyteswapped)
+           _DBSWAP(mi_offset);
+       key.mv_data = (void *) &mi_offset;
+       key.mv_size = sizeof(mi_offset.ui);
+    }
+
+    rc = dbiCursorGet(dbc, &key, &data, hdrNum ? MDB_SET : MDB_NEXT);
+    if (rc == 0) {
+       if (hdrBlob)
+           *hdrBlob = data.mv_data;
+       if (hdrLen)
+           *hdrLen = data.mv_size;
+       rc = RPMRC_OK;
+    } else if (rc == MDB_NOTFOUND)
+       rc = RPMRC_NOTFOUND;
+    else
+       rc = RPMRC_FAIL;
+exit:
+    return rc;
+}
+
+static unsigned int lmdb_pkgdbKey(dbiIndex dbi, dbiCursor dbc)
+{
+    union _dbswap mi_offset;
+
+    if (dbc == NULL || dbc->key == NULL)
+       return 0;
+    memcpy(&mi_offset, dbc->key, sizeof(mi_offset.ui));
+    if (_dbibyteswapped)
+       _DBSWAP(mi_offset);
+    return mi_offset.ui;
+}
+
+static rpmRC lmdb_pkgdbNew(dbiIndex dbi, dbiCursor dbc, unsigned int *hdrNum)
+{
+    unsigned int num;
+    rpmRC rc = RPMRC_FAIL;
+
+    if (dbc == NULL)
+       goto exit;
+    num = pkgInstance(dbc, 1);
+    if (num) {
+       *hdrNum = num;
+       rc = RPMRC_OK;
+    }
+exit:
+    return rc;
+}
+
+struct rpmdbOps_s lmdb_dbops = {
+    .open   = lmdb_dbiOpen,
+    .close  = lmdb_dbiClose,
+    .verify = lmdb_dbiVerify,
+
+    .setFSync = lmdb_dbSetFSync,
+    .ctrl = lmdb_Ctrl,
+
+    .cursorInit = lmdb_dbiCursorInit,
+    .cursorFree = lmdb_dbiCursorFree,
+
+    .pkgdbGet = lmdb_pkgdbGet,
+    .pkgdbPut = lmdb_pkgdbPut,
+    .pkgdbDel = lmdb_pkgdbDel,
+    .pkgdbNew = lmdb_pkgdbNew,
+    .pkgdbKey = lmdb_pkgdbKey,
+
+    .idxdbGet = lmdb_idxdbGet,
+    .idxdbPut = lmdb_idxdbPut,
+    .idxdbDel = lmdb_idxdbDel,
+    .idxdbKey = lmdb_idxdbKey
+};
diff --git a/lib/backend/ndb/glue.c b/lib/backend/ndb/glue.c
new file mode 100644 (file)
index 0000000..144ada0
--- /dev/null
@@ -0,0 +1,492 @@
+#include "system.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "lib/rpmdb_internal.h"
+#include <rpm/rpmstring.h>
+#include <rpm/rpmlog.h>
+
+#include "lib/backend/ndb/rpmpkg.h"
+#include "lib/backend/ndb/rpmxdb.h"
+#include "lib/backend/ndb/rpmidx.h"
+
+#include "debug.h"
+
+struct dbiCursor_s {
+    dbiIndex dbi; 
+    const void *key;
+    unsigned int keylen;
+    unsigned int hdrNum;
+    int flags;
+
+    unsigned int *list;
+    unsigned int nlist;
+    unsigned int ilist;
+    unsigned char *listdata;
+};
+
+struct ndbEnv_s {
+    rpmpkgdb pkgdb;
+    rpmxdb xdb;
+    int refs;
+
+    unsigned int hdrNum;
+    void *data;
+    unsigned int datalen;
+};
+
+static void closeEnv(rpmdb rdb)
+{
+    struct ndbEnv_s *ndbenv = rdb->db_dbenv;
+    if (--ndbenv->refs == 0) {
+       if (ndbenv->xdb) {
+           rpmxdbClose(ndbenv->xdb);
+           rpmlog(RPMLOG_DEBUG, "closed   db index       %s/Index.db\n", rpmdbHome(rdb));
+       }
+       if (ndbenv->pkgdb) {
+           rpmpkgClose(ndbenv->pkgdb);
+           rpmlog(RPMLOG_DEBUG, "closed   db index       %s/Packages.db\n", rpmdbHome(rdb));
+       }
+       if (ndbenv->data)
+           free(ndbenv->data);
+       free(ndbenv);
+       rdb->db_dbenv = 0;
+    }
+}
+
+static struct ndbEnv_s *openEnv(rpmdb rdb)
+{
+    struct ndbEnv_s *ndbenv = rdb->db_dbenv;
+    if (!ndbenv)
+       rdb->db_dbenv = ndbenv = xcalloc(1, sizeof(struct ndbEnv_s));
+    ndbenv->refs++;
+    return ndbenv;
+}
+
+static int ndb_Close(dbiIndex dbi, unsigned int flags)
+{
+    rpmdb rdb = dbi->dbi_rpmdb;
+    if (dbi->dbi_type != DBI_PRIMARY && dbi->dbi_db) {
+       rpmidxClose(dbi->dbi_db);
+       rpmlog(RPMLOG_DEBUG, "closed   db index       %s\n", dbi->dbi_file);
+    }
+    if (rdb->db_dbenv)
+       closeEnv(rdb);
+    dbi->dbi_db = 0;
+    return 0;
+}
+
+static int ndb_Open(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
+{
+    const char *dbhome = rpmdbHome(rdb);
+    struct ndbEnv_s *ndbenv;
+    dbiIndex dbi;
+    int rc, oflags, ioflags;
+
+    if (dbip)
+       *dbip = NULL;
+
+    if ((dbi = dbiNew(rdb, rpmtag)) == NULL)
+       return 1;
+
+    ndbenv = openEnv(rdb);
+
+    oflags = O_RDWR;
+    if ((rdb->db_mode & O_ACCMODE) == O_RDONLY)
+       oflags = O_RDONLY;
+    
+    if (dbi->dbi_type == DBI_PRIMARY) {
+       rpmpkgdb pkgdb = 0;
+       char *path = rstrscat(NULL, dbhome, "/Packages.db", NULL);
+       rpmlog(RPMLOG_DEBUG, "opening  db index       %s mode=0x%x\n", path, rdb->db_mode);
+       rc = rpmpkgOpen(&pkgdb, path, oflags, 0666);
+       if (rc && errno == ENOENT) {
+           oflags = O_RDWR|O_CREAT;
+           dbi->dbi_flags |= DBI_CREATED;
+           rc = rpmpkgOpen(&pkgdb, path, oflags, 0666);
+       }
+       if (rc) {
+           perror("rpmpkgOpen");
+           free(path);
+           ndb_Close(dbi, 0);
+           return 1;
+       }
+       free(path);
+       dbi->dbi_db = ndbenv->pkgdb = pkgdb;
+
+       if ((oflags & (O_RDWR | O_RDONLY)) == O_RDONLY)
+           dbi->dbi_flags |= DBI_RDONLY;
+    } else {
+       unsigned int id;
+       rpmidxdb idxdb = 0;
+       if (!ndbenv->pkgdb) {
+           ndb_Close(dbi, 0);
+           return 1;   /* please open primary first */
+       }
+       if (!ndbenv->xdb) {
+           char *path = rstrscat(NULL, dbhome, "/Index.db", NULL);
+           rpmlog(RPMLOG_DEBUG, "opening  db index       %s mode=0x%x\n", path, rdb->db_mode);
+
+           /* Open indexes readwrite if possible */
+           ioflags = O_RDWR;
+           rc = rpmxdbOpen(&ndbenv->xdb, rdb->db_pkgs->dbi_db, path, ioflags, 0666);
+           if (rc && errno == EACCES) {
+               /* If it is not asked for rw explicitly, try to open ro */
+               if (!(oflags & O_RDWR)) {
+                   ioflags = O_RDONLY;
+                   rc = rpmxdbOpen(&ndbenv->xdb, rdb->db_pkgs->dbi_db, path, ioflags, 0666);
+               }
+           } else if (rc && errno == ENOENT) {
+               ioflags = O_CREAT|O_RDWR;
+               rc = rpmxdbOpen(&ndbenv->xdb, rdb->db_pkgs->dbi_db, path, ioflags, 0666);
+           }
+           if (rc) {
+               perror("rpmxdbOpen");
+               free(path);
+               ndb_Close(dbi, 0);
+               return 1;
+           }
+           free(path);
+       }
+       if (rpmxdbLookupBlob(ndbenv->xdb, &id, rpmtag, 0, 0) == RPMRC_NOTFOUND) {
+           dbi->dbi_flags |= DBI_CREATED;
+       }
+       rpmlog(RPMLOG_DEBUG, "opening  db index       %s tag=%d\n", dbiName(dbi), rpmtag);
+       if (rpmidxOpenXdb(&idxdb, rdb->db_pkgs->dbi_db, ndbenv->xdb, rpmtag)) {
+           perror("rpmidxOpenXdb");
+           ndb_Close(dbi, 0);
+           return 1;
+       }
+       dbi->dbi_db = idxdb;
+
+       if (rpmxdbIsRdonly(ndbenv->xdb))
+           dbi->dbi_flags |= DBI_RDONLY;
+    }
+
+
+    if (dbip != NULL)
+       *dbip = dbi;
+    else
+       ndb_Close(dbi, 0);
+    return 0;
+}
+
+static int ndb_Verify(dbiIndex dbi, unsigned int flags)
+{
+    return 1;
+}
+
+static void ndb_SetFSync(rpmdb rdb, int enable)
+{
+}
+
+static int indexSync(rpmpkgdb pkgdb, rpmxdb xdb)
+{
+    unsigned int generation;
+    int rc;
+    if (!pkgdb || !xdb)
+        return 1;
+    if (rpmpkgLock(pkgdb, 1))
+        return 1;
+    if (rpmpkgGeneration(pkgdb, &generation)) {
+        rpmpkgUnlock(pkgdb, 1);
+        return 1;
+    }
+    rc = rpmxdbSetUserGeneration(xdb, generation);
+    rpmpkgUnlock(pkgdb, 1);
+    return rc;
+}
+
+static int ndb_Ctrl(rpmdb rdb, dbCtrlOp ctrl)
+{
+    struct ndbEnv_s *ndbenv = rdb->db_dbenv;
+
+    switch (ctrl) {
+    case DB_CTRL_LOCK_RO:
+       if (!rdb->db_pkgs)
+           return 1;
+       return rpmpkgLock(rdb->db_pkgs->dbi_db, 0);
+    case DB_CTRL_LOCK_RW:
+       if (!rdb->db_pkgs)
+           return 1;
+       return rpmpkgLock(rdb->db_pkgs->dbi_db, 1);
+    case DB_CTRL_UNLOCK_RO:
+       if (!rdb->db_pkgs)
+           return 1;
+       return rpmpkgUnlock(rdb->db_pkgs->dbi_db, 0);
+    case DB_CTRL_UNLOCK_RW:
+       if (!rdb->db_pkgs)
+           return 1;
+       return rpmpkgUnlock(rdb->db_pkgs->dbi_db, 1);
+    case DB_CTRL_INDEXSYNC:
+       if (!ndbenv)
+           return 1;
+       return indexSync(ndbenv->pkgdb, ndbenv->xdb);
+    default:
+       break;
+    }
+    return 0;
+}
+
+static dbiCursor ndb_CursorInit(dbiIndex dbi, unsigned int flags)
+{
+    dbiCursor dbc = xcalloc(1, sizeof(*dbc));
+    dbc->dbi = dbi;
+    dbc->flags = flags;
+    return dbc;
+}
+
+static dbiCursor ndb_CursorFree(dbiIndex dbi, dbiCursor dbc)
+{
+    if (dbc) {
+       if (dbc->list)
+           free(dbc->list);
+       if (dbc->listdata)
+           free(dbc->listdata);
+       free(dbc);
+    }
+    return NULL;
+}
+
+
+static void setdata(dbiCursor dbc,  unsigned int hdrNum, unsigned char *hdrBlob, unsigned int hdrLen)
+{
+    struct ndbEnv_s *ndbenv = dbc->dbi->dbi_rpmdb->db_dbenv;
+    if (ndbenv->data)
+       free(ndbenv->data);
+    ndbenv->hdrNum  = hdrNum;
+    ndbenv->data    = hdrBlob;
+    ndbenv->datalen = hdrLen;
+}
+
+static rpmRC ndb_pkgdbNew(dbiIndex dbi, dbiCursor dbc,  unsigned int *hdrNum)
+{
+    int rc = rpmpkgNextPkgIdx(dbc->dbi->dbi_db, hdrNum);
+    if (!rc)
+       setdata(dbc, *hdrNum, 0, 0);
+    return rc;
+}
+
+static rpmRC ndb_pkgdbPut(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum, unsigned char *hdrBlob, unsigned int hdrLen)
+{
+    int rc = rpmpkgPut(dbc->dbi->dbi_db, hdrNum, hdrBlob, hdrLen);
+    if (!rc) {
+       dbc->hdrNum = hdrNum;
+       setdata(dbc, hdrNum, 0, 0);
+    }
+    return rc;
+}
+
+static rpmRC ndb_pkgdbDel(dbiIndex dbi, dbiCursor dbc,  unsigned int hdrNum)
+{
+    dbc->hdrNum = 0;
+    setdata(dbc, 0, 0, 0);
+    return rpmpkgDel(dbc->dbi->dbi_db, hdrNum);
+}
+
+/* iterate over all packages */
+static rpmRC ndb_pkgdbIter(dbiIndex dbi, dbiCursor dbc, unsigned char **hdrBlob, unsigned int *hdrLen)
+{
+    int rc;
+    unsigned int hdrNum;
+
+    if (!dbc->list) {
+       rc = rpmpkgList(dbc->dbi->dbi_db, &dbc->list, &dbc->nlist);
+       if (rc)
+           return rc;
+       dbc->ilist = 0;
+    }
+    for (;;) {
+       if (dbc->ilist >= dbc->nlist) {
+           rc = RPMRC_NOTFOUND;
+           break;
+       }
+       *hdrBlob = 0;
+       hdrNum = dbc->list[dbc->ilist];
+       rc = rpmpkgGet(dbc->dbi->dbi_db, hdrNum, hdrBlob, hdrLen);
+       if (rc && rc != RPMRC_NOTFOUND)
+           break;
+       dbc->ilist++;
+       if (!rc) {
+           dbc->hdrNum = hdrNum;
+           setdata(dbc, hdrNum, *hdrBlob, *hdrLen);
+           break;
+       }
+    }
+    return rc;
+}
+
+static rpmRC ndb_pkgdbGet(dbiIndex dbi, dbiCursor dbc, unsigned int hdrNum, unsigned char **hdrBlob, unsigned int *hdrLen)
+{
+    int rc;
+    struct ndbEnv_s *ndbenv = dbc->dbi->dbi_rpmdb->db_dbenv;
+
+    if (!hdrNum)
+       return ndb_pkgdbIter(dbi, dbc, hdrBlob, hdrLen);
+    if (hdrNum == ndbenv->hdrNum && ndbenv->data) {
+       *hdrBlob = ndbenv->data;
+       *hdrLen = ndbenv->datalen;
+       return RPMRC_OK;
+    }
+    rc = rpmpkgGet(dbc->dbi->dbi_db, hdrNum, hdrBlob, hdrLen);
+    if (!rc) {
+       dbc->hdrNum = hdrNum;
+       setdata(dbc, hdrNum, *hdrBlob, *hdrLen);
+    }
+    return rc;
+}
+
+static unsigned int ndb_pkgdbKey(dbiIndex dbi, dbiCursor dbc)
+{
+    return dbc->hdrNum;
+}
+
+
+static void addtoset(dbiIndexSet *set, unsigned int *pkglist, unsigned int pkglistn)
+{
+    unsigned int i, j;
+    dbiIndexSet newset = dbiIndexSetNew(pkglistn / 2);
+    for (i = j = 0; i < pkglistn; i += 2) {
+       newset->recs[j].hdrNum = pkglist[i];
+       newset->recs[j].tagNum = pkglist[i + 1];
+       j++;
+    }
+    newset->count = j;
+    if (pkglist)
+       free(pkglist);
+    if (*set) {
+       dbiIndexSetAppendSet(*set, newset, 0);
+       dbiIndexSetFree(newset);
+    } else
+       *set = newset;
+}
+
+/* Iterate over all index entries */
+static rpmRC ndb_idxdbIter(dbiIndex dbi, dbiCursor dbc, dbiIndexSet *set)
+{
+    int rc;
+    if (!dbc->list) {
+       /* setup iteration list on first call */
+       rc = rpmidxList(dbc->dbi->dbi_db, &dbc->list, &dbc->nlist, &dbc->listdata);
+       if (rc)
+           return rc;
+       dbc->ilist = 0;
+    }
+    for (;;) {
+       unsigned char *k;
+       unsigned int kl;
+       unsigned int *pkglist, pkglistn;
+       if (dbc->ilist >= dbc->nlist) {
+           rc = RPMRC_NOTFOUND;
+           break;
+       }
+       k = dbc->listdata + dbc->list[dbc->ilist];
+       kl = dbc->list[dbc->ilist + 1];
+#if 0
+       if (searchType == DBC_KEY_SEARCH) {
+           dbc->ilist += 2;
+           dbc->key = k;
+           dbc->keylen = kl;
+           rc = RPMRC_OK;
+           break;
+       }
+#endif
+       pkglist = 0;
+       pkglistn = 0;
+       rc = rpmidxGet(dbc->dbi->dbi_db, k, kl, &pkglist, &pkglistn);
+       if (rc && rc != RPMRC_NOTFOUND)
+           break;
+       dbc->ilist += 2;
+       if (!rc && pkglistn) {
+           addtoset(set, pkglist, pkglistn);
+           dbc->key = k;
+           dbc->keylen = kl;
+           break;
+       }
+       if (pkglist)
+           free(pkglist);
+    }
+    return rc;
+}
+
+static rpmRC ndb_idxdbGet(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexSet *set, int searchType)
+{
+    int rc;
+    unsigned int *pkglist = 0, pkglistn = 0;
+
+    if (!keyp)
+       return ndb_idxdbIter(dbi, dbc, set);
+
+    if (searchType == DBC_PREFIX_SEARCH) {
+       unsigned int *list = 0, nlist = 0, i = 0;
+       unsigned char *listdata = 0;
+       int rrc = RPMRC_NOTFOUND;
+       rc = rpmidxList(dbc->dbi->dbi_db, &list, &nlist, &listdata);
+       if (rc)
+           return rc;
+       for (i = 0; i < nlist && !rc; i += 2) {
+           unsigned char *k = listdata + list[i];
+           unsigned int kl = list[i + 1];
+           if (kl < keylen || memcmp(k, keyp, keylen) != 0)
+               continue;
+           rc = ndb_idxdbGet(dbi, dbc, (char *)k, kl, set, DBC_NORMAL_SEARCH);
+           if (rc == RPMRC_NOTFOUND)
+               rc = 0;
+           else
+               rrc = rc;
+       }
+       if (list)
+           free(list);
+       if (listdata)
+           free(listdata);
+       return rc ? rc : rrc;
+    }
+
+    rc = rpmidxGet(dbc->dbi->dbi_db, (const unsigned char *)keyp, keylen, &pkglist, &pkglistn);
+    if (!rc)
+       addtoset(set, pkglist, pkglistn);
+    return rc;
+}
+
+static rpmRC ndb_idxdbPut(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec)
+{
+    return rpmidxPut(dbc->dbi->dbi_db, (const unsigned char *)keyp, keylen, rec->hdrNum, rec->tagNum);
+}
+
+static rpmRC ndb_idxdbDel(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen, dbiIndexItem rec)
+{
+    return rpmidxDel(dbc->dbi->dbi_db, (const unsigned char *)keyp, keylen, rec->hdrNum, rec->tagNum);
+}
+
+static const void * ndb_idxdbKey(dbiIndex dbi, dbiCursor dbc, unsigned int *keylen)
+{
+    if (dbc->key && keylen)
+       *keylen = dbc->keylen;
+    return dbc->key;
+}
+
+
+
+struct rpmdbOps_s ndb_dbops = {
+    .open      = ndb_Open,
+    .close     = ndb_Close,
+    .verify    = ndb_Verify,
+    .setFSync  = ndb_SetFSync,
+    .ctrl      = ndb_Ctrl,
+
+    .cursorInit        = ndb_CursorInit,
+    .cursorFree        = ndb_CursorFree,
+
+    .pkgdbNew  = ndb_pkgdbNew,
+    .pkgdbPut  = ndb_pkgdbPut,
+    .pkgdbDel  = ndb_pkgdbDel,
+    .pkgdbGet  = ndb_pkgdbGet,
+    .pkgdbKey  = ndb_pkgdbKey,
+
+    .idxdbGet  = ndb_idxdbGet,
+    .idxdbPut  = ndb_idxdbPut,
+    .idxdbDel  = ndb_idxdbDel,
+    .idxdbKey  = ndb_idxdbKey
+};
+
diff --git a/lib/backend/ndb/rpmidx.c b/lib/backend/ndb/rpmidx.c
new file mode 100644 (file)
index 0000000..313d2e0
--- /dev/null
@@ -0,0 +1,1280 @@
+#define _GNU_SOURCE
+
+#include "system.h"
+
+#include <rpm/rpmlog.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+#include <endian.h>
+
+#include "rpmidx.h"
+#include "rpmxdb.h"
+
+#define RPMRC_OK 0
+#define RPMRC_NOTFOUND 1
+#define RPMRC_FAIL 2
+
+/* Index database
+ *
+ *
+ * Layout:
+ *    Header
+ *    Slots
+ *    Keys
+ *
+ * Each slot contains 12 bytes, they are split into a 8 byte
+ * and a 4 byte part:
+ *    4 bytes   key offset + extra tag bits
+ *    4 bytes   data
+ *    4 bytes   data overflow
+ * The slot space first contains all 8 byte parts followed by all of
+ * the 4 byte overflow parts. This is done because most of the time we
+ * do not need the latter.
+ *
+ * If a new (key, pkgidx, datidx) tupel is added, the key is hashed with
+ * the popular murmur hash. The lower bits of the hash determine the start
+ * slot, parts of the higher bits are used as extra key equality check.
+ * The (pkgidx, datidx) pair is encoded in a (data, dataovl) pair, so that
+ * most of the time dataovl is zero.
+ * 
+ * The code then checks the current entry at the start slot. If the key
+ * does not match, it advances to the next slot. If it matches, it also
+ * checks the data part for a match but it remembers the key offset.
+ * If the code found a (key, data, dataovl) match, nothing needs to be done.
+ *
+ * Otherwise, the code arrived at an empty slot. It then adds the key
+ * to the key space if it did not find a matching key, and then puts
+ * the encoded (key, data, dataovl) pair into the slot.
+ *
+ * Deleting a (key, data) pair is done by replacing the slot with a
+ * (-1, -1, 0) dummy entry.
+ *
+ */
+
+
+typedef struct rpmidxdb_s {
+    rpmpkgdb pkgdb;            /* master database */
+
+    char *filename;
+    int fd;                    /* our file descriptor */
+    int flags;
+    int mode;
+
+    int rdonly;
+
+    /* xdb support */
+    rpmxdb xdb;
+    unsigned int xdbtag;
+    unsigned int xdbid;
+
+    unsigned char *head_mapped;
+    unsigned char *slot_mapped;
+    unsigned char *key_mapped;
+    unsigned int key_size;
+    unsigned int file_size;
+
+    unsigned int generation;
+    unsigned int nslots;
+    unsigned int usedslots;
+    unsigned int dummyslots;
+
+    unsigned int keyend;
+    unsigned int keyexcess;
+
+    unsigned int hmask;
+    unsigned int xmask;
+
+    unsigned int pagesize;
+} * rpmidxdb;
+
+static inline unsigned int le2h(unsigned char *p) 
+{
+    return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
+}
+
+static inline void h2le(unsigned int x, unsigned char *p) 
+{
+    p[0] = x;
+    p[1] = x >> 8; 
+    p[2] = x >> 16;
+    p[3] = x >> 24;
+}
+
+/* aligned versions */
+static inline unsigned int le2ha(unsigned char *p) 
+{
+    unsigned int x = *(unsigned int *)p;
+    return le32toh(x);
+}
+
+static inline void h2lea(unsigned int x, unsigned char *p) 
+{
+    *(unsigned int *)p = htole32(x);
+}
+
+/*** Header management ***/
+
+#define IDXDB_MAGIC     ('R' | 'p' << 8 | 'm' << 16 | 'I' << 24)
+#define IDXDB_VERSION  0
+
+#define IDXDB_OFFSET_MAGIC     0
+#define IDXDB_OFFSET_VERSION   4
+#define IDXDB_OFFSET_GENERATION        8
+#define IDXDB_OFFSET_NSLOTS    12
+#define IDXDB_OFFSET_USEDSLOTS 16
+#define IDXDB_OFFSET_DUMMYSLOTS        20
+#define IDXDB_OFFSET_XMASK     24
+#define IDXDB_OFFSET_KEYEND    28
+#define IDXDB_OFFSET_KEYEXCESS 32
+#define IDXDB_OFFSET_OBSOLETE  36
+
+#define IDXDB_SLOT_OFFSET      64
+#define IDXDB_KEY_CHUNKSIZE    4096
+
+/* XDB subids */
+
+#define IDXDB_XDB_SUBTAG               0
+#define IDXDB_XDB_SUBTAG_REBUILD       1
+
+static void set_mapped(rpmidxdb idxdb, unsigned char *addr, unsigned int size)
+{
+    if (addr) {
+       idxdb->head_mapped = addr;
+       idxdb->slot_mapped = addr + IDXDB_SLOT_OFFSET; 
+       idxdb->key_mapped = addr + IDXDB_SLOT_OFFSET + idxdb->nslots * 12;
+       idxdb->key_size = size - (IDXDB_SLOT_OFFSET + idxdb->nslots * 12);
+       idxdb->file_size = size;
+    } else {
+       idxdb->head_mapped = idxdb->slot_mapped = idxdb->key_mapped = 0;
+       idxdb->file_size = idxdb->key_size = 0;
+    }
+}
+
+/* XDB callbacks */
+static void mapcb(rpmxdb xdb, void *data, void *newaddr, size_t newsize) {
+    set_mapped((rpmidxdb)data, newaddr, (unsigned int)newsize);
+}
+
+static int rpmidxReadHeader(rpmidxdb idxdb);
+
+static int rpmidxMap(rpmidxdb idxdb)
+{
+    if (idxdb->xdb) {
+       if (rpmxdbMapBlob(idxdb->xdb, idxdb->xdbid, idxdb->rdonly ? O_RDONLY : O_RDWR, mapcb, idxdb))
+           return RPMRC_FAIL;
+       if (idxdb->file_size < 4096) {
+           rpmxdbUnmapBlob(idxdb->xdb, idxdb->xdbid);
+           return RPMRC_FAIL;
+       }
+    } else {
+#ifdef IDXDB_FILESUPPORT
+       struct stat stb;
+       size_t size;
+       void *mapped;
+       if (fstat(idxdb->fd, &stb))
+           return RPMRC_FAIL;
+       size = stb.st_size;
+       if (size < 4096)
+           return RPMRC_FAIL;
+       /* round up for mmap */
+       size = (size + idxdb->pagesize - 1) & ~(idxdb->pagesize - 1);
+       mapped = mmap(0, size, idxdb->rdonly ? PROT_READ : PROT_READ | PROT_WRITE, MAP_SHARED, idxdb->fd, 0);
+       if (mapped == MAP_FAILED)
+           return RPMRC_FAIL;
+       set_mapped(idxdb, mapped, (unsigned int)stb.st_size);
+#else
+       return RPMRC_FAIL;
+#endif
+    }
+    return RPMRC_OK;
+}
+
+static void rpmidxUnmap(rpmidxdb idxdb)
+{
+    if (!idxdb->head_mapped)
+       return;
+    if (idxdb->xdb) {
+       rpmxdbUnmapBlob(idxdb->xdb, idxdb->xdbid);
+    } else {
+#ifdef IDXDB_FILESUPPORT
+       size_t size = idxdb->file_size;
+       /* round up for munmap */
+       size = (size + idxdb->pagesize - 1) & ~(idxdb->pagesize - 1);
+       munmap(idxdb->head_mapped, size);
+       set_mapped(idxdb, 0, 0);
+#else
+       return;
+#endif
+    }
+}
+
+#ifdef IDXDB_FILESUPPORT
+static int rpmidxReadHeader(rpmidxdb idxdb);
+
+/* re-open file to get the new version */
+static int rpmidxHandleObsolete(rpmidxdb idxdb)
+{
+    int nfd;
+    struct stat stb1, stb2;
+
+    if (fstat(idxdb->fd, &stb1))
+       return RPMRC_FAIL;
+    nfd = open(idxdb->filename, idxdb->rdonly ? O_RDONLY : O_RDWR, 0);
+    if (nfd == -1)
+       return RPMRC_FAIL;
+    if (fstat(nfd, &stb2)) {
+       close(nfd);
+       return RPMRC_FAIL;
+    }
+    if (stb1.st_dev == stb2.st_dev && stb1.st_ino == stb2.st_ino)
+       return RPMRC_FAIL;              /* openend the same obsolete file */
+    rpmidxUnmap(idxdb);
+    close(idxdb->fd);
+    idxdb->fd = nfd;
+    return rpmidxReadHeader(idxdb);    /* re-try with new file */
+}
+#endif
+
+static int rpmidxReadHeader(rpmidxdb idxdb)
+{
+    unsigned int version;
+
+    if (idxdb->head_mapped) {
+       if (le2ha(idxdb->head_mapped + IDXDB_OFFSET_GENERATION) == idxdb->generation)
+           return RPMRC_OK;
+       rpmidxUnmap(idxdb);
+    }
+    idxdb->nslots = 0;
+    if (rpmidxMap(idxdb))
+       return RPMRC_FAIL;
+
+    if (le2ha(idxdb->head_mapped + IDXDB_OFFSET_MAGIC) != IDXDB_MAGIC) {
+       rpmidxUnmap(idxdb);
+       return RPMRC_FAIL;
+    }
+    version = le2ha(idxdb->head_mapped + IDXDB_OFFSET_VERSION);
+    if (version != IDXDB_VERSION) {
+       rpmlog(RPMLOG_ERR, _("rpmidx: Version mismatch. Expected version: %u. "
+           "Found version: %u\n"), IDXDB_VERSION, version);
+       rpmidxUnmap(idxdb);
+       return RPMRC_FAIL;
+    }
+#ifdef IDXDB_FILESUPPORT
+    if (!idxdb->xdb && le2ha(idxdb->head_mapped + IDXDB_OFFSET_OBSOLETE))
+       return rpmidxHandleObsolete(idxdb);
+#endif
+    idxdb->generation = le2ha(idxdb->head_mapped + IDXDB_OFFSET_GENERATION);
+    idxdb->nslots     = le2ha(idxdb->head_mapped + IDXDB_OFFSET_NSLOTS);
+    idxdb->usedslots  = le2ha(idxdb->head_mapped + IDXDB_OFFSET_USEDSLOTS);
+    idxdb->dummyslots = le2ha(idxdb->head_mapped + IDXDB_OFFSET_DUMMYSLOTS);
+    idxdb->xmask      = le2ha(idxdb->head_mapped + IDXDB_OFFSET_XMASK);
+    idxdb->keyend     = le2ha(idxdb->head_mapped + IDXDB_OFFSET_KEYEND);
+    idxdb->keyexcess  = le2ha(idxdb->head_mapped + IDXDB_OFFSET_KEYEXCESS);
+
+    idxdb->hmask = idxdb->nslots - 1;
+
+    /* now that we know nslots we can split between slots and keys */
+    if (idxdb->file_size <= IDXDB_SLOT_OFFSET + idxdb->nslots * 12) {
+       rpmidxUnmap(idxdb);     /* too small, somthing is wrong */
+       return RPMRC_FAIL;
+    }
+    idxdb->key_mapped = idxdb->slot_mapped + idxdb->nslots * 12;
+    idxdb->key_size = idxdb->file_size - (IDXDB_SLOT_OFFSET + idxdb->nslots * 12);
+    return RPMRC_OK;
+}
+
+static int rpmidxWriteHeader(rpmidxdb idxdb)
+{
+    if (!idxdb->head_mapped)
+       return RPMRC_FAIL;
+    h2lea(IDXDB_MAGIC,       idxdb->head_mapped + IDXDB_OFFSET_MAGIC);
+    h2lea(IDXDB_VERSION,     idxdb->head_mapped + IDXDB_OFFSET_VERSION);
+    h2lea(idxdb->generation, idxdb->head_mapped + IDXDB_OFFSET_GENERATION);
+    h2lea(idxdb->nslots,     idxdb->head_mapped + IDXDB_OFFSET_NSLOTS);
+    h2lea(idxdb->usedslots,  idxdb->head_mapped + IDXDB_OFFSET_USEDSLOTS);
+    h2lea(idxdb->dummyslots, idxdb->head_mapped + IDXDB_OFFSET_DUMMYSLOTS);
+    h2lea(idxdb->xmask,      idxdb->head_mapped + IDXDB_OFFSET_XMASK);
+    h2lea(idxdb->keyend,     idxdb->head_mapped + IDXDB_OFFSET_KEYEND);
+    h2lea(idxdb->keyexcess,  idxdb->head_mapped + IDXDB_OFFSET_KEYEXCESS);
+    return RPMRC_OK;
+}
+
+static inline void updateUsedslots(rpmidxdb idxdb)
+{
+    h2lea(idxdb->usedslots, idxdb->head_mapped + IDXDB_OFFSET_USEDSLOTS);
+}
+
+static inline void updateDummyslots(rpmidxdb idxdb)
+{
+    h2lea(idxdb->dummyslots, idxdb->head_mapped + IDXDB_OFFSET_DUMMYSLOTS);
+}
+
+static inline void updateKeyend(rpmidxdb idxdb)
+{
+    h2lea(idxdb->keyend, idxdb->head_mapped + IDXDB_OFFSET_KEYEND);
+}
+
+static inline void updateKeyexcess(rpmidxdb idxdb)
+{
+    h2lea(idxdb->keyexcess, idxdb->head_mapped + IDXDB_OFFSET_KEYEXCESS);
+}
+
+static inline void bumpGeneration(rpmidxdb idxdb)
+{
+    idxdb->generation++;
+    h2lea(idxdb->generation, idxdb->head_mapped + IDXDB_OFFSET_GENERATION);
+}
+
+#ifdef IDXDB_FILESUPPORT
+static int createempty(rpmidxdb idxdb, off_t off, size_t size)
+{
+    char buf[4096];
+    memset(buf, 0, sizeof(buf));
+    while (size >= 4096) {
+       if (pwrite(idxdb->fd, buf, 4096, off) != 4096)
+           return RPMRC_FAIL;
+       off += 4096;
+       size -= 4096;
+    }
+    if (size > 0 && pwrite(idxdb->fd, buf, size , off) != size)
+       return RPMRC_FAIL;
+    return RPMRC_OK;
+}
+#endif
+
+/*** Key management ***/
+
+#define MURMUR_M 0x5bd1e995
+
+static unsigned int murmurhash(const unsigned char *s, unsigned int l)
+{
+    unsigned int h =  l * MURMUR_M;
+
+    while (l >= 4) {
+       h += s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24;
+       h *= MURMUR_M;
+       h ^= h >> 16;
+       s += 4;
+       l -= 4;
+    }
+    switch (l) {
+       case 3:
+           h += s[2] << 16; 
+       case 2:
+           h += s[1] << 8;
+       case 1:
+           h += s[0];
+           h *= MURMUR_M;
+           h ^= h >> 16;
+       default:
+           break;
+    }
+    h *= MURMUR_M;
+    h ^= h >> 10; 
+    h *= MURMUR_M;
+    h ^= h >> 17; 
+    return h;
+}
+
+static inline unsigned int decodekeyl(unsigned char *p, unsigned int *hl)
+{
+    if (*p != 255) {
+       *hl = 1;
+       return *p;
+    } else if (p[1] != 255 || p[2] != 255) {
+       *hl = 3;
+       return p[1] | p[2] << 8;
+    } else {
+       *hl = 7;
+       return p[3] | p[4] << 8 | p[5] << 16 | p[6] << 24;
+    }
+}
+
+static inline void encodekeyl(unsigned char *p, unsigned int keyl)
+{
+    if (keyl && keyl < 255) {
+       p[0] = keyl;
+    } else if (keyl < 65535) {
+       p[0] = 255;
+       p[1] = keyl;
+       p[2] = keyl >> 8;
+    } else {
+       p[0] = 255;
+       p[1] = 255;
+       p[2] = 255;
+       p[3] = keyl;
+       p[4] = keyl >> 8;
+       p[5] = keyl >> 16;
+       p[6] = keyl >> 24;
+    }
+}
+
+static inline unsigned int keylsize(unsigned int keyl)
+{
+    return keyl && keyl < 255 ? 1 : keyl < 65535 ? 3 : 7;
+}
+
+static inline int equalkey(rpmidxdb idxdb, unsigned int off, const unsigned char *key, unsigned int keyl)
+{
+    unsigned char *p;
+    if (off + keyl + 1 > idxdb->keyend)
+       return 0;
+    p = idxdb->key_mapped + off;
+    if (keyl && keyl < 255) {
+       if (*p != keyl)
+           return 0;
+       p += 1;
+    } else if (keyl < 65535) {
+       if (p[0] != 255 || (p[1] | p[2] << 8) != keyl)
+           return 0;
+       p += 3;
+    } else {
+       if (p[0] != 255 || p[1] != 255 || p[2] != 255 || (p[3] | p[4] << 8 | p[5] << 16 | p[6] << 24) != keyl)
+           return 0;
+       p += 7;
+    }
+    if (keyl && memcmp(key, p, keyl))
+       return 0;
+    return 1;
+}
+
+static int addkeypage(rpmidxdb idxdb) {
+    unsigned int addsize = idxdb->pagesize > IDXDB_KEY_CHUNKSIZE ? idxdb->pagesize : IDXDB_KEY_CHUNKSIZE;
+
+    if (idxdb->xdb) {
+       if (rpmxdbResizeBlob(idxdb->xdb, idxdb->xdbid, idxdb->file_size + addsize))
+           return RPMRC_FAIL;
+    } else {
+#ifdef IDXDB_FILESUPPORT
+       /* don't use ftruncate because we want to create a "backed" page */
+       void *newaddr;
+       size_t oldsize, newsize;
+       if (createempty(idxdb, idxdb->file_size, addsize))
+           return RPMRC_FAIL;
+       oldsize = idxdb->file_size;
+       newsize = idxdb->file_size + addsize;
+       /* round up for mremap */
+       oldsize = (oldsize + idxdb->pagesize - 1) & ~(idxdb->pagesize - 1);
+       newsize = (newsize + idxdb->pagesize - 1) & ~(idxdb->pagesize - 1);
+       newaddr = mremap(idxdb->head_mapped, oldsize, newsize, MREMAP_MAYMOVE);
+       if (newaddr == MAP_FAILED)
+           return RPMRC_FAIL;
+       set_mapped(idxdb, newaddr, idxdb->file_size + addsize);
+#else
+       return RPMRC_FAIL;
+#endif
+    }
+    return RPMRC_OK;
+}
+
+static int addnewkey(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int *keyoffp)
+{
+    int hl = keylsize(keyl);
+    while (idxdb->key_size - idxdb->keyend < hl + keyl) {
+       if (addkeypage(idxdb))
+           return RPMRC_FAIL;
+    }
+    encodekeyl(idxdb->key_mapped + idxdb->keyend, keyl);
+    if (keyl)
+       memcpy(idxdb->key_mapped + idxdb->keyend + hl, key, keyl);
+    *keyoffp = idxdb->keyend;
+    idxdb->keyend += hl + keyl;
+    updateKeyend(idxdb);
+    return RPMRC_OK;
+}
+
+
+/*** Data encoding/decoding ***/
+
+/* Encode a (pkgidx, datidx) tuple into a (data, ovldata) tuple in a way
+ * that most of the time ovldata will be zero. */
+static inline unsigned int encodedata(rpmidxdb idxdb, unsigned int pkgidx, unsigned int datidx, unsigned int *ovldatap)
+{
+    if (pkgidx < 0x100000 && datidx < 0x400) {
+       *ovldatap = 0;
+       return pkgidx | datidx << 20;
+    } else if (pkgidx < 0x1000000 && datidx < 0x40) {
+       *ovldatap = 0;
+       return pkgidx | datidx << 24 | 0x40000000;
+    } else {
+       *ovldatap = pkgidx;
+       return datidx | 0x80000000;
+    }
+}
+
+/* Decode (data, ovldata) back into (pkgidx, datidx) */
+static inline unsigned int decodedata(rpmidxdb idxdb, unsigned int data, unsigned int ovldata, unsigned int *datidxp)
+{
+    if (data & 0x80000000) {
+       *datidxp = data ^ 0x80000000;
+       return ovldata;
+    } else if (data & 0x40000000) {
+       *datidxp = (data ^ 0x40000000) >> 24;
+       return data & 0xffffff;
+    } else {
+       *datidxp = data >> 20;
+       return data & 0xfffff;
+    }
+}
+
+
+/*** Rebuild helpers ***/
+
+/* copy a single data entry into the new database */
+static inline void copyentry(rpmidxdb idxdb, unsigned int keyh, unsigned int newkeyoff, unsigned int data, unsigned int ovldata)
+{
+    unsigned int h, hh = 7;
+    unsigned char *ent;
+    unsigned int hmask = idxdb->hmask;
+    unsigned int x;
+    
+    /* find an empty slot */
+    for (h = keyh & hmask;; h = (h + hh++) & hmask) {
+       ent = idxdb->slot_mapped + 8 * h;
+       x = le2ha(ent);
+       if (x == 0)
+           break;
+    }
+    /* write data */
+    h2lea(newkeyoff, ent);
+    h2lea(data, ent + 4);
+    if (ovldata)
+       h2lea(ovldata, idxdb->slot_mapped + idxdb->nslots * 8 + 4 * h);
+    idxdb->usedslots++;
+}
+
+/* copy all entries belonging to a single key from the old database into the new database */
+static inline void copykeyentries(const unsigned char *key, unsigned int keyl, rpmidxdb idxdb, unsigned int oldkeyoff, rpmidxdb nidxdb, unsigned int newkeyoff, unsigned char *done)
+{
+    unsigned int h, hh;
+    unsigned int keyh = murmurhash(key, keyl);
+    unsigned int hmask = idxdb->hmask;
+
+    oldkeyoff |= keyh & idxdb->xmask;
+    newkeyoff |= keyh & nidxdb->xmask;
+    for (h = keyh & hmask, hh = 7; ; h = (h + hh++) & hmask) {
+       unsigned char *ent = idxdb->slot_mapped + 8 * h;
+       unsigned int data, ovldata;
+       unsigned int x = le2ha(ent);
+       if (x == 0)
+           break;
+       if (x != oldkeyoff)
+           continue;
+       data = le2ha(ent + 4);
+       ovldata = (data & 0x80000000) ? le2ha(idxdb->slot_mapped + idxdb->nslots * 8 + 4 * h) : 0;
+       copyentry(nidxdb, keyh, newkeyoff, data, ovldata);
+       done[h >> 3] |= 1 << (h & 7);
+    }
+}
+
+static int rpmidxRebuildInternal(rpmidxdb idxdb)
+{
+    struct rpmidxdb_s nidxdb_s, *nidxdb;
+    unsigned int i, nslots;
+    unsigned int keyend, keyoff, xmask;
+    unsigned char *done;
+    unsigned char *ent;
+    unsigned int file_size, key_size, xfile_size;
+
+    nidxdb = &nidxdb_s;
+    memset(nidxdb, 0, sizeof(*nidxdb));
+    nidxdb->pagesize = sysconf(_SC_PAGE_SIZE);
+
+    /* calculate nslots the hard way, don't trust usedslots */
+    nslots = 0;
+    for (i = 0, ent = idxdb->slot_mapped; i < idxdb->nslots; i++, ent += 8) {
+       unsigned int x = le2ha(ent);
+       if (x != 0 && x != -1)
+           nslots++;
+    }
+    if (nslots < 256)
+       nslots = 256;
+    while (nslots & (nslots - 1))
+       nslots = nslots & (nslots - 1);
+    nslots *= 4;
+
+    nidxdb->nslots = nslots;
+    nidxdb->hmask = nslots - 1;
+
+    /* calculate the new key space size */
+    key_size = idxdb->keyend;
+    if (key_size < IDXDB_KEY_CHUNKSIZE)
+       key_size = IDXDB_KEY_CHUNKSIZE;
+    file_size = IDXDB_SLOT_OFFSET + nslots * 12 + key_size;
+
+    /* round file size to multiple of the page size */
+    if (file_size & (nidxdb->pagesize - 1)) {
+       unsigned int add = nidxdb->pagesize - (file_size & (nidxdb->pagesize - 1));
+       file_size += add;
+       key_size += add;
+    }
+
+    /* calculate xmask, leave at least 8192 bytes headroom for key space */
+    for (xmask = 0x00010000; xmask && xmask < key_size + 8192; xmask <<= 1)
+      ;
+    xmask = xmask ? ~(xmask - 1) : 0;
+    nidxdb->xmask = xmask;
+
+    /* create new database */
+    if (idxdb->xdb) {
+       nidxdb->xdb = idxdb->xdb;
+       nidxdb->xdbtag = idxdb->xdbtag;
+       if (rpmxdbLookupBlob(nidxdb->xdb, &nidxdb->xdbid, idxdb->xdbtag, IDXDB_XDB_SUBTAG_REBUILD, O_CREAT|O_TRUNC)) {
+           return RPMRC_FAIL;
+       }
+       if (rpmxdbResizeBlob(nidxdb->xdb, nidxdb->xdbid, file_size)) {
+           return RPMRC_FAIL;
+       }
+       if (rpmidxMap(nidxdb)) {
+           return RPMRC_FAIL;
+       }
+    } else {
+#ifdef IDXDB_FILESUPPORT
+       void *mapped;
+       nidxdb->filename = malloc(strlen(idxdb->filename) + 8);
+       if (!nidxdb->filename)
+           return RPMRC_FAIL;
+       sprintf(nidxdb->filename, "%s-XXXXXX", idxdb->filename);
+       nidxdb->fd = mkstemp(nidxdb->filename);
+       if (nidxdb->fd == -1) {
+           free(nidxdb->filename);
+           return RPMRC_FAIL;
+       }
+       if (createempty(nidxdb, 0, file_size)) {
+           close(nidxdb->fd);
+           unlink(nidxdb->filename);
+           free(nidxdb->filename);
+           return RPMRC_FAIL;
+       }
+       mapped = mmap(0, file_size, idxdb->rdonly ? PROT_READ : PROT_READ | PROT_WRITE, MAP_SHARED, nidxdb->fd, 0);
+       if (mapped == MAP_FAILED) {
+           close(nidxdb->fd);
+           unlink(nidxdb->filename);
+           free(nidxdb->filename);
+           return RPMRC_FAIL;
+       }
+       set_mapped(nidxdb, mapped, file_size);
+#else
+       return RPMRC_FAIL;
+#endif
+    }
+
+    /* copy all entries */
+    done = calloc(idxdb->nslots / 8 + 1, 1);
+    if (!done) {
+       rpmidxUnmap(nidxdb);
+       if (!idxdb->xdb) {
+           close(nidxdb->fd);
+           unlink(nidxdb->filename);
+           free(nidxdb->filename);
+       }
+       return RPMRC_FAIL;
+    }
+    keyend = 1;
+    for (i = 0, ent = idxdb->slot_mapped; i < idxdb->nslots; i++, ent += 8) {
+       unsigned int x = le2ha(ent);
+       unsigned char *key;
+       unsigned int keyl, hl;
+
+       if (x == 0 || x == -1)
+           continue;
+       if (done[i >> 3] & (1 << (i & 7))) {
+           continue;   /* we already did that one */
+       }
+       x &= ~idxdb->xmask;
+       key = idxdb->key_mapped + x;
+       keyl = decodekeyl(key, &hl);
+       keyoff = keyend;
+       keyend += hl + keyl;
+       memcpy(nidxdb->key_mapped + keyoff, key, hl + keyl);
+       copykeyentries(key + hl, keyl, idxdb, x, nidxdb, keyoff, done);
+    }
+    free(done);
+    nidxdb->keyend = keyend;
+    nidxdb->generation = idxdb->generation + 1;
+    rpmidxWriteHeader(nidxdb);
+    rpmidxUnmap(nidxdb);
+
+    /* shrink if we have allocated excessive key space */
+    xfile_size = file_size - key_size + keyend + IDXDB_KEY_CHUNKSIZE;
+    xfile_size = (xfile_size + nidxdb->pagesize - 1) & ~(nidxdb->pagesize - 1);
+    if (xfile_size < file_size) {
+       if (nidxdb->xdb) {
+           rpmxdbResizeBlob(nidxdb->xdb, nidxdb->xdbid, xfile_size);
+       } else {
+           if (ftruncate(nidxdb->fd, xfile_size)) {
+               rpmlog(RPMLOG_WARNING, _("truncate failed: %s\n"), strerror(errno));
+           }
+       }
+    }
+
+    /* now switch over to new database */
+    if (idxdb->xdb) {
+       rpmidxUnmap(idxdb);
+       if (rpmxdbRenameBlob(nidxdb->xdb, &nidxdb->xdbid, idxdb->xdbtag, IDXDB_XDB_SUBTAG))
+           return RPMRC_FAIL;
+       idxdb->xdbid = nidxdb->xdbid;
+    } else {
+#ifdef IDXDB_FILESUPPORT
+       if (rename(nidxdb->filename, idxdb->filename)) {
+           close(nidxdb->fd);
+           unlink(nidxdb->filename);
+           free(nidxdb->filename);
+           return RPMRC_FAIL;
+       }
+       if (idxdb->head_mapped) {
+           h2lea(1, idxdb->head_mapped + IDXDB_OFFSET_OBSOLETE);
+           bumpGeneration(idxdb);
+           rpmidxUnmap(idxdb);
+       }
+       free(nidxdb->filename);
+       close(idxdb->fd);
+       idxdb->fd = nidxdb->fd;
+#else
+       return RPMRC_FAIL;
+#endif
+    }
+    if (rpmidxReadHeader(idxdb))
+       return RPMRC_FAIL;
+    return RPMRC_OK;
+}
+
+/* check if we need to rebuild the index. We need to do this if
+ * - there are too many used slot, so hashing is inefficient
+ * - there is too much key excess (i.e. holes in the keys)
+ * - our keys grew so much that they need more bits
+ */
+static int rpmidxCheck(rpmidxdb idxdb)
+{
+    if (idxdb->usedslots * 2 > idxdb->nslots ||
+       (idxdb->keyexcess > 4096 && idxdb->keyexcess * 4 > idxdb->keyend) ||
+       idxdb->keyend >= ~idxdb->xmask) {
+       if (rpmidxRebuildInternal(idxdb))
+           return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+static int rpmidxPutInternal(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int pkgidx, unsigned int datidx)
+{
+    unsigned int keyh = murmurhash(key, keyl);
+    unsigned int keyoff = 0;
+    unsigned int freeh = -1;
+    unsigned int x, h, hh = 7;
+    unsigned int hmask;
+    unsigned int xmask;
+    unsigned char *ent;
+    unsigned int data, ovldata;
+
+    if (datidx >= 0x80000000)
+       return RPMRC_FAIL;
+    if (rpmidxCheck(idxdb))
+       return RPMRC_FAIL;
+    data = encodedata(idxdb, pkgidx, datidx, &ovldata);
+    hmask = idxdb->hmask;
+    xmask = idxdb->xmask;
+    for (h = keyh & hmask; ; h = (h + hh++) & hmask) {
+       ent = idxdb->slot_mapped + 8 * h;
+       x = le2ha(ent);
+       if (x == 0)             /* reached an empty slot */
+           break;
+       if (x == -1) {
+           freeh = h;          /* found a dummy slot, remember the position */
+           continue;
+       }
+       if (!keyoff) {
+           if (((x ^ keyh) & xmask) != 0)
+               continue;
+           if (!equalkey(idxdb, x & ~xmask, key, keyl))
+               continue;
+           keyoff = x;
+       }
+       if (keyoff != x)
+           continue;
+       /* string matches, check data/ovldata */
+       if (le2ha(ent + 4) == data) {
+           if (!ovldata || le2ha(idxdb->slot_mapped + idxdb->nslots * 8 + 4 * h) == ovldata)
+               return RPMRC_OK;        /* already in database */
+       }
+       /* continue searching */
+    }
+    if (!keyoff) {
+       /* we did not find this key. add it */
+       if (addnewkey(idxdb, key, keyl, &keyoff))
+           return RPMRC_FAIL;
+       keyoff |= keyh & xmask;         /* tag it with the extra bits */
+       /* re-calculate ent, addnewkey may have changed the mapping! */
+       ent = idxdb->slot_mapped + 8 * h;
+    }
+    if (freeh == -1) {
+       /* did not find a dummy slot, so use the current empty slot */
+       idxdb->usedslots++;
+       updateUsedslots(idxdb);
+    } else {
+       /* re-use dummy slot */
+       h = freeh;
+       ent = idxdb->slot_mapped + 8 * h;
+       if (idxdb->dummyslots) {
+           idxdb->dummyslots--;
+           updateDummyslots(idxdb);
+       }
+    }
+    h2lea(keyoff, ent);
+    h2lea(data, ent + 4);
+    if (ovldata)
+       h2lea(ovldata, idxdb->slot_mapped + idxdb->nslots * 8 + 4 * h);
+    bumpGeneration(idxdb);
+    return RPMRC_OK;
+}
+
+static int rpmidxDelInternal(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int pkgidx, unsigned int datidx)
+{
+    unsigned int keyoff = 0;
+    unsigned int keyh = murmurhash(key, keyl);
+    unsigned int hmask;
+    unsigned int xmask;
+    unsigned int x, h, hh = 7;
+    int otherusers = 0;
+    unsigned int data, ovldata;
+
+    if (datidx >= 0x80000000)
+       return RPMRC_FAIL;
+    if (rpmidxCheck(idxdb))
+       return RPMRC_FAIL;
+    data = encodedata(idxdb, pkgidx, datidx, &ovldata);
+    hmask = idxdb->hmask;
+    xmask = idxdb->xmask;
+    for (h = keyh & hmask; ; h = (h + hh++) & hmask) {
+       unsigned char *ent = idxdb->slot_mapped + 8 * h;
+       x = le2ha(ent);
+       if (x == 0)
+           break;
+       if (x == -1)
+           continue;
+       if (!keyoff) {
+           if (((x ^ keyh) & xmask) != 0)
+               continue;
+           if (!equalkey(idxdb, x & ~xmask, key, keyl))
+               continue;
+           keyoff = x;
+       }
+       if (keyoff != x)
+           continue;
+       /* key matches, check data/ovldata */
+       if (le2ha(ent + 4) != data) {
+           otherusers = 1;
+           continue;
+       }
+       if (ovldata && le2ha(idxdb->slot_mapped + idxdb->nslots * 8 + 4 * h) != ovldata) {
+           otherusers = 1;
+           continue;
+       }
+       /* found a match. convert entry to a dummy slot */
+       h2lea(-1, ent);
+       h2lea(-1, ent + 4);
+       if (ovldata)
+           h2lea(0, idxdb->slot_mapped + idxdb->nslots * 8 + 4 * h);
+       idxdb->dummyslots++;
+       updateDummyslots(idxdb);
+       /* continue searching (so that we find other users of the key...) */
+    }
+    if (keyoff && !otherusers) {
+       /* key is no longer in use. free it */
+       int hl = keylsize(keyl);
+       memset(idxdb->key_mapped + (keyoff & ~xmask), 0, hl + keyl);
+       idxdb->keyexcess += hl + keyl;
+       updateKeyexcess(idxdb);
+    }
+    if (keyoff)
+       bumpGeneration(idxdb);
+    return RPMRC_OK;
+}
+
+static int rpmidxGetInternal(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int **pkgidxlistp, unsigned int *pkgidxnump)
+{
+    unsigned int keyoff = 0;
+    unsigned int keyh = murmurhash(key, keyl);
+    unsigned int hmask = idxdb->hmask;
+    unsigned int xmask = idxdb->xmask;
+    unsigned int x, h, hh = 7;
+    unsigned int data, ovldata, datidx;
+    unsigned int nhits = 0;
+    unsigned int *hits = 0;
+    for (h = keyh & hmask; ; h = (h + hh++) & hmask) {
+       unsigned char *ent = idxdb->slot_mapped + 8 * h;
+       x = le2ha(ent);
+       if (x == 0)
+           break;
+       if (x == -1)
+           continue;
+       if (!keyoff) {
+           if (((x ^ keyh) & xmask) != 0)
+               continue;
+           if (!equalkey(idxdb, x & ~xmask, key, keyl))
+               continue;
+           keyoff = x;
+       }
+       if (keyoff != x)
+           continue;
+       if ((nhits & 15) == 0) {
+           if (!hits) {
+               hits = malloc(16 * sizeof(unsigned int));
+           } else {
+               hits = realloc(hits, (nhits + 16) * sizeof(unsigned int));
+           }
+           if (!hits)
+               return RPMRC_FAIL;
+       }
+       data = le2ha(ent + 4);
+       ovldata = (data & 0x80000000) ? le2ha(idxdb->slot_mapped + idxdb->nslots * 8 + 4 * h) : 0;
+       hits[nhits++] = decodedata(idxdb, data, ovldata, &datidx);
+       hits[nhits++] = datidx;
+    }
+    *pkgidxlistp = hits;
+    *pkgidxnump = nhits;
+    return nhits ? RPMRC_OK : RPMRC_NOTFOUND;
+}
+
+static int rpmidxListSort_cmp(const void *a, const void *b)
+{
+    return ((unsigned int *)a)[1] - ((unsigned int *)b)[1];
+}
+
+/* sort in hash offset order, so that we get sequential acceess */
+static void rpmidxListSort(rpmidxdb idxdb, unsigned int *keylist, unsigned int nkeylist, unsigned char *data)
+{
+    unsigned int i, *arr;
+    if (nkeylist < 2 * 2)
+       return;
+    arr = malloc(nkeylist * sizeof(unsigned int));
+    if (!arr)
+       return;
+    for (i = 0; i < nkeylist; i += 2) {
+       arr[i] = i;
+       arr[i + 1] = murmurhash(data + keylist[i], keylist[i + 1]) & idxdb->hmask;
+    }
+    qsort(arr, nkeylist / 2, 2 * sizeof(unsigned int), rpmidxListSort_cmp);
+    for (i = 0; i < nkeylist; i += 2) {
+       unsigned int ai = arr[i];
+       arr[i] = keylist[ai];
+       arr[i + 1] = keylist[ai + 1];
+    }
+    memcpy(keylist, arr, nkeylist * sizeof(unsigned int));
+    free(arr);
+}
+
+static int rpmidxListInternal(rpmidxdb idxdb, unsigned int **keylistp, unsigned int *nkeylistp, unsigned char **datap)
+{
+    unsigned int *keylist = 0;
+    unsigned int nkeylist = 0;
+    unsigned char *data, *terminate, *key, *keyendp;
+
+    data = malloc(idxdb->keyend + 1);  /* +1 so we can terminate the last key */
+    if (!data)
+       return RPMRC_FAIL;
+    memcpy(data, idxdb->key_mapped, idxdb->keyend);
+    keylist = malloc(16 * sizeof(*keylist));
+    if (!keylist) {
+       free(data);
+       return RPMRC_FAIL;
+    }
+    terminate = 0;
+    for (key = data + 1, keyendp = data + idxdb->keyend; key < keyendp; ) {
+       unsigned int hl, keyl;
+       if (!*key) {
+           key++;
+           continue;
+       }
+       if ((nkeylist & 15) == 0) {
+           unsigned int *kl = realloc(keylist, (nkeylist + 16) * sizeof(*keylist));
+           if (!kl) {
+               free(keylist);
+               free(data);
+               return RPMRC_FAIL;
+           }
+           keylist = kl;
+       }
+       keyl = decodekeyl(key, &hl);
+       keylist[nkeylist++] = key + hl - data;
+       keylist[nkeylist++] = keyl;
+       key += hl + keyl;
+       if (terminate)
+         *terminate = 0;
+       terminate = key;
+    }
+    if (terminate)
+      *terminate = 0;
+    rpmidxListSort(idxdb, keylist, nkeylist, data);
+    *keylistp = keylist;
+    *nkeylistp = nkeylist;
+    *datap = data;
+    return RPMRC_OK;
+}
+
+
+static int rpmidxInitInternal(rpmidxdb idxdb)
+{
+    if (idxdb->xdb) {
+       unsigned int id;
+       int rc = rpmxdbLookupBlob(idxdb->xdb, &id, idxdb->xdbtag, IDXDB_XDB_SUBTAG, 0);
+       if (rc == RPMRC_OK && id) {
+           idxdb->xdbid = id;
+           return RPMRC_OK;    /* somebody else was faster */
+       }
+       if (rc && rc != RPMRC_NOTFOUND)
+           return rc;
+    } else {
+#ifdef IDXDB_FILESUPPORT
+       struct stat stb; 
+       if (stat(idxdb->filename, &stb))
+           return RPMRC_FAIL;
+       if (stb.st_size)        /* somebody else was faster */
+           return rpmidxHandleObsolete(idxdb);
+#else
+       return RPMRC_FAIL;
+#endif
+    }
+    return rpmidxRebuildInternal(idxdb);
+}
+
+static int rpmidxLock(rpmidxdb idxdb, int excl)
+{
+    if (excl && idxdb->rdonly)
+       return RPMRC_FAIL;
+    if (idxdb->xdb)
+       return rpmxdbLock(idxdb->xdb, excl);
+    else
+       return rpmpkgLock(idxdb->pkgdb, excl);
+}
+
+static int rpmidxUnlock(rpmidxdb idxdb, int excl)
+{
+    if (idxdb->xdb)
+       return rpmxdbUnlock(idxdb->xdb, excl);
+    else
+       return rpmpkgUnlock(idxdb->pkgdb, excl);
+}
+
+static int rpmidxLockReadHeader(rpmidxdb idxdb, int excl)
+{
+    if (rpmidxLock(idxdb, excl))
+       return RPMRC_FAIL;
+    if (rpmidxReadHeader(idxdb)) {
+       rpmidxUnlock(idxdb, excl);
+       return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+static int rpmidxInit(rpmidxdb idxdb)
+{
+    int rc;
+    if (rpmidxLock(idxdb, 1))
+       return RPMRC_FAIL;
+    rc = rpmidxInitInternal(idxdb);
+    rpmidxUnlock(idxdb, 1);
+    return rc;
+}
+
+int rpmidxOpen(rpmidxdb *idxdbp, rpmpkgdb pkgdb, const char *filename, int flags, int mode)
+{
+#ifdef IDXDB_FILESUPPORT
+    struct stat stb;
+    rpmidxdb idxdb;
+
+    *idxdbp = 0;
+    idxdb = calloc(1, sizeof(*idxdb));
+    if (!idxdb)
+       return RPMRC_FAIL;
+    idxdb->filename = strdup(filename);
+    if (!idxdb->filename) {
+       free(idxdb);
+       return RPMRC_FAIL;
+    }   
+    if ((flags & (O_RDONLY|O_RDWR)) == O_RDONLY)
+       idxdb->rdonly = 1;
+    if ((idxdb->fd = open(filename, flags, mode)) == -1) {
+       free(idxdb->filename);
+       free(idxdb);
+       return RPMRC_FAIL;
+    }   
+    if (fstat(idxdb->fd, &stb)) {
+       close(idxdb->fd);
+       free(idxdb->filename);
+       free(idxdb);
+       return RPMRC_FAIL;
+    }   
+    idxdb->pkgdb = pkgdb;
+    idxdb->flags = flags;
+    idxdb->mode = mode;
+    idxdb->pagesize = sysconf(_SC_PAGE_SIZE);
+    if (stb.st_size == 0) {
+       if (rpmidxInit(idxdb)) {
+           close(idxdb->fd);
+           free(idxdb->filename);
+           free(idxdb);
+           return RPMRC_FAIL;
+       }
+    }
+    *idxdbp = idxdb;
+    return RPMRC_OK;
+#else
+    return RPMRC_FAIL;
+#endif
+}
+
+int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag)
+{
+    rpmidxdb idxdb;
+    unsigned int id;
+    *idxdbp = 0;
+    int rc;
+    
+    if (rpmxdbLock(xdb, 0))
+       return RPMRC_FAIL;
+    rc = rpmxdbLookupBlob(xdb, &id, xdbtag, IDXDB_XDB_SUBTAG, 0);
+    if (rc == RPMRC_NOTFOUND)
+       id = 0;
+    else if (rc) {
+       rpmxdbUnlock(xdb, 0);
+       return RPMRC_FAIL;
+    }
+    idxdb = calloc(1, sizeof(*idxdb));
+    if (!idxdb) {
+       rpmxdbUnlock(xdb, 0);
+       return RPMRC_FAIL;
+    }
+    idxdb->fd = -1;
+    idxdb->xdb = xdb;
+    idxdb->xdbtag = xdbtag;
+    idxdb->xdbid = id;
+    idxdb->pkgdb = pkgdb;
+    idxdb->pagesize = sysconf(_SC_PAGE_SIZE);
+    if (rpmxdbIsRdonly(xdb))
+       idxdb->rdonly = 1;
+    if (!id) {
+       if (rpmidxInit(idxdb)) {
+           free(idxdb);
+           rpmxdbUnlock(xdb, 0);
+           return RPMRC_FAIL;
+       }
+    }
+    *idxdbp = idxdb;
+    rpmxdbUnlock(xdb, 0);
+    return RPMRC_OK;
+}
+
+int rpmidxDelXdb(rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag)
+{
+    unsigned int id;
+    int rc;
+    if (rpmxdbLock(xdb, 1))
+       return RPMRC_FAIL;
+    rc = rpmxdbLookupBlob(xdb, &id, xdbtag, IDXDB_XDB_SUBTAG, 0);
+    if (rc == RPMRC_NOTFOUND)
+       id = 0;
+    else if (rc) {
+       rpmxdbUnlock(xdb, 1);
+       return rc;
+    }
+    if (id && rpmxdbDelBlob(xdb, id)) {
+       rpmxdbUnlock(xdb, 1);
+       return RPMRC_FAIL;
+    }
+    rpmxdbUnlock(xdb, 1);
+    return RPMRC_OK;
+}
+
+void rpmidxClose(rpmidxdb idxdb)
+{
+    rpmidxUnmap(idxdb);
+    if (idxdb->fd >= 0) {
+       close(idxdb->fd);
+       idxdb->fd = -1; 
+    }   
+    if (idxdb->filename)
+       free(idxdb->filename);
+    free(idxdb);
+}
+
+int rpmidxPut(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int pkgidx, unsigned int datidx)
+{
+    int rc;
+    if (!pkgidx || datidx >= 0x80000000) {
+       return RPMRC_FAIL;
+    }
+    if (rpmidxLockReadHeader(idxdb, 1))
+       return RPMRC_FAIL;
+    rc = rpmidxPutInternal(idxdb, key, keyl, pkgidx, datidx);
+    rpmidxUnlock(idxdb, 1);
+    return rc;
+}
+
+int rpmidxDel(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int pkgidx, unsigned int datidx)
+{
+    int rc;
+    if (!pkgidx || datidx >= 0x80000000) {
+       return RPMRC_FAIL;
+    }
+    if (rpmidxLockReadHeader(idxdb, 1))
+       return RPMRC_FAIL;
+    rc = rpmidxDelInternal(idxdb, key, keyl, pkgidx, datidx);
+    rpmidxUnlock(idxdb, 1);
+    return rc;
+}
+
+int rpmidxGet(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int **pkgidxlistp, unsigned int *pkgidxnump)
+{
+    int rc;
+    *pkgidxlistp = 0;
+    *pkgidxnump = 0;
+    if (rpmidxLockReadHeader(idxdb, 0))
+       return RPMRC_FAIL;
+    rc = rpmidxGetInternal(idxdb, key, keyl, pkgidxlistp, pkgidxnump);
+    rpmidxUnlock(idxdb, 0);
+    return rc;
+}
+
+int rpmidxList(rpmidxdb idxdb, unsigned int **keylistp, unsigned int *nkeylistp, unsigned char **datap)
+{
+    int rc;
+    *keylistp = 0;
+    *nkeylistp = 0;
+    if (rpmidxLockReadHeader(idxdb, 0))
+       return RPMRC_FAIL;
+    rc = rpmidxListInternal(idxdb, keylistp, nkeylistp, datap);
+    rpmidxUnlock(idxdb, 0);
+    return rc;
+}
+
+int rpmidxStats(rpmidxdb idxdb)
+{
+    if (rpmidxLockReadHeader(idxdb, 0))
+       return RPMRC_FAIL;
+    printf("--- IndexDB Stats\n");
+    if (idxdb->xdb) {
+       printf("Xdb tag: %d, id: %d\n", idxdb->xdbtag, idxdb->xdbid);
+    } else {
+       printf("Filename: %s\n", idxdb->filename);
+    }
+    printf("Generation: %u\n", idxdb->generation);
+    printf("Slots: %u\n", idxdb->nslots);
+    printf("Used slots: %u\n", idxdb->usedslots);
+    printf("Dummy slots: %u\n", idxdb->dummyslots);
+    printf("Key data size: %u, left %u\n", idxdb->keyend, idxdb->key_size - idxdb->keyend);
+    printf("Key excess: %u\n", idxdb->keyexcess);
+    printf("XMask: 0x%08x\n", idxdb->xmask);
+    rpmidxUnlock(idxdb, 0);
+    return RPMRC_OK;
+}
diff --git a/lib/backend/ndb/rpmidx.h b/lib/backend/ndb/rpmidx.h
new file mode 100644 (file)
index 0000000..e89bd82
--- /dev/null
@@ -0,0 +1,18 @@
+#include "rpmpkg.h"
+#include "rpmxdb.h"
+
+struct rpmidxdb_s;
+typedef struct rpmidxdb_s *rpmidxdb;
+
+int rpmidxOpen(rpmidxdb *idxdbp, rpmpkgdb pkgdb, const char *filename, int flags, int mode);
+int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag);
+int rpmidxDelXdb(rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag);
+void rpmidxClose(rpmidxdb idxdbp);
+
+int rpmidxGet(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int **pkgidxlist, unsigned int *pkgidxnum);
+int rpmidxPut(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int pkgidx, unsigned int datidx);
+int rpmidxDel(rpmidxdb idxdb, const unsigned char *key, unsigned int keyl, unsigned int pkgidx, unsigned int datidx);
+int rpmidxList(rpmidxdb idxdb, unsigned int **keylistp, unsigned int *nkeylistp, unsigned char **datap);
+
+int rpmidxStats(rpmidxdb idxdb);
+
diff --git a/lib/backend/ndb/rpmpkg.c b/lib/backend/ndb/rpmpkg.c
new file mode 100644 (file)
index 0000000..68b03ee
--- /dev/null
@@ -0,0 +1,1312 @@
+#include "system.h"
+
+#include <rpm/rpmlog.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <libgen.h>
+
+#include "rpmpkg.h"
+
+#define RPMRC_FAIL 2
+#define RPMRC_NOTFOUND 1
+#define RPMRC_OK 0
+
+#ifdef RPMPKG_LZO
+static int rpmpkgLZOCompress(unsigned char **blobp, unsigned int *bloblp);
+static int rpmpkgLZODecompress(unsigned char **blobp, unsigned int *bloblp);
+#endif
+
+static int rpmpkgVerifyblob(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkoff, unsigned int blkcnt);
+
+typedef struct pkgslot_s {
+    unsigned int pkgidx;
+    unsigned int blkoff;
+    unsigned int blkcnt;
+    unsigned int slotno;
+} pkgslot;
+
+typedef struct rpmpkgdb_s {
+    int fd;                    /* our file descriptor */
+    int flags;
+    int mode;
+
+    int rdonly;
+
+    unsigned int locked_shared;
+    unsigned int locked_excl;
+
+    int header_ok;             /* header data (e.g. generation) is valid */
+    unsigned int generation;
+    unsigned int slotnpages;
+    unsigned int nextpkgidx;
+
+    struct pkgslot_s *slots;
+    unsigned int aslots;       /* allocated slots */
+    unsigned int nslots;       /* used slots */
+
+    unsigned int *slothash;
+    unsigned int nslothash;
+
+    unsigned int freeslot;     /* first free slot */
+    int slotorder;
+
+    char *filename;
+    unsigned int fileblks;     /* file size in blks */
+    int dofsync;
+} * rpmpkgdb;
+
+#define SLOTORDER_UNORDERED    0
+#define SLOTORDER_BLKOFF       1
+
+
+static inline unsigned int le2h(unsigned char *p) 
+{
+    return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; 
+}
+
+static inline void h2le(unsigned int x, unsigned char *p) 
+{
+    p[0] = x;
+    p[1] = x >> 8;  
+    p[2] = x >> 16; 
+    p[3] = x >> 24; 
+}
+
+/* adler 32 algorithm taken from RFC 1950 */
+#define ADLER32_INIT 1
+static unsigned int update_adler32(unsigned int adler, unsigned char *buf, unsigned int len)
+{
+    unsigned int s1 = adler & 0xffff;
+    unsigned int s2 = (adler >> 16) & 0xffff;
+    int n;
+
+    for (; len >= 5552; len -= 5552) {
+        for (n = 0; n < 5552; n++) {
+            s1 += *buf++;
+            s2 += s1; 
+        }
+        s1 %= 65521;
+        s2 %= 65521;
+    }   
+    for (n = 0; n < len; n++) {
+        s1 += *buf++;
+        s2 += s1; 
+    }   
+    return ((s2 % 65521) << 16) + (s1 % 65521);
+}
+
+/*** Header management ***/
+
+#define PKGDB_MAGIC    ('R' | 'p' << 8 | 'm' << 16 | 'P' << 24)
+#define PKGDB_VERSION          0
+
+/* must be a multiple of SLOT_SIZE! */
+#define PKGDB_HEADER_SIZE      32
+
+#define PKGDB_OFFSET_MAGIC     0
+#define PKGDB_OFFSET_VERSION   4
+#define PKGDB_OFFSET_GENERATION        8
+#define PKGDB_OFFSET_SLOTNPAGES 12
+#define PKGDB_OFFSET_NEXTPKGIDX 16
+
+static int rpmpkgReadHeader(rpmpkgdb pkgdb)
+{
+    unsigned int generation, slotnpages, nextpkgidx, version;
+    unsigned char header[PKGDB_HEADER_SIZE];
+
+    /* if we always head the write lock then our data matches */
+    if (pkgdb->header_ok)
+       return RPMRC_OK;
+    if (pread(pkgdb->fd, header, PKGDB_HEADER_SIZE, 0) != PKGDB_HEADER_SIZE) {
+       return RPMRC_FAIL;
+    }
+    if (le2h(header + PKGDB_OFFSET_MAGIC) != PKGDB_MAGIC) {
+       return RPMRC_FAIL;
+    }
+    version = le2h(header + PKGDB_OFFSET_VERSION);
+    if (version != PKGDB_VERSION) {
+       rpmlog(RPMLOG_ERR, _("rpmpkg: Version mismatch. Expected version: %u. "
+           "Found version: %u\n"), PKGDB_VERSION, version);
+       return RPMRC_FAIL;
+    }
+    generation = le2h(header + PKGDB_OFFSET_GENERATION);
+    slotnpages = le2h(header + PKGDB_OFFSET_SLOTNPAGES);
+    nextpkgidx = le2h(header + PKGDB_OFFSET_NEXTPKGIDX);
+    /* free slots if our internal data no longer matches */
+    if (pkgdb->slots && (pkgdb->generation != generation || pkgdb->slotnpages != slotnpages)) {
+       free(pkgdb->slots);
+       pkgdb->slots = 0;
+       if (pkgdb->slothash) {
+           free(pkgdb->slothash);
+           pkgdb->slothash = 0;
+       }
+    }
+    pkgdb->generation = generation;
+    pkgdb->slotnpages = slotnpages;
+    pkgdb->nextpkgidx = nextpkgidx;
+    pkgdb->header_ok = 1;
+    return RPMRC_OK;
+}
+
+static int rpmpkgWriteHeader(rpmpkgdb pkgdb)
+{
+    unsigned char header[PKGDB_HEADER_SIZE];
+    memset(header, 0, sizeof(header));
+    h2le(PKGDB_MAGIC, header + PKGDB_OFFSET_MAGIC);
+    h2le(PKGDB_VERSION, header + PKGDB_OFFSET_VERSION);
+    h2le(pkgdb->generation, header + PKGDB_OFFSET_GENERATION);
+    h2le(pkgdb->slotnpages, header + PKGDB_OFFSET_SLOTNPAGES);
+    h2le(pkgdb->nextpkgidx, header + PKGDB_OFFSET_NEXTPKGIDX);
+    if (pwrite(pkgdb->fd, header, sizeof(header), 0) != sizeof(header)) {
+       return RPMRC_FAIL;
+    }
+    if (pkgdb->dofsync && fsync(pkgdb->fd))
+       return RPMRC_FAIL;      /* write error */
+    return RPMRC_OK;
+}
+
+/*** Slot management ***/
+
+#define SLOT_MAGIC     ('S' | 'l' << 8 | 'o' << 16 | 't' << 24)
+
+#define SLOT_SIZE 16
+#define BLK_SIZE  16
+#define PAGE_SIZE 4096
+
+/* the first slots (i.e. 32 bytes) are used for the header */
+#define SLOT_START (PKGDB_HEADER_SIZE / SLOT_SIZE)
+
+static inline unsigned int hashpkgidx(unsigned int h)
+{
+    h *= 0x5bd1e995;
+    h ^= h >> 16;
+    return h;
+}
+
+static int rpmpkgHashSlots(rpmpkgdb pkgdb)
+{
+    unsigned int nslots, num;
+    unsigned int *hash;
+    unsigned int h, hh, hmask;
+    int i;
+    pkgslot *slot;
+
+    pkgdb->nslothash = 0;
+    num = pkgdb->nslots;
+    while (num & (num - 1))
+       num = num & (num - 1);
+    num *= 4;
+    hash = pkgdb->slothash;
+    if (!hash || pkgdb->nslothash != num) {
+       free(pkgdb->slothash);
+       hash = pkgdb->slothash = calloc(num, sizeof(unsigned int));
+       if (!hash)
+           return RPMRC_FAIL;
+       pkgdb->nslothash = num;
+    } else {
+       memset(hash, 0, num * sizeof(unsigned int));
+    }
+    hmask = num - 1;
+    nslots = pkgdb->nslots;
+    for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) {
+       for (h = hashpkgidx(slot->pkgidx) & hmask, hh = 7; hash[h] != 0; h = (h + hh++) & hmask)
+           ;
+       hash[h] = i + 1;
+    }
+    pkgdb->slothash = hash;
+    pkgdb->nslothash = num;
+    return RPMRC_OK;
+}
+
+static int rpmpkgReadSlots(rpmpkgdb pkgdb)
+{
+    unsigned int slotnpages = pkgdb->slotnpages;
+    struct stat stb;
+    unsigned char pagebuf[PAGE_SIZE];
+    unsigned int page;
+    unsigned int i, minblkoff, fileblks, slotno, freeslot, o;
+    pkgslot *slot;
+
+    /* free old slot data */
+    if (pkgdb->slots) {
+       free(pkgdb->slots);
+       pkgdb->slots = 0;
+    }
+    if (pkgdb->slothash) {
+       free(pkgdb->slothash);
+       pkgdb->slothash = 0;
+    }
+    pkgdb->nslots = 0;
+    pkgdb->freeslot = 0;
+
+    /* calculate current database size in blks */
+    if (fstat(pkgdb->fd, &stb))
+       return RPMRC_FAIL;
+    if (stb.st_size % BLK_SIZE)
+       return RPMRC_FAIL;      /* hmm */
+    fileblks = stb.st_size / BLK_SIZE;
+
+    /* read (and somewhat verify) all slots */
+    pkgdb->aslots = slotnpages * (PAGE_SIZE / SLOT_SIZE);
+    pkgdb->slots = calloc(pkgdb->aslots, sizeof(*pkgdb->slots));
+    if (!pkgdb->slots) {
+       return RPMRC_FAIL;
+    }
+    i = 0;
+    slot = pkgdb->slots;
+    minblkoff = slotnpages * (PAGE_SIZE / BLK_SIZE);
+    slotno = SLOT_START;
+    freeslot = 0;
+    for (page = 0; page < slotnpages; page++) {
+       if (pread(pkgdb->fd, pagebuf, PAGE_SIZE, page * PAGE_SIZE) != PAGE_SIZE)
+           return RPMRC_FAIL;
+       for (o = page ? 0 : SLOT_START * SLOT_SIZE; o < PAGE_SIZE; o += SLOT_SIZE, slotno++) {
+           unsigned char *pp = pagebuf + o;
+           unsigned int blkoff, blkcnt, pkgidx;
+           if (le2h(pp) != SLOT_MAGIC) {
+               return RPMRC_FAIL;
+           }
+           blkoff = le2h(pp + 8);
+           if (!blkoff) {
+               if (!freeslot)
+                   freeslot = slotno;
+               continue;
+           }
+           pkgidx = le2h(pp + 4);
+           blkcnt = le2h(pp + 12);
+           slot->pkgidx = pkgidx;
+           slot->blkoff = blkoff;
+           slot->blkcnt = blkcnt;
+           slot->slotno = slotno;
+           if (slot->blkoff + slot->blkcnt > fileblks)
+               return RPMRC_FAIL;      /* truncated database */
+           if (!slot->pkgidx || !slot->blkcnt || slot->blkoff < minblkoff)
+               return RPMRC_FAIL;      /* bad entry */
+           i++;
+           slot++;
+       }
+    }
+    pkgdb->nslots = i;
+    pkgdb->slotorder = SLOTORDER_UNORDERED;    /* XXX: always order? */
+    pkgdb->fileblks = fileblks;
+    pkgdb->freeslot = freeslot;
+    if (rpmpkgHashSlots(pkgdb)) {
+       free(pkgdb->slots);
+       pkgdb->slots = 0;
+       return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+static int orderslots_blkoff_cmp(const void *a, const void *b)
+{
+    unsigned int blkoffa = ((const pkgslot *)a)->blkoff;
+    unsigned int blkoffb = ((const pkgslot *)b)->blkoff;
+    return blkoffa > blkoffb ? 1 : blkoffa < blkoffb ? -1 : 0;
+}
+
+static void rpmpkgOrderSlots(rpmpkgdb pkgdb, int slotorder)
+{
+    if (pkgdb->slotorder == slotorder)
+       return;
+    if (slotorder == SLOTORDER_BLKOFF) {
+       if (pkgdb->nslots > 1)
+           qsort(pkgdb->slots, pkgdb->nslots, sizeof(*pkgdb->slots), orderslots_blkoff_cmp);
+    }
+    pkgdb->slotorder = slotorder;
+    rpmpkgHashSlots(pkgdb);
+}
+
+static inline pkgslot *rpmpkgFindSlot(rpmpkgdb pkgdb, unsigned int pkgidx)
+{
+    unsigned int i, h,  hh, hmask = pkgdb->nslothash - 1;
+    unsigned int *hash = pkgdb->slothash;
+
+    for (h = hashpkgidx(pkgidx) & hmask, hh = 7; (i = hash[h]) != 0; h = (h + hh++) & hmask)
+       if (pkgdb->slots[i - 1].pkgidx == pkgidx)
+           return pkgdb->slots + (i - 1);
+    return 0;
+}
+
+static int rpmpkgFindEmptyOffset(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkcnt, unsigned *blkoffp, pkgslot **oldslotp, int dontprepend)
+{
+    unsigned int i, nslots = pkgdb->nslots;
+    unsigned int bestblkoff = 0;
+    unsigned int freecnt, bestfreecnt = 0;
+    unsigned int lastblkend = pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE);
+    pkgslot *slot, *oldslot = 0;
+
+    if (pkgdb->slotorder != SLOTORDER_BLKOFF)
+       rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
+
+    if (dontprepend && nslots) {
+       lastblkend = pkgdb->slots[0].blkoff;
+    }
+    /* best fit strategy */
+    for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) {
+       if (slot->blkoff < lastblkend) {
+           return RPMRC_FAIL;          /* eek, slots overlap! */
+       }
+       if (slot->pkgidx == pkgidx) {
+           if (oldslot) {
+               return RPMRC_FAIL;      /* eek, two slots with our pkgid ! */
+           }
+           oldslot = slot;
+       }
+       freecnt = slot->blkoff - lastblkend;
+       if (freecnt >= blkcnt) {
+           if (!bestblkoff || bestfreecnt > freecnt) {
+               bestblkoff = lastblkend;
+               bestfreecnt = freecnt;
+           }
+       }
+       lastblkend = slot->blkoff + slot->blkcnt;
+    }
+    if (!bestblkoff) {
+       bestblkoff = lastblkend;        /* append to end */
+    }
+    *oldslotp = oldslot;
+    *blkoffp = bestblkoff;
+    return RPMRC_OK;
+}
+
+static int rpmpkgNeighbourCheck(rpmpkgdb pkgdb, unsigned int blkoff, unsigned int blkcnt, unsigned int *newblkcnt)
+{
+    unsigned int i, nslots = pkgdb->nslots;
+    unsigned int lastblkend = pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE);
+    pkgslot *slot, *left = 0, *right = 0;
+
+    if (pkgdb->slotorder != SLOTORDER_BLKOFF)
+       rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
+    if (blkoff < lastblkend)
+       return RPMRC_FAIL;
+    for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) {
+       if (slot->blkoff < lastblkend)
+           return RPMRC_FAIL;          /* eek, slots overlap! */
+       if (slot->blkoff < blkoff)
+           left = slot;
+       if (!right && slot->blkoff >= blkoff)
+           right = slot;
+       lastblkend = slot->blkoff + slot->blkcnt;
+    }
+    if (left && left->blkoff + left->blkcnt != blkoff)
+       return RPMRC_FAIL;      /* must always start right after the block */
+    if (!left && blkoff != pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE))
+       return RPMRC_FAIL;
+    if (right && right->blkoff < blkoff + blkcnt)
+       return RPMRC_FAIL;
+    /* check if neighbour blobs are in good shape */
+    if (left && rpmpkgVerifyblob(pkgdb, left->pkgidx, left->blkoff, left->blkcnt) != RPMRC_OK)
+       return RPMRC_FAIL;
+    if (right && rpmpkgVerifyblob(pkgdb, right->pkgidx, right->blkoff, right->blkcnt) != RPMRC_OK)
+       return RPMRC_FAIL;
+    *newblkcnt = right ? right->blkoff - blkoff : blkcnt;
+    /* bounds are intect. free area. */
+    return RPMRC_OK;
+}
+
+static int rpmpkgWriteslot(rpmpkgdb pkgdb, unsigned int slotno, unsigned int pkgidx, unsigned int blkoff, unsigned int blkcnt)
+{
+    unsigned char buf[SLOT_SIZE];
+    /* sanity */
+    if (slotno < SLOT_START)
+       return RPMRC_FAIL;
+    if (blkoff && slotno == pkgdb->freeslot)
+       pkgdb->freeslot = 0;
+    h2le(SLOT_MAGIC, buf);
+    h2le(pkgidx, buf + 4);
+    h2le(blkoff, buf + 8);
+    h2le(blkcnt, buf + 12);
+    if (pwrite(pkgdb->fd, buf, sizeof(buf), slotno * SLOT_SIZE) != sizeof(buf)) {
+       return RPMRC_FAIL;
+    }
+    pkgdb->generation++;
+    if (rpmpkgWriteHeader(pkgdb)) {
+       return RPMRC_FAIL;
+    }
+   return RPMRC_OK;
+}
+
+static int rpmpkgWriteEmptySlotpage(rpmpkgdb pkgdb, int pageno)
+{
+    unsigned char page[PAGE_SIZE];
+    int i, off = pageno ? 0 : SLOT_START * SLOT_SIZE;
+    memset(page, 0, sizeof(page));
+    for (i = 0; i < PAGE_SIZE / SLOT_SIZE; i++)
+        h2le(SLOT_MAGIC, page + i * SLOT_SIZE);
+    if (pwrite(pkgdb->fd, page, PAGE_SIZE - off, pageno * PAGE_SIZE + off) != PAGE_SIZE - off) {
+       return RPMRC_FAIL;
+    }
+    if (pkgdb->dofsync && fsync(pkgdb->fd)) {
+       return RPMRC_FAIL;      /* write error */
+    }
+    return RPMRC_OK;
+}
+
+/*** Blk primitives ***/
+
+static int rpmpkgZeroBlks(rpmpkgdb pkgdb, unsigned int blkoff, unsigned int blkcnt)
+{
+    unsigned char buf[65536];
+    unsigned int towrite;
+    off_t fileoff;
+
+    memset(buf, 0, sizeof(buf));
+    fileoff = (off_t)blkoff * BLK_SIZE;
+    for (towrite = blkcnt * BLK_SIZE; towrite; ) {
+       unsigned int chunk = towrite > 65536 ? 65536 : towrite;
+       if (pwrite(pkgdb->fd, buf, chunk, fileoff) != chunk) {
+           return RPMRC_FAIL;  /* write error */
+       }
+       fileoff += chunk;
+       towrite -= chunk;
+    }
+    if (blkoff + blkcnt > pkgdb->fileblks)
+       pkgdb->fileblks = blkoff + blkcnt;
+    return RPMRC_OK;
+}
+
+static int rpmpkgValidateZeroCheck(rpmpkgdb pkgdb, unsigned int blkoff, unsigned int blkcnt)
+{
+    unsigned long long buf[(65536 / sizeof(unsigned long long)) + 1];
+    off_t fileoff;
+    off_t tocheck;
+    int i;
+
+    if (blkoff > pkgdb->fileblks)
+       return RPMRC_FAIL;              /* huh? */
+    fileoff = (off_t)blkoff * BLK_SIZE;
+    tocheck = blkoff + blkcnt > pkgdb->fileblks ? pkgdb->fileblks - blkoff : blkcnt;
+    tocheck *= BLK_SIZE;
+    while (tocheck >= 65536) {
+        if (pread(pkgdb->fd, (void *)buf, 65536, fileoff) != 65536)
+           return RPMRC_FAIL;          /* read error */
+       for (i = 0; i < 65536 / sizeof(unsigned long long); i++)
+           if (buf[i])
+               return RPMRC_FAIL;      /* not empty */
+       fileoff += 65536;
+       tocheck -= 65536;
+    }
+    if (tocheck) {
+       int cnt = (int)tocheck / sizeof(unsigned long long);
+       buf[cnt++] = 0;
+        if (pread(pkgdb->fd, (void *)buf, tocheck, fileoff) != tocheck)
+           return RPMRC_FAIL;          /* read error */
+       for (i = 0; i < cnt; i++)
+           if (buf[i])
+               return RPMRC_FAIL;      /* not empty */
+    }
+    return RPMRC_OK;
+}
+
+static int rpmpkgValidateZero(rpmpkgdb pkgdb, unsigned int blkoff, unsigned int blkcnt)
+{
+    if (rpmpkgValidateZeroCheck(pkgdb, blkoff, blkcnt) == RPMRC_OK)
+       return RPMRC_OK;
+    rpmlog(RPMLOG_WARNING, _("rpmpkg: detected non-zero blob, trying auto repair\n"));
+    /* auto-repair interrupted transactions */
+    if (rpmpkgNeighbourCheck(pkgdb, blkoff, blkcnt, &blkcnt) != RPMRC_OK)
+       return RPMRC_FAIL;
+    if (rpmpkgZeroBlks(pkgdb, blkoff, blkcnt) != RPMRC_OK)
+       return RPMRC_FAIL;
+    return RPMRC_OK;
+}
+
+
+/*** Blob primitives ***/
+
+/* head: magic + pkgidx + timestamp + bloblen */
+/* tail: adler32 + bloblen + magic */
+
+#define BLOBHEAD_MAGIC ('B' | 'l' << 8 | 'b' << 16 | 'S' << 24)
+#define BLOBTAIL_MAGIC ('B' | 'l' << 8 | 'b' << 16 | 'E' << 24)
+
+#define BLOBHEAD_SIZE  (4 + 4 + 4 + 4)
+#define BLOBTAIL_SIZE  (4 + 4 + 4)
+
+static int rpmpkgReadBlob(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkoff, unsigned int blkcnt, unsigned char *blob, unsigned int *bloblp, unsigned int *tstampp)
+{
+    unsigned char buf[BLOBHEAD_SIZE > BLOBTAIL_SIZE ? BLOBHEAD_SIZE : BLOBTAIL_SIZE];
+    unsigned int bloblen, toread, tstamp;
+    off_t fileoff;
+    unsigned int adl;
+    int verifyadler = bloblp ? 0 : 1;
+
+    /* sanity */
+    if (blkcnt <  (BLOBHEAD_SIZE + BLOBTAIL_SIZE + BLK_SIZE - 1) / BLK_SIZE)
+       return RPMRC_FAIL;      /* blkcnt too small */
+    /* read header */
+    fileoff = (off_t)blkoff * BLK_SIZE;
+    if (pread(pkgdb->fd, buf, BLOBHEAD_SIZE, fileoff) != BLOBHEAD_SIZE)
+       return RPMRC_FAIL;      /* read error */
+    if (le2h(buf) != BLOBHEAD_MAGIC)
+       return RPMRC_FAIL;      /* bad blob */
+    if (le2h(buf + 4) != pkgidx)
+       return RPMRC_FAIL;      /* bad blob */
+    tstamp = le2h(buf + 8);
+    bloblen = le2h(buf + 12);
+    if (blkcnt != (BLOBHEAD_SIZE + bloblen + BLOBTAIL_SIZE + BLK_SIZE - 1) / BLK_SIZE)
+       return RPMRC_FAIL;      /* bad blob */
+    adl = ADLER32_INIT;
+    if (verifyadler)
+       adl = update_adler32(adl, buf, BLOBHEAD_SIZE);
+    /* read in 64K chunks */
+    fileoff += BLOBHEAD_SIZE;
+    toread = blkcnt * BLK_SIZE - BLOBHEAD_SIZE;
+    if (!bloblp)
+       toread -= BLOBTAIL_SIZE;
+    while (toread) {
+       unsigned int chunk = toread > 65536 ? 65536 : toread;
+        if (pread(pkgdb->fd, blob, chunk, fileoff) != chunk) {
+           return RPMRC_FAIL;  /* read error */
+       }
+       if (verifyadler) {
+           if (!bloblp)
+               adl = update_adler32(adl, blob, chunk);
+           else if (toread > BLOBTAIL_SIZE)
+               adl = update_adler32(adl, blob, toread - BLOBTAIL_SIZE > chunk ? chunk : toread - BLOBTAIL_SIZE);
+       }
+       if (bloblp)
+           blob += chunk;
+       toread -= chunk;
+       fileoff += chunk;
+    }
+    /* read trailer */
+    if (bloblp) {
+       memcpy(buf, blob - BLOBTAIL_SIZE, BLOBTAIL_SIZE);
+    } else if (pread(pkgdb->fd, buf, BLOBTAIL_SIZE, fileoff) != BLOBTAIL_SIZE) {
+       return RPMRC_FAIL;      /* read error */
+    }
+    if (verifyadler && le2h(buf) != adl) {
+       return RPMRC_FAIL;      /* bad blob, adler32 mismatch */
+    }
+    if (le2h(buf + 4) != bloblen) {
+       return RPMRC_FAIL;      /* bad blob, bloblen mismatch */
+    }
+    if (le2h(buf + 8) != BLOBTAIL_MAGIC) {
+       return RPMRC_FAIL;      /* bad blob */
+    }
+    if (bloblp)
+       *bloblp = bloblen;
+    if (tstampp)
+       *tstampp = tstamp;
+    return RPMRC_OK;
+}
+
+static int rpmpkgVerifyblob(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkoff, unsigned int blkcnt)
+{
+    unsigned char buf[65536];
+    return rpmpkgReadBlob(pkgdb, pkgidx, blkoff, blkcnt, buf, 0, 0);
+}
+
+static int rpmpkgWriteBlob(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkoff, unsigned int blkcnt, unsigned char *blob, unsigned int blobl, unsigned int now)
+{
+    unsigned char buf[(BLOBHEAD_SIZE > BLOBTAIL_SIZE ? BLOBHEAD_SIZE : BLOBTAIL_SIZE) + BLK_SIZE];
+    unsigned int towrite, pad;
+    unsigned int adl;
+    off_t fileoff;
+
+    /* sanity */
+    if (blkcnt <  (BLOBHEAD_SIZE + BLOBTAIL_SIZE + BLK_SIZE - 1) / BLK_SIZE)
+       return RPMRC_FAIL;      /* blkcnt too small */
+    if (blkcnt != (BLOBHEAD_SIZE + blobl + BLOBTAIL_SIZE + BLK_SIZE - 1) / BLK_SIZE)
+       return RPMRC_FAIL;      /* blkcnt mismatch */
+    fileoff = (off_t)blkoff * BLK_SIZE;
+    h2le(BLOBHEAD_MAGIC, buf);
+    h2le(pkgidx, buf + 4);
+    h2le(now, buf + 8);
+    h2le(blobl, buf + 12);
+    if (pwrite(pkgdb->fd, buf, BLOBHEAD_SIZE, fileoff) != BLOBHEAD_SIZE) {
+       return RPMRC_FAIL;      /* write error */
+    }
+    adl = ADLER32_INIT;
+    adl = update_adler32(adl, buf, BLOBHEAD_SIZE);
+    /* write in 64K chunks */
+    fileoff += BLOBHEAD_SIZE;
+    for (towrite = blobl; towrite;) {
+       unsigned int chunk = towrite > 65536 ? 65536 : towrite;
+       if (pwrite(pkgdb->fd, blob, chunk, fileoff) != chunk) {
+           return RPMRC_FAIL;  /* write error */
+       }
+       adl = update_adler32(adl, blob, chunk);
+       blob += chunk;
+       towrite -= chunk;
+       fileoff += chunk;
+    }
+    /* pad if needed */
+    pad = blkcnt * BLK_SIZE - (BLOBHEAD_SIZE + blobl + BLOBTAIL_SIZE);
+    if (pad) {
+       memset(buf + (sizeof(buf) - BLOBTAIL_SIZE) - pad, 0, pad);
+       adl = update_adler32(adl, buf + (sizeof(buf) - BLOBTAIL_SIZE) - pad, pad);
+    }
+    h2le(adl, buf + (sizeof(buf) - BLOBTAIL_SIZE));
+    h2le(blobl, buf + (sizeof(buf) - BLOBTAIL_SIZE) + 4);
+    h2le(BLOBTAIL_MAGIC, buf + (sizeof(buf) - BLOBTAIL_SIZE) + 8);
+    if (pwrite(pkgdb->fd, buf + (sizeof(buf) - BLOBTAIL_SIZE) - pad, pad + BLOBTAIL_SIZE, fileoff) != pad + BLOBTAIL_SIZE) {
+       return RPMRC_FAIL;      /* write error */
+    }
+    /* update file length */
+    if (blkoff + blkcnt > pkgdb->fileblks)
+       pkgdb->fileblks = blkoff + blkcnt;
+    if (pkgdb->dofsync && fsync(pkgdb->fd)) {
+       return RPMRC_FAIL;      /* write error */
+    }
+    return RPMRC_OK;
+}
+
+static int rpmpkgDelBlob(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned int blkoff, unsigned int blkcnt)
+{
+    if (rpmpkgVerifyblob(pkgdb, pkgidx, blkoff, blkcnt))
+       return RPMRC_FAIL;
+    if (rpmpkgZeroBlks(pkgdb, blkoff, blkcnt))
+       return RPMRC_FAIL;
+    if (pkgdb->dofsync && fsync(pkgdb->fd))
+       return RPMRC_FAIL;      /* write error */
+    return RPMRC_OK;
+}
+
+
+static int rpmpkgMoveBlob(rpmpkgdb pkgdb, pkgslot *slot, unsigned int newblkoff)
+{
+    unsigned int pkgidx = slot->pkgidx;
+    unsigned int blkoff = slot->blkoff;
+    unsigned int blkcnt = slot->blkcnt;
+    unsigned char *blob;
+    unsigned int tstamp, blobl;
+
+    blob = malloc((size_t)blkcnt * BLK_SIZE);
+    if (rpmpkgReadBlob(pkgdb, pkgidx, blkoff, blkcnt, blob, &blobl, &tstamp)) {
+       free(blob);
+       return RPMRC_FAIL;
+    }
+    if (rpmpkgWriteBlob(pkgdb, pkgidx, newblkoff, blkcnt, blob, blobl, tstamp)) {
+       free(blob);
+       return RPMRC_FAIL;
+    }
+    free(blob);
+    if (rpmpkgWriteslot(pkgdb, slot->slotno, pkgidx, newblkoff, blkcnt)) {
+       return RPMRC_FAIL;
+    }
+    if (rpmpkgDelBlob(pkgdb, pkgidx, blkoff, blkcnt)) {
+       return RPMRC_FAIL;
+    }
+    slot->blkoff = newblkoff;
+    pkgdb->slotorder = SLOTORDER_UNORDERED;
+    return RPMRC_OK;
+}
+
+static int rpmpkgAddSlotPage(rpmpkgdb pkgdb)
+{
+    unsigned int cutoff;
+    if (pkgdb->slotorder != SLOTORDER_BLKOFF)
+       rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
+    cutoff = (pkgdb->slotnpages + 1) * (PAGE_SIZE / BLK_SIZE);
+
+    /* now move every blob before cutoff */
+    while (pkgdb->nslots && pkgdb->slots[0].blkoff < cutoff) {
+       unsigned int newblkoff;
+        pkgslot *slot = pkgdb->slots, *oldslot;
+
+       oldslot = 0;
+       if (rpmpkgFindEmptyOffset(pkgdb, slot->pkgidx, slot->blkcnt, &newblkoff, &oldslot, 1)) {
+           return RPMRC_FAIL;
+       }
+       if (!oldslot || oldslot != slot) {
+           return RPMRC_FAIL;
+       }
+       if (rpmpkgMoveBlob(pkgdb, slot, newblkoff)) {
+           return RPMRC_FAIL;
+       }
+       rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
+    }
+
+    /* make sure our new page is empty */
+    if (rpmpkgValidateZero(pkgdb, pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE), PAGE_SIZE / BLK_SIZE)) {
+       return RPMRC_FAIL;
+    }
+    if (rpmpkgWriteEmptySlotpage(pkgdb, pkgdb->slotnpages)) {
+       return RPMRC_FAIL;
+    }
+
+    /* announce free page */
+    pkgdb->freeslot = pkgdb->slotnpages * (PAGE_SIZE / SLOT_SIZE);
+    pkgdb->slotnpages++;
+    pkgdb->generation++;
+    if (rpmpkgWriteHeader(pkgdb)) {
+       return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+static int rpmpkgGetLock(rpmpkgdb pkgdb, int type)
+{
+    if (!pkgdb->fd)
+       return RPMRC_FAIL;
+    if (flock(pkgdb->fd, type))
+       return RPMRC_FAIL;
+    return RPMRC_OK;
+}
+
+int rpmpkgLock(rpmpkgdb pkgdb, int excl)
+{
+    unsigned int *lockcntp = excl ? &pkgdb->locked_excl : &pkgdb->locked_shared;
+    if (*lockcntp > 0 || (!excl && pkgdb->locked_excl)) {
+       (*lockcntp)++;
+       return RPMRC_OK;
+    }
+    pkgdb->header_ok = 0;
+    if (rpmpkgGetLock(pkgdb, excl ? LOCK_EX : LOCK_SH)) {
+       return RPMRC_FAIL;
+    }
+    (*lockcntp)++;
+    return RPMRC_OK;
+}
+
+static int rpmpkgLockInternal(rpmpkgdb pkgdb, int excl)
+{
+    if (excl && pkgdb->rdonly)
+       return RPMRC_FAIL;
+
+    return  rpmpkgLock(pkgdb, excl);
+}
+
+int rpmpkgUnlock(rpmpkgdb pkgdb, int excl)
+{
+    unsigned int *lockcntp = excl ? &pkgdb->locked_excl : &pkgdb->locked_shared;
+    if (*lockcntp == 0) {
+       return RPMRC_FAIL;
+    }
+    if (*lockcntp > 1 || (!excl && pkgdb->locked_excl)) {
+       (*lockcntp)--;
+       return RPMRC_OK;
+    }
+    if (excl && pkgdb->locked_shared) {
+       /* excl -> shared switch */
+       if (rpmpkgGetLock(pkgdb, LOCK_SH)) {
+           return RPMRC_FAIL;
+       }
+       (*lockcntp)--;
+       return RPMRC_OK;
+    }
+    flock(pkgdb->fd, LOCK_UN);
+    (*lockcntp)--;
+    pkgdb->header_ok = 0;
+    return RPMRC_OK;
+}
+
+static int rpmpkgLockReadHeader(rpmpkgdb pkgdb, int excl)
+{
+    if (rpmpkgLockInternal(pkgdb, excl))
+       return RPMRC_FAIL;
+    if (rpmpkgReadHeader(pkgdb)) {
+       rpmpkgUnlock(pkgdb, excl);
+       return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+static int rpmpkgInitInternal(rpmpkgdb pkgdb)
+{
+    struct stat stb;
+    if (fstat(pkgdb->fd, &stb)) {
+       return RPMRC_FAIL;
+    }
+    if (stb.st_size == 0) {
+       if (rpmpkgWriteEmptySlotpage(pkgdb, 0)) {
+           return RPMRC_FAIL;
+       }
+       pkgdb->slotnpages = 1;
+       if (!pkgdb->nextpkgidx)
+           pkgdb->nextpkgidx = 1;
+       pkgdb->generation++;
+       if (rpmpkgWriteHeader(pkgdb)) {
+           return RPMRC_FAIL;
+       }
+    }
+    return RPMRC_OK;
+}
+
+static int rpmpkgInit(rpmpkgdb pkgdb)
+{
+    int rc;
+    
+    if (rpmpkgLockInternal(pkgdb, 1))
+       return RPMRC_FAIL;
+    rc = rpmpkgInitInternal(pkgdb);
+    rpmpkgUnlock(pkgdb, 1);
+    return rc;
+}
+
+int rpmpkgOpen(rpmpkgdb *pkgdbp, const char *filename, int flags, int mode)
+{
+    struct stat stb;
+    rpmpkgdb pkgdb;
+
+    *pkgdbp = 0;
+    pkgdb = calloc(1, sizeof(*pkgdb));
+    pkgdb->filename = strdup(filename);
+    if (!pkgdb->filename) {
+       free(pkgdb);
+       return RPMRC_FAIL;
+    }
+    if ((flags & (O_RDONLY|O_RDWR)) == O_RDONLY)
+       pkgdb->rdonly = 1;
+    if ((pkgdb->fd = open(filename, flags, mode)) == -1) {
+       free(pkgdb->filename);
+       free(pkgdb);
+        return RPMRC_FAIL;
+    }
+    if (flags & O_CREAT) {
+       char *filenameCopy;
+       DIR *pdir;
+
+       if ((filenameCopy = strdup(pkgdb->filename)) == NULL) {
+           close(pkgdb->fd);
+           free(pkgdb->filename);
+           free(pkgdb);
+           return RPMRC_FAIL;
+       }
+
+       if ((pdir = opendir(dirname(filenameCopy))) == NULL) {
+           free(filenameCopy);
+           close(pkgdb->fd);
+           free(pkgdb->filename);
+           free(pkgdb);
+           return RPMRC_FAIL;
+       }
+
+       if (fsync(dirfd(pdir)) == -1) {
+           closedir(pdir);
+           free(filenameCopy);
+           close(pkgdb->fd);
+           free(pkgdb->filename);
+           free(pkgdb);
+           return RPMRC_FAIL;
+       }
+       closedir(pdir);
+       free(filenameCopy);
+
+    }
+    if (fstat(pkgdb->fd, &stb)) {
+       close(pkgdb->fd);
+       free(pkgdb->filename);
+       free(pkgdb);
+        return RPMRC_FAIL;
+    }
+    if (stb.st_size == 0) {
+       if (rpmpkgInit(pkgdb)) {
+           close(pkgdb->fd);
+           free(pkgdb->filename);
+           free(pkgdb);
+           return RPMRC_FAIL;
+       }
+    }
+    pkgdb->flags = flags;
+    pkgdb->mode = mode;
+    pkgdb->dofsync = 1;
+    *pkgdbp = pkgdb;
+    return RPMRC_OK;
+}
+
+void rpmpkgClose(rpmpkgdb pkgdb)
+{
+    if (pkgdb->fd >= 0) {
+       close(pkgdb->fd);
+       pkgdb->fd = -1;
+    }
+    if (pkgdb->slots)
+       free(pkgdb->slots);
+    pkgdb->slots = 0;
+    if (pkgdb->slothash)
+       free(pkgdb->slothash);
+    pkgdb->slothash = 0;
+    free(pkgdb->filename);
+    free(pkgdb);
+}
+
+void rpmpkgSetFsync(rpmpkgdb pkgdb, int dofsync)
+{
+    pkgdb->dofsync = dofsync;
+}
+
+
+static int rpmpkgGetInternal(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char **blobp, unsigned int *bloblp)
+{
+    pkgslot *slot;
+    unsigned char *blob;
+
+    if (!pkgdb->slots && rpmpkgReadSlots(pkgdb)) {
+       return RPMRC_FAIL;
+    }
+    slot = rpmpkgFindSlot(pkgdb, pkgidx);
+    if (!slot) {
+       return RPMRC_NOTFOUND;
+    }
+    blob = malloc((size_t)slot->blkcnt * BLK_SIZE);
+    if (rpmpkgReadBlob(pkgdb, pkgidx, slot->blkoff, slot->blkcnt, blob, bloblp, (unsigned int *)0)) {
+       free(blob);
+       return RPMRC_FAIL;
+    }
+    *blobp = blob;
+    return RPMRC_OK;
+}
+
+static int rpmpkgPutInternal(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char *blob, unsigned int blobl)
+{
+    unsigned int blkcnt, blkoff, slotno;
+    pkgslot *oldslot;
+
+    /* we always read all slots when writing, just in case */
+    if (rpmpkgReadSlots(pkgdb)) {
+       return RPMRC_FAIL;
+    }
+    blkcnt = (BLOBHEAD_SIZE + blobl + BLOBTAIL_SIZE + BLK_SIZE - 1) / BLK_SIZE;
+    /* find a nice place for the blob */
+    if (rpmpkgFindEmptyOffset(pkgdb, pkgidx, blkcnt, &blkoff, &oldslot, 0)) {
+       return RPMRC_FAIL;
+    }
+    /* create new slot page if we don't have a free slot and can't reuse an old one */
+    if (!oldslot && !pkgdb->freeslot) {
+       if (rpmpkgAddSlotPage(pkgdb)) {
+           return RPMRC_FAIL;
+       }
+       /* redo rpmpkgFindEmptyOffset to get another free area */
+       if (rpmpkgFindEmptyOffset(pkgdb, pkgidx, blkcnt, &blkoff, &oldslot, 0)) {
+           return RPMRC_FAIL;
+       }
+    }
+    /* make sure that we don't overwrite data */
+    if (rpmpkgValidateZero(pkgdb, blkoff, blkcnt)) {
+       return RPMRC_FAIL;
+    }
+    /* write new blob */
+    if (rpmpkgWriteBlob(pkgdb, pkgidx, blkoff, blkcnt, blob, blobl, (unsigned int)time(0))) {
+       return RPMRC_FAIL;
+    }
+    /* write slot */
+    slotno = oldslot ? oldslot->slotno : pkgdb->freeslot;
+    if (!slotno) {
+       return RPMRC_FAIL;
+    }
+    if (rpmpkgWriteslot(pkgdb, slotno, pkgidx, blkoff, blkcnt)) {
+       free(pkgdb->slots);
+       pkgdb->slots = 0;
+       return RPMRC_FAIL;
+    }
+    /* erase old blob */
+    if (oldslot && oldslot->blkoff) {
+       if (rpmpkgDelBlob(pkgdb, pkgidx, oldslot->blkoff, oldslot->blkcnt)) {
+           free(pkgdb->slots);
+           pkgdb->slots = 0;
+           return RPMRC_FAIL;
+       }
+    }
+    if (oldslot) {
+       /* just update the slot, no need to free the slot data */
+       oldslot->blkoff = blkoff;
+       oldslot->blkcnt = blkcnt;
+       pkgdb->slotorder = SLOTORDER_UNORDERED;
+    } else {
+       free(pkgdb->slots);
+       pkgdb->slots = 0;
+    }
+    return RPMRC_OK;
+}
+
+static int rpmpkgDelInternal(rpmpkgdb pkgdb, unsigned int pkgidx)
+{
+    pkgslot *slot;
+    unsigned int blkoff, blkcnt;
+
+    /* we always read all slots when writing, just in case */
+    if (rpmpkgReadSlots(pkgdb)) {
+       return RPMRC_FAIL;
+    }
+    rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
+    slot = rpmpkgFindSlot(pkgdb, pkgidx);
+    if (!slot) {
+       return RPMRC_OK;
+    }
+    if (rpmpkgWriteslot(pkgdb, slot->slotno, 0, 0, 0)) {
+       return RPMRC_FAIL;
+    }
+    if (rpmpkgDelBlob(pkgdb, pkgidx, slot->blkoff, slot->blkcnt)) {
+       return RPMRC_FAIL;
+    }
+    if (pkgdb->nslots > 1 && slot->blkoff < pkgdb->fileblks / 2) {
+       /* we freed a blob in the first half of our data. do some extra work */
+       int i;
+       if (slot == pkgdb->slots) {
+           blkoff = pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE);
+       } else {
+           blkoff = slot[-1].blkoff + slot[-1].blkcnt;
+       }
+       if (slot < pkgdb->slots + pkgdb->nslots - 1) {
+           blkcnt = slot[1].blkoff - blkoff;
+       } else {
+           blkcnt = slot->blkoff + slot->blkcnt - blkoff;
+       }
+       slot->blkoff = 0;
+       slot->blkcnt = 0;
+       slot = pkgdb->slots + pkgdb->nslots - 2;
+       if (slot->blkcnt < slot[1].blkcnt)
+         slot++;       /* bigger slot first */
+       for (i = 0; i < 2; i++, slot++) {
+           if (slot == pkgdb->slots + pkgdb->nslots)
+               slot -= 2;
+           if (!slot->blkoff || slot->blkoff < blkoff)
+               continue;
+           if (slot->blkoff < pkgdb->fileblks / 2)
+               continue;
+           if (slot->blkcnt > blkcnt)
+               continue;
+           rpmpkgMoveBlob(pkgdb, slot, blkoff);
+           blkoff += slot->blkcnt;
+           blkcnt -= slot->blkcnt;
+       }
+       rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
+    } else {
+       slot->blkoff = 0;
+       slot->blkcnt = 0;
+    }
+    /* check if we can truncate the file */
+    slot = pkgdb->slots + pkgdb->nslots - 1;
+    if (!slot->blkoff && pkgdb->nslots > 1) {
+       slot--;
+    }
+    if (slot->blkoff)
+       blkoff = slot->blkoff + slot->blkcnt;
+    else
+       blkoff = pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE);
+    if (blkoff < pkgdb->fileblks / 4 * 3) {
+       /* truncate the file */
+       if (!rpmpkgValidateZero(pkgdb, blkoff, pkgdb->fileblks - blkoff)) {
+           if (!ftruncate(pkgdb->fd, blkoff * BLK_SIZE)) {
+               pkgdb->fileblks = blkoff;
+           }
+       }
+    }
+    free(pkgdb->slots);
+    pkgdb->slots = 0;
+    return RPMRC_OK;
+}
+
+static int rpmpkgListInternal(rpmpkgdb pkgdb, unsigned int **pkgidxlistp, unsigned int *npkgidxlistp)
+{
+    unsigned int i, nslots, *pkgidxlist;
+    pkgslot *slot;
+
+    if (!pkgdb->slots && rpmpkgReadSlots(pkgdb)) {
+       return RPMRC_FAIL;
+    }
+    if (!pkgidxlistp) {
+       *npkgidxlistp = pkgdb->nslots;
+       return RPMRC_OK;
+    }
+    rpmpkgOrderSlots(pkgdb, SLOTORDER_BLKOFF);
+    nslots = pkgdb->nslots;
+    pkgidxlist = calloc(nslots + 1, sizeof(unsigned int));
+    for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) {
+       pkgidxlist[i] = slot->pkgidx;
+    }
+    *pkgidxlistp = pkgidxlist;
+    *npkgidxlistp = nslots;
+    return RPMRC_OK;
+}
+
+int rpmpkgGet(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char **blobp, unsigned int *bloblp)
+{
+    int rc;
+
+    *blobp = 0;
+    *bloblp = 0;
+    if (!pkgidx)
+       return RPMRC_FAIL;
+    if (rpmpkgLockReadHeader(pkgdb, 0))
+       return RPMRC_FAIL;
+    rc = rpmpkgGetInternal(pkgdb, pkgidx, blobp, bloblp);
+    rpmpkgUnlock(pkgdb, 0);
+#ifdef RPMPKG_LZO
+    if (!rc)
+       rc = rpmpkgLZODecompress(blobp, bloblp);
+#endif
+    return rc;
+}
+
+int rpmpkgPut(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char *blob, unsigned int blobl)
+{
+    int rc;
+
+    if (!pkgidx) {
+       return RPMRC_FAIL;
+    }
+    if (rpmpkgLockReadHeader(pkgdb, 1))
+       return RPMRC_FAIL;
+#ifdef RPMPKG_LZO
+    if (rpmpkgLZOCompress(&blob, &blobl)) {
+       rpmpkgUnlock(pkgdb, 1);
+       return RPMRC_FAIL;
+    }
+#endif
+    rc = rpmpkgPutInternal(pkgdb, pkgidx, blob, blobl);
+#ifdef RPMPKG_LZO
+    free(blob);
+#endif
+    rpmpkgUnlock(pkgdb, 1);
+    return rc;
+}
+
+int rpmpkgDel(rpmpkgdb pkgdb, unsigned int pkgidx)
+{
+    int rc;
+
+    if (!pkgidx) {
+       return RPMRC_FAIL;
+    }
+    if (rpmpkgLockReadHeader(pkgdb, 1))
+       return RPMRC_FAIL;
+    rc = rpmpkgDelInternal(pkgdb, pkgidx);
+    rpmpkgUnlock(pkgdb, 1);
+    return rc;
+}
+
+int rpmpkgList(rpmpkgdb pkgdb, unsigned int **pkgidxlistp, unsigned int *npkgidxlistp)
+{
+    int rc;
+    if (pkgidxlistp)
+       *pkgidxlistp = 0;
+    *npkgidxlistp = 0;
+    if (rpmpkgLockReadHeader(pkgdb, 0))
+       return RPMRC_FAIL;
+    rc = rpmpkgListInternal(pkgdb, pkgidxlistp, npkgidxlistp);
+    rpmpkgUnlock(pkgdb, 0);
+    return rc;
+}
+
+int rpmpkgNextPkgIdx(rpmpkgdb pkgdb, unsigned int *pkgidxp)
+{
+    if (rpmpkgLockReadHeader(pkgdb, 1))
+       return RPMRC_FAIL;
+    *pkgidxp = pkgdb->nextpkgidx++;
+    if (rpmpkgWriteHeader(pkgdb)) {
+       rpmpkgUnlock(pkgdb, 1);
+       return RPMRC_FAIL;
+    }
+    /* no fsync needed. also no need to increase the generation count,
+     * as the header is always read in */
+    rpmpkgUnlock(pkgdb, 1);
+    return RPMRC_OK;
+}
+
+int rpmpkgGeneration(rpmpkgdb pkgdb, unsigned int *generationp)
+{
+    if (rpmpkgLockReadHeader(pkgdb, 0))
+       return RPMRC_FAIL;
+    *generationp = pkgdb->generation;
+    rpmpkgUnlock(pkgdb, 0);
+    return RPMRC_OK;
+}
+
+int rpmpkgStats(rpmpkgdb pkgdb)
+{
+    unsigned int usedblks = 0;
+    int i;
+
+    if (rpmpkgLockReadHeader(pkgdb, 0))
+       return RPMRC_FAIL;
+    if (rpmpkgReadSlots(pkgdb)) {
+       rpmpkgUnlock(pkgdb, 0);
+       return RPMRC_FAIL;
+    }
+    for (i = 0; i < pkgdb->nslots; i++)
+       usedblks += pkgdb->slots[i].blkcnt;
+    printf("--- Package DB Stats\n");
+    printf("Filename: %s\n", pkgdb->filename);
+    printf("Generation: %d\n", pkgdb->generation);
+    printf("Slot pages: %d\n", pkgdb->slotnpages);
+    printf("Used slots: %d\n", pkgdb->nslots);
+    printf("Free slots: %d\n", pkgdb->slotnpages * (PAGE_SIZE / SLOT_SIZE) - pkgdb->nslots);
+    printf("Blob area size: %d\n", (pkgdb->fileblks - pkgdb->slotnpages * (PAGE_SIZE / BLK_SIZE)) * BLK_SIZE);
+    printf("Blob area used: %d\n", usedblks * BLK_SIZE);
+    rpmpkgUnlock(pkgdb, 0);
+    return RPMRC_OK;
+}
+
+#ifdef RPMPKG_LZO
+
+#include "lzo/lzoconf.h"
+#include "lzo/lzo1x.h"
+
+#define BLOBLZO_MAGIC  ('L' | 'Z' << 8 | 'O' << 16 | 'B' << 24)
+
+static int rpmpkgLZOCompress(unsigned char **blobp, unsigned int *bloblp)
+{
+    unsigned char *blob = *blobp;
+    unsigned int blobl = *bloblp;
+    unsigned char *lzoblob, *workmem;
+    unsigned int lzoblobl;
+    lzo_uint blobl2;
+
+    if (lzo_init() != LZO_E_OK) {
+       return RPMRC_FAIL;
+    }
+    workmem = malloc(LZO1X_1_MEM_COMPRESS);
+    if (!workmem) {
+       return RPMRC_FAIL;
+    }
+    lzoblobl = 4 + 4 + blobl + blobl / 16 + 64 + 3;
+    lzoblob = malloc(lzoblobl);
+    if (!lzoblob) {
+       free(workmem);
+       return RPMRC_FAIL;
+    }
+    h2le(BLOBLZO_MAGIC, lzoblob);
+    h2le(blobl, lzoblob + 4);
+    if (lzo1x_1_compress(blob, blobl, lzoblob + 8, &blobl2, workmem) != LZO_E_OK) {
+       free(workmem);
+       free(lzoblob);
+       return RPMRC_FAIL;
+    }
+    free(workmem);
+    *blobp = lzoblob;
+    *bloblp = 8 + blobl2;
+    return RPMRC_OK;
+}
+
+static int rpmpkgLZODecompress(unsigned char **blobp, unsigned int *bloblp)
+{
+    unsigned char *lzoblob = *blobp;
+    unsigned int lzoblobl = *bloblp;
+    unsigned char *blob;
+    unsigned int blobl;
+    lzo_uint blobl2;
+
+    if (!lzoblob || lzoblobl < 8)
+       return RPMRC_FAIL;
+    if (le2h(lzoblob) != BLOBLZO_MAGIC)
+       return RPMRC_FAIL;
+    if (lzo_init() != LZO_E_OK)
+       return RPMRC_FAIL;
+    blobl = le2h(lzoblob + 4);
+    blob = malloc(blobl ? blobl : 1);
+    if (!blob)
+       return RPMRC_FAIL;
+    if (lzo1x_decompress(lzoblob + 8, lzoblobl - 8, blob, &blobl2, 0) != LZO_E_OK || blobl2 != blobl) {
+       free(blob);
+       return RPMRC_FAIL;
+    }
+    free(lzoblob);
+    *blobp = blob;
+    *bloblp = blobl;
+    return RPMRC_OK;
+}
+
+#endif
diff --git a/lib/backend/ndb/rpmpkg.h b/lib/backend/ndb/rpmpkg.h
new file mode 100644 (file)
index 0000000..7e5d0c6
--- /dev/null
@@ -0,0 +1,20 @@
+struct rpmpkgdb_s;
+typedef struct rpmpkgdb_s *rpmpkgdb;
+
+int rpmpkgOpen(rpmpkgdb *pkgdbp, const char *filename, int flags, int mode);
+void rpmpkgClose(rpmpkgdb pkgdbp);
+void rpmpkgSetFsync(rpmpkgdb pkgdbp, int dofsync);
+
+int rpmpkgLock(rpmpkgdb pkgdb, int excl);
+int rpmpkgUnlock(rpmpkgdb pkgdb, int excl);
+
+int rpmpkgGet(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char **blobp, unsigned int *bloblp);
+int rpmpkgPut(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char *blob, unsigned int blobl);
+int rpmpkgDel(rpmpkgdb pkgdb, unsigned int pkgidx);
+int rpmpkgList(rpmpkgdb pkgdb, unsigned int **pkgidxlistp, unsigned int *npkgidxlistp);
+
+int rpmpkgNextPkgIdx(rpmpkgdb pkgdb, unsigned int *pkgidxp);
+int rpmpkgGeneration(rpmpkgdb pkgdb, unsigned int *generationp);
+
+int rpmpkgStats(rpmpkgdb pkgdb);
+
diff --git a/lib/backend/ndb/rpmxdb.c b/lib/backend/ndb/rpmxdb.c
new file mode 100644 (file)
index 0000000..55cc197
--- /dev/null
@@ -0,0 +1,1221 @@
+#define _GNU_SOURCE
+
+#include "system.h"
+
+#include <rpm/rpmlog.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <endian.h>
+#include <libgen.h>
+
+#include "rpmxdb.h"
+
+#define RPMRC_OK 0
+#define RPMRC_NOTFOUND 1
+#define RPMRC_FAIL 2
+
+typedef struct rpmxdb_s {
+    rpmpkgdb pkgdb;             /* master database */
+    char *filename;
+    int fd;
+    int flags;
+    int mode;
+    int rdonly;
+    unsigned int pagesize;
+    unsigned int generation;
+    unsigned int slotnpages;
+    unsigned int usergeneration;
+
+    unsigned char *mapped;
+    unsigned int mappedlen;
+
+    struct xdb_slot {
+       unsigned int slotno;
+       unsigned int blobtag;
+       unsigned int subtag;
+       unsigned char *mapped;
+       int mapflags;
+       unsigned int startpage;
+       unsigned int pagecnt;
+       void (*mapcallback)(rpmxdb xdb, void *data, void *newaddr, size_t newsize);
+       void *mapcallbackdata;
+       unsigned int next;
+       unsigned int prev;
+    } *slots;
+    unsigned int nslots;
+    unsigned int firstfree;
+    unsigned int usedblobpages;
+    unsigned int systempagesize;
+    int dofsync;
+} *rpmxdb;
+
+
+static inline void h2le(unsigned int x, unsigned char *p)
+{
+    p[0] = x;
+    p[1] = x >> 8;
+    p[2] = x >> 16;
+    p[3] = x >> 24;
+}
+
+/* aligned versions */
+static inline unsigned int le2ha(unsigned char *p)
+{
+    unsigned int x = *(unsigned int *)p;
+    return le32toh(x);
+}
+
+static inline void h2lea(unsigned int x, unsigned char *p)
+{
+    *(unsigned int *)p = htole32(x);
+}
+
+
+#define XDB_MAGIC     ('R' | 'p' << 8 | 'm' << 16 | 'X' << 24)
+#define XDB_VERSION    0
+
+#define XDB_OFFSET_MAGIC       0
+#define XDB_OFFSET_VERSION     4
+#define XDB_OFFSET_GENERATION  8
+#define XDB_OFFSET_SLOTNPAGES  12
+#define XDB_OFFSET_PAGESIZE    16
+#define XDB_OFFSET_USERGENERATION      20
+
+/* must be multiple of SLOT_SIZE */
+#define XDB_HEADER_SIZE                32
+
+#define SLOT_MAGIC     ('S' | 'l' << 8 | 'o' << 16)
+
+#define SLOT_SIZE 16
+#define SLOT_START (XDB_HEADER_SIZE / SLOT_SIZE)
+
+static void rpmxdbUnmap(rpmxdb xdb)
+{
+    munmap(xdb->mapped, xdb->mappedlen);
+    xdb->mapped = 0;
+    xdb->mappedlen = 0;
+}
+
+/* slot mapping functions */
+static int mapslot(rpmxdb xdb, struct xdb_slot *slot)
+{
+    void *mapped;
+    size_t off, size, shift;
+
+    if (slot->mapped)
+       return RPMRC_FAIL;
+    size = slot->pagecnt * xdb->pagesize;
+    off = slot->startpage * xdb->pagesize;
+    shift = 0;
+    if (xdb->pagesize != xdb->systempagesize) {
+       shift = off & (xdb->systempagesize - 1);
+       off -= shift;
+       size += shift;
+       size = (size + xdb->systempagesize - 1) & ~(xdb->systempagesize - 1);
+    }
+    mapped = mmap(0, size, slot->mapflags, MAP_SHARED, xdb->fd, off);
+    if (mapped == MAP_FAILED)
+       return RPMRC_FAIL;
+    slot->mapped = (unsigned char *)mapped + shift;
+    return RPMRC_OK;
+}
+
+static void unmapslot(rpmxdb xdb, struct xdb_slot *slot)
+{
+    size_t size;
+    unsigned char *mapped = slot->mapped;
+    if (!mapped)
+       return;
+    size = slot->pagecnt * xdb->pagesize;
+    if (xdb->pagesize != xdb->systempagesize) {
+       size_t off = slot->startpage * xdb->pagesize;
+       size_t shift = off & (xdb->systempagesize - 1);
+       mapped -= shift;
+       size += shift;
+       size = (size + xdb->systempagesize - 1) & ~(xdb->systempagesize - 1);
+    }
+    munmap(mapped, size);
+    slot->mapped = 0;
+}
+
+static int remapslot(rpmxdb xdb, struct xdb_slot *slot, unsigned int newpagecnt)
+{
+    void *mapped;
+    size_t off, oldsize, newsize, shift;
+    oldsize = slot->pagecnt * xdb->pagesize;
+    newsize = newpagecnt * xdb->pagesize;
+    off = slot->startpage * xdb->pagesize;
+    shift = 0;
+    if (xdb->pagesize != xdb->systempagesize) {
+       off = slot->startpage * xdb->pagesize;
+       shift = off & (xdb->systempagesize - 1);
+       off -= shift;
+       oldsize += shift;
+       oldsize = (oldsize + xdb->systempagesize - 1) & ~(xdb->systempagesize - 1);
+       newsize += shift;
+       newsize = (newsize + xdb->systempagesize - 1) & ~(xdb->systempagesize - 1);
+    }
+    if (slot->mapped)
+       mapped = mremap(slot->mapped - shift, oldsize, newsize, MREMAP_MAYMOVE);
+    else
+       mapped = mmap(0, newsize, slot->mapflags, MAP_SHARED, xdb->fd, off);
+    if (mapped == MAP_FAILED)
+       return RPMRC_FAIL;
+    slot->mapped = (unsigned char *)mapped + shift;
+    slot->pagecnt = newpagecnt;
+    return RPMRC_OK;
+}
+
+
+static int usedslots_cmp(const void *a, const void *b)
+{
+    struct xdb_slot *sa = *(struct xdb_slot **)a;
+    struct xdb_slot *sb = *(struct xdb_slot **)b;
+    if (sa->startpage == sb->startpage) {
+      return sa->pagecnt > sb->pagecnt ? 1 : sa->pagecnt < sb->pagecnt ? -1 : 0;
+    }
+    return sa->startpage > sb->startpage ? 1 : -1;
+}
+
+static int rpmxdbReadHeader(rpmxdb xdb)
+{
+    struct xdb_slot *slot;
+    unsigned int header[XDB_HEADER_SIZE / sizeof(unsigned int)];
+    unsigned int slotnpages, pagesize, generation, usergeneration, version;
+    unsigned int page, *lastfreep;
+    unsigned char *pageptr;
+    struct xdb_slot *slots, **usedslots, *lastslot;
+    unsigned int nslots;
+    unsigned int usedblobpages;
+    int i, nused, slotno;
+    struct stat stb;
+    size_t mapsize;
+
+    if (xdb->mapped) {
+       if (le2ha(xdb->mapped + XDB_OFFSET_GENERATION) == xdb->generation) {
+           return RPMRC_OK;
+       }
+       rpmxdbUnmap(xdb);
+    }
+    if (fstat(xdb->fd, &stb)) {
+        return RPMRC_FAIL;
+    }
+    if (pread(xdb->fd, header, sizeof(header), 0) != sizeof(header)) {
+       return RPMRC_FAIL;
+    }
+    if (le2ha((unsigned char *)header + XDB_OFFSET_MAGIC) != XDB_MAGIC)
+       return RPMRC_FAIL;
+    version = le2ha((unsigned char *)header + XDB_OFFSET_VERSION);
+    if (version != XDB_VERSION) {
+       rpmlog(RPMLOG_ERR, _("rpmxdb: Version mismatch. Expected version: %u. "
+           "Found version: %u\n"), XDB_VERSION, version);
+       return RPMRC_FAIL;
+    }
+
+    generation = le2ha((unsigned char *)header + XDB_OFFSET_GENERATION);
+    slotnpages = le2ha((unsigned char *)header + XDB_OFFSET_SLOTNPAGES);
+    pagesize = le2ha((unsigned char *)header + XDB_OFFSET_PAGESIZE);
+    usergeneration = le2ha((unsigned char *)header + XDB_OFFSET_USERGENERATION);
+    if (!slotnpages || !pagesize || stb.st_size % pagesize != 0)
+       return RPMRC_FAIL;
+    xdb->pagesize = pagesize;
+
+    /* round up */
+    mapsize = slotnpages * pagesize;
+    mapsize = (mapsize + xdb->systempagesize - 1) & ~(xdb->systempagesize - 1);
+    xdb->mapped = mmap(0, mapsize, xdb->rdonly ? PROT_READ : PROT_READ | PROT_WRITE, MAP_SHARED, xdb->fd, 0);
+    if ((void *)xdb->mapped == MAP_FAILED) {
+       xdb->mapped = 0;
+       return RPMRC_FAIL;
+    }
+    xdb->mappedlen = mapsize;
+
+    /* read in all slots */
+    xdb->firstfree = 0;
+    nslots = slotnpages * (pagesize / SLOT_SIZE) - SLOT_START + 1;
+    slots = calloc(nslots + 1, sizeof(struct xdb_slot));
+    if (!slots) {
+       rpmxdbUnmap(xdb);
+       return RPMRC_FAIL;
+    }
+    usedslots = calloc(nslots + 1, sizeof(int));
+    if (!usedslots) {
+       rpmxdbUnmap(xdb);
+       free(slots);
+       return RPMRC_FAIL;
+    }
+    nused = 0;
+    slotno = 1;
+    slot = slots + 1;
+    usedblobpages = 0;
+    lastfreep = &xdb->firstfree;
+    for (page = 0, pageptr = xdb->mapped; page < slotnpages; page++, pageptr += pagesize) {
+       unsigned int o;
+       for (o = page ? 0 : SLOT_START * SLOT_SIZE; o < pagesize; o += SLOT_SIZE, slotno++, slot++) {
+           unsigned char *pp = pageptr + o;
+           slot->slotno = slotno;
+           slot->subtag = le2ha(pp);
+           if ((slot->subtag & 0x00ffffff) != SLOT_MAGIC) {
+               free(slots);
+               free(usedslots);
+               rpmxdbUnmap(xdb);
+               return RPMRC_FAIL;
+           }
+           slot->subtag = (slot->subtag >> 24) & 255;
+           slot->blobtag = le2ha(pp + 4);
+           slot->startpage = le2ha(pp + 8);
+           slot->pagecnt = le2ha(pp + 12);
+           if (slot->pagecnt == 0 && slot->startpage)  /* empty but used slot? */
+               slot->startpage = slotnpages;
+           if (!slot->startpage) {
+               *lastfreep = slotno;
+               lastfreep = &slot->next;
+           } else {
+               usedslots[nused++] = slot;
+               usedblobpages += slot->pagecnt;
+           }
+       }
+    }
+    if (nused > 1) {
+       qsort(usedslots, nused, sizeof(*usedslots), usedslots_cmp);
+    }
+    /* now chain em */
+    slots[0].pagecnt = slotnpages;
+    lastslot = slots;
+    for (i = 0; i < nused; i++, lastslot = slot) {
+       slot = usedslots[i];
+       if (lastslot->startpage + lastslot->pagecnt > slot->startpage) {
+           free(slots);
+           free(usedslots);
+           rpmxdbUnmap(xdb);
+           return RPMRC_FAIL;
+       }
+       lastslot->next = slot->slotno;
+       slot->prev = lastslot->slotno;
+    }
+    lastslot->next = nslots;
+    slots[nslots].slotno = nslots;
+    slots[nslots].prev = lastslot->slotno;
+    slots[nslots].startpage = stb.st_size / pagesize;
+    free(usedslots);
+    /* now sync with the old slot data */
+    if (xdb->slots) {
+       for (i = 1, slot = xdb->slots + i; i < xdb->nslots; i++, slot++) {
+           if (slot->startpage && (slot->mapped || slot->mapcallback)) {
+               struct xdb_slot *nslot;
+               if (i >= nslots || !slots[i].startpage || slots[i].blobtag != slot->blobtag || slots[i].subtag != slot->subtag) {
+                   /* slot is gone */
+                   if (slot->mapped) {
+                       unmapslot(xdb, slot);
+                       slot->mapcallback(xdb, slot->mapcallbackdata, 0, 0);
+                   }
+                   continue;
+               }
+               nslot = slots + i;
+               if (slot->mapcallback) {
+                   nslot->mapflags = slot->mapflags;
+                   nslot->mapcallback = slot->mapcallback;
+                   nslot->mapcallbackdata = slot->mapcallbackdata;
+               }
+               if (slot->startpage != nslot->startpage || slot->pagecnt != nslot->pagecnt) {
+                   /* slot moved or was resized */
+                   if (slot->mapped)
+                       unmapslot(xdb, slot);
+                   if (nslot->mapcallback) {
+                       if (nslot->pagecnt) {
+                           mapslot(xdb, nslot);
+                           nslot->mapcallback(xdb, nslot->mapcallbackdata, nslot->mapped, nslot->mapped ? nslot->pagecnt * xdb->pagesize : 0);
+                       } else {
+                           nslot->mapcallback(xdb, nslot->mapcallbackdata, 0, 0);
+                       }
+                   }
+               }
+           }
+       }
+       free(xdb->slots);
+    }
+    xdb->slots = slots;
+    xdb->nslots = nslots;
+    xdb->generation = generation;
+    xdb->slotnpages = slotnpages;
+    xdb->usergeneration = usergeneration;
+    xdb->usedblobpages = usedblobpages;
+    return RPMRC_OK;
+}
+
+static int rpmxdbWriteHeader(rpmxdb xdb)
+{
+    if (!xdb->mapped)
+       return RPMRC_FAIL;
+    h2lea(XDB_MAGIC, xdb->mapped + XDB_OFFSET_MAGIC);
+    h2lea(XDB_VERSION, xdb->mapped + XDB_OFFSET_VERSION);
+    h2lea(xdb->generation, xdb->mapped + XDB_OFFSET_GENERATION);
+    h2lea(xdb->slotnpages, xdb->mapped + XDB_OFFSET_SLOTNPAGES);
+    h2lea(xdb->pagesize, xdb->mapped + XDB_OFFSET_PAGESIZE);
+    h2lea(xdb->usergeneration, xdb->mapped + XDB_OFFSET_USERGENERATION);
+    return RPMRC_OK;
+}
+
+static void rpmxdbUpdateSlot(rpmxdb xdb, struct xdb_slot *slot)
+{
+    unsigned char *pp = xdb->mapped + (SLOT_START - 1 + slot->slotno) * SLOT_SIZE;
+    h2lea(SLOT_MAGIC | (slot->subtag << 24), pp);
+    h2lea(slot->blobtag, pp + 4);
+    if (slot->pagecnt || !slot->startpage)
+       h2lea(slot->startpage, pp + 8);
+    else
+       h2lea(1, pp + 8);       /* "empty but used" blobs always start at 1 */
+    h2lea(slot->pagecnt, pp + 12);
+    xdb->generation++;
+    h2lea(xdb->generation, xdb->mapped + XDB_OFFSET_GENERATION);
+}
+
+static int rpmxdbWriteEmptyPages(rpmxdb xdb, unsigned int pageno, unsigned int count)
+{
+    unsigned char *page;
+    if (!count)
+       return RPMRC_OK;
+    page = malloc(xdb->pagesize);
+    if (!page)
+       return RPMRC_FAIL;
+    memset(page, 0, xdb->pagesize);
+    for (; count; count--, pageno++) {
+       if (pwrite(xdb->fd, page, xdb->pagesize, pageno * xdb->pagesize) != xdb->pagesize) {
+           free(page);
+           return RPMRC_FAIL;
+       }
+    }
+    free(page);
+    return RPMRC_OK;
+}
+
+static int rpmxdbWriteEmptySlotpage(rpmxdb xdb, int pageno)
+{
+    unsigned char *page;
+    int i, spp;
+    page = malloc(xdb->pagesize);
+    if (!page)
+       return RPMRC_FAIL;
+    memset(page, 0, xdb->pagesize);
+    spp = xdb->pagesize / SLOT_SIZE;   /* slots per page */
+    for (i = pageno ? 0 : SLOT_START; i < spp; i++)
+        h2le(SLOT_MAGIC, page + i * SLOT_SIZE);
+    if (!pageno) {
+       /* only used when called from InitInternal */
+       if (xdb->mapped) {
+           free(page);
+           return RPMRC_FAIL;
+       }
+       xdb->mapped = page;
+       rpmxdbWriteHeader(xdb);
+       xdb->mapped = 0;
+    }
+    if (pwrite(xdb->fd, page, xdb->pagesize, pageno * xdb->pagesize) != xdb->pagesize) {
+       free(page);
+       return RPMRC_FAIL;
+    }
+    free(page);
+    return RPMRC_OK;
+}
+
+static int rpmxdbInitInternal(rpmxdb xdb)
+{
+    struct stat stb;
+    if (fstat(xdb->fd, &stb)) {
+        return RPMRC_FAIL;
+    }
+    if (stb.st_size == 0) {
+        xdb->slotnpages = 1;
+        xdb->generation++;
+       xdb->pagesize = sysconf(_SC_PAGE_SIZE);
+        if (rpmxdbWriteEmptySlotpage(xdb, 0)) {
+            return RPMRC_FAIL;
+        }
+    }
+    return RPMRC_OK;
+}
+
+/* we use the master pdb for locking */
+static int rpmxdbLockOnly(rpmxdb xdb, int excl)
+{
+    if (excl && xdb->rdonly)
+        return RPMRC_FAIL;
+    return rpmpkgLock(xdb->pkgdb, excl);
+}
+
+/* this is the same as rpmxdbLockReadHeader. It does the
+ * ReadHeader to sync the mappings if xdb moved some blobs.
+ */
+int rpmxdbLock(rpmxdb xdb, int excl)
+{
+    if (rpmxdbLockOnly(xdb, excl))
+       return RPMRC_FAIL;
+    if (rpmxdbReadHeader(xdb)) {
+       rpmxdbUnlock(xdb, excl);
+        return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+int rpmxdbUnlock(rpmxdb xdb, int excl)
+{
+    return rpmpkgUnlock(xdb->pkgdb, excl);
+}
+
+static int rpmxdbLockReadHeader(rpmxdb xdb, int excl)
+{
+    if (rpmxdbLockOnly(xdb, excl))
+       return RPMRC_FAIL;
+    if (rpmxdbReadHeader(xdb)) {
+       rpmxdbUnlock(xdb, excl);
+        return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+static int rpmxdbInit(rpmxdb xdb)
+{
+    int rc;
+
+    if (rpmxdbLockOnly(xdb, 1))
+        return RPMRC_FAIL;
+    rc = rpmxdbInitInternal(xdb);
+    rpmxdbUnlock(xdb, 1);
+    return rc;
+}
+
+int rpmxdbOpen(rpmxdb *xdbp, rpmpkgdb pkgdb, const char *filename, int flags, int mode)
+{
+    struct stat stb;
+    rpmxdb xdb;
+
+    *xdbp = 0;
+    xdb = calloc(1, sizeof(*xdb));
+    xdb->pkgdb = pkgdb;
+    xdb->filename = strdup(filename);
+    xdb->systempagesize = sysconf(_SC_PAGE_SIZE);
+    if (!xdb->filename) {
+       free(xdb);
+       return RPMRC_FAIL;
+    }
+    if ((flags & (O_RDONLY|O_RDWR)) == O_RDONLY)
+       xdb->rdonly = 1;
+    if ((xdb->fd = open(filename, flags, mode)) == -1) {
+       free(xdb->filename);
+       free(xdb);
+       return RPMRC_FAIL;
+    }
+    if (flags & O_CREAT) {
+       char *filenameCopy;
+       DIR *pdir;
+
+       if ((filenameCopy = strdup(xdb->filename)) == NULL) {
+           close(xdb->fd);
+           free(xdb->filename);
+           free(xdb);
+           return RPMRC_FAIL;
+       }
+
+       if ((pdir = opendir(dirname(filenameCopy))) == NULL) {
+           free(filenameCopy);
+           close(xdb->fd);
+           free(xdb->filename);
+           free(xdb);
+           return RPMRC_FAIL;
+       }
+
+       if (fsync(dirfd(pdir)) == -1) {
+           closedir(pdir);
+           free(filenameCopy);
+           close(xdb->fd);
+           free(xdb->filename);
+           free(xdb);
+           return RPMRC_FAIL;
+       }
+       closedir(pdir);
+       free(filenameCopy);
+    }
+    if (fstat(xdb->fd, &stb)) {
+       close(xdb->fd);
+       free(xdb->filename);
+       free(xdb);
+       return RPMRC_FAIL;
+    }
+    if (stb.st_size == 0) {
+       if (rpmxdbInit(xdb)) {
+           close(xdb->fd);
+           free(xdb->filename);
+           free(xdb);
+           return RPMRC_FAIL;
+       }
+    }
+    xdb->flags = flags;
+    xdb->mode = mode;
+    xdb->dofsync = 1;
+    *xdbp = xdb;
+    return RPMRC_OK;
+}
+
+void rpmxdbClose(rpmxdb xdb)
+{
+    struct xdb_slot *slot;
+    int i;
+
+    for (i = 1, slot = xdb->slots + 1; i < xdb->nslots; i++, slot++) {
+       if (slot->mapped) {
+           unmapslot(xdb, slot);
+           slot->mapcallback(xdb, slot->mapcallbackdata, 0, 0);
+       }
+    }
+    if (xdb->slots)
+       free(xdb->slots);
+    if (xdb->fd >= 0)
+       close(xdb->fd);
+    if (xdb->filename)
+       free(xdb->filename);
+    free(xdb);
+}
+
+/* moves the blob to a given new location (possibly resizeing) */
+static int moveblobto(rpmxdb xdb, struct xdb_slot *oldslot, struct xdb_slot *afterslot, unsigned int newpagecnt)
+{
+    struct xdb_slot *nextslot;
+    unsigned int newstartpage, oldpagecnt;
+    unsigned int tocopy;
+    int didmap;
+
+    newstartpage = afterslot->startpage + afterslot->pagecnt;
+    nextslot = xdb->slots + afterslot->next;
+
+    /* make sure there's enough room */
+    if (newpagecnt > nextslot->startpage - newstartpage)
+       return RPMRC_FAIL;
+
+#if 0
+    printf("moveblobto %d %d %d %d, afterslot %d\n", oldslot->startpage, oldslot->pagecnt, newstartpage, newpagecnt, afterslot->slotno);
+#endif
+    /* map old content */
+    didmap = 0;
+    oldpagecnt = oldslot->pagecnt;
+    if (!oldslot->mapped && oldpagecnt) {
+       if (mapslot(xdb, oldslot))
+           return RPMRC_FAIL;
+        didmap = 1;
+    }
+
+    /* copy content */
+    tocopy = newpagecnt > oldpagecnt ? oldpagecnt : newpagecnt;
+    if (tocopy && pwrite(xdb->fd, oldslot->mapped, tocopy * xdb->pagesize, newstartpage * xdb->pagesize) != tocopy * xdb->pagesize) {
+       if (didmap)
+           unmapslot(xdb, oldslot);
+       return RPMRC_FAIL;
+    }
+    /* zero out new pages */
+    if (newpagecnt > oldpagecnt) {
+       if (rpmxdbWriteEmptyPages(xdb, newstartpage + oldpagecnt, newpagecnt - oldpagecnt)) {
+           if (didmap)
+               unmapslot(xdb, oldslot);
+           return RPMRC_FAIL;
+       }
+    }
+
+    if (oldslot->mapped)
+       unmapslot(xdb, oldslot);
+
+    /* set new offset and position */
+    oldslot->startpage = newstartpage;
+    oldslot->pagecnt = newpagecnt;
+    rpmxdbUpdateSlot(xdb, oldslot);
+    xdb->usedblobpages -= oldpagecnt;
+    xdb->usedblobpages += newpagecnt;
+
+    if (afterslot != oldslot && nextslot != oldslot) {
+       /* remove from old chain */
+       xdb->slots[oldslot->prev].next = oldslot->next;
+       xdb->slots[oldslot->next].prev = oldslot->prev;
+
+       /* chain into new position, between lastslot and nextslot */
+       oldslot->prev = afterslot->slotno;
+       afterslot->next = oldslot->slotno;
+
+       oldslot->next = nextslot->slotno;
+       nextslot->prev = oldslot->slotno;
+    }
+
+    /* map again (if needed) */
+    if (oldslot->mapcallback) {
+       if (newpagecnt) {
+           if (mapslot(xdb, oldslot))
+               oldslot->mapped = 0;    /* XXX: HELP, what can we do here? */
+       }
+       oldslot->mapcallback(xdb, oldslot->mapcallbackdata, oldslot->mapped, oldslot->mapped ? oldslot->pagecnt * xdb->pagesize : 0);
+    }
+    return RPMRC_OK;
+}
+
+/* moves the blob to a new location (possibly resizeing) */
+static int moveblob(rpmxdb xdb, struct xdb_slot *oldslot, unsigned int newpagecnt)
+{
+    struct xdb_slot *slot, *lastslot;
+    unsigned int nslots;
+    unsigned int freecnt;
+    int i;
+
+    nslots = xdb->nslots;
+    freecnt = 0;
+    lastslot = xdb->slots;
+    for (i = xdb->slots[0].next; ; lastslot = slot, i = slot->next) {
+       slot = xdb->slots + i;
+       freecnt = slot->startpage - (lastslot->startpage + lastslot->pagecnt);
+       if (freecnt >= newpagecnt)
+           break;
+       if (i == nslots)
+           break;
+    }
+    if (i == nslots && newpagecnt > freecnt) {
+       /* need to grow the file */
+       if (rpmxdbWriteEmptyPages(xdb, slot->startpage, newpagecnt - freecnt)) {
+           return RPMRC_FAIL;
+       }
+       slot->startpage += newpagecnt - freecnt;
+    }
+    return moveblobto(xdb, oldslot, lastslot, newpagecnt);
+}
+
+/* move the two blobs at the end of our file to the free area after the provided slot */
+static int moveblobstofront(rpmxdb xdb, struct xdb_slot *afterslot)
+{
+    struct xdb_slot *slot1, *slot2;
+    unsigned int freestart = afterslot->startpage + afterslot->pagecnt;
+    unsigned int freecount = xdb->slots[afterslot->next].startpage - freestart;
+
+    slot1 = xdb->slots + xdb->slots[xdb->nslots].prev;
+    if (slot1 == xdb->slots)
+       slot1 = slot2 = 0;
+    else {
+       slot2 = xdb->slots + slot1->prev;
+       if (slot2 == xdb->slots)
+           slot2 = 0;
+    }
+    if (slot1->pagecnt < slot2->pagecnt) {
+       struct xdb_slot *tmp = slot1;
+       slot1 = slot2;
+       slot2 = tmp;
+    }
+    if (slot1 && slot1->pagecnt && slot1->pagecnt <= freecount && slot1->startpage > freestart) {
+       if (moveblobto(xdb, slot1, afterslot, slot1->pagecnt))
+           return RPMRC_FAIL;
+       freestart += slot1->pagecnt;
+       freecount -= slot1->pagecnt;
+       afterslot = slot1;
+    }
+    if (slot2 && slot2->pagecnt && slot2->pagecnt <= freecount && slot2->startpage > freestart) {
+       if (moveblobto(xdb, slot2, afterslot, slot2->pagecnt))
+           return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+/* add a single page containing empty slots */
+static int addslotpage(rpmxdb xdb)
+{
+    unsigned char *newaddr;
+    struct xdb_slot *slot;
+    int i, spp, nslots;
+    size_t newmappedlen;
+
+    if (xdb->firstfree)
+       return RPMRC_FAIL;
+
+    /* move first blob if needed */
+    nslots = xdb->nslots;
+    for (i = xdb->slots[0].next; i != nslots; i = slot->next) {
+       slot = xdb->slots + i;
+       if (slot->pagecnt)
+           break;
+    }
+    if (i != nslots && slot->pagecnt && slot->startpage == xdb->slotnpages) {
+       /* the blob at this slot is in the way. move it. */
+       if (moveblob(xdb, slot, slot->pagecnt))
+           return RPMRC_FAIL;
+    }
+
+    spp = xdb->pagesize / SLOT_SIZE;   /* slots per page */
+    slot = realloc(xdb->slots, (nslots + 1 + spp) * sizeof(*slot));
+    if (!slot)
+       return RPMRC_FAIL;
+    xdb->slots = slot;
+
+    if (rpmxdbWriteEmptySlotpage(xdb, xdb->slotnpages)) {
+       return RPMRC_FAIL;
+    }
+    /* remap slots */
+    newmappedlen = xdb->slotnpages * xdb->pagesize + xdb->pagesize;
+    newmappedlen = (newmappedlen + xdb->systempagesize - 1) & ~(xdb->systempagesize - 1);
+    newaddr = mremap(xdb->mapped, xdb->mappedlen, newmappedlen, MREMAP_MAYMOVE);
+    if (newaddr == MAP_FAILED)
+       return RPMRC_FAIL;
+    xdb->mapped = newaddr;
+    xdb->mappedlen = newmappedlen;
+
+    /* update the header */
+    xdb->slotnpages++;
+    xdb->generation++;
+    rpmxdbWriteHeader(xdb);
+
+    /* fixup empty but used slots */
+    for (i = xdb->slots[0].next; i != nslots; i = slot->next) {
+       slot = xdb->slots + i;
+       if (slot->startpage >= xdb->slotnpages)
+           break;
+       slot->startpage = xdb->slotnpages;
+       if (slot->pagecnt)
+           abort();
+    }
+
+    /* move tail element to the new end */
+    slot = xdb->slots + nslots + spp;
+    *slot = xdb->slots[nslots];
+    slot->slotno = nslots + spp;
+    xdb->slots[slot->prev].next = slot->slotno;
+    xdb->nslots += spp;
+
+    /* add new free slots to the firstfree chain */
+    memset(xdb->slots + nslots, 0, sizeof(*slot) * spp);
+    for (i = 0; i < spp - 1; i++) {
+       xdb->slots[nslots + i].slotno = nslots + i;
+       xdb->slots[nslots + i].next = i + 1;
+    }
+    xdb->slots[nslots + i].slotno = nslots + i;
+    xdb->firstfree = nslots;
+    return RPMRC_OK;
+}
+
+static int createblob(rpmxdb xdb, unsigned int *idp, unsigned int blobtag, unsigned int subtag)
+{
+    struct xdb_slot *slot;
+    unsigned int id;
+
+    if (subtag > 255)
+       return RPMRC_FAIL;
+    if (!xdb->firstfree) {
+       if (addslotpage(xdb))
+           return RPMRC_FAIL;
+    }
+    id = xdb->firstfree;
+    slot = xdb->slots + xdb->firstfree;
+    xdb->firstfree = slot->next;
+
+    slot->mapped = 0;
+    slot->blobtag = blobtag;
+    slot->subtag = subtag;
+    slot->startpage = xdb->slotnpages;
+    slot->pagecnt = 0;
+    rpmxdbUpdateSlot(xdb, slot);
+    /* enqueue */
+    slot->prev = 0;
+    slot->next = xdb->slots[0].next;
+    xdb->slots[slot->next].prev = id;
+    xdb->slots[0].next = id;
+#if 0
+    printf("createblob #%d %d/%d\n", id, blobtag, subtag);
+#endif
+    if (slot->slotno != id)
+       abort();
+    if (slot->mapped)
+       abort();
+    *idp = id;
+    return RPMRC_OK;
+}
+
+int rpmxdbLookupBlob(rpmxdb xdb, unsigned int *idp, unsigned int blobtag, unsigned int subtag, int flags)
+{
+    struct xdb_slot *slot;
+    unsigned int i, nslots;
+    if (rpmxdbLockReadHeader(xdb, flags ? 1 : 0))
+        return RPMRC_FAIL;
+    nslots = xdb->nslots;
+    slot = 0;
+    for (i = xdb->slots[0].next; i != nslots; i = slot->next) {
+       slot = xdb->slots + i;
+       if (slot->blobtag == blobtag && slot->subtag == subtag)
+           break;
+    }
+    if (i == nslots)
+       i = 0;
+    if (i && (flags & O_TRUNC) != 0) {
+       if (rpmxdbResizeBlob(xdb, i, 0)) {
+           rpmxdbUnlock(xdb, flags ? 1 : 0);
+           return RPMRC_FAIL;
+       }
+    }
+    if (!i && (flags & O_CREAT) != 0) {
+       if (createblob(xdb, &i, blobtag, subtag)) {
+           rpmxdbUnlock(xdb, flags ? 1 : 0);
+           return RPMRC_FAIL;
+       }
+    }
+    *idp = i;
+    rpmxdbUnlock(xdb, flags ? 1 : 0);
+    return i ? RPMRC_OK : RPMRC_NOTFOUND;
+}
+
+int rpmxdbDelBlob(rpmxdb xdb, unsigned int id)
+{
+    struct xdb_slot *slot;
+    if (!id)
+       return RPMRC_FAIL;
+    if (rpmxdbLockReadHeader(xdb, 1))
+        return RPMRC_FAIL;
+    if (id >= xdb->nslots) {
+       rpmxdbUnlock(xdb, 1);
+        return RPMRC_FAIL;
+    }
+    slot = xdb->slots + id;
+    if (!slot->startpage) {
+       rpmxdbUnlock(xdb, 1);
+        return RPMRC_OK;
+    }
+    if (slot->mapped) {
+       unmapslot(xdb, slot);
+       slot->mapcallback(xdb, slot->mapcallbackdata, 0, 0);
+    }
+    /* remove from old chain */
+    xdb->slots[slot->prev].next = slot->next;
+    xdb->slots[slot->next].prev = slot->prev;
+    xdb->usedblobpages -= slot->pagecnt;
+
+    if (xdb->usedblobpages * 2 < xdb->slots[xdb->nslots].startpage && (slot->startpage + slot->pagecnt) * 2 < xdb->slots[xdb->nslots].startpage) {
+       /* freed in first half of pages, move last two blobs if we can */
+       moveblobstofront(xdb, xdb->slots + slot->prev);
+    }
+
+    /* zero slot */
+    memset(slot, 0, sizeof(*slot));
+    slot->slotno = id;
+    rpmxdbUpdateSlot(xdb, slot);
+
+    /* enqueue into free chain */
+    slot->next = xdb->firstfree;
+    xdb->firstfree = slot->slotno;
+
+    /* check if we should truncate the file */
+    slot = xdb->slots + xdb->slots[xdb->nslots].prev;
+    if (slot->startpage + slot->pagecnt < xdb->slots[xdb->nslots].startpage / 4 * 3) {
+       unsigned int newend = slot->startpage + slot->pagecnt;
+       if (!ftruncate(xdb->fd, newend * xdb->pagesize))
+           xdb->slots[xdb->nslots].startpage = newend;
+    }
+
+    rpmxdbUnlock(xdb, 1);
+    return RPMRC_OK;
+}
+
+int rpmxdbResizeBlob(rpmxdb xdb, unsigned int id, size_t newsize)
+{
+    struct xdb_slot *slot;
+    unsigned int oldpagecnt, newpagecnt;
+    if (!id)
+       return RPMRC_FAIL;
+    if (rpmxdbLockReadHeader(xdb, 1))
+        return RPMRC_FAIL;
+    if (id >= xdb->nslots) {
+       rpmxdbUnlock(xdb, 1);
+        return RPMRC_FAIL;
+    }
+    slot = xdb->slots + id;
+    if (!slot->startpage) {
+       rpmxdbUnlock(xdb, 1);
+        return RPMRC_FAIL;
+    }
+    oldpagecnt = slot->pagecnt;
+    newpagecnt = (newsize + xdb->pagesize - 1) / xdb->pagesize;
+    if (oldpagecnt && newpagecnt && newpagecnt <= oldpagecnt) {
+       /* reducing size. zero to end of page */
+       unsigned int pg = newsize & (xdb->pagesize - 1);
+       if (pg) {
+           if (slot->mapped) {
+               memset(slot->mapped + pg, 0, xdb->pagesize - pg);
+           } else {
+               char *empty = calloc(1, xdb->pagesize - pg);
+               if (!empty) {
+                   rpmxdbUnlock(xdb, 1);
+                   return RPMRC_FAIL;
+               }
+                if (pwrite(xdb->fd, empty, xdb->pagesize - pg, (slot->startpage + newpagecnt - 1) * xdb->pagesize + pg ) != xdb->pagesize - pg) {
+                   free(empty);
+                   rpmxdbUnlock(xdb, 1);
+                   return RPMRC_FAIL;
+               }
+               free(empty);
+           }
+       }
+    }
+    if (newpagecnt == oldpagecnt) {
+       /* no size change */
+       rpmxdbUnlock(xdb, 1);
+        return RPMRC_OK;
+    }
+    if (!newpagecnt) {
+       /* special case: zero size blob, no longer mapped */
+       if (slot->mapped)
+           unmapslot(xdb, slot);
+       slot->pagecnt = 0;
+       slot->startpage = xdb->slotnpages;
+       /* remove from old chain */
+       xdb->slots[slot->prev].next = slot->next;
+       xdb->slots[slot->next].prev = slot->prev;
+       /* enqueue into head */
+       slot->prev = 0;
+       slot->next = xdb->slots[0].next;
+       xdb->slots[slot->next].prev = slot->slotno;
+       xdb->slots[0].next = slot->slotno;
+       rpmxdbUpdateSlot(xdb, slot);
+       xdb->usedblobpages -= oldpagecnt;
+       if (slot->mapcallback)
+           slot->mapcallback(xdb, slot->mapcallbackdata, 0, 0);
+    } else if (newpagecnt <= xdb->slots[slot->next].startpage - slot->startpage) {
+       /* can do it inplace */
+       if (newpagecnt > oldpagecnt) {
+           /* zero new pages */
+           if (rpmxdbWriteEmptyPages(xdb, slot->startpage + oldpagecnt, newpagecnt - oldpagecnt)) {
+               rpmxdbUnlock(xdb, 1);
+               return RPMRC_FAIL;
+           }
+       }
+       if (slot->mapcallback) {
+           if (remapslot(xdb, slot, newpagecnt)) {
+               rpmxdbUnlock(xdb, 1);
+               return RPMRC_FAIL;
+           }
+       } else {
+           if (slot->mapped)
+               unmapslot(xdb, slot);
+           slot->pagecnt = newpagecnt;
+       }
+       rpmxdbUpdateSlot(xdb, slot);
+       xdb->usedblobpages -= oldpagecnt;
+       xdb->usedblobpages += newpagecnt;
+       if (slot->mapcallback)
+           slot->mapcallback(xdb, slot->mapcallbackdata, slot->mapped, slot->pagecnt * xdb->pagesize);
+    } else {
+       /* need to relocate to a new page area */
+       if (moveblob(xdb, slot, newpagecnt)) {
+           rpmxdbUnlock(xdb, 1);
+           return RPMRC_FAIL;
+       }
+    }
+    rpmxdbUnlock(xdb, 1);
+    return RPMRC_OK;
+}
+
+int rpmxdbMapBlob(rpmxdb xdb, unsigned int id, int flags, void (*mapcallback)(rpmxdb xdb, void *data, void *newaddr, size_t newsize), void *mapcallbackdata)
+{
+    struct xdb_slot *slot;
+    if (!id || !mapcallback)
+       return RPMRC_FAIL;
+    if ((flags & (O_RDONLY|O_RDWR)) == O_RDWR && xdb->rdonly)
+       return RPMRC_FAIL;
+    if (rpmxdbLockReadHeader(xdb, 0))
+        return RPMRC_FAIL;
+    if (id >= xdb->nslots) {
+       rpmxdbUnlock(xdb, 0);
+        return RPMRC_FAIL;
+    }
+    slot = xdb->slots + id;
+    if (!slot->startpage || slot->mapped) {
+       rpmxdbUnlock(xdb, 0);
+        return RPMRC_FAIL;
+    }
+    slot->mapflags = (flags & (O_RDONLY|O_RDWR)) == O_RDWR ? PROT_READ | PROT_WRITE : PROT_READ;
+    if (slot->pagecnt) {
+       if (mapslot(xdb, slot)) {
+           slot->mapflags = 0;
+           rpmxdbUnlock(xdb, 0);
+           return RPMRC_FAIL;
+       }
+    }
+    slot->mapcallback = mapcallback;
+    slot->mapcallbackdata = mapcallbackdata;
+    mapcallback(xdb, mapcallbackdata, slot->mapped, slot->mapped ? slot->pagecnt * xdb->pagesize : 0);
+    rpmxdbUnlock(xdb, 0);
+    return RPMRC_OK;
+}
+
+int rpmxdbUnmapBlob(rpmxdb xdb, unsigned int id)
+{
+    struct xdb_slot *slot;
+    if (!id)
+       return RPMRC_OK;
+    if (rpmxdbLockReadHeader(xdb, 0))
+        return RPMRC_FAIL;
+    if (id >= xdb->nslots) {
+       rpmxdbUnlock(xdb, 0);
+       return RPMRC_FAIL;
+    }
+    slot = xdb->slots + id;
+    if (slot->mapped) {
+       unmapslot(xdb, slot);
+       slot->mapcallback(xdb, slot->mapcallbackdata, 0, 0);
+    }
+    slot->mapcallback = 0;
+    slot->mapcallbackdata = 0;
+    slot->mapflags = 0;
+    rpmxdbUnlock(xdb, 0);
+    return RPMRC_OK;
+}
+
+int rpmxdbRenameBlob(rpmxdb xdb, unsigned int *idp, unsigned int blobtag, unsigned int subtag)
+{
+    struct xdb_slot *slot;
+    unsigned int otherid;
+    unsigned int id = *idp;
+    int rc;
+
+    if (!id || subtag > 255)
+       return RPMRC_FAIL;
+    if (rpmxdbLockReadHeader(xdb, 1))
+        return RPMRC_FAIL;
+    if (id >= xdb->nslots) {
+       rpmxdbUnlock(xdb, 1);
+        return RPMRC_FAIL;
+    }
+    slot = xdb->slots + id;
+#if 0
+    printf("rpmxdbRenameBlob #%d %d/%d -> %d/%d\n", id, slot->blobtag, slot->subtag, blobtag, subtag);
+#endif
+    if (!slot->startpage) {
+       rpmxdbUnlock(xdb, 1);
+       return RPMRC_FAIL;
+    }
+    if (slot->blobtag == blobtag && slot->subtag == subtag) {
+       rpmxdbUnlock(xdb, 1);
+       return RPMRC_OK;
+    }
+    rc = rpmxdbLookupBlob(xdb, &otherid, blobtag, subtag, 0);
+    if (rc == RPMRC_NOTFOUND)
+       otherid = 0;
+    else if (rc) {
+       rpmxdbUnlock(xdb, 1);
+       return RPMRC_FAIL;
+    }
+    if (otherid) {
+#if 0
+       printf("(replacing #%d)\n", otherid);
+#endif
+       if (rpmxdbDelBlob(xdb, otherid)) {
+           rpmxdbUnlock(xdb, 1);
+           return RPMRC_FAIL;
+       }
+       /* get otherid back from free chain */
+       if (xdb->firstfree != otherid)
+           return RPMRC_FAIL;
+       xdb->firstfree = xdb->slots[otherid].next;
+
+       slot->blobtag = blobtag;
+       slot->subtag = subtag;
+       xdb->slots[otherid] = *slot;
+       /* fixup ids */
+       xdb->slots[otherid].slotno = otherid;
+       xdb->slots[slot->prev].next = otherid;
+       xdb->slots[slot->next].prev = otherid;
+       /* write */
+       rpmxdbUpdateSlot(xdb, xdb->slots + otherid);
+       memset(slot, 0, sizeof(*slot));
+       slot->slotno = id;
+       rpmxdbUpdateSlot(xdb, slot);
+       slot->next = xdb->firstfree;
+       xdb->firstfree = slot->slotno;
+       *idp = otherid;
+    } else {
+       slot = xdb->slots + id;
+       slot->blobtag = blobtag;
+       slot->subtag = subtag;
+       rpmxdbUpdateSlot(xdb, slot);
+    }
+    rpmxdbUnlock(xdb, 1);
+    return RPMRC_OK;
+}
+
+void rpmxdbSetFsync(rpmxdb xdb, int dofsync)
+{
+    xdb->dofsync = dofsync;
+}
+
+int rpmxdbIsRdonly(rpmxdb xdb)
+{
+    return xdb->rdonly;
+}
+
+int rpmxdbSetUserGeneration(rpmxdb xdb, unsigned int usergeneration)
+{
+    if (rpmxdbLockReadHeader(xdb, 1))
+        return RPMRC_FAIL;
+    /* sync before the update */
+    if (xdb->dofsync && fsync(xdb->fd)) {
+       rpmxdbUnlock(xdb, 1);
+       return RPMRC_FAIL;
+    }
+    xdb->usergeneration = usergeneration;
+    xdb->generation++;
+    rpmxdbWriteHeader(xdb);
+    rpmxdbUnlock(xdb, 1);
+    return RPMRC_OK;
+}
+
+int rpmxdbGetUserGeneration(rpmxdb xdb, unsigned int *usergenerationp)
+{
+    if (rpmxdbLockReadHeader(xdb, 0))
+        return RPMRC_FAIL;
+    *usergenerationp = xdb->usergeneration;
+    rpmxdbUnlock(xdb, 0);
+    return RPMRC_OK;
+}
+
+int rpmxdbStats(rpmxdb xdb)
+{
+    struct xdb_slot *slot;
+    unsigned int i, nslots;
+
+    if (rpmxdbLockReadHeader(xdb, 0))
+        return RPMRC_FAIL;
+    nslots = xdb->nslots;
+    printf("--- XDB Stats\n");
+    printf("Filename: %s\n", xdb->filename);
+    printf("Generation: %d\n", xdb->generation);
+    printf("Slot pages: %d\n", xdb->slotnpages);
+    printf("Blob pages: %d\n", xdb->usedblobpages);
+    printf("Free pages: %d\n", xdb->slots[nslots].startpage - xdb->usedblobpages - xdb->slotnpages);
+    printf("Pagesize: %d / %d\n", xdb->pagesize, xdb->systempagesize);
+    for (i = 1, slot = xdb->slots + i; i < nslots; i++, slot++) {
+       if (!slot->startpage)
+           continue;
+       printf("%2d: tag %d/%d, startpage %d, pagecnt %d%s\n", i, slot->blobtag, slot->subtag, slot->startpage, slot->pagecnt, slot->mapcallbackdata ? ", mapped" : "");
+    }
+#if 0
+    printf("Again in offset order:\n");
+    for (i = xdb->slots[0].next; i != nslots; i = slot->next) {
+       slot = xdb->slots + i;
+       printf("%2d: tag %d/%d, startpage %d, pagecnt %d%s\n", i, slot->blobtag, slot->subtag, slot->startpage, slot->pagecnt, slot->mapcallbackdata ? ", mapped" : "");
+    }
+#endif
+#if 0
+    printf("Free chain:\n");
+    for (i = xdb->firstfree; i; i = slot->next) {
+       slot = xdb->slots + i;
+       printf("%2d [%2d]: tag %d/%d, startpage %d, pagecnt %d%s\n", i, slot->slotno, slot->blobtag, slot->subtag, slot->startpage, slot->pagecnt, slot->mapcallbackdata ? ", mapped" : "");
+    }
+#endif
+    rpmxdbUnlock(xdb, 0);
+    return RPMRC_OK;
+}
+
diff --git a/lib/backend/ndb/rpmxdb.h b/lib/backend/ndb/rpmxdb.h
new file mode 100644 (file)
index 0000000..4358536
--- /dev/null
@@ -0,0 +1,27 @@
+#include "rpmpkg.h"
+
+struct rpmxdb_s;
+typedef struct rpmxdb_s *rpmxdb;
+
+int rpmxdbOpen(rpmxdb *xdbp, rpmpkgdb pkgdb, const char *filename, int flags, int mode);
+void rpmxdbClose(rpmxdb xdb);
+void rpmxdbSetFsync(rpmxdb xdb, int dofsync);
+int rpmxdbIsRdonly(rpmxdb xdb);
+
+int rpmxdbLock(rpmxdb xdb, int excl);
+int rpmxdbUnlock(rpmxdb xdb, int excl);
+
+int rpmxdbLookupBlob(rpmxdb xdb, unsigned int *idp, unsigned int blobtag, unsigned int subtag, int flags);
+int rpmxdbDelBlob(rpmxdb xdb, unsigned int id) ;
+
+int rpmxdbMapBlob(rpmxdb xdb, unsigned int id, int flags, void (*mapcallback)(rpmxdb xdb, void *data, void *newaddr, size_t newsize), void *mapcallbackdata);
+int rpmxdbUnmapBlob(rpmxdb xdb, unsigned int id);
+
+int rpmxdbResizeBlob(rpmxdb xdb, unsigned int id, size_t newsize);
+int rpmxdbRenameBlob(rpmxdb xdb, unsigned int *idp, unsigned int blobtag, unsigned int subtag);
+
+int rpmxdbSetUserGeneration(rpmxdb xdb, unsigned int usergeneration);
+int rpmxdbGetUserGeneration(rpmxdb xdb, unsigned int *usergenerationp);
+
+int rpmxdbStats(rpmxdb xdb);
+
index 382eeb65ae6af5dca83c864ae371b257991b1100..57c9592586d0eef239db28f3a655d8cf2d7bedcc 100644 (file)
@@ -16,7 +16,6 @@
 #else
 #include <sys/types.h> /* already included from system.h */
 #endif
-#include <errno.h>
 #include <string.h>
 
 #include <rpm/rpmio.h>
@@ -24,6 +23,7 @@
 #include <rpm/rpmstring.h>
 
 #include "lib/cpio.h"
+#include "lib/rpmarchive.h"
 
 #include "debug.h"
 
@@ -35,6 +35,47 @@ struct rpmcpio_s {
     off_t fileend;
 };
 
+/*
+ * Size limit for individual files in "new ascii format" cpio archives.
+ * The max size of the entire archive is unlimited from cpio POV,
+ * but subject to filesystem limitations.
+ */
+#define CPIO_FILESIZE_MAX UINT32_MAX
+
+#define CPIO_NEWC_MAGIC        "070701"
+#define CPIO_CRC_MAGIC "070702"
+#define CPIO_STRIPPED_MAGIC "07070X"
+#define CPIO_TRAILER   "TRAILER!!!"
+
+/** \ingroup payload
+ * Cpio archive header information.
+ */
+struct cpioCrcPhysicalHeader {
+    /* char magic[6]; handled separately */
+    char inode[8];
+    char mode[8];
+    char uid[8];
+    char gid[8];
+    char nlink[8];
+    char mtime[8];
+    char filesize[8];
+    char devMajor[8];
+    char devMinor[8];
+    char rdevMajor[8];
+    char rdevMinor[8];
+    char namesize[8];
+    char checksum[8];                  /* ignored !! */
+};
+
+#define        PHYS_HDR_SIZE   104             /* Don't depend on sizeof(struct) */
+
+struct cpioStrippedPhysicalHeader {
+    /* char magic[6]; handled separately */
+    char fx[8];
+};
+
+#define STRIPPED_PHYS_HDR_SIZE 8       /* Don't depend on sizeof(struct) */
+
 rpmcpio_t rpmcpioOpen(FD_t fd, char mode)
 {
     if ((mode & O_ACCMODE) != O_RDONLY &&
@@ -83,16 +124,16 @@ static unsigned long strntoul(const char *str,char **endptr, int base, size_t nu
 static int rpmcpioWritePad(rpmcpio_t cpio, ssize_t modulo)
 {
     char buf[modulo];
-    ssize_t left, writen;
+    ssize_t left, written;
     memset(buf, 0, modulo);
     left = (modulo - ((cpio->offset) % modulo)) % modulo;
     if (left <= 0)
         return 0;
-    writen = Fwrite(&buf, left, 1, cpio->fd);
-    if (writen != left) {
-        return CPIOERR_WRITE_FAILED;
+    written = Fwrite(&buf, left, 1, cpio->fd);
+    if (written != left) {
+        return RPMERR_WRITE_FAILED;
     }
-    cpio->offset += writen;
+    cpio->offset += written;
     return 0;
 }
 
@@ -107,7 +148,7 @@ static int rpmcpioReadPad(rpmcpio_t cpio)
     read = Fread(&buf, left, 1, cpio->fd);
     cpio->offset += read;
     if (read != left) {
-        return CPIOERR_READ_FAILED;
+        return RPMERR_READ_FAILED;
     }
     return 0;
 }
@@ -116,7 +157,7 @@ static int rpmcpioReadPad(rpmcpio_t cpio)
        \
        log = strntoul(phys, &end, 16, sizeof(phys)); \
        \
-       if ( (end - phys) != sizeof(phys) ) return CPIOERR_BAD_HEADER;
+       if ( (end - phys) != sizeof(phys) ) return RPMERR_BAD_HEADER;
 #define SET_NUM_FIELD(phys, val, space) \
        sprintf(space, "%8.8lx", (unsigned long) (val)); \
        \
@@ -126,10 +167,10 @@ static int rpmcpioTrailerWrite(rpmcpio_t cpio)
 {
     struct cpioCrcPhysicalHeader hdr;
     int rc;
-    size_t writen;
+    size_t written;
 
     if (cpio->fileend != cpio->offset) {
-        return CPIOERR_WRITE_FAILED;
+        return RPMERR_WRITE_FAILED;
     }
 
     rc = rpmcpioWritePad(cpio, 4);
@@ -137,18 +178,24 @@ static int rpmcpioTrailerWrite(rpmcpio_t cpio)
         return rc;
 
     memset(&hdr, '0', PHYS_HDR_SIZE);
-    memcpy(&hdr.magic, CPIO_NEWC_MAGIC, sizeof(hdr.magic));
     memcpy(&hdr.nlink, "00000001", 8);
     memcpy(&hdr.namesize, "0000000b", 8);
-    writen = Fwrite(&hdr, PHYS_HDR_SIZE, 1, cpio->fd);
-    cpio->offset += writen;
-    if (writen != PHYS_HDR_SIZE) {
-        return CPIOERR_WRITE_FAILED;
+
+    written = Fwrite(CPIO_NEWC_MAGIC, 6, 1, cpio->fd);
+    cpio->offset += written;
+    if (written != 6) {
+        return RPMERR_WRITE_FAILED;
     }
-    writen = Fwrite(&CPIO_TRAILER, sizeof(CPIO_TRAILER), 1, cpio->fd);
-    cpio->offset += writen;
-    if (writen != sizeof(CPIO_TRAILER)) {
-        return CPIOERR_WRITE_FAILED;
+
+    written = Fwrite(&hdr, PHYS_HDR_SIZE, 1, cpio->fd);
+    cpio->offset += written;
+    if (written != PHYS_HDR_SIZE) {
+        return RPMERR_WRITE_FAILED;
+    }
+    written = Fwrite(&CPIO_TRAILER, sizeof(CPIO_TRAILER), 1, cpio->fd);
+    cpio->offset += written;
+    if (written != sizeof(CPIO_TRAILER)) {
+        return RPMERR_WRITE_FAILED;
     }
 
     /*
@@ -166,20 +213,20 @@ int rpmcpioHeaderWrite(rpmcpio_t cpio, char * path, struct stat * st)
     struct cpioCrcPhysicalHeader hdr_s;
     struct cpioCrcPhysicalHeader * hdr = &hdr_s;
     char field[64];
-    size_t len, writen;
+    size_t len, written;
     dev_t dev;
     int rc = 0;
 
     if ((cpio->mode & O_ACCMODE) != O_WRONLY) {
-        return CPIOERR_WRITE_FAILED;
+        return RPMERR_WRITE_FAILED;
     }
 
     if (cpio->fileend != cpio->offset) {
-        return CPIOERR_WRITE_FAILED;
+        return RPMERR_WRITE_FAILED;
     }
 
     if (st->st_size >= CPIO_FILESIZE_MAX) {
-       return CPIOERR_FILE_SIZE;
+       return RPMERR_FILE_SIZE;
     }
 
     rc = rpmcpioWritePad(cpio, 4);
@@ -187,7 +234,6 @@ int rpmcpioHeaderWrite(rpmcpio_t cpio, char * path, struct stat * st)
         return rc;
     }
 
-    memcpy(hdr->magic, CPIO_NEWC_MAGIC, sizeof(hdr->magic));
     SET_NUM_FIELD(hdr->inode, st->st_ino, field);
     SET_NUM_FIELD(hdr->mode, st->st_mode, field);
     SET_NUM_FIELD(hdr->uid, st->st_uid, field);
@@ -206,16 +252,22 @@ int rpmcpioHeaderWrite(rpmcpio_t cpio, char * path, struct stat * st)
 
     memcpy(hdr->checksum, "00000000", 8);
 
-    writen = Fwrite(hdr, PHYS_HDR_SIZE, 1, cpio->fd);
-    cpio->offset += writen;
-    if (writen != PHYS_HDR_SIZE) {
-        return CPIOERR_WRITE_FAILED;
+    written = Fwrite(CPIO_NEWC_MAGIC, 6, 1, cpio->fd);
+    cpio->offset += written;
+    if (written != 6) {
+        return RPMERR_WRITE_FAILED;
+    }
+
+    written = Fwrite(hdr, PHYS_HDR_SIZE, 1, cpio->fd);
+    cpio->offset += written;
+    if (written != PHYS_HDR_SIZE) {
+        return RPMERR_WRITE_FAILED;
     }
 
-    writen = Fwrite(path, len, 1, cpio->fd);
-    cpio->offset += writen;
-    if (writen != len) {
-        return CPIOERR_WRITE_FAILED;
+    written = Fwrite(path, len, 1, cpio->fd);
+    cpio->offset += written;
+    if (written != len) {
+        return RPMERR_WRITE_FAILED;
     }
 
     rc = rpmcpioWritePad(cpio, 4);
@@ -225,34 +277,77 @@ int rpmcpioHeaderWrite(rpmcpio_t cpio, char * path, struct stat * st)
     return rc;
 }
 
-ssize_t rpmcpioWrite(rpmcpio_t cpio, void * buf, size_t size)
+int rpmcpioStrippedHeaderWrite(rpmcpio_t cpio, int fx, off_t fsize)
+{
+    struct cpioStrippedPhysicalHeader hdr_s;
+    struct cpioStrippedPhysicalHeader * hdr = &hdr_s;
+    char field[64];
+    size_t written;
+    int rc = 0;
+
+    if ((cpio->mode & O_ACCMODE) != O_WRONLY) {
+        return RPMERR_WRITE_FAILED;
+    }
+
+    if (cpio->fileend != cpio->offset) {
+        return RPMERR_WRITE_FAILED;
+    }
+
+    rc = rpmcpioWritePad(cpio, 4);
+    if (rc) {
+        return rc;
+    }
+
+    SET_NUM_FIELD(hdr->fx, fx, field);
+
+    written = Fwrite(CPIO_STRIPPED_MAGIC, 6, 1, cpio->fd);
+    cpio->offset += written;
+    if (written != 6) {
+        return RPMERR_WRITE_FAILED;
+    }
+
+    written = Fwrite(hdr, STRIPPED_PHYS_HDR_SIZE, 1, cpio->fd);
+    cpio->offset += written;
+    if (written != STRIPPED_PHYS_HDR_SIZE) {
+        return RPMERR_WRITE_FAILED;
+    }
+
+    rc = rpmcpioWritePad(cpio, 4);
+
+    cpio->fileend = cpio->offset + fsize;
+
+    return rc;
+}
+
+ssize_t rpmcpioWrite(rpmcpio_t cpio, const void * buf, size_t size)
 {
-    size_t writen, left;
+    size_t written, left;
 
     if ((cpio->mode & O_ACCMODE) != O_WRONLY) {
-        return CPIOERR_WRITE_FAILED;
+        return RPMERR_WRITE_FAILED;
     }
 
     // Do not write beyond file length
     left = cpio->fileend - cpio->offset;
     size = size > left ? left : size;
-    writen = Fwrite(buf, size, 1, cpio->fd);
-    cpio->offset += writen;
-    return writen;
+    written = Fwrite(buf, size, 1, cpio->fd);
+    cpio->offset += written;
+    return written;
 }
 
 
-int rpmcpioHeaderRead(rpmcpio_t cpio, char ** path, struct stat * st)
+int rpmcpioHeaderRead(rpmcpio_t cpio, char ** path, int * fx)
 {
     struct cpioCrcPhysicalHeader hdr;
     int nameSize;
     char * end;
-    unsigned int major, minor;
     int rc = 0;
     ssize_t read;
+    char magic[6];
+    rpm_loff_t fsize;
 
     if ((cpio->mode & O_ACCMODE) != O_RDONLY) {
-        return CPIOERR_READ_FAILED;
+        return RPMERR_READ_FAILED;
     }
 
     /* Move to next file */
@@ -262,7 +357,7 @@ int rpmcpioHeaderRead(rpmcpio_t cpio, char ** path, struct stat * st)
         while (cpio->fileend != cpio->offset) {
             read = cpio->fileend - cpio->offset > 8*BUFSIZ ? 8*BUFSIZ : cpio->fileend - cpio->offset;
             if (rpmcpioRead(cpio, &buf, read) != read) {
-                return CPIOERR_READ_FAILED;
+                return RPMERR_READ_FAILED;
             }
         }
     }
@@ -270,56 +365,75 @@ int rpmcpioHeaderRead(rpmcpio_t cpio, char ** path, struct stat * st)
     rc = rpmcpioReadPad(cpio);
     if (rc) return rc;
 
-    read = Fread(&hdr, PHYS_HDR_SIZE, 1, cpio->fd);
+    read = Fread(&magic, 6, 1, cpio->fd);
     cpio->offset += read;
-    if (read != PHYS_HDR_SIZE)
-       return CPIOERR_READ_FAILED;
+    if (read != 6)
+       return RPMERR_BAD_MAGIC;
+
+    /* read stripped header */
+    if (!strncmp(CPIO_STRIPPED_MAGIC, magic,
+                 sizeof(CPIO_STRIPPED_MAGIC)-1)) {
+        struct cpioStrippedPhysicalHeader shdr;
+        read = Fread(&shdr, STRIPPED_PHYS_HDR_SIZE, 1, cpio->fd);
+        cpio->offset += read;
+        if (read != STRIPPED_PHYS_HDR_SIZE)
+           return RPMERR_BAD_HEADER;
+
+        GET_NUM_FIELD(shdr.fx, *fx);
+        rc = rpmcpioReadPad(cpio);
+
+        if (!rc && *fx == -1)
+            rc = RPMERR_ITER_END;
+        return rc;
+    }
 
-    if (strncmp(CPIO_CRC_MAGIC, hdr.magic, sizeof(CPIO_CRC_MAGIC)-1) &&
-       strncmp(CPIO_NEWC_MAGIC, hdr.magic, sizeof(CPIO_NEWC_MAGIC)-1)) {
-       return CPIOERR_BAD_MAGIC;
+    if (strncmp(CPIO_CRC_MAGIC, magic, sizeof(CPIO_CRC_MAGIC)-1) &&
+       strncmp(CPIO_NEWC_MAGIC, magic, sizeof(CPIO_NEWC_MAGIC)-1)) {
+       return RPMERR_BAD_MAGIC;
     }
-    GET_NUM_FIELD(hdr.inode, st->st_ino);
-    GET_NUM_FIELD(hdr.mode, st->st_mode);
-    GET_NUM_FIELD(hdr.uid, st->st_uid);
-    GET_NUM_FIELD(hdr.gid, st->st_gid);
-    GET_NUM_FIELD(hdr.nlink, st->st_nlink);
-    GET_NUM_FIELD(hdr.mtime, st->st_mtime);
-    GET_NUM_FIELD(hdr.filesize, st->st_size);
-
-    GET_NUM_FIELD(hdr.devMajor, major);
-    GET_NUM_FIELD(hdr.devMinor, minor);
-    st->st_dev = makedev(major, minor);
-
-    GET_NUM_FIELD(hdr.rdevMajor, major);
-    GET_NUM_FIELD(hdr.rdevMinor, minor);
-    st->st_rdev = makedev(major, minor);
 
+    read = Fread(&hdr, PHYS_HDR_SIZE, 1, cpio->fd);
+    cpio->offset += read;
+    if (read != PHYS_HDR_SIZE)
+        return RPMERR_BAD_HEADER;
+
+    GET_NUM_FIELD(hdr.filesize, fsize);
     GET_NUM_FIELD(hdr.namesize, nameSize);
+    if (nameSize <= 0 || nameSize > 4096) {
+        return RPMERR_BAD_HEADER;
+    }
 
-    *path = xmalloc(nameSize + 1);
-    read = Fread(*path, nameSize, 1, cpio->fd);
-    (*path)[nameSize] = '\0';
+    char name[nameSize + 1];
+    read = Fread(name, nameSize, 1, cpio->fd);
+    name[nameSize] = '\0';
     cpio->offset += read;
     if (read != nameSize ) {
-        return CPIOERR_BAD_HEADER;
+        return RPMERR_BAD_HEADER;
     }
 
     rc = rpmcpioReadPad(cpio);
-    cpio->fileend = cpio->offset + st->st_size;
+    cpio->fileend = cpio->offset + fsize;
 
-    if (!rc && rstreq(*path, CPIO_TRAILER))
-       rc = CPIOERR_HDR_TRAILER;
+    if (!rc && rstreq(name, CPIO_TRAILER))
+       rc = RPMERR_ITER_END;
+
+    if (!rc && path)
+       *path = xstrdup(name);
 
     return rc;
 }
 
+void rpmcpioSetExpectedFileSize(rpmcpio_t cpio, off_t fsize)
+{
+    cpio->fileend = cpio->offset + fsize;
+}
+
 ssize_t rpmcpioRead(rpmcpio_t cpio, void * buf, size_t size)
 {
     size_t read, left;
 
     if ((cpio->mode & O_ACCMODE) != O_RDONLY) {
-        return CPIOERR_READ_FAILED;
+        return RPMERR_READ_FAILED;
     }
 
     left = cpio->fileend - cpio->offset;
@@ -349,67 +463,3 @@ rpmcpio_t rpmcpioFree(rpmcpio_t cpio)
     }
     return NULL;
 }
-
-const char * rpmcpioStrerror(int rc)
-{
-    static char msg[256];
-    const char *s;
-    int myerrno = errno;
-    size_t l;
-
-    strcpy(msg, "cpio: ");
-    switch (rc) {
-    default: {
-       char *t = msg + strlen(msg);
-       sprintf(t, _("(error 0x%x)"), (unsigned)rc);
-       s = NULL;
-       break;
-    }
-    case CPIOERR_BAD_MAGIC:    s = _("Bad magic");             break;
-    case CPIOERR_BAD_HEADER:   s = _("Bad/unreadable  header");break;
-
-    case CPIOERR_OPEN_FAILED:  s = "open";     break;
-    case CPIOERR_CHMOD_FAILED: s = "chmod";    break;
-    case CPIOERR_CHOWN_FAILED: s = "chown";    break;
-    case CPIOERR_WRITE_FAILED: s = "write";    break;
-    case CPIOERR_UTIME_FAILED: s = "utime";    break;
-    case CPIOERR_UNLINK_FAILED:        s = "unlink";   break;
-    case CPIOERR_RENAME_FAILED:        s = "rename";   break;
-    case CPIOERR_SYMLINK_FAILED: s = "symlink";        break;
-    case CPIOERR_STAT_FAILED:  s = "stat";     break;
-    case CPIOERR_LSTAT_FAILED: s = "lstat";    break;
-    case CPIOERR_MKDIR_FAILED: s = "mkdir";    break;
-    case CPIOERR_RMDIR_FAILED: s = "rmdir";    break;
-    case CPIOERR_MKNOD_FAILED: s = "mknod";    break;
-    case CPIOERR_MKFIFO_FAILED:        s = "mkfifo";   break;
-    case CPIOERR_LINK_FAILED:  s = "link";     break;
-    case CPIOERR_READLINK_FAILED: s = "readlink";      break;
-    case CPIOERR_READ_FAILED:  s = "read";     break;
-    case CPIOERR_COPY_FAILED:  s = "copy";     break;
-    case CPIOERR_LSETFCON_FAILED: s = "lsetfilecon";   break;
-    case CPIOERR_SETCAP_FAILED: s = "cap_set_file";    break;
-
-    case CPIOERR_HDR_SIZE:     s = _("Header size too big");   break;
-    case CPIOERR_FILE_SIZE:    s = _("File too large for archive");    break;
-    case CPIOERR_UNKNOWN_FILETYPE: s = _("Unknown file type"); break;
-    case CPIOERR_MISSING_HARDLINK: s = _("Missing hard link(s)"); break;
-    case CPIOERR_DIGEST_MISMATCH: s = _("Digest mismatch");    break;
-    case CPIOERR_INTERNAL:     s = _("Internal error");        break;
-    case CPIOERR_UNMAPPED_FILE:        s = _("Archive file not in header"); break;
-    case CPIOERR_ENOENT:       s = strerror(ENOENT); break;
-    case CPIOERR_ENOTEMPTY:    s = strerror(ENOTEMPTY); break;
-    }
-
-    l = sizeof(msg) - strlen(msg) - 1;
-    if (s != NULL) {
-       if (l > 0) strncat(msg, s, l);
-       l -= strlen(s);
-    }
-    if ((rc & CPIOERR_CHECK_ERRNO) && myerrno) {
-       s = _(" failed - ");
-       if (l > 0) strncat(msg, s, l);
-       l -= strlen(s);
-       if (l > 0) strncat(msg, strerror(myerrno), l);
-    }
-    return msg;
-}
index 7364caf27952fb97bfec8ea4da41b79c4e8641d1..b33b5fc1358c6ef2aaabd0e26f90f731631e2561 100644 (file)
  *
  */
 
-/** \ingroup payload
- * @note CPIO_CHECK_ERRNO bit is set only if errno is valid.
- */
-#define CPIOERR_CHECK_ERRNO    0x00008000
-
-/** \ingroup payload
- */
-enum cpioErrorReturns {
-       CPIOERR_BAD_MAGIC       = 2,
-       CPIOERR_BAD_HEADER      = 3,
-       CPIOERR_OPEN_FAILED     = 4     | CPIOERR_CHECK_ERRNO,
-       CPIOERR_CHMOD_FAILED    = 5     | CPIOERR_CHECK_ERRNO,
-       CPIOERR_CHOWN_FAILED    = 6     | CPIOERR_CHECK_ERRNO,
-       CPIOERR_WRITE_FAILED    = 7     | CPIOERR_CHECK_ERRNO,
-       CPIOERR_UTIME_FAILED    = 8     | CPIOERR_CHECK_ERRNO,
-       CPIOERR_UNLINK_FAILED   = 9     | CPIOERR_CHECK_ERRNO,
-       CPIOERR_RENAME_FAILED   = 10    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_SYMLINK_FAILED  = 11    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_STAT_FAILED     = 12    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_LSTAT_FAILED    = 13    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_MKDIR_FAILED    = 14    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_RMDIR_FAILED    = 15    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_MKNOD_FAILED    = 16    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_MKFIFO_FAILED   = 17    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_LINK_FAILED     = 18    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_READLINK_FAILED = 19    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_READ_FAILED     = 20    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_COPY_FAILED     = 21    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_LSETFCON_FAILED = 22    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_HDR_SIZE        = 23,
-       CPIOERR_HDR_TRAILER     = 24,
-       CPIOERR_UNKNOWN_FILETYPE= 25,
-       CPIOERR_MISSING_HARDLINK= 26,
-       CPIOERR_DIGEST_MISMATCH = 27,
-       CPIOERR_INTERNAL        = 28,
-       CPIOERR_UNMAPPED_FILE   = 29,
-       CPIOERR_ENOENT          = 30,
-       CPIOERR_ENOTEMPTY       = 31,
-       CPIOERR_SETCAP_FAILED   = 32    | CPIOERR_CHECK_ERRNO,
-       CPIOERR_FILE_SIZE       = 33,
-};
-
-/*
- * Size limit for individual files in "new ascii format" cpio archives.
- * The max size of the entire archive is unlimited from cpio POV,
- * but subject to filesystem limitations.
- */
-#define CPIO_FILESIZE_MAX UINT32_MAX
-
-#define CPIO_NEWC_MAGIC        "070701"
-#define CPIO_CRC_MAGIC "070702"
-#define CPIO_TRAILER   "TRAILER!!!"
-
-/** \ingroup payload
- * Cpio archive header information.
- */
-struct cpioCrcPhysicalHeader {
-    char magic[6];
-    char inode[8];
-    char mode[8];
-    char uid[8];
-    char gid[8];
-    char nlink[8];
-    char mtime[8];
-    char filesize[8];
-    char devMajor[8];
-    char devMinor[8];
-    char rdevMajor[8];
-    char rdevMinor[8];
-    char namesize[8];
-    char checksum[8];                  /* ignored !! */
-};
-
-#define        PHYS_HDR_SIZE   110             /* Don't depend on sizeof(struct) */
-
 typedef struct rpmcpio_s * rpmcpio_t;
 
 #ifdef __cplusplus
@@ -109,33 +34,43 @@ rpmcpio_t rpmcpioFree(rpmcpio_t cpio);
 
 /**
  * Write cpio header.
- * @retval fsm         file path and stat info
- * @param st
+ * @param cpio         cpio archive
+ * @param path         file name
+ * @param st           stat struct with meta data
  * @return             0 on success
  */
 RPM_GNUC_INTERNAL
 int rpmcpioHeaderWrite(rpmcpio_t cpio, char * path, struct stat * st);
+RPM_GNUC_INTERNAL
+int rpmcpioStrippedHeaderWrite(rpmcpio_t cpio, int fx, off_t fsize);
 
-ssize_t rpmcpioWrite(rpmcpio_t cpio, void * buf, size_t size);
+ssize_t rpmcpioWrite(rpmcpio_t cpio, const void * buf, size_t size);
 
 /**
- * Read cpio header.
+ * Read cpio header. Iff fx is returned as -1 a cpio header was read
+ * and the file name is found in path. Otherwise a stripped header was read
+ * and the fx is the number of the file in the header/rpmfi. In this case
+ * rpmcpioSetExpectedFileSize() needs to be called with the file size of the
+ * payload content - with may be zero for hard links, directory or other
+ * special files.
  * @retval fsm         file path and stat info
- * @retval st
+ * @retval path                path of the file
+ * @retval fx          number in the header of the file read
  * @return             0 on success
  */
 RPM_GNUC_INTERNAL
-int rpmcpioHeaderRead(rpmcpio_t cpio, char ** path, struct stat * st);
-
-ssize_t rpmcpioRead(rpmcpio_t cpio, void * buf, size_t size);
+int rpmcpioHeaderRead(rpmcpio_t cpio, char ** path, int * fx);
 
-/** \ingroup payload
- * Return formatted error message on payload handling failure.
- * @param rc           error code
- * @return             formatted error string
+/**
+ * Tell the cpio object the expected file size in the payload.
+ * The size must be zero for all but the last of hard linked files,
+ * directories and special files.
+ * This is needed after reading a stripped cpio header! See above.
  */
-/* XXX should be RPM_GNUC_INTERNAL too but build/pack.c uses */
-const char * rpmcpioStrerror(int rc);
+RPM_GNUC_INTERNAL
+void rpmcpioSetExpectedFileSize(rpmcpio_t cpio, off_t fsize);
+
+ssize_t rpmcpioRead(rpmcpio_t cpio, void * buf, size_t size);
 
 #ifdef __cplusplus
 }
index fa11725a847b0a23ffd5abc53cb63aaedffcd20e..4719b6738cf2b31deaeb04200acdf8801cf6230c 100644 (file)
 #include "lib/rpmts_internal.h"
 #include "lib/rpmte_internal.h"
 #include "lib/rpmds_internal.h"
+#include "lib/rpmfi_internal.h" /* rpmfiles stuff for now */
 #include "lib/misc.h"
 
+#include "lib/backend/dbiset.h"
+
 #include "debug.h"
 
 const char * const RPMVERSION = VERSION;
@@ -39,7 +42,7 @@ const int rpmFLAGS = RPMSENSE_EQUAL;
 #undef HTKEYTYPE
 #undef HTDATATYPE
 
-#define HASHTYPE removedHash
+#define HASHTYPE packageHash
 #define HTKEYTYPE unsigned int
 #define HTDATATYPE struct rpmte_s *
 #include "rpmhash.C"
@@ -47,6 +50,28 @@ const int rpmFLAGS = RPMSENSE_EQUAL;
 #undef HTKEYTYPE
 #undef HTDATATYPE
 
+#define HASHTYPE filedepHash
+#define HTKEYTYPE const char *
+#define HTDATATYPE const char *
+#include "rpmhash.H"
+#include "rpmhash.C"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+
+#define HASHTYPE depexistsHash
+#define HTKEYTYPE const char *
+#include "lib/rpmhash.H"
+#include "lib/rpmhash.C"
+#undef HASHTYPE
+#undef HTKEYTYPE
+
+enum addOp_e {
+    RPMTE_INSTALL      = 0,
+    RPMTE_UPGRADE      = 1,
+    RPMTE_REINSTALL    = 2,
+};
+
 /**
  * Check for supported payload format in header.
  * @param h            header to check
@@ -88,22 +113,23 @@ static rpmRC headerCheckPayloadFormat(Header h) {
 static int removePackage(rpmts ts, Header h, rpmte depends)
 {
     tsMembers tsmem = rpmtsMembers(ts);
-    rpmte p;
+    rpmte p, *pp;
     unsigned int dboffset = headerGetInstance(h);
 
     /* Can't remove what's not installed */
     if (dboffset == 0) return 1;
 
     /* Filter out duplicate erasures. */
-    if (removedHashHasEntry(tsmem->removedPackages, dboffset)) {
-        return 0;
+    if (packageHashGetEntry(tsmem->removedPackages, dboffset, &pp, NULL, NULL)) {
+       rpmteSetDependsOn(pp[0], depends);
+       return 0;
     }
 
     p = rpmteNew(ts, h, TR_REMOVED, NULL, NULL);
     if (p == NULL)
        return 1;
 
-    removedHashAddEntry(tsmem->removedPackages, dboffset, p);
+    packageHashAddEntry(tsmem->removedPackages, dboffset, p);
 
     if (tsmem->orderCount >= tsmem->orderAlloced) {
        tsmem->orderAlloced += (tsmem->orderCount - tsmem->orderAlloced) + tsmem->delta;
@@ -119,7 +145,7 @@ static int removePackage(rpmts ts, Header h, rpmte depends)
 }
 
 /* Return rpmdb iterator with removals optionally pruned out */
-static rpmdbMatchIterator rpmtsPrunedIterator(rpmts ts, rpmDbiTagVal tag,
+rpmdbMatchIterator rpmtsPrunedIterator(rpmts ts, rpmDbiTagVal tag,
                                              const char * key, int prune)
 {
     rpmdbMatchIterator mi = rpmtsInitIterator(ts, tag, key, 0);
@@ -163,22 +189,29 @@ static int rpmNameVersionCompare(Header first, Header second)
 }
 
 /* Add erase elements for older packages of same color (if any). */
-static int addUpgradeErasures(rpmts ts, rpm_color_t tscolor,
+static int addSelfErasures(rpmts ts, rpm_color_t tscolor, int op,
                                rpmte p, rpm_color_t hcolor, Header h)
 {
     Header oh;
     rpmdbMatchIterator mi = rpmtsInitIterator(ts, RPMDBI_NAME, rpmteN(p), 0);
     int rc = 0;
+    int cmp;
 
-    while((oh = rpmdbNextIterator(mi)) != NULL) {
+    while ((oh = rpmdbNextIterator(mi)) != NULL) {
        /* Ignore colored packages not in our rainbow. */
        if (skipColor(tscolor, hcolor, headerGetNumber(oh, RPMTAG_HEADERCOLOR)))
            continue;
 
-       /* Skip packages that contain identical NEVRA. */
-       if (rpmNameVersionCompare(h, oh) == 0)
+       cmp = rpmNameVersionCompare(h, oh);
+
+       /* On upgrade, skip packages that contain identical NEVR. */
+       if ((op == RPMTE_UPGRADE) && (cmp == 0))
            continue;
 
+       /* On reinstall, skip packages with differing NEVR. */
+       if ((op == RPMTE_REINSTALL) && (cmp != 0))
+           continue;
+       
        if (removePackage(ts, oh, p)) {
            rc = 1;
            break;
@@ -205,7 +238,7 @@ static int addObsoleteErasures(rpmts ts, rpm_color_t tscolor, rpmte p)
 
        mi = rpmtsPrunedIterator(ts, RPMDBI_NAME, Name, 1);
 
-       while((oh = rpmdbNextIterator(mi)) != NULL) {
+       while ((oh = rpmdbNextIterator(mi)) != NULL) {
            const char *oarch = headerGetString(oh, RPMTAG_ARCH);
            int match;
 
@@ -396,8 +429,8 @@ rpmal rpmtsCreateAl(rpmts ts, rpmElementTypes types)
     return al;
 }
 
-int rpmtsAddInstallElement(rpmts ts, Header h,
-                       fnpyKey key, int upgrade, rpmRelocation * relocs)
+static int addPackage(rpmts ts, Header h,
+                   fnpyKey key, int op, rpmRelocation * relocs)
 {
     tsMembers tsmem = rpmtsMembers(ts);
     rpm_color_t tscolor = rpmtsColor(ts);
@@ -414,10 +447,10 @@ int rpmtsAddInstallElement(rpmts ts, Header h,
 
     /* Source packages are never "upgraded" */
     if (isSource)
-       upgrade = 0;
+       op = RPMTE_INSTALL;
 
     /* Do lazy (readonly?) open of rpm database for upgrades. */
-    if (upgrade && rpmtsGetRdb(ts) == NULL && rpmtsGetDBMode(ts) != -1) {
+    if (op != RPMTE_INSTALL && rpmtsGetRdb(ts) == NULL && rpmtsGetDBMode(ts) != -1) {
        if ((ec = rpmtsOpenDB(ts, rpmtsGetDBMode(ts))) != 0)
            goto exit;
     }
@@ -430,7 +463,7 @@ int rpmtsAddInstallElement(rpmts ts, Header h,
 
     /* Check binary packages for redundancies in the set */
     if (!isSource) {
-       oc = findPos(ts, tscolor, p, upgrade);
+       oc = findPos(ts, tscolor, p, (op == RPMTE_UPGRADE));
        /* If we're replacing a previously added element, free the old one */
        if (oc >= 0 && oc < tsmem->orderCount) {
            rpmalDel(tsmem->addedPackages, tsmem->order[oc]);
@@ -462,22 +495,42 @@ int rpmtsAddInstallElement(rpmts ts, Header h,
 
     /* Add erasure elements for old versions and obsoletions on upgrades */
     /* XXX TODO: If either of these fails, we'd need to undo all additions */
-    if (upgrade) {
-       addUpgradeErasures(ts, tscolor, p, rpmteColor(p), h);
+    if (op != RPMTE_INSTALL)
+       addSelfErasures(ts, tscolor, op, p, rpmteColor(p), h);
+    if (op == RPMTE_UPGRADE)
        addObsoleteErasures(ts, tscolor, p);
-    }
 
 exit:
     return ec;
 }
 
+int rpmtsAddInstallElement(rpmts ts, Header h,
+                       fnpyKey key, int upgrade, rpmRelocation * relocs)
+{
+    int op = (upgrade == 0) ? RPMTE_INSTALL : RPMTE_UPGRADE;
+    if (rpmtsSetupTransactionPlugins(ts) == RPMRC_FAIL)
+       return 1;
+    return addPackage(ts, h, key, op, relocs);
+}
+
+int rpmtsAddReinstallElement(rpmts ts, Header h, fnpyKey key)
+{
+    if (rpmtsSetupTransactionPlugins(ts) == RPMRC_FAIL)
+       return 1;
+    /* TODO: pull relocations from installed package */
+    /* TODO: should reinstall of non-installed package fail? */
+    return addPackage(ts, h, key, RPMTE_REINSTALL, NULL);
+}
+
 int rpmtsAddEraseElement(rpmts ts, Header h, int dboffset)
 {
+    if (rpmtsSetupTransactionPlugins(ts) == RPMRC_FAIL)
+       return 1;
     return removePackage(ts, h, NULL);
 }
 
 /* Cached rpmdb provide lookup, returns 0 if satisfied, 1 otherwise */
-static int rpmdbProvides(rpmts ts, depCache dcache, rpmds dep)
+static int rpmdbProvides(rpmts ts, depCache dcache, rpmds dep, dbiIndexSet *matches)
 {
     const char * Name = rpmdsN(dep);
     const char * DNEVR = rpmdsDNEVR(dep);
@@ -491,7 +544,7 @@ static int rpmdbProvides(rpmts ts, depCache dcache, rpmds dep)
     unsigned int keyhash = 0;
 
     /* See if we already looked this up */
-    if (prune) {
+    if (prune && !matches) {
        keyhash = depCacheKeyHash(dcache, DNEVR);
        if (depCacheGetHEntry(dcache, DNEVR, keyhash, &cachedrc, NULL, NULL)) {
            rc = *cachedrc;
@@ -500,6 +553,8 @@ static int rpmdbProvides(rpmts ts, depCache dcache, rpmds dep)
        }
     }
 
+    if (matches)
+       *matches = dbiIndexSetNew(0);
     /*
      * See if a filename dependency is a real file in some package,
      * taking file state into account: replaced, wrong colored and
@@ -508,6 +563,16 @@ static int rpmdbProvides(rpmts ts, depCache dcache, rpmds dep)
     if (deptag != RPMTAG_OBSOLETENAME && Name[0] == '/') {
        mi = rpmtsPrunedIterator(ts, RPMDBI_INSTFILENAMES, Name, prune);
        while ((h = rpmdbNextIterator(mi)) != NULL) {
+           /* Ignore self-conflicts */
+           if (deptag == RPMTAG_CONFLICTNAME) {
+               unsigned int instance = headerGetInstance(h);
+               if (instance && instance == rpmdsInstance(dep))
+                   continue;
+           }
+           if (matches) {
+               dbiIndexSetAppendOne(*matches, headerGetInstance(h), 0, 0);
+               continue;
+           }
            rpmdsNotify(dep, "(db files)", rc);
            break;
        }
@@ -531,7 +596,17 @@ static int rpmdbProvides(rpmts ts, depCache dcache, rpmds dep)
            int prix = (selfevr) ? -1 : rpmdbGetIteratorFileNum(mi);
            int match = rpmdsMatches(tspool, h, prix, dep, selfevr,
                                        _rpmds_nopromote);
+           /* Ignore self-obsoletes and self-conflicts */
+           if (match && (deptag == RPMTAG_OBSOLETENAME || deptag == RPMTAG_CONFLICTNAME)) {
+               unsigned int instance = headerGetInstance(h);
+               if (instance && instance == rpmdsInstance(dep))
+                   match = 0;
+           }
            if (match) {
+               if (matches) {
+                   dbiIndexSetAppendOne(*matches, headerGetInstance(h), 0, 0);
+                   continue;
+               }
                rpmdsNotify(dep, "(db provides)", rc);
                break;
            }
@@ -540,16 +615,85 @@ static int rpmdbProvides(rpmts ts, depCache dcache, rpmds dep)
     }
     rc = (h != NULL) ? 0 : 1;
 
+    if (matches) {
+       dbiIndexSetUniq(*matches, 0);
+       rc = dbiIndexSetCount(*matches) ? 0 : 1;
+    }
+
     /* Cache the relatively expensive rpmdb lookup results */
     /* Caching the oddball non-pruned case would mess up other results */
-    if (prune)
+    if (prune && !matches)
        depCacheAddHEntry(dcache, xstrdup(DNEVR), keyhash, rc);
     return rc;
 }
 
+static dbiIndexSet unsatisfiedDependSet(rpmts ts, rpmds dep)
+{
+    dbiIndexSet set1 = NULL, set2 = NULL;
+    tsMembers tsmem = rpmtsMembers(ts);
+    rpmsenseFlags dsflags = rpmdsFlags(dep);
+
+    if (dsflags & RPMSENSE_RPMLIB)
+       goto exit;
+
+    if (rpmdsIsRich(dep)) {
+       rpmds ds1, ds2; 
+       rpmrichOp op;
+       char *emsg = 0; 
+
+       if (rpmdsParseRichDep(dep, &ds1, &ds2, &op, &emsg) != RPMRC_OK) {
+           rpmdsNotify(dep, emsg ? emsg : "(parse error)", 1);  
+           _free(emsg);
+           goto exit;
+       }
+       /* only a subset of ops is supported in set mode */
+       if (op != RPMRICHOP_WITH && op != RPMRICHOP_WITHOUT
+            && op != RPMRICHOP_OR && op != RPMRICHOP_SINGLE) {
+           rpmdsNotify(dep, "(unsupported op in set mode)", 1);  
+           goto exit_rich;
+       }
+
+       set1 = unsatisfiedDependSet(ts, ds1);
+       if (op == RPMRICHOP_SINGLE)
+           goto exit_rich;
+       if (op != RPMRICHOP_OR && dbiIndexSetCount(set1) == 0)
+           goto exit_rich;
+       set2 = unsatisfiedDependSet(ts, ds2);
+       if (op == RPMRICHOP_WITH) {
+           dbiIndexSetFilterSet(set1, set2, 0);
+       } else if (op == RPMRICHOP_WITHOUT) {
+           dbiIndexSetPruneSet(set1, set2, 0);
+       } else if (op == RPMRICHOP_OR) {
+           dbiIndexSetAppendSet(set1, set2, 0);
+       }
+exit_rich:
+       ds1 = rpmdsFree(ds1);
+       ds2 = rpmdsFree(ds2);
+       goto exit;
+    }
+
+    /* match database entries */
+    rpmdbProvides(ts, NULL, dep, &set1);
+
+    /* Pretrans dependencies can't be satisfied by added packages. */
+    if (!(dsflags & RPMSENSE_PRETRANS)) {
+       rpmte *matches = rpmalAllSatisfiesDepend(tsmem->addedPackages, dep);
+       if (matches) {
+           for (rpmte *p = matches; *p; p++)
+               dbiIndexSetAppendOne(set1, rpmalLookupTE(tsmem->addedPackages, *p), 1, 0);
+       }
+       _free(matches);
+    }
+
+exit:
+    set2 = dbiIndexSetFree(set2);
+    return set1 ? set1 : dbiIndexSetNew(0);
+}
+
 /**
  * Check dep for an unsatisfied dependency.
  * @param ts           transaction set
+ * @param dcache       dependency cache
  * @param dep          dependency
  * @return             0 if satisfied, 1 if not satisfied
  */
@@ -584,29 +728,78 @@ retry:
     if (!adding && isInstallPreReq(dsflags) && !isErasePreReq(dsflags))
        goto exit;
 
+    /* Handle rich dependencies */
+    if (rpmdsIsRich(dep)) {
+       rpmds ds1, ds2; 
+       rpmrichOp op;
+       char *emsg = 0; 
+       if (rpmdsParseRichDep(dep, &ds1, &ds2, &op, &emsg) != RPMRC_OK) {
+           rc = rpmdsTagN(dep) == RPMTAG_CONFLICTNAME ? 0 : 1;
+           if (rpmdsInstance(dep) != 0)
+               rc = !rc;       /* ignore errors for installed packages */
+           rpmdsNotify(dep, emsg ? emsg : "(parse error)", rc);  
+           _free(emsg);
+           goto exit;
+       }
+       if (op == RPMRICHOP_WITH || op == RPMRICHOP_WITHOUT) {
+           /* switch to set mode processing */
+           dbiIndexSet set = unsatisfiedDependSet(ts, dep);
+           rc = dbiIndexSetCount(set) ? 0 : 1;
+           dbiIndexSetFree(set);
+           ds1 = rpmdsFree(ds1);
+           ds2 = rpmdsFree(ds2);
+           rpmdsNotify(dep, "(rich)", rc);
+           goto exit;
+       }
+       if (op == RPMRICHOP_IF || op == RPMRICHOP_UNLESS) {
+           /* A IF B -> A OR NOT(B) */
+           /* A UNLESS B -> A AND NOT(B) */
+           if (rpmdsIsRich(ds2)) {
+               /* check if this has an ELSE clause */
+               rpmds ds21 = NULL, ds22 = NULL;
+               rpmrichOp op2;
+               if (rpmdsParseRichDep(ds2, &ds21, &ds22, &op2, NULL) == RPMRC_OK && op2 == RPMRICHOP_ELSE) {
+                   /* A IF B ELSE C -> (A OR NOT(B)) AND (C OR B) */
+                   /* A UNLESS B ELSE C -> (A AND NOT(B)) OR (C AND B) */
+                   rc = !unsatisfiedDepend(ts, dcache, ds21);  /* NOT(B) */
+                   if ((rc && op == RPMRICHOP_IF) || (!rc && op == RPMRICHOP_UNLESS)) {
+                       rc = unsatisfiedDepend(ts, dcache, ds1);        /* A */
+                   } else {
+                       rc = unsatisfiedDepend(ts, dcache, ds22);       /* C */
+                   }
+                   rpmdsFree(ds21);
+                   rpmdsFree(ds22);
+                   goto exitrich;
+               }
+               rpmdsFree(ds21);
+               rpmdsFree(ds22);
+           }
+           rc = !unsatisfiedDepend(ts, dcache, ds2);   /* NOT(B) */
+           if ((rc && op == RPMRICHOP_IF) || (!rc && op == RPMRICHOP_UNLESS))
+               rc = unsatisfiedDepend(ts, dcache, ds1);
+       } else {
+           rc = unsatisfiedDepend(ts, dcache, ds1);
+           if ((rc && op == RPMRICHOP_OR) || (!rc && op == RPMRICHOP_AND))
+               rc = unsatisfiedDepend(ts, dcache, ds2);
+       }
+exitrich:
+       ds1 = rpmdsFree(ds1);
+       ds2 = rpmdsFree(ds2);
+       rpmdsNotify(dep, "(rich)", rc);
+       goto exit;
+    }
+
     /* Pretrans dependencies can't be satisfied by added packages. */
     if (!(dsflags & RPMSENSE_PRETRANS)) {
-       rpmte match = rpmalSatisfiesDepend(tsmem->addedPackages, dep);
-
-       /*
-        * Handle definitive matches within the added package set.
-        * Self-obsoletes and -conflicts fall through here as we need to 
-        * check for possible other matches in the rpmdb.
-        */
-       if (match) {
-           rpmTagVal dtag = rpmdsTagN(dep);
-           /* Requires match, look no further */
-           if (dtag == RPMTAG_REQUIRENAME)
-               goto exit;
-
-           /* Conflicts/obsoletes match on another package, look no further */
-           if (rpmteDS(match, dtag) != dep)
-               goto exit;
-       }
+       rpmte *matches = rpmalAllSatisfiesDepend(tsmem->addedPackages, dep);
+       int match = matches && *matches;
+       _free(matches);
+       if (match)
+           goto exit;
     }
 
     /* See if the rpmdb provides it */
-    if (rpmdbProvides(ts, dcache, dep) == 0)
+    if (rpmdbProvides(ts, dcache, dep, NULL) == 0)
        goto exit;
 
     /* Search for an unsatisfied dependency. */
@@ -637,7 +830,7 @@ exit:
 /* Check a dependency set for problems */
 static void checkDS(rpmts ts, depCache dcache, rpmte te,
                const char * pkgNEVRA, rpmds ds,
-               const char * depName, rpm_color_t tscolor)
+               rpm_color_t tscolor)
 {
     rpm_color_t dscolor;
     /* require-problems are unsatisfied, others appear "satisfied" */
@@ -645,10 +838,6 @@ static void checkDS(rpmts ts, depCache dcache, rpmte te,
 
     ds = rpmdsInit(ds);
     while (rpmdsNext(ds) >= 0) {
-       /* Filter out dependencies that came along for the ride. */
-       if (depName != NULL && !rstreq(depName, rpmdsN(ds)))
-           continue;
-
        /* Ignore colored dependencies not in our rainbow. */
        dscolor = rpmdsColor(ds);
        if (tscolor && dscolor && !(tscolor & dscolor))
@@ -659,19 +848,33 @@ static void checkDS(rpmts ts, depCache dcache, rpmte te,
     }
 }
 
-/* Check a given dependency type against installed packages */
+/* Check a given dependency against installed packages */
 static void checkInstDeps(rpmts ts, depCache dcache, rpmte te,
                          rpmTag depTag, const char *dep)
 {
     Header h;
     rpmdbMatchIterator mi = rpmtsPrunedIterator(ts, depTag, dep, 1);
     rpmstrPool pool = rpmtsPool(ts);
+    /* require-problems are unsatisfied, others appear "satisfied" */
+    int is_problem = (depTag == RPMTAG_REQUIRENAME);
 
     while ((h = rpmdbNextIterator(mi)) != NULL) {
-       char * pkgNEVRA = headerGetAsString(h, RPMTAG_NEVRA);
-       rpmds ds = rpmdsNewPool(pool, h, depTag, 0);
+       char * pkgNEVRA;
+       rpmds ds;
 
-       checkDS(ts, dcache, te, pkgNEVRA, ds, dep, 0);
+       /* Ignore self-obsoletes and self-conflicts */
+       if (depTag == RPMTAG_OBSOLETENAME || depTag == RPMTAG_CONFLICTNAME) {
+           unsigned int instance = headerGetInstance(h);
+           if (instance && instance == rpmteDBInstance(te))
+               continue;
+       }
+
+       pkgNEVRA = headerGetAsString(h, RPMTAG_NEVRA);
+       ds = rpmdsNewPool(pool, h, depTag, 0);
+       rpmdsSetIx(ds, rpmdbGetIteratorFileNum(mi));
+
+       if (unsatisfiedDepend(ts, dcache, ds) == is_problem)
+           rpmteAddDepProblem(te, pkgNEVRA, ds, NULL);
 
        rpmdsFree(ds);
        free(pkgNEVRA);
@@ -679,6 +882,116 @@ static void checkInstDeps(rpmts ts, depCache dcache, rpmte te,
     rpmdbFreeIterator(mi);
 }
 
+static void checkNotInstDeps(rpmts ts, depCache dcache, rpmte te,
+                            rpmTag depTag, const char *dep)
+{
+    char *ndep = rmalloc(strlen(dep) + 2);
+    ndep[0] = '!';
+    strcpy(ndep + 1, dep);
+    checkInstDeps(ts, dcache, te, depTag, ndep);
+    free(ndep);
+}
+
+static void checkInstFileDeps(rpmts ts, depCache dcache, rpmte te,
+                             rpmTag depTag, rpmfi fi, int is_not,
+                             filedepHash cache, fingerPrintCache *fpcp)
+{
+    fingerPrintCache fpc = *fpcp;
+    fingerPrint * fp = NULL;
+    const char *basename = rpmfiBN(fi);
+    const char *dirname;
+    const char **dirnames = 0;
+    int ndirnames = 0;
+    int i;
+
+    filedepHashGetEntry(cache, basename, &dirnames, &ndirnames, NULL);
+    if (!ndirnames)
+       return;
+    if (!fpc)
+       *fpcp = fpc = fpCacheCreate(1001, NULL);
+    dirname = rpmfiDN(fi);
+    fpLookup(fpc, dirname, basename, &fp);
+    for (i = 0; i < ndirnames; i++) {
+       char *fpdep = 0;
+       const char *dep;
+       if (!strcmp(dirnames[i], dirname)) {
+           dep = rpmfiFN(fi);
+       } else if (fpLookupEquals(fpc, fp, dirnames[i], basename)) {
+           fpdep = rmalloc(strlen(dirnames[i]) + strlen(basename) + 1);
+           strcpy(fpdep, dirnames[i]);
+           strcat(fpdep, basename);
+           dep = fpdep;
+       } else {
+           continue;
+       }
+       if (!is_not)
+           checkInstDeps(ts, dcache, te, depTag, dep);
+       else
+           checkNotInstDeps(ts, dcache, te, depTag, dep);
+       _free(fpdep);
+    }
+    _free(fp);
+}
+
+static void addFileDepToHash(filedepHash hash, char *key, size_t keylen)
+{
+    int i;
+    char *basename, *dirname;
+    if (!keylen || key[0] != '/')
+       return;
+    for (i = keylen - 1; key[i] != '/'; i--) 
+       ;
+    dirname = rmalloc(i + 2);
+    memcpy(dirname, key, i + 1);
+    dirname[i + 1] = 0; 
+    basename = rmalloc(keylen - i);
+    memcpy(basename, key + i + 1, keylen - i - 1);
+    basename[keylen - i - 1] = 0; 
+    filedepHashAddEntry(hash, basename, dirname);
+}
+
+static void addDepToHash(depexistsHash hash, char *key, size_t keylen)
+{
+    char *keystr;
+    if (!keylen)
+       return;
+    keystr = rmalloc(keylen + 1);
+    strncpy(keystr, key, keylen);
+    keystr[keylen] = 0;
+    depexistsHashAddEntry(hash, keystr);
+}
+
+static void addIndexToDepHashes(rpmts ts, rpmDbiTag tag,
+                               depexistsHash dephash, filedepHash filehash,
+                               depexistsHash depnothash, filedepHash filenothash)
+{
+    char *key;
+    size_t keylen;
+    rpmdbIndexIterator ii = rpmdbIndexIteratorInit(rpmtsGetRdb(ts), tag);
+
+    if (!ii)
+       return;
+    while ((rpmdbIndexIteratorNext(ii, (const void**)&key, &keylen)) == 0) {
+       if (!key || !keylen)
+           continue;
+       if (*key == '!' && keylen > 1) {
+           key++;
+           keylen--;
+           if (*key == '/' && filenothash)
+               addFileDepToHash(filenothash, key, keylen);
+           if (depnothash)
+               addDepToHash(depnothash, key, keylen);
+       } else {
+           if (*key == '/' && filehash)
+               addFileDepToHash(filehash, key, keylen);
+           if (dephash)
+               addDepToHash(dephash, key, keylen);
+       }
+    }
+    rpmdbIndexIteratorFree(ii);
+}
+
+
 int rpmtsCheck(rpmts ts)
 {
     rpm_color_t tscolor = rpmtsColor(ts);
@@ -686,20 +999,67 @@ int rpmtsCheck(rpmts ts)
     int closeatexit = 0;
     int rc = 0;
     depCache dcache = NULL;
+    filedepHash confilehash = NULL;    /* file conflicts of installed packages */
+    filedepHash connotfilehash = NULL; /* file conflicts of installed packages */
+    depexistsHash connothash = NULL;
+    filedepHash reqfilehash = NULL;    /* file requires of installed packages */
+    filedepHash reqnotfilehash = NULL; /* file requires of installed packages */
+    depexistsHash reqnothash = NULL;
+    fingerPrintCache fpc = NULL;
+    rpmdb rdb = NULL;
     
     (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_CHECK), 0);
 
     /* Do lazy, readonly, open of rpm database. */
-    if (rpmtsGetRdb(ts) == NULL && rpmtsGetDBMode(ts) != -1) {
+    rdb = rpmtsGetRdb(ts);
+    if (rdb == NULL && rpmtsGetDBMode(ts) != -1) {
        if ((rc = rpmtsOpenDB(ts, rpmtsGetDBMode(ts))) != 0)
            goto exit;
+       rdb = rpmtsGetRdb(ts);
        closeatexit = 1;
     }
 
+    if (rdb)
+       rpmdbCtrl(rdb, RPMDB_CTRL_LOCK_RO);
+
     /* XXX FIXME: figure some kind of heuristic for the cache size */
     dcache = depCacheCreate(5001, rstrhash, strcmp,
                                     (depCacheFreeKey)rfree, NULL);
 
+    /* build hashes of all confilict sdependencies */
+    confilehash = filedepHashCreate(257, rstrhash, strcmp,
+                                   (filedepHashFreeKey)rfree,
+                                   (filedepHashFreeData)rfree);
+    connothash = depexistsHashCreate(257, rstrhash, strcmp,
+                                   (filedepHashFreeKey)rfree);
+    connotfilehash = filedepHashCreate(257, rstrhash, strcmp,
+                                   (filedepHashFreeKey)rfree,
+                                   (filedepHashFreeData)rfree);
+    addIndexToDepHashes(ts, RPMTAG_CONFLICTNAME, NULL, confilehash, connothash, connotfilehash);
+    if (!filedepHashNumKeys(confilehash))
+       confilehash = filedepHashFree(confilehash);
+    if (!depexistsHashNumKeys(connothash))
+       connothash= depexistsHashFree(connothash);
+    if (!filedepHashNumKeys(connotfilehash))
+       connotfilehash = filedepHashFree(connotfilehash);
+
+    /* build hashes of all requires dependencies */
+    reqfilehash = filedepHashCreate(8191, rstrhash, strcmp,
+                                   (filedepHashFreeKey)rfree,
+                                   (filedepHashFreeData)rfree);
+    reqnothash = depexistsHashCreate(257, rstrhash, strcmp,
+                                   (filedepHashFreeKey)rfree);
+    reqnotfilehash = filedepHashCreate(257, rstrhash, strcmp,
+                                   (filedepHashFreeKey)rfree,
+                                   (filedepHashFreeData)rfree);
+    addIndexToDepHashes(ts, RPMTAG_REQUIRENAME, NULL, reqfilehash, reqnothash, reqnotfilehash);
+    if (!filedepHashNumKeys(reqfilehash))
+       reqfilehash = filedepHashFree(reqfilehash);
+    if (!depexistsHashNumKeys(reqnothash))
+       reqnothash= depexistsHashFree(reqnothash);
+    if (!filedepHashNumKeys(reqnotfilehash))
+       reqnotfilehash = filedepHashFree(reqnotfilehash);
+
     /*
      * Look at all of the added packages and make sure their dependencies
      * are satisfied.
@@ -712,15 +1072,18 @@ int rpmtsCheck(rpmts ts)
                rpmteNEVR(p), rpmteA(p), rpmteO(p), rpmteColor(p));
 
        checkDS(ts, dcache, p, rpmteNEVRA(p), rpmteDS(p, RPMTAG_REQUIRENAME),
-               NULL, tscolor);
+               tscolor);
        checkDS(ts, dcache, p, rpmteNEVRA(p), rpmteDS(p, RPMTAG_CONFLICTNAME),
-               NULL, tscolor);
+               tscolor);
        checkDS(ts, dcache, p, rpmteNEVRA(p), rpmteDS(p, RPMTAG_OBSOLETENAME),
-               NULL, tscolor);
+               tscolor);
 
        /* Check provides against conflicts in installed packages. */
        while (rpmdsNext(provides) >= 0) {
-           checkInstDeps(ts, dcache, p, RPMTAG_CONFLICTNAME, rpmdsN(provides));
+           const char *dep = rpmdsN(provides);
+           checkInstDeps(ts, dcache, p, RPMTAG_CONFLICTNAME, dep);
+           if (reqnothash && depexistsHashHasEntry(reqnothash, dep))
+               checkNotInstDeps(ts, dcache, p, RPMTAG_REQUIRENAME, dep);
        }
 
        /* Skip obsoletion checks for source packages (ie build) */
@@ -729,6 +1092,20 @@ int rpmtsCheck(rpmts ts)
 
        /* Check package name (not provides!) against installed obsoletes */
        checkInstDeps(ts, dcache, p, RPMTAG_OBSOLETENAME, rpmteN(p));
+
+       /* Check filenames against installed conflicts */
+        if (confilehash || reqnotfilehash) {
+           rpmfiles files = rpmteFiles(p);
+           rpmfi fi = rpmfilesIter(files, RPMFI_ITER_FWD);
+           while (rpmfiNext(fi) >= 0) {
+               if (confilehash)
+                   checkInstFileDeps(ts, dcache, p, RPMTAG_CONFLICTNAME, fi, 0, confilehash, &fpc);
+               if (reqnotfilehash)
+                   checkInstFileDeps(ts, dcache, p, RPMTAG_REQUIRENAME, fi, 1, reqnotfilehash, &fpc);
+           }
+           rpmfiFree(fi);
+           rpmfilesFree(files);
+       }
     }
     rpmtsiFree(pi);
 
@@ -738,25 +1115,47 @@ int rpmtsCheck(rpmts ts)
     pi = rpmtsiInit(ts);
     while ((p = rpmtsiNext(pi, TR_REMOVED)) != NULL) {
        rpmds provides = rpmdsInit(rpmteDS(p, RPMTAG_PROVIDENAME));
-       rpmfi fi = rpmfiInit(rpmteFI(p), 0);
 
        rpmlog(RPMLOG_DEBUG, "========== --- %s %s/%s 0x%x\n",
                rpmteNEVR(p), rpmteA(p), rpmteO(p), rpmteColor(p));
 
        /* Check provides and filenames against installed dependencies. */
        while (rpmdsNext(provides) >= 0) {
-           checkInstDeps(ts, dcache, p, RPMTAG_REQUIRENAME, rpmdsN(provides));
+           const char *dep = rpmdsN(provides);
+           checkInstDeps(ts, dcache, p, RPMTAG_REQUIRENAME, dep);
+           if (connothash && depexistsHashHasEntry(connothash, dep))
+               checkNotInstDeps(ts, dcache, p, RPMTAG_CONFLICTNAME, dep);
        }
 
-       while (rpmfiNext(fi) >= 0) {
-           if (RPMFILE_IS_INSTALLED(rpmfiFState(fi)))
-               checkInstDeps(ts, dcache, p, RPMTAG_REQUIRENAME, rpmfiFN(fi));
+       if (reqfilehash || connotfilehash) {
+           rpmfiles files = rpmteFiles(p);
+           rpmfi fi = rpmfilesIter(files, RPMFI_ITER_FWD);;
+           while (rpmfiNext(fi) >= 0) {
+               if (RPMFILE_IS_INSTALLED(rpmfiFState(fi))) {
+                   if (reqfilehash)
+                       checkInstFileDeps(ts, dcache, p, RPMTAG_REQUIRENAME, fi, 0, reqfilehash, &fpc);
+                   if (connotfilehash)
+                       checkInstFileDeps(ts, dcache, p, RPMTAG_CONFLICTNAME, fi, 1, connotfilehash, &fpc);
+               }
+           }
+           rpmfiFree(fi);
+           rpmfilesFree(files);
        }
     }
     rpmtsiFree(pi);
 
+    if (rdb)
+       rpmdbCtrl(rdb, RPMDB_CTRL_UNLOCK_RO);
+
 exit:
     depCacheFree(dcache);
+    filedepHashFree(confilehash);
+    filedepHashFree(connotfilehash);
+    depexistsHashFree(connothash);
+    filedepHashFree(reqfilehash);
+    filedepHashFree(reqnotfilehash);
+    depexistsHashFree(reqnothash);
+    fpCacheFree(fpc);
 
     (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_CHECK), 0);
 
index 23f40277f26cfc5fc89667e04cbcdd8ce71ee590..cd69073ea911b81050d0b419e9aea369c68e72aa 100644 (file)
 
 #include "debug.h"
 
+#define RPM_ANY_CLASS 255
+
+typedef char * (*headerTagFormatFunction) (rpmtd td, char **emsg);
+
 /** \ingroup header
  * Define header tag output formats.
  */
 
-struct headerFormatFunc_s {
+struct headerFmt_s {
     rpmtdFormats fmt;  /*!< Value of extension */
     const char *name;  /*!< Name of extension. */
+    rpmTagClass class; /*!< Class of source data (RPM_ANY_CLASS for any) */
     headerTagFormatFunction func;      /*!< Pointer to formatter function. */  
 };
 
-/**
- * barebones string representation with no extra formatting
- * @param td           tag data container
- * @return             formatted string
- */
-static char * stringFormat(rpmtd td)
+static const char *classEr(rpmTagClass class)
+{
+    switch (class) {
+    case RPM_BINARY_CLASS:      return _("(not a blob)");
+    case RPM_NUMERIC_CLASS:     return _("(not a number)");
+    case RPM_STRING_CLASS:      return _("(not a string)");
+    default:                    break;
+    }
+    return _("(invalid type)");
+}
+
+/* barebones string representation with no extra formatting */
+static char * stringFormat(rpmtd td, char **emsg)
 {
     char *val = NULL;
 
@@ -44,109 +56,80 @@ static char * stringFormat(rpmtd td)
        case RPM_NUMERIC_CLASS:
            rasprintf(&val, "%" PRIu64, rpmtdGetNumber(td));
            break;
-       case RPM_STRING_CLASS:
-           val = xstrdup(rpmtdGetString(td));
+       case RPM_STRING_CLASS: {
+           const char *str = rpmtdGetString(td);
+           if (str)
+               val = xstrdup(str);
            break;
+       }
        case RPM_BINARY_CLASS:
            val = pgpHexStr(td->data, td->count);
            break;
        default:
-           val = xstrdup("(unknown type)");
+           *emsg = xstrdup("(unknown type)");
            break;
     }
     return val;
 }
 
+/* arbitrary number format as per format arg */
 static char * numFormat(rpmtd td, const char *format)
 {
     char * val = NULL;
-
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
-    } else {
-       rasprintf(&val, format, rpmtdGetNumber(td));
-    }
-
+    rasprintf(&val, format, rpmtdGetNumber(td));
     return val;
 }
-/**
- * octalFormat.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * octalFormat(rpmtd td)
+
+/* octal number formatting */
+static char * octalFormat(rpmtd td, char **emsg)
 {
     return numFormat(td, "%o");
 }
 
-/**
- * hexFormat.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * hexFormat(rpmtd td)
+/* hexadecimal format */
+static char * hexFormat(rpmtd td, char **emsg)
 {
     return numFormat(td, "%x");
 }
 
-/**
- * @param td           tag data container
- * @return             formatted string
- */
-static char * realDateFormat(rpmtd td, const char * strftimeFormat)
+/* arbitrary date formatting as per strftimeFormat arg */
+static char * realDateFormat(rpmtd td, const char * strftimeFormat, char **emsg)
 {
     char * val = NULL;
+    struct tm * tstruct;
+    char buf[1024];
+    time_t dateint = rpmtdGetNumber(td);
+    tstruct = localtime(&dateint);
 
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
-    } else {
-       struct tm * tstruct;
-       char buf[50];
-       time_t dateint = rpmtdGetNumber(td);
-       tstruct = localtime(&dateint);
-
-       /* XXX TODO: deal with non-fitting date string correctly */
-       buf[0] = '\0';
-       if (tstruct)
-           (void) strftime(buf, sizeof(buf) - 1, strftimeFormat, tstruct);
-       val = xstrdup(buf);
-    }
+    buf[0] = '\0';
+    if (tstruct)
+       if (strftime(buf, sizeof(buf) - 1, strftimeFormat, tstruct) == 0)
+           *emsg = xstrdup("date output too long");
+    val = xstrdup(buf);
 
     return val;
 }
 
-/**
- * Format a date.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * dateFormat(rpmtd td)
+/* date formatting */
+static char * dateFormat(rpmtd td, char **emsg)
 {
-    return realDateFormat(td, _("%c"));
+    return realDateFormat(td, _("%c"), emsg);
 }
 
-/**
- * Format a day.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * dayFormat(rpmtd td)
+/* day formatting */
+static char * dayFormat(rpmtd td, char **emsg)
 {
-    return realDateFormat(td, _("%a %b %d %Y"));
+    return realDateFormat(td, _("%a %b %d %Y"), emsg);
 }
 
-/**
- * Return shell escape formatted data.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * shescapeFormat(rpmtd td)
+/* shell escape formatting */
+static char * shescapeFormat(rpmtd td, char **emsg)
 {
     char * result = NULL, * dst, * src;
 
     if (rpmtdClass(td) == RPM_NUMERIC_CLASS) {
        rasprintf(&result, "%" PRIu64, rpmtdGetNumber(td));
-    } else {
+    } else if (rpmtdClass(td) == RPM_STRING_CLASS) {
        char *buf = xstrdup(rpmtdGetString(td));;
 
        result = dst = xmalloc(strlen(buf) * 4 + 3);
@@ -164,139 +147,95 @@ static char * shescapeFormat(rpmtd td)
        *dst++ = '\'';
        *dst = '\0';
        free(buf);
+    } else {
+       *emsg = xstrdup(_("(invalid type)"));
     }
 
     return result;
 }
 
 
-/**
- * Identify type of trigger.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * triggertypeFormat(rpmtd td)
+/* trigger type formatting (from rpmsense flags) */
+static char * triggertypeFormat(rpmtd td, char **emsg)
 {
     char * val;
-
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
-    } else {
-       uint64_t item = rpmtdGetNumber(td);
-       if (item & RPMSENSE_TRIGGERPREIN)
-           val = xstrdup("prein");
-       else if (item & RPMSENSE_TRIGGERIN)
-           val = xstrdup("in");
-       else if (item & RPMSENSE_TRIGGERUN)
-           val = xstrdup("un");
-       else if (item & RPMSENSE_TRIGGERPOSTUN)
-           val = xstrdup("postun");
-       else
-           val = xstrdup("");
-    }
+    uint64_t item = rpmtdGetNumber(td);
+    if (item & RPMSENSE_TRIGGERPREIN)
+       val = xstrdup("prein");
+    else if (item & RPMSENSE_TRIGGERIN)
+       val = xstrdup("in");
+    else if (item & RPMSENSE_TRIGGERUN)
+       val = xstrdup("un");
+    else if (item & RPMSENSE_TRIGGERPOSTUN)
+       val = xstrdup("postun");
+    else
+       val = xstrdup("");
     return val;
 }
 
-/**
- * Identify type of dependency.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * deptypeFormat(rpmtd td)
+/* dependency type formatting (from rpmsense flags) */
+static char * deptypeFormat(rpmtd td, char **emsg)
 {
     char *val = NULL;
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
+    ARGV_t sdeps = NULL;
+    uint64_t item = rpmtdGetNumber(td);
+
+    if (item & RPMSENSE_SCRIPT_PRE)
+       argvAdd(&sdeps, "pre");
+    if (item & RPMSENSE_SCRIPT_POST)
+       argvAdd(&sdeps, "post");
+    if (item & RPMSENSE_SCRIPT_PREUN)
+       argvAdd(&sdeps, "preun");
+    if (item & RPMSENSE_SCRIPT_POSTUN)
+       argvAdd(&sdeps, "postun");
+    if (item & RPMSENSE_SCRIPT_VERIFY)
+       argvAdd(&sdeps, "verify");
+    if (item & RPMSENSE_INTERP)
+       argvAdd(&sdeps, "interp");
+    if (item & RPMSENSE_RPMLIB)
+       argvAdd(&sdeps, "rpmlib");
+    if ((item & RPMSENSE_FIND_REQUIRES) || (item & RPMSENSE_FIND_PROVIDES))
+       argvAdd(&sdeps, "auto");
+    if (item & RPMSENSE_PREREQ)
+       argvAdd(&sdeps, "prereq");
+    if (item & RPMSENSE_PRETRANS)
+       argvAdd(&sdeps, "pretrans");
+    if (item & RPMSENSE_POSTTRANS)
+       argvAdd(&sdeps, "posttrans");
+    if (item & RPMSENSE_CONFIG)
+       argvAdd(&sdeps, "config");
+    if (item & RPMSENSE_MISSINGOK)
+       argvAdd(&sdeps, "missingok");
+
+    if (sdeps) {
+       val = argvJoin(sdeps, ",");
     } else {
-       ARGV_t sdeps = NULL;
-       uint64_t item = rpmtdGetNumber(td);
-
-       if (item & RPMSENSE_SCRIPT_PRE)
-           argvAdd(&sdeps, "pre");
-       if (item & RPMSENSE_SCRIPT_POST)
-           argvAdd(&sdeps, "post");
-       if (item & RPMSENSE_SCRIPT_PREUN)
-           argvAdd(&sdeps, "preun");
-       if (item & RPMSENSE_SCRIPT_POSTUN)
-           argvAdd(&sdeps, "postun");
-       if (item & RPMSENSE_SCRIPT_VERIFY)
-           argvAdd(&sdeps, "verify");
-       if (item & RPMSENSE_INTERP)
-           argvAdd(&sdeps, "interp");
-       if (item & RPMSENSE_RPMLIB)
-           argvAdd(&sdeps, "rpmlib");
-       if ((item & RPMSENSE_FIND_REQUIRES) || (item & RPMSENSE_FIND_PROVIDES))
-           argvAdd(&sdeps, "auto");
-       if (item & RPMSENSE_PREREQ)
-           argvAdd(&sdeps, "prereq");
-       if (item & RPMSENSE_PRETRANS)
-           argvAdd(&sdeps, "pretrans");
-       if (item & RPMSENSE_POSTTRANS)
-           argvAdd(&sdeps, "posttrans");
-       if (item & RPMSENSE_CONFIG)
-           argvAdd(&sdeps, "config");
-       if (item & RPMSENSE_MISSINGOK)
-           argvAdd(&sdeps, "missingok");
-
-       if (sdeps) {
-           val = argvJoin(sdeps, ",");
-       } else {
-           val = xstrdup("manual");
-       }
-
-       argvFree(sdeps);
+       val = xstrdup("manual");
     }
+
+    argvFree(sdeps);
     return val;
 }
 
-/**
- * Format file permissions for display.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * permsFormat(rpmtd td)
+/* file permissions formatting */
+static char * permsFormat(rpmtd td, char **emsg)
 {
-    char * val = NULL;
-
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
-    } else {
-       val = rpmPermsString(rpmtdGetNumber(td));
-    }
-
-    return val;
+    return rpmPermsString(rpmtdGetNumber(td));
 }
 
-/**
- * Format file flags for display.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * fflagsFormat(rpmtd td)
+/* file flags formatting */
+static char * fflagsFormat(rpmtd td, char **emsg)
 {
-    char * val = NULL;
-
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
-    } else {
-       val = rpmFFlagsString(rpmtdGetNumber(td), "");
-    }
-
-    return val;
+    return rpmFFlagsString(rpmtdGetNumber(td), "");
 }
 
-/**
- * Wrap a pubkey in ascii armor for display.
- * @todo Permit selectable display formats (i.e. binary).
- * @param td           tag data container
- * @return             formatted string
- */
-static char * armorFormat(rpmtd td)
+/* pubkey ascii armor formatting */
+static char * armorFormat(rpmtd td, char **emsg)
 {
     const char * enc;
     const unsigned char * s;
     unsigned char * bs = NULL;
-    char *val;
+    char *val = NULL;
     size_t ns;
     int atype;
 
@@ -310,8 +249,10 @@ static char * armorFormat(rpmtd td)
     case RPM_STRING_TYPE:
     case RPM_STRING_ARRAY_TYPE:
        enc = rpmtdGetString(td);
-       if (rpmBase64Decode(enc, (void **)&bs, &ns))
-           return xstrdup(_("(not base64)"));
+       if (rpmBase64Decode(enc, (void **)&bs, &ns)) {
+           *emsg = xstrdup(_("(not base64)"));
+           goto exit;
+       }
        s = bs;
        atype = PGPARMOR_PUBKEY;        /* XXX check pkt for pubkey */
        break;
@@ -323,7 +264,8 @@ static char * armorFormat(rpmtd td)
     case RPM_INT64_TYPE:
     case RPM_I18NSTRING_TYPE:
     default:
-       return xstrdup(_("(invalid type)"));
+       *emsg = xstrdup(_("(invalid type)"));
+       goto exit;
        break;
     }
 
@@ -332,48 +274,35 @@ static char * armorFormat(rpmtd td)
     if (atype == PGPARMOR_PUBKEY) {
        free(bs);
     }
+
+exit:
     return val;
 }
 
-/**
- * Encode binary data in base64 for display.
- * @todo Permit selectable display formats (i.e. binary).
- * @param td           tag data container
- * @return             formatted string
- */
-static char * base64Format(rpmtd td)
+/* base64 encoding formatting */
+static char * base64Format(rpmtd td, char **emsg)
 {
-    char * val = NULL;
-
-    if (rpmtdType(td) != RPM_BIN_TYPE) {
-       val = xstrdup(_("(not a blob)"));
-    } else {
-       val = rpmBase64Encode(td->data, td->count, -1);
-       if (val == NULL)
-           val = xstrdup("");
-    }
+    char * val = rpmBase64Encode(td->data, td->count, -1);
+    if (val == NULL)
+       val = xstrdup("");
 
     return val;
 }
 
-/**
- * Wrap tag data in simple header xml markup.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * xmlFormat(rpmtd td)
+/* xml formatting */
+static char * xmlFormat(rpmtd td, char **emsg)
 {
     const char *xtag = NULL;
     char *val = NULL;
     char *s = NULL;
-    rpmtdFormats fmt = RPMTD_FORMAT_STRING;
+    headerTagFormatFunction fmt = stringFormat;
 
     switch (rpmtdClass(td)) {
     case RPM_STRING_CLASS:
        xtag = "string";
        break;
     case RPM_BINARY_CLASS:
-       fmt = RPMTD_FORMAT_BASE64;
+       fmt = base64Format;
        xtag = "base64";
        break;
     case RPM_NUMERIC_CLASS:
@@ -381,12 +310,14 @@ static char * xmlFormat(rpmtd td)
        break;
     case RPM_NULL_TYPE:
     default:
-       return xstrdup(_("(invalid xml type)"));
+       *emsg = xstrdup(_("(invalid xml type)"));
+       goto exit;
        break;
     }
 
-    /* XXX TODO: handle errors */
-    s = rpmtdFormat(td, fmt, NULL);
+    s = fmt(td, emsg);
+    if (s == NULL)
+       goto exit;
 
     if (s[0] == '\0') {
        val = rstrscat(NULL, "\t<", xtag, "/>", NULL);
@@ -413,226 +344,204 @@ static char * xmlFormat(rpmtd td)
     }
     free(s);
 
+exit:
     return val;
 }
 
-/**
- * Display signature fingerprint and time.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * pgpsigFormat(rpmtd td)
+/* signature fingerprint and time formatting */
+static char * pgpsigFormat(rpmtd td, char **emsg)
 {
     char * val = NULL;
+    pgpDigParams sigp = NULL;
 
-    if (rpmtdType(td) != RPM_BIN_TYPE) {
-       val = xstrdup(_("(not a blob)"));
+    if (pgpPrtParams(td->data, td->count, PGPTAG_SIGNATURE, &sigp)) {
+       *emsg = xstrdup(_("(not an OpenPGP signature)"));
     } else {
-       pgpDigParams sigp = NULL;
-
-       if (pgpPrtParams(td->data, td->count, PGPTAG_SIGNATURE, &sigp)) {
-           val = xstrdup(_("(not an OpenPGP signature)"));
+       char dbuf[BUFSIZ];
+       char *keyid = pgpHexStr(sigp->signid, sizeof(sigp->signid));
+       unsigned int dateint = sigp->time;
+       time_t date = dateint;
+       struct tm * tms = localtime(&date);
+       unsigned int key_algo = pgpDigParamsAlgo(sigp, PGPVAL_PUBKEYALGO);
+       unsigned int hash_algo = pgpDigParamsAlgo(sigp, PGPVAL_HASHALGO);
+
+       if (!(tms && strftime(dbuf, sizeof(dbuf), "%c", tms) > 0)) {
+           rasprintf(emsg, _("Invalid date %u"), dateint);
        } else {
-           char dbuf[BUFSIZ];
-           char *keyid = pgpHexStr(sigp->signid, sizeof(sigp->signid));
-           unsigned int dateint = pgpGrab(sigp->time, sizeof(sigp->time));
-           time_t date = dateint;
-           struct tm * tms = localtime(&date);
-           unsigned int key_algo = pgpDigParamsAlgo(sigp, PGPVAL_PUBKEYALGO);
-           unsigned int hash_algo = pgpDigParamsAlgo(sigp, PGPVAL_HASHALGO);
-
-           if (!(tms && strftime(dbuf, sizeof(dbuf), "%c", tms) > 0)) {
-               snprintf(dbuf, sizeof(dbuf),
-                        _("Invalid date %u"), dateint);
-               dbuf[sizeof(dbuf)-1] = '\0';
-           }
-
            rasprintf(&val, "%s/%s, %s, Key ID %s",
-                       pgpValString(PGPVAL_PUBKEYALGO, key_algo),
-                       pgpValString(PGPVAL_HASHALGO, hash_algo),
-                       dbuf, keyid);
-
-           free(keyid);
-           pgpDigParamsFree(sigp);
+                   pgpValString(PGPVAL_PUBKEYALGO, key_algo),
+                   pgpValString(PGPVAL_HASHALGO, hash_algo),
+                   dbuf, keyid);
        }
-    }
-
-    return val;
-}
 
-/**
- * Format dependency flags for display.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * depflagsFormat(rpmtd td)
-{
-    char * val = NULL;
-
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
-    } else {
-       uint64_t anint = rpmtdGetNumber(td);
-       val = xcalloc(4, 1);
-
-       if (anint & RPMSENSE_LESS) 
-           strcat(val, "<");
-       if (anint & RPMSENSE_GREATER)
-           strcat(val, ">");
-       if (anint & RPMSENSE_EQUAL)
-           strcat(val, "=");
+       free(keyid);
+       pgpDigParamsFree(sigp);
     }
 
     return val;
 }
 
-static char * depflag_strongFormat(rpmtd td)
+/* dependency flags formatting */
+static char * depflagsFormat(rpmtd td, char **emsg)
 {
     char * val = NULL;
+    uint64_t anint = rpmtdGetNumber(td);
+    val = xcalloc(4, 1);
+
+    if (anint & RPMSENSE_LESS)
+       strcat(val, "<");
+    if (anint & RPMSENSE_GREATER)
+       strcat(val, ">");
+    if (anint & RPMSENSE_EQUAL)
+       strcat(val, "=");
 
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
-    } else {
-       uint64_t anint = rpmtdGetNumber(td);
-       val = xstrdup(anint & RPMSENSE_STRONG ? "strong" : "");
-    }
     return val;
 }
-
-/**
- * Return tag container array size.
- * @param td           tag data container
- * @return             formatted string
- */
-static char * arraysizeFormat(rpmtd td)
+/* tag container array size */
+static char * arraysizeFormat(rpmtd td, char **emsg)
 {
     char *val = NULL;
     rasprintf(&val, "%u", rpmtdCount(td));
     return val;
 }
 
-static char * fstateFormat(rpmtd td)
+/* file state formatting */
+static char * fstateFormat(rpmtd td, char **emsg)
 {
     char * val = NULL;
-
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
-    } else {
-       const char * str;
-       rpmfileState fstate = rpmtdGetNumber(td);
-       switch (fstate) {
-       case RPMFILE_STATE_NORMAL:
-           str = _("normal");
-           break;
-       case RPMFILE_STATE_REPLACED:
-           str = _("replaced");
-           break;
-       case RPMFILE_STATE_NOTINSTALLED:
-           str = _("not installed");
-           break;
-       case RPMFILE_STATE_NETSHARED:
-           str = _("net shared");
-           break;
-       case RPMFILE_STATE_WRONGCOLOR:
-           str = _("wrong color");
-           break;
-       case RPMFILE_STATE_MISSING:
-           str = _("missing");
-           break;
-       default:
-           str = _("(unknown)");
-           break;
-       }
-       
-       val = xstrdup(str);
+    const char * str;
+    rpmfileState fstate = rpmtdGetNumber(td);
+    switch (fstate) {
+    case RPMFILE_STATE_NORMAL:
+       str = _("normal");
+       break;
+    case RPMFILE_STATE_REPLACED:
+       str = _("replaced");
+       break;
+    case RPMFILE_STATE_NOTINSTALLED:
+       str = _("not installed");
+       break;
+    case RPMFILE_STATE_NETSHARED:
+       str = _("net shared");
+       break;
+    case RPMFILE_STATE_WRONGCOLOR:
+       str = _("wrong color");
+       break;
+    case RPMFILE_STATE_MISSING:
+       str = _("missing");
+       break;
+    default:
+       str = _("(unknown)");
+       break;
     }
+
+    val = xstrdup(str);
     return val;
 }
 
+/* file verification flags formatting with optional padding */
 static char * verifyFlags(rpmtd td, const char *pad)
 {
-    char * val = NULL;
-
-    if (rpmtdClass(td) != RPM_NUMERIC_CLASS) {
-       val = xstrdup(_("(not a number)"));
-    } else {
-       val = rpmVerifyString(rpmtdGetNumber(td), pad);
-    }
-    return val;
+    return rpmVerifyString(rpmtdGetNumber(td), pad);
 }
 
-static char * vflagsFormat(rpmtd td)
+static char * vflagsFormat(rpmtd td, char **emsg)
 {
     return verifyFlags(td, "");
 }
 
-static char * fstatusFormat(rpmtd td)
+static char * fstatusFormat(rpmtd td, char **emsg)
 {
     return verifyFlags(td, ".");
 }
 
-static char * expandFormat(rpmtd td)
+/* macro expansion formatting */
+static char * expandFormat(rpmtd td, char **emsg)
 {
-    char *val = NULL;
-    if (rpmtdClass(td) != RPM_STRING_CLASS) {
-       val = xstrdup(_("(not a string)"));
-    } else {
-       val = rpmExpand(td->data, NULL);
-    }
-    return val;
+    return rpmExpand(rpmtdGetString(td), NULL);
 }
 
-static const struct headerFormatFunc_s rpmHeaderFormats[] = {
-    { RPMTD_FORMAT_STRING,     "string",       stringFormat },
-    { RPMTD_FORMAT_ARMOR,      "armor",        armorFormat },
-    { RPMTD_FORMAT_BASE64,     "base64",       base64Format },
-    { RPMTD_FORMAT_PGPSIG,     "pgpsig",       pgpsigFormat },
-    { RPMTD_FORMAT_DEPFLAGS,   "depflags",     depflagsFormat },
-    { RPMTD_FORMAT_DEPTYPE,    "deptype",      deptypeFormat },
-    { RPMTD_FORMAT_FFLAGS,     "fflags",       fflagsFormat },
-    { RPMTD_FORMAT_PERMS,      "perms",        permsFormat },
-    { RPMTD_FORMAT_PERMS,      "permissions",  permsFormat },
-    { RPMTD_FORMAT_TRIGGERTYPE,        "triggertype",  triggertypeFormat },
-    { RPMTD_FORMAT_XML,                "xml",          xmlFormat },
-    { RPMTD_FORMAT_OCTAL,      "octal",        octalFormat },
-    { RPMTD_FORMAT_HEX,                "hex",          hexFormat },
-    { RPMTD_FORMAT_DATE,       "date",         dateFormat },
-    { RPMTD_FORMAT_DAY,                "day",          dayFormat },
-    { RPMTD_FORMAT_SHESCAPE,   "shescape",     shescapeFormat },
-    { RPMTD_FORMAT_ARRAYSIZE,  "arraysize",    arraysizeFormat },
-    { RPMTD_FORMAT_FSTATE,     "fstate",       fstateFormat },
-    { RPMTD_FORMAT_VFLAGS,     "vflags",       vflagsFormat },
-    { RPMTD_FORMAT_EXPAND,     "expand",       expandFormat },
-    { RPMTD_FORMAT_FSTATUS,    "fstatus",      fstatusFormat },
-    { RPMTD_FORMAT_DEPFLAG_STRONG,     "depflag_strong",       depflag_strongFormat },
-    { -1,                      NULL,           NULL }
+static const struct headerFmt_s rpmHeaderFormats[] = {
+    { RPMTD_FORMAT_STRING,     "string",
+       RPM_ANY_CLASS,          stringFormat },
+    { RPMTD_FORMAT_ARMOR,      "armor",
+       RPM_ANY_CLASS,          armorFormat },
+    { RPMTD_FORMAT_BASE64,     "base64",
+       RPM_BINARY_CLASS,       base64Format },
+    { RPMTD_FORMAT_PGPSIG,     "pgpsig",
+       RPM_BINARY_CLASS,       pgpsigFormat },
+    { RPMTD_FORMAT_DEPFLAGS,   "depflags",
+       RPM_NUMERIC_CLASS, depflagsFormat },
+    { RPMTD_FORMAT_DEPTYPE,    "deptype",
+       RPM_NUMERIC_CLASS,      deptypeFormat },
+    { RPMTD_FORMAT_FFLAGS,     "fflags",
+       RPM_NUMERIC_CLASS,      fflagsFormat },
+    { RPMTD_FORMAT_PERMS,      "perms",
+       RPM_NUMERIC_CLASS,      permsFormat },
+    { RPMTD_FORMAT_PERMS,      "permissions",
+       RPM_NUMERIC_CLASS,      permsFormat },
+    { RPMTD_FORMAT_TRIGGERTYPE,        "triggertype",
+       RPM_NUMERIC_CLASS,      triggertypeFormat },
+    { RPMTD_FORMAT_XML,                "xml",
+       RPM_ANY_CLASS,          xmlFormat },
+    { RPMTD_FORMAT_OCTAL,      "octal",
+       RPM_NUMERIC_CLASS,      octalFormat },
+    { RPMTD_FORMAT_HEX,                "hex",
+       RPM_NUMERIC_CLASS,      hexFormat },
+    { RPMTD_FORMAT_DATE,       "date",
+       RPM_NUMERIC_CLASS,      dateFormat },
+    { RPMTD_FORMAT_DAY,                "day",
+       RPM_NUMERIC_CLASS,      dayFormat },
+    { RPMTD_FORMAT_SHESCAPE,   "shescape",
+       RPM_ANY_CLASS,          shescapeFormat },
+    { RPMTD_FORMAT_ARRAYSIZE,  "arraysize",
+       RPM_ANY_CLASS,          arraysizeFormat },
+    { RPMTD_FORMAT_FSTATE,     "fstate",
+       RPM_NUMERIC_CLASS,      fstateFormat },
+    { RPMTD_FORMAT_VFLAGS,     "vflags",
+       RPM_NUMERIC_CLASS,      vflagsFormat },
+    { RPMTD_FORMAT_EXPAND,     "expand",
+       RPM_STRING_CLASS,       expandFormat },
+    { RPMTD_FORMAT_FSTATUS,    "fstatus",
+       RPM_NUMERIC_CLASS,      fstatusFormat },
+    { -1,                      NULL,           0,      NULL }
 };
 
-headerTagFormatFunction rpmHeaderFormatFuncByName(const char *fmt)
+headerFmt rpmHeaderFormatByName(const char *fmt)
 {
-    const struct headerFormatFunc_s * ext;
-    headerTagFormatFunction func = NULL;
+    const struct headerFmt_s * ext;
 
     for (ext = rpmHeaderFormats; ext->name != NULL; ext++) {
-       if (rstreq(ext->name, fmt)) {
-           func = ext->func;
-           break;
-       }
+       if (rstreq(ext->name, fmt))
+           return ext;
     }
-    return func;
+    return NULL;
 }
 
-headerTagFormatFunction rpmHeaderFormatFuncByValue(rpmtdFormats fmt)
+headerFmt rpmHeaderFormatByValue(rpmtdFormats fmt)
 {
-    const struct headerFormatFunc_s * ext;
-    headerTagFormatFunction func = NULL;
+    const struct headerFmt_s * ext;
 
     for (ext = rpmHeaderFormats; ext->name != NULL; ext++) {
-       if (fmt == ext->fmt) {
-           func = ext->func;
-           break;
-       }
+       if (fmt == ext->fmt)
+           return ext;
     }
-    return func;
+    return NULL;
 }
 
+char *rpmHeaderFormatCall(headerFmt fmt, rpmtd td)
+{
+    char *ret = NULL;
+    char *err = NULL;
+
+    if (fmt->class != RPM_ANY_CLASS && rpmtdClass(td) != fmt->class)
+       err = xstrdup(classEr(fmt->class));
+    else
+       ret = fmt->func(td, &err);
+
+    if (err) {
+       free(ret);
+       ret = err;
+    }
+    return ret;
+}
index 6f6172cf23062b2a45ba5306bf31deae9af5a7df..b810e4d2b678133d99142e573e4b630f842d6322 100644 (file)
@@ -6,7 +6,7 @@
 
 #include <rpm/rpmfileutil.h>   /* for rpmCleanPath */
 #include <rpm/rpmts.h>
-#include <rpm/rpmdb.h>
+#include <rpm/rpmsq.h>
 
 #include "lib/rpmdb_internal.h"
 #include "lib/rpmfi_internal.h"
@@ -251,7 +251,7 @@ int fpLookup(fingerPrintCache cache,
 /**
  * Return hash value for a finger print.
  * Hash based on dev and inode only!
- * @param key          pointer to finger print entry
+ * @param fp           pointer to finger print entry
  * @return hash value
  */
 static unsigned int fpHashFunction(const fingerPrint * fp)
@@ -335,7 +335,7 @@ fingerPrint * fpLookupList(fingerPrintCache cache, rpmstrPool pool,
 /* Check file for to be installed symlinks in their path and correct their fp */
 static void fpLookupSubdir(rpmFpHash symlinks, fingerPrintCache fpc, rpmte p, int filenr)
 {
-    rpmfi fi = rpmteFI(p);
+    rpmfiles fi = rpmteFiles(p);
     struct fingerPrint_s current_fp;
     const char *currentsubdir;
     size_t lensubDir, bnStart, bnEnd;
@@ -343,13 +343,13 @@ static void fpLookupSubdir(rpmFpHash symlinks, fingerPrintCache fpc, rpmte p, in
     struct rpmffi_s * recs;
     int numRecs;
     int i;
-    fingerPrint *fp = rpmfiFps(fi) + filenr;
+    fingerPrint *fp = rpmfilesFps(fi) + filenr;
     int symlinkcount = 0;
     struct rpmffi_s ffi = { p, filenr};
 
     if (fp->subDirId == 0) {
-        rpmFpHashAddEntry(fpc->fp, fp, ffi);
-        return;
+       rpmFpHashAddEntry(fpc->fp, fp, ffi);
+       goto exit;
     }
 
     currentsubdir = rpmstrPoolStr(fpc->pool, fp->subDirId);
@@ -364,88 +364,98 @@ static void fpLookupSubdir(rpmFpHash symlinks, fingerPrintCache fpc, rpmte p, in
     current_fp.subDirId = 0;
 
     while (bnEnd < lensubDir) {
-        char found = 0;
+       char found = 0;
 
-        current_fp.baseNameId = rpmstrPoolIdn(fpc->pool,
+       current_fp.baseNameId = rpmstrPoolIdn(fpc->pool,
                                                currentsubdir + bnStart,
                                                bnEnd - bnStart, 1);
 
-        rpmFpHashGetEntry(symlinks, &current_fp, &recs, &numRecs, NULL);
-
-        for (i=0; i<numRecs; i++) {
-             rpmfi foundfi = rpmteFI(recs[i].p);
-             char const *linktarget = rpmfiFLinkIndex(foundfi, recs[i].fileno);
-             char *link;
-
-             if (linktarget && *linktarget != '\0') {
-                  const char *bn;
-                  /* this "directory" is a symlink */
-                  link = NULL;
-                  if (*linktarget != '/') {
-                       const char *dn, *subDir = NULL;
-                       dn = rpmstrPoolStr(fpc->pool, current_fp.entry->dirId);
-                       if (current_fp.subDirId) {
-                           subDir = rpmstrPoolStr(fpc->pool,
-                                                  current_fp.subDirId);
-                       }
-                       rstrscat(&link, dn,
-                                subDir ? subDir : "",
-                                "/", NULL);
-                  }
-                  rstrscat(&link, linktarget, "/", NULL);
-                  if (strlen(currentsubdir + bnEnd)) {
-                       rstrscat(&link, currentsubdir + bnEnd, NULL);
-                  }
-
-                  bn = rpmstrPoolStr(fpc->pool, fp->baseNameId);
-                  doLookup(fpc, link, bn, fp);
-
-                  free(link);
-                  symlinkcount++;
-
-                  /* setup current_fp for the new path */
-                  found = 1;
-                  current_fp = *fp;
-                  if (fp->subDirId == 0) {
-                    /* directory exists - no need to look for symlinks */
-                    rpmFpHashAddEntry(fpc->fp, fp, ffi);
-                    return;
-                  }
-                  currentsubdir = rpmstrPoolStr(fpc->pool, fp->subDirId);
-                  lensubDir = rpmstrPoolStrlen(fpc->pool, fp->subDirId);
-                  /* no subDir for now */
-                  current_fp.subDirId = 0;
-
-                  /* Set baseName to the upper most dir */
-                  bnStart = bnEnd = 1;
-                  while (bnEnd < lensubDir && currentsubdir[bnEnd] != '/')
-                       bnEnd++;
-                  break;
-
-             }
-        }
-        if (symlinkcount>50) {
-             // found too many symlinks in the path
-             // most likley a symlink cicle
-             // giving up
-             // TODO warning/error
-             break;
-        }
-        if (found) {
-             continue; // restart loop after symlink
-        }
-
-         /* Set former baseName as subDir */
-        bnEnd++;
-        current_fp.subDirId = rpmstrPoolIdn(fpc->pool, currentsubdir, bnEnd, 1);
-
-        /* set baseName to the next lower dir */
-        bnStart = bnEnd;
-        while (bnEnd < lensubDir && currentsubdir[bnEnd] != '/')
+       rpmFpHashGetEntry(symlinks, &current_fp, &recs, &numRecs, NULL);
+
+       for (i = 0; i < numRecs; i++) {
+           rpmfiles foundfi = rpmteFiles(recs[i].p);
+           char const *linktarget = rpmfilesFLink(foundfi, recs[i].fileno);
+           char *link;
+
+           /* Ignore already removed (by eg %pretrans) links */
+           if (linktarget && rpmteType(recs[i].p) == TR_REMOVED) {
+               char *path = rpmfilesFN(foundfi, recs[i].fileno);
+               struct stat sb;
+               if (lstat(path, &sb) == -1)
+                   linktarget = NULL;
+               free(path);
+           }
+
+           foundfi = rpmfilesFree(foundfi);
+
+           if (linktarget && *linktarget != '\0') {
+               const char *bn;
+               /* this "directory" is a symlink */
+               link = NULL;
+               if (*linktarget != '/') {
+                   const char *dn, *subDir = NULL;
+                   dn = rpmstrPoolStr(fpc->pool, current_fp.entry->dirId);
+                   if (current_fp.subDirId) {
+                       subDir = rpmstrPoolStr(fpc->pool, current_fp.subDirId);
+                   }
+                   rstrscat(&link, dn, subDir ? subDir : "", "/", NULL);
+               }
+               rstrscat(&link, linktarget, "/", NULL);
+               if (strlen(currentsubdir + bnEnd)) {
+                   rstrscat(&link, currentsubdir + bnEnd, NULL);
+               }
+
+               bn = rpmstrPoolStr(fpc->pool, fp->baseNameId);
+               doLookup(fpc, link, bn, fp);
+
+               free(link);
+               symlinkcount++;
+
+               /* setup current_fp for the new path */
+               found = 1;
+               current_fp = *fp;
+               if (fp->subDirId == 0) {
+                   /* directory exists - no need to look for symlinks */
+                   rpmFpHashAddEntry(fpc->fp, fp, ffi);
+                   goto exit;
+               }
+               currentsubdir = rpmstrPoolStr(fpc->pool, fp->subDirId);
+               lensubDir = rpmstrPoolStrlen(fpc->pool, fp->subDirId);
+               /* no subDir for now */
+               current_fp.subDirId = 0;
+
+               /* Set baseName to the upper most dir */
+               bnStart = bnEnd = 1;
+               while (bnEnd < lensubDir && currentsubdir[bnEnd] != '/')
+                   bnEnd++;
+               break;
+
+           }
+       }
+       if (symlinkcount > 50) {
+           // found too many symlinks in the path
+           // most likley a symlink cicle
+           // giving up
+           // TODO warning/error
+           break;
+       }
+       if (found) {
+           continue; // restart loop after symlink
+       }
+
+       /* Set former baseName as subDir */
+       bnEnd++;
+       current_fp.subDirId = rpmstrPoolIdn(fpc->pool, currentsubdir, bnEnd, 1);
+
+       /* set baseName to the next lower dir */
+       bnStart = bnEnd;
+       while (bnEnd < lensubDir && currentsubdir[bnEnd] != '/')
            bnEnd++;
     }
     rpmFpHashAddEntry(fpc->fp, fp, ffi);
 
+exit:
+    rpmfilesFree(fi);
 }
 
 fingerPrint * fpCacheGetByFp(fingerPrintCache cache,
@@ -463,7 +473,7 @@ void fpCachePopulate(fingerPrintCache fpc, rpmts ts, int fileCount)
     rpmtsi pi;
     rpmte p;
     rpmfs fs;
-    rpmfi fi;
+    rpmfiles fi;
     int i, fc;
 
     if (fpc->fp == NULL)
@@ -475,23 +485,23 @@ void fpCachePopulate(fingerPrintCache fpc, rpmts ts, int fileCount)
     pi = rpmtsiInit(ts);
     while ((p = rpmtsiNext(pi, 0)) != NULL) {
        fingerPrint *fpList;
-       (void) rpmdbCheckSignals();
+       (void) rpmsqPoll();
 
-       if ((fi = rpmteFI(p)) == NULL)
+       if ((fi = rpmteFiles(p)) == NULL)
            continue;   /* XXX can't happen */
 
        (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_FINGERPRINT), 0);
-       rpmfiFpLookup(fi, fpc);
+       rpmfilesFpLookup(fi, fpc);
        fs = rpmteGetFileStates(p);
        fc = rpmfsFC(fs);
-       fpList = rpmfiFps(fi);
+       fpList = rpmfilesFps(fi);
        /* collect symbolic links */
        for (i = 0; i < fc; i++) {
            struct rpmffi_s ffi;
            char const *linktarget;
            if (XFA_SKIPPING(rpmfsGetAction(fs, i)))
                continue;
-           linktarget = rpmfiFLinkIndex(fi, i);
+           linktarget = rpmfilesFLink(fi, i);
            if (!(linktarget && *linktarget != '\0'))
                continue;
            ffi.p = p;
@@ -499,7 +509,7 @@ void fpCachePopulate(fingerPrintCache fpc, rpmts ts, int fileCount)
            rpmFpHashAddEntry(symlinks, fpList + i, ffi);
        }
        (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_FINGERPRINT), fc);
-
+       rpmfilesFree(fi);
     }
     rpmtsiFree(pi);
 
@@ -510,7 +520,7 @@ void fpCachePopulate(fingerPrintCache fpc, rpmts ts, int fileCount)
 
     pi = rpmtsiInit(ts);
     while ((p = rpmtsiNext(pi, 0)) != NULL) {
-       (void) rpmdbCheckSignals();
+       (void) rpmsqPoll();
 
        fs = rpmteGetFileStates(p);
        fc = rpmfsFC(fs);
index ab4e18034eaf1aa233cfa1296293623054bdabed..839ce83c6558d2f989cc21b582acd86293eec367 100644 (file)
--- a/lib/fsm.c
+++ b/lib/fsm.c
 
 #include <rpm/rpmte.h>
 #include <rpm/rpmts.h>
-#include <rpm/rpmsq.h>
 #include <rpm/rpmlog.h>
+#include <rpm/rpmmacro.h>
 
 #include "rpmio/rpmio_internal.h"      /* fdInit/FiniDigest */
-#include "lib/cpio.h"
 #include "lib/fsm.h"
-#define        fsmUNSAFE       fsmStage
-#include "lib/rpmfi_internal.h"        /* XXX fi->apath, ... */
 #include "lib/rpmte_internal.h"        /* XXX rpmfs */
-#include "lib/rpmts_internal.h"        /* rpmtsSELabelFoo() only */
-#include "lib/rpmplugins.h"     /* rpm plugins hooks */
+#include "lib/rpmplugins.h"    /* rpm plugins hooks */
 #include "lib/rpmug.h"
-#include "lib/cpio.h"
 
 #include "debug.h"
 
 #define        _FSM_DEBUG      0
 int _fsm_debug = _FSM_DEBUG;
 
-extern int _fsm_debug;
-
-/** \ingroup payload
- */
-enum cpioMapFlags_e {
-    CPIO_MAP_PATH      = (1 << 0),
-    CPIO_MAP_MODE      = (1 << 1),
-    CPIO_MAP_UID       = (1 << 2),
-    CPIO_MAP_GID       = (1 << 3),
-    CPIO_FOLLOW_SYMLINKS= (1 << 4), /*!< only for building. */
-    CPIO_MAP_ABSOLUTE  = (1 << 5),
-    CPIO_MAP_ADDDOT    = (1 << 6),
-    CPIO_MAP_TYPE      = (1 << 8),  /*!< only for building. */
-    CPIO_SBIT_CHECK    = (1 << 9)
-};
-typedef rpmFlags cpioMapFlags;
-
-typedef struct fsmIterator_s * FSMI_t;
-typedef struct fsm_s * FSM_t;
-
-typedef struct hardLink_s * hardLink_t;
-
-typedef enum fileStage_e {
-    FSM_PKGINSTALL,
-    FSM_PKGERASE,
-    FSM_PKGBUILD,
-} fileStage;
-
 /* XXX Failure to remove is not (yet) cause for failure. */
 static int strict_erasures = 0;
 
-/** \ingroup payload
- * Keeps track of the set of all hard links to a file in an archive.
- */
-struct hardLink_s {
-    hardLink_t next;
-    const char ** nsuffix;
-    int * filex;
-    struct stat sb;
-    nlink_t nlink;
-    nlink_t linksLeft;
-    int linkIndex;
-    int createdPath;
-};
-
-/** \ingroup payload
- * Iterator across package file info, forward on install, backward on erase.
- */
-struct fsmIterator_s {
-    rpmfs fs;                  /*!< file state info. */
-    rpmfi fi;                  /*!< transaction element file info. */
-    int reverse;               /*!< reversed traversal? */
-    int isave;                 /*!< last returned iterator index. */
-    int i;                     /*!< iterator index. */
-};
-
-/** \ingroup payload
- * File name and stat information.
- */
-struct fsm_s {
-    char * path;               /*!< Current file name. */
-    char * buf;                        /*!<  read: Buffer. */
-    size_t bufsize;            /*!<  read: Buffer allocated size. */
-    FSMI_t iter;               /*!< File iterator. */
-    int ix;                    /*!< Current file iterator index. */
-    hardLink_t links;          /*!< Pending hard linked file(s). */
-    char ** failedFile;                /*!< First file name that failed. */
-    const char * osuffix;      /*!< Old, preserved, file suffix. */
-    const char * nsuffix;      /*!< New, created, file suffix. */
-    char * suffix;             /*!< Current file suffix. */
-    int postpone;              /*!< Skip remaining stages? */
-    int diskchecked;           /*!< Has stat(2) been performed? */
-    int exists;                        /*!< Does current file exist on disk? */
-    cpioMapFlags mapFlags;     /*!< Bit(s) to control mapping. */
-    const char * dirName;      /*!< File directory name. */
-    const char * baseName;     /*!< File base name. */
-    struct selabel_handle *sehandle;   /*!< SELinux label handle (if any). */
-    rpmPlugins plugins;        /*!< Rpm plugins handle */
-
-    unsigned fflags;           /*!< File flags. */
-    rpmFileAction action;      /*!< File disposition. */
-    fileStage goal;            /*!< Package state machine goal. */
-    struct stat sb;            /*!< Current file stat(2) info. */
-    struct stat osb;           /*!< Original file stat(2) info. */
-};
-
-
-/**
- * Retrieve transaction element file info from file state machine iterator.
- * @param fsm          file state machine
- * @return             transaction element file info
- */
-static rpmfi fsmGetFi(const FSM_t fsm)
-{
-    const FSMI_t iter = fsm->iter;
-    return (iter ? iter->fi : NULL);
-}
-
-static rpmfs fsmGetFs(const FSM_t fsm)
-{
-    const FSMI_t iter = fsm->iter;
-    return (iter ? iter->fs : NULL);
-}
-
 #define        SUFFIX_RPMORIG  ".rpmorig"
 #define        SUFFIX_RPMSAVE  ".rpmsave"
 #define        SUFFIX_RPMNEW   ".rpmnew"
@@ -152,126 +46,20 @@ static const char * fileActionString(rpmFileAction a);
 
 /** \ingroup payload
  * Build path to file from file info, optionally ornamented with suffix.
- * @param fsm          file state machine data
- * @param isDir                directory or regular path?
+ * @param fi           file info iterator
  * @param suffix       suffix to use (NULL disables)
  * @retval             path to file (malloced)
  */
-static char * fsmFsPath(const FSM_t fsm, int isDir,
-                       const char * suffix)
-{
-    return rstrscat(NULL,
-                   fsm->dirName, fsm->baseName,
-                   (!isDir && suffix) ? suffix : "",
-                   NULL);
-}
-
-/** \ingroup payload
- * Destroy file info iterator.
- * @param p            file info iterator
- * @retval             NULL always
- */
-static FSMI_t mapFreeIterator(FSMI_t iter)
+static char * fsmFsPath(rpmfi fi, const char * suffix)
 {
-    if (iter) {
-       iter->fs = NULL; /* rpmfs is not refcounted */
-       iter->fi = rpmfiFree(iter->fi);
-       free(iter);
-    }
-    return NULL;
-}
-
-/** \ingroup payload
- * Create file info iterator.
- * @param fi           transaction element file info
- * @return             file info iterator
- */
-static FSMI_t 
-mapInitIterator(rpmfs fs, rpmfi fi, int reverse)
-{
-    FSMI_t iter = NULL;
-
-    iter = xcalloc(1, sizeof(*iter));
-    iter->fs = fs; /* rpmfs is not refcounted */
-    iter->fi = rpmfiLink(fi);
-    iter->reverse = reverse;
-    iter->i = (iter->reverse ? (rpmfiFC(fi) - 1) : 0);
-    iter->isave = iter->i;
-    return iter;
-}
-
-/** \ingroup payload
- * Return next index into file info.
- * @param a            file info iterator
- * @return             next index, -1 on termination
- */
-static int mapNextIterator(FSMI_t iter)
-{
-    int i = -1;
-
-    if (iter) {
-       const rpmfi fi = iter->fi;
-       if (iter->reverse) {
-           if (iter->i >= 0)   i = iter->i--;
-       } else {
-           if (iter->i < rpmfiFC(fi))  i = iter->i++;
-       }
-       iter->isave = i;
-    }
-    return i;
-}
-
-/** \ingroup payload
- */
-static int cpioStrCmp(const void * a, const void * b)
-{
-    const char * afn = *(const char **)a;
-    const char * bfn = *(const char **)b;
-
-    /* Match rpm-4.0 payloads with ./ prefixes. */
-    if (afn[0] == '.' && afn[1] == '/')        afn += 2;
-    if (bfn[0] == '.' && bfn[1] == '/')        bfn += 2;
-
-    /* If either path is absolute, make it relative. */
-    if (afn[0] == '/') afn += 1;
-    if (bfn[0] == '/') bfn += 1;
-
-    return strcmp(afn, bfn);
-}
-
-/** \ingroup payload
- * Locate archive path in file info.
- * @param iter         file info iterator
- * @param fsmPath      archive path
- * @return             index into file info, -1 if archive path was not found
- */
-static int mapFind(FSMI_t iter, const char * fsmPath)
-{
-    int ix = -1;
-
-    if (iter) {
-       const rpmfi fi = iter->fi;
-       int fc = rpmfiFC(fi);
-       if (fi && fc > 0 && fi->apath && fsmPath && *fsmPath) {
-           char ** p = NULL;
-
-           if (fi->apath != NULL)
-               p = bsearch(&fsmPath, fi->apath, fc, sizeof(fsmPath),
-                       cpioStrCmp);
-           if (p) {
-               iter->i = p - fi->apath;
-               ix = mapNextIterator(iter);
-           }
-       }
-    }
-    return ix;
+    return rstrscat(NULL, rpmfiDN(fi), rpmfiBN(fi), suffix ? suffix : "", NULL);
 }
 
 /** \ingroup payload
  * Directory name iterator.
  */
 typedef struct dnli_s {
-    rpmfi fi;
+    rpmfiles fi;
     char * active;
     int reverse;
     int isave;
@@ -280,7 +68,7 @@ typedef struct dnli_s {
 
 /** \ingroup payload
  * Destroy directory name iterator.
- * @param a            directory name iterator
+ * @param dnli         directory name iterator
  * @retval             NULL always
  */
 static DNLI_t dnlFreeIterator(DNLI_t dnli)
@@ -299,7 +87,7 @@ static DNLI_t dnlFreeIterator(DNLI_t dnli)
  * @param reverse      traverse directory names in reverse order?
  * @return             directory name iterator
  */
-static DNLI_t dnlInitIterator(rpmfi fi, rpmfs fs, int reverse)
+static DNLI_t dnlInitIterator(rpmfiles fi, rpmfs fs, int reverse)
 {
     DNLI_t dnli;
     int i, j;
@@ -307,7 +95,7 @@ static DNLI_t dnlInitIterator(rpmfi fi, rpmfs fs, int reverse)
 
     if (fi == NULL)
        return NULL;
-    dc = rpmfiDC(fi);
+    dc = rpmfilesDC(fi);
     dnli = xcalloc(1, sizeof(*dnli));
     dnli->fi = fi;
     dnli->reverse = reverse;
@@ -315,24 +103,24 @@ static DNLI_t dnlInitIterator(rpmfi fi, rpmfs fs, int reverse)
 
     if (dc) {
        dnli->active = xcalloc(dc, sizeof(*dnli->active));
-       int fc = rpmfiFC(fi);
+       int fc = rpmfilesFC(fi);
 
        /* Identify parent directories not skipped. */
        for (i = 0; i < fc; i++)
             if (!XFA_SKIPPING(rpmfsGetAction(fs, i)))
-               dnli->active[rpmfiDIIndex(fi, i)] = 1;
+               dnli->active[rpmfilesDI(fi, i)] = 1;
 
        /* Exclude parent directories that are explicitly included. */
        for (i = 0; i < fc; i++) {
            int dil;
            size_t dnlen, bnlen;
 
-           if (!S_ISDIR(rpmfiFModeIndex(fi, i)))
+           if (!S_ISDIR(rpmfilesFMode(fi, i)))
                continue;
 
-           dil = rpmfiDIIndex(fi, i);
-           dnlen = strlen(rpmfiDNIndex(fi, dil));
-           bnlen = strlen(rpmfiBNIndex(fi, i));
+           dil = rpmfilesDI(fi, i);
+           dnlen = strlen(rpmfilesDN(fi, dil));
+           bnlen = strlen(rpmfilesBN(fi, i));
 
            for (j = 0; j < dc; j++) {
                const char * dnl;
@@ -340,13 +128,13 @@ static DNLI_t dnlInitIterator(rpmfi fi, rpmfs fs, int reverse)
 
                if (!dnli->active[j] || j == dil)
                    continue;
-               dnl = rpmfiDNIndex(fi, j);
+               dnl = rpmfilesDN(fi, j);
                jlen = strlen(dnl);
                if (jlen != (dnlen+bnlen+1))
                    continue;
-               if (!rstreqn(dnl, rpmfiDNIndex(fi, dil), dnlen))
+               if (!rstreqn(dnl, rpmfilesDN(fi, dil), dnlen))
                    continue;
-               if (!rstreqn(dnl+dnlen, rpmfiBNIndex(fi, i), bnlen))
+               if (!rstreqn(dnl+dnlen, rpmfilesBN(fi, i), bnlen))
                    continue;
                if (dnl[dnlen+bnlen] != '/' || dnl[dnlen+bnlen+1] != '\0')
                    continue;
@@ -366,7 +154,7 @@ static DNLI_t dnlInitIterator(rpmfi fi, rpmfs fs, int reverse)
                    rpmlog(RPMLOG_DEBUG,
        "========== Directories not explicitly included in package:\n");
                }
-               rpmlog(RPMLOG_DEBUG, "%10d %s\n", i, rpmfiDNIndex(fi, i));
+               rpmlog(RPMLOG_DEBUG, "%10d %s\n", i, rpmfilesDN(fi, i));
            }
            if (j)
                rpmlog(RPMLOG_DEBUG, "==========\n");
@@ -386,8 +174,8 @@ const char * dnlNextIterator(DNLI_t dnli)
     const char * dn = NULL;
 
     if (dnli) {
-       rpmfi fi = dnli->fi;
-       int dc = rpmfiDC(fi);
+       rpmfiles fi = dnli->fi;
+       int dc = rpmfilesDC(fi);
        int i = -1;
 
        if (dnli->active)
@@ -396,7 +184,7 @@ const char * dnlNextIterator(DNLI_t dnli)
        } while (i >= 0 && i < dc && !dnli->active[i]);
 
        if (i >= 0 && i < dc)
-           dn = rpmfiDNIndex(fi, i);
+           dn = rpmfilesDN(fi, i);
        else
            i = -1;
        dnli->isave = i;
@@ -404,251 +192,6 @@ const char * dnlNextIterator(DNLI_t dnli)
     return dn;
 }
 
-/**
- * Map next file path and action.
- * @param fsm          file state machine
- * @param i            file index
- */
-static int fsmMapPath(FSM_t fsm, int i)
-{
-    rpmfi fi = fsmGetFi(fsm);  /* XXX const except for fstates */
-    int rc = 0;
-
-    fsm->osuffix = NULL;
-    fsm->nsuffix = NULL;
-    fsm->action = FA_UNKNOWN;
-
-    if (fi && i >= 0 && i < rpmfiFC(fi)) {
-       rpmfs fs = fsmGetFs(fsm);
-       /* XXX these should use rpmfiFFlags() etc */
-       fsm->action = rpmfsGetAction(fs, i);
-       fsm->fflags = rpmfiFFlagsIndex(fi, i);
-
-       /* src rpms have simple base name in payload. */
-       fsm->dirName = rpmfiDNIndex(fi, rpmfiDIIndex(fi, i));
-       fsm->baseName = rpmfiBNIndex(fi, i);
-
-       /* Never create backup for %ghost files. */
-       if (fsm->goal != FSM_PKGBUILD && !(fsm->fflags & RPMFILE_GHOST)) {
-           switch (fsm->action) {
-           case FA_ALTNAME:
-               fsm->nsuffix = SUFFIX_RPMNEW;
-               break;
-           case FA_SAVE:
-               fsm->osuffix = SUFFIX_RPMSAVE;
-               break;
-           case FA_BACKUP:
-               fsm->osuffix = (fsm->goal == FSM_PKGINSTALL) ?
-                               SUFFIX_RPMORIG : SUFFIX_RPMSAVE;
-               break;
-           default:
-               break;
-           }
-       }
-
-       if ((fsm->mapFlags & CPIO_MAP_PATH) || fsm->nsuffix) {
-           fsm->path = _free(fsm->path);
-           fsm->path = fsmFsPath(fsm, S_ISDIR(fsm->sb.st_mode),
-               (fsm->suffix ? fsm->suffix : fsm->nsuffix));
-       }
-    }
-    return rc;
-}
-
-/** \ingroup payload
- * Save hard link in chain.
- * @param fsm          file state machine data
- * @retval linkSet     hard link set when complete
- * @return             Is chain only partially filled?
- */
-static int saveHardLink(FSM_t fsm, hardLink_t * linkSet)
-{
-    struct stat * st = &fsm->sb;
-    int rc = 0;
-    int ix = -1;
-    int j;
-    hardLink_t *tailp, li;
-
-    /* Find hard link set. */
-    for (tailp = &fsm->links; (li = *tailp) != NULL; tailp = &li->next) {
-       if (li->sb.st_ino == st->st_ino && li->sb.st_dev == st->st_dev)
-           break;
-    }
-
-    /* New hard link encountered, add new link to set. */
-    if (li == NULL) {
-       li = xcalloc(1, sizeof(*li));
-       li->next = NULL;
-       li->sb = *st;   /* structure assignment */
-       li->nlink = st->st_nlink;
-       li->linkIndex = fsm->ix;
-       li->createdPath = -1;
-
-       li->filex = xcalloc(st->st_nlink, sizeof(li->filex[0]));
-       memset(li->filex, -1, (st->st_nlink * sizeof(li->filex[0])));
-       li->nsuffix = xcalloc(st->st_nlink, sizeof(*li->nsuffix));
-
-       if (fsm->goal == FSM_PKGBUILD)
-           li->linksLeft = st->st_nlink;
-       if (fsm->goal == FSM_PKGINSTALL)
-           li->linksLeft = 0;
-
-       *tailp = li;    /* append to tail of linked list */
-    }
-
-    if (fsm->goal == FSM_PKGBUILD) --li->linksLeft;
-    li->filex[li->linksLeft] = fsm->ix;
-    li->nsuffix[li->linksLeft] = fsm->nsuffix;
-    if (fsm->goal == FSM_PKGINSTALL) li->linksLeft++;
-
-    if (fsm->goal == FSM_PKGBUILD)
-       return (li->linksLeft > 0);
-
-    if (fsm->goal != FSM_PKGINSTALL)
-       return 0;
-
-    if (!(st->st_size || li->linksLeft == st->st_nlink))
-       return 1;
-
-    /* Here come the bits, time to choose a non-skipped file name. */
-    {  rpmfs fs = fsmGetFs(fsm);
-
-       for (j = li->linksLeft - 1; j >= 0; j--) {
-           ix = li->filex[j];
-           if (ix < 0 || XFA_SKIPPING(rpmfsGetAction(fs, ix)))
-               continue;
-           break;
-       }
-    }
-
-    /* Are all links skipped or not encountered yet? */
-    if (ix < 0 || j < 0)
-       return 1;       /* XXX W2DO? */
-
-    /* Save the non-skipped file name and map index. */
-    li->linkIndex = j;
-    if (linkSet)
-       *linkSet = li;
-    fsm->path = _free(fsm->path);
-    fsm->ix = ix;
-    rc = fsmMapPath(fsm, fsm->ix);
-    return rc;
-}
-
-/** \ingroup payload
- * Destroy set of hard links.
- * @param li           set of hard links
- * @return             NULL always
- */
-static hardLink_t freeHardLink(hardLink_t li)
-{
-    if (li) {
-       li->nsuffix = _free(li->nsuffix);       /* XXX elements are shared */
-       li->filex = _free(li->filex);
-       _free(li);
-    }
-    return NULL;
-}
-
-/* Check for hard links missing from payload */
-static int checkHardLinks(FSM_t fsm)
-{
-    int rc = 0;
-    rpmfs fs = fsmGetFs(fsm);
-
-    for (hardLink_t li = fsm->links; li != NULL; li = li->next) {
-       if (li->linksLeft) {
-           for (nlink_t i = 0 ; i < li->linksLeft; i++) {
-               int ix = li->filex[i];
-               if (ix < 0 || XFA_SKIPPING(rpmfsGetAction(fs, ix)))
-                   continue;
-               rc = CPIOERR_MISSING_HARDLINK;
-               if (fsm->failedFile && *fsm->failedFile == NULL) {
-                   if (!fsmMapPath(fsm, ix)) {
-                       /* Out-of-sync hardlinks handled as sub-state */
-                       *fsm->failedFile = fsm->path;
-                       fsm->path = NULL;
-                   }
-               }
-               break;
-           }
-       }
-    }
-    return rc;
-}
-
-static FSM_t fsmNew(fileStage goal, rpmfs fs, rpmfi fi, char ** failedFile)
-{
-    FSM_t fsm = xcalloc(1, sizeof(*fsm));
-
-    fsm->ix = -1;
-    fsm->goal = goal;
-    fsm->iter = mapInitIterator(fs, fi, (goal == FSM_PKGERASE));
-
-    /* common flags for all modes */
-    fsm->mapFlags = CPIO_MAP_PATH | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID;
-
-    if (fsm->goal == FSM_PKGINSTALL || fsm->goal == FSM_PKGBUILD) {
-        fsm->bufsize = 8 * BUFSIZ;
-        fsm->buf = xmalloc(fsm->bufsize);
-    }
-
-    fsm->failedFile = failedFile;
-    if (fsm->failedFile)
-       *fsm->failedFile = NULL;
-
-    return fsm;
-}
-
-static FSM_t fsmFree(FSM_t fsm)
-{
-    hardLink_t li;
-    fsm->buf = _free(fsm->buf);
-    fsm->bufsize = 0;
-
-    fsm->iter = mapFreeIterator(fsm->iter);
-    fsm->failedFile = NULL;
-
-    fsm->path = _free(fsm->path);
-    fsm->suffix = _free(fsm->suffix);
-
-    while ((li = fsm->links) != NULL) {
-       fsm->links = li->next;
-       li->next = NULL;
-       freeHardLink(li);
-    }
-    free(fsm);
-    return NULL;
-}
-
-/* Find and set file security context */
-static int fsmSetSELabel(struct selabel_handle *sehandle,
-                        const char *path, mode_t mode)
-{
-    int rc = 0;
-#if WITH_SELINUX
-    if (sehandle) {
-       security_context_t scon = NULL;
-
-       if (selabel_lookup_raw(sehandle, &scon, path, mode) == 0) {
-           rc = lsetfilecon(path, scon);
-
-           if (_fsm_debug) {
-               rpmlog(RPMLOG_DEBUG, " %8s (%s, %s) %s\n",
-                       __func__, path, scon,
-                       (rc < 0 ? strerror(errno) : ""));
-           }
-
-           if (rc < 0 && errno == EOPNOTSUPP)
-               rc = 0;
-       }
-
-       freecon(scon);
-    }
-#endif
-    return rc ? CPIOERR_LSETFCON_FAILED : 0;
-}
-
 static int fsmSetFCaps(const char *path, const char *captxt)
 {
     int rc = 0;
@@ -656,7 +199,7 @@ static int fsmSetFCaps(const char *path, const char *captxt)
     if (captxt && *captxt != '\0') {
        cap_t fcaps = cap_from_text(captxt);
        if (fcaps == NULL || cap_set_file(path, fcaps) != 0) {
-           rc = CPIOERR_SETCAP_FAILED;
+           rc = RPMERR_SETCAP_FAILED;
        }
        cap_free(fcaps);
     } 
@@ -664,132 +207,102 @@ static int fsmSetFCaps(const char *path, const char *captxt)
     return rc;
 }
 
-/**
- * Map file stat(2) info.
- * @param fsm          file state machine
- */
-static int fsmMapAttrs(FSM_t fsm)
+static void wfd_close(FD_t *wfdp)
 {
-    struct stat * st = &fsm->sb;
-    rpmfi fi = fsmGetFi(fsm);
-    int i = fsm->ix;
-
-    /* this check is pretty moot,  rpmfi accessors check array bounds etc */
-    if (fi && i >= 0 && i < rpmfiFC(fi)) {
-       ino_t finalInode = rpmfiFInodeIndex(fi, i);
-       mode_t finalMode = rpmfiFModeIndex(fi, i);
-       dev_t finalRdev = rpmfiFRdevIndex(fi, i);
-       time_t finalMtime = rpmfiFMtimeIndex(fi, i);
-       const char *user = rpmfiFUserIndex(fi, i);
-       const char *group = rpmfiFGroupIndex(fi, i);
-       uid_t uid = 0;
-       gid_t gid = 0;
-
-       if (user && rpmugUid(user, &uid)) {
-           if (fsm->goal == FSM_PKGINSTALL)
-               rpmlog(RPMLOG_WARNING,
-                   _("user %s does not exist - using root\n"), user);
-           finalMode &= ~S_ISUID;      /* turn off suid bit */
+    if (wfdp && *wfdp) {
+       int myerrno = errno;
+       static int oneshot = 0;
+       static int flush_io = 0;
+       if (!oneshot) {
+           flush_io = rpmExpandNumeric("%{?_flush_io}");
+           oneshot = 1;
        }
-
-       if (group && rpmugGid(group, &gid)) {
-           if (fsm->goal == FSM_PKGINSTALL)
-               rpmlog(RPMLOG_WARNING,
-                   _("group %s does not exist - using root\n"), group);
-           finalMode &= ~S_ISGID;      /* turn off sgid bit */
+       if (flush_io) {
+           int fdno = Fileno(*wfdp);
+           fsync(fdno);
        }
+       Fclose(*wfdp);
+       *wfdp = NULL;
+       errno = myerrno;
+    }
+}
 
-       if (fsm->mapFlags & CPIO_MAP_MODE)
-           st->st_mode = (st->st_mode & S_IFMT) | (finalMode & ~S_IFMT);
-       if (fsm->mapFlags & CPIO_MAP_TYPE) {
-           st->st_mode = (st->st_mode & ~S_IFMT) | (finalMode & S_IFMT);
-           if ((S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
-           && st->st_nlink == 0)
-               st->st_nlink = 1;
-           st->st_ino = finalInode;
-           st->st_rdev = finalRdev;
-           st->st_mtime = finalMtime;
-       }
-       if (fsm->mapFlags & CPIO_MAP_UID)
-           st->st_uid = uid;
-       if (fsm->mapFlags & CPIO_MAP_GID)
-           st->st_gid = gid;
+static int wfd_open(FD_t *wfdp, const char *dest)
+{
+    int rc = 0;
+    /* Create the file with 0200 permissions (write by owner). */
+    {
+       mode_t old_umask = umask(0577);
+       *wfdp = Fopen(dest, "wx.ufdio");
+       umask(old_umask);
     }
+    if (Ferror(*wfdp)) {
+       rc = RPMERR_OPEN_FAILED;
+       goto exit;
+    }
+
     return 0;
+
+exit:
+    wfd_close(wfdp);
+    return rc;
 }
 
 /** \ingroup payload
  * Create file from payload stream.
- * @param fsm          file state machine data
- * @param archive      payload archive
  * @return             0 on success
  */
-static int expandRegular(FSM_t fsm, rpmpsm psm, rpmcpio_t archive, int nodigest)
+static int expandRegular(rpmfi fi, const char *dest, rpmpsm psm, int nodigest)
 {
     FD_t wfd = NULL;
-    const struct stat * st = &fsm->sb;
-    rpm_loff_t left = st->st_size;
-    const unsigned char * fidigest = NULL;
-    pgpHashAlgo digestalgo = 0;
-    int rc = 0;
-
-    wfd = Fopen(fsm->path, "w.ufdio");
-    if (Ferror(wfd)) {
-       rc = CPIOERR_OPEN_FAILED;
-       goto exit;
-    }
-
-    if (!nodigest) {
-       rpmfi fi = fsmGetFi(fsm);
-       digestalgo = rpmfiDigestAlgo(fi);
-       fidigest = rpmfiFDigestIndex(fi, fsm->ix, NULL, NULL);
-    }
-
-    if (st->st_size > 0 && fidigest)
-       fdInitDigest(wfd, digestalgo, 0);
-
-    while (left) {
-        size_t len;
-       len = (left > fsm->bufsize ? fsm->bufsize : left);
-        if (rpmcpioRead(archive, fsm->buf, len) != len) {
-            rc = CPIOERR_READ_FAILED;
-           goto exit;
-        }
-       if ((Fwrite(fsm->buf, sizeof(*fsm->buf), len, wfd) != len) || Ferror(wfd)) {
-           rc = CPIOERR_WRITE_FAILED;
-           goto exit;
-       }
+    int rc;
 
-       left -= len;
+    rc = wfd_open(&wfd, dest);
+    if (rc != 0)
+        goto exit;
 
-       /* don't call this with fileSize == fileComplete */
-       if (!rc && left)
-           rpmpsmNotify(psm, RPMCALLBACK_INST_PROGRESS, rpmcpioTell(archive));
-    }
-
-    if (st->st_size > 0 && fidigest) {
-       void * digest = NULL;
+    rc = rpmfiArchiveReadToFilePsm(fi, wfd, nodigest, psm);
+    wfd_close(&wfd);
+exit:
+    return rc;
+}
 
-       (void) Fflush(wfd);
-       fdFiniDigest(wfd, digestalgo, &digest, NULL, 0);
+static int fsmMkfile(rpmfi fi, const char *dest, rpmfiles files,
+                    rpmpsm psm, int nodigest, int *setmeta,
+                    int * firsthardlink, FD_t *firstlinkfile)
+{
+    int rc = 0;
+    int numHardlinks = rpmfiFNlink(fi);
 
-       if (digest != NULL && fidigest != NULL) {
-           size_t diglen = rpmDigestLength(digestalgo);
-           if (memcmp(digest, fidigest, diglen)) {
-               rc = CPIOERR_DIGEST_MISMATCH;
-            }
+    if (numHardlinks > 1) {
+       /* Create first hardlinked file empty */
+       if (*firsthardlink < 0) {
+           *firsthardlink = rpmfiFX(fi);
+           rc = wfd_open(firstlinkfile, dest);
        } else {
-           rc = CPIOERR_DIGEST_MISMATCH;
+           /* Create hard links for others */
+           char *fn = rpmfilesFN(files, *firsthardlink);
+           rc = link(fn, dest);
+           if (rc < 0) {
+               rc = RPMERR_LINK_FAILED;
+           }
+           free(fn);
        }
-       free(digest);
     }
-
-exit:
-    if (wfd) {
-       int myerrno = errno;
-       Fclose(wfd);
-       errno = myerrno;
+    /* Write normal files or fill the last hardlinked (already
+       existing) file with content */
+    if (numHardlinks<=1) {
+       if (!rc)
+           rc = expandRegular(fi, dest, psm, nodigest);
+    } else if (rpmfiArchiveHasContent(fi)) {
+       if (!rc)
+           rc = rpmfiArchiveReadToFilePsm(fi, *firstlinkfile, nodigest, psm);
+       wfd_close(firstlinkfile);
+       *firsthardlink = -1;
+    } else {
+       *setmeta = 0;
     }
+
     return rc;
 }
 
@@ -797,7 +310,7 @@ static int fsmReadLink(const char *path,
                       char *buf, size_t bufsize, size_t *linklen)
 {
     ssize_t llen = readlink(path, buf, bufsize - 1);
-    int rc = CPIOERR_READLINK_FAILED;
+    int rc = RPMERR_READLINK_FAILED;
 
     if (_fsm_debug) {
         rpmlog(RPMLOG_DEBUG, " %8s (%s, buf, %d) %s\n",
@@ -813,168 +326,6 @@ static int fsmReadLink(const char *path,
     return rc;
 }
 
-/** \ingroup payload
- * Write next item to payload stream.
- * @param fsm          file state machine data
- * @param writeData    should data be written?
- * @param archive      payload archive
- * @param ix           file index
- * @return             0 on success
- */
-static int writeFile(FSM_t fsm, int writeData, rpmcpio_t archive, int ix)
-{
-    FD_t rfd = NULL;
-    char * path = fsm->path;
-    struct stat * st = &fsm->sb;
-    struct stat * ost = &fsm->osb;
-    char * symbuf = NULL;
-    rpm_loff_t left;
-    int rc = 0;
-
-    st->st_size = (writeData ? ost->st_size : 0);
-
-    if (S_ISDIR(st->st_mode)) {
-       st->st_size = 0;
-    } else if (S_ISLNK(st->st_mode)) {
-       /*
-        * While linux puts the size of a symlink in the st_size field,
-        * I don't think that's a specified standard.
-        */
-        size_t linklen;
-       rc = fsmReadLink(fsm->path, fsm->buf, fsm->bufsize, &linklen);
-       if (rc) goto exit;
-       st->st_size = linklen;
-       rstrcat(&symbuf, fsm->buf);     /* XXX save readlink return. */
-    }
-
-    if (fsm->mapFlags & CPIO_MAP_ABSOLUTE) {
-       fsm->path = rstrscat(NULL, (fsm->mapFlags & CPIO_MAP_ADDDOT) ? "." : "",
-                                  fsm->dirName, fsm->baseName, NULL);
-    } else if (fsm->mapFlags & CPIO_MAP_PATH) {
-       rpmfi fi = fsmGetFi(fsm);
-       fsm->path = xstrdup((fi->apath ? fi->apath[ix] : 
-                                        rpmfiBNIndex(fi, ix)));
-    }
-
-    rc = rpmcpioHeaderWrite(archive, fsm->path, st);
-    _free(fsm->path);
-    fsm->path = path;
-
-    if (rc) goto exit;
-
-
-    if (writeData && S_ISREG(st->st_mode)) {
-       size_t len;
-
-       rfd = Fopen(fsm->path, "r.ufdio");
-       if (Ferror(rfd)) {
-           rc = CPIOERR_OPEN_FAILED;
-           goto exit;
-       }
-       
-       left = st->st_size;
-
-       while (left) {
-           len = (left > fsm->bufsize ? fsm->bufsize : left);
-           if (Fread(fsm->buf, sizeof(*fsm->buf), len, rfd) != len || Ferror(rfd)) {
-               rc = CPIOERR_READ_FAILED;
-               goto exit;
-           }
-
-           if (rpmcpioWrite(archive, fsm->buf, len) != len) {
-               rc = CPIOERR_WRITE_FAILED;
-               goto exit;
-           }
-           left -= len;
-       }
-    } else if (writeData && S_ISLNK(st->st_mode)) {
-        size_t len = strlen(symbuf);
-        if (rpmcpioWrite(archive, symbuf, len) != len) {
-            rc = CPIOERR_WRITE_FAILED;
-            goto exit;
-        }
-    }
-
-exit:
-    if (rfd) {
-       /* preserve any prior errno across close */
-       int myerrno = errno;
-       Fclose(rfd);
-       errno = myerrno;
-    }
-    fsm->path = path;
-    free(symbuf);
-    return rc;
-}
-
-/** \ingroup payload
- * Write set of linked files to payload stream.
- * @param fsm          file state machine data
- * @param archive      payload archive
- * @param li           link to write
- * @return             0 on success
- */
-static int writeLinkedFile(FSM_t fsm, rpmcpio_t archive, hardLink_t li)
-{
-    char * path = fsm->path;
-    const char * nsuffix = fsm->nsuffix;
-    int ec = 0;
-    int rc;
-    int i;
-
-    fsm->path = NULL;
-    fsm->nsuffix = NULL;
-
-    for (i = li->nlink - 1; i >= 0; i--) {
-
-       if (li->filex[i] < 0) continue;
-
-       rc = fsmMapPath(fsm, li->filex[i]);
-
-       /* Write data after last link. */
-       rc = writeFile(fsm, (i == 0), archive, li->filex[i]);
-       if (fsm->failedFile && rc != 0 && *fsm->failedFile == NULL) {
-           ec = rc;
-           *fsm->failedFile = xstrdup(fsm->path);
-       }
-
-       fsm->path = _free(fsm->path);
-       li->filex[i] = -1;
-    }
-
-    fsm->nsuffix = nsuffix;
-    fsm->path = path;
-    return ec;
-}
-
-static int writeLinks(FSM_t fsm, rpmcpio_t archive)
-{
-    int j, rc = 0;
-    nlink_t i, nlink;
-
-    for (hardLink_t li = fsm->links; li; li = li->next) {
-       /* Re-calculate link count for archive header. */
-       for (j = -1, nlink = 0, i = 0; i < li->nlink; i++) {
-           if (li->filex[i] < 0)
-               continue;
-           nlink++;
-           if (j == -1) j = i;
-       }
-       /* XXX force the contents out as well. */
-       if (j != 0) {
-           li->filex[0] = li->filex[j];
-           li->filex[j] = -1;
-       }
-       li->sb.st_nlink = nlink;
-
-       fsm->sb = li->sb;       /* structure assignment */
-       fsm->osb = fsm->sb;     /* structure assignment */
-
-       if (!rc) rc = writeLinkedFile(fsm, archive, li);
-    }
-    return rc;
-}
-
 static int fsmStat(const char *path, int dolstat, struct stat *sb)
 {
     int rc;
@@ -988,105 +339,10 @@ static int fsmStat(const char *path, int dolstat, struct stat *sb)
                __func__,
                path, (rc < 0 ? strerror(errno) : ""));
     if (rc < 0) {
-        rc = (errno == ENOENT ? CPIOERR_ENOENT : CPIOERR_LSTAT_FAILED);
-       /* WTH is this, and is it really needed, still? */
-        memset(sb, 0, sizeof(*sb));    /* XXX s390x hackery */
-    }
-    return rc;
-}
-
-static int fsmVerify(FSM_t fsm);
-
-/** \ingroup payload
- * Create pending hard links to existing file.
- * @param fsm          file state machine data
- * @param li           hard link
- * @return             0 on success
- */
-static int fsmMakeLinks(FSM_t fsm, hardLink_t li)
-{
-    char * path = fsm->path;
-    char * opath = NULL;
-    const char * nsuffix = fsm->nsuffix;
-    int ec = 0;
-    int rc;
-    int i;
-
-    fsm->path = NULL;
-    fsm->nsuffix = NULL;
-
-    rc = fsmMapPath(fsm, li->filex[li->createdPath]);
-    opath = fsm->path;
-    fsm->path = NULL;
-    for (i = 0; i < li->nlink; i++) {
-       if (li->filex[i] < 0) continue;
-       if (li->createdPath == i) continue;
-
-       fsm->path = _free(fsm->path);
-       rc = fsmMapPath(fsm, li->filex[i]);
-       if (XFA_SKIPPING(fsm->action)) continue;
-
-       rc = fsmVerify(fsm);
-       if (!rc) continue;
-       if (!(rc == CPIOERR_ENOENT)) break;
-
-       /* XXX link(opath, fsm->path) */
-       rc = link(opath, fsm->path);
-       if (_fsm_debug)
-           rpmlog(RPMLOG_DEBUG, " %8s (%s, %s) %s\n", __func__,
-               opath, fsm->path, (rc < 0 ? strerror(errno) : ""));
-       if (rc < 0)     rc = CPIOERR_LINK_FAILED;
-
-       if (fsm->failedFile && rc != 0 && *fsm->failedFile == NULL) {
-           ec = rc;
-           *fsm->failedFile = xstrdup(fsm->path);
-       }
-
-       li->linksLeft--;
+        rc = (errno == ENOENT ? RPMERR_ENOENT : RPMERR_LSTAT_FAILED);
+       /* Ensure consistent struct content on failure */
+        memset(sb, 0, sizeof(*sb));
     }
-    fsm->path = _free(fsm->path);
-    free(opath);
-
-    fsm->nsuffix = nsuffix;
-    fsm->path = path;
-    return ec;
-}
-
-static int fsmCommit(FSM_t fsm, int ix);
-
-/** \ingroup payload
- * Commit hard linked file set atomically.
- * @param fsm          file state machine data
- * @return             0 on success
- */
-static int fsmCommitLinks(FSM_t fsm)
-{
-    char * path = fsm->path;
-    const char * nsuffix = fsm->nsuffix;
-    struct stat * st = &fsm->sb;
-    int rc = 0;
-    nlink_t i;
-    hardLink_t li;
-
-    fsm->path = NULL;
-    fsm->nsuffix = NULL;
-
-    for (li = fsm->links; li != NULL; li = li->next) {
-       if (li->sb.st_ino == st->st_ino && li->sb.st_dev == st->st_dev)
-           break;
-    }
-
-    for (i = 0; i < li->nlink; i++) {
-       if (li->filex[i] < 0) continue;
-       rc = fsmMapPath(fsm, li->filex[i]);
-       if (!XFA_SKIPPING(fsm->action))
-           rc = fsmCommit(fsm, li->filex[i]);
-       fsm->path = _free(fsm->path);
-       li->filex[i] = -1;
-    }
-
-    fsm->nsuffix = nsuffix;
-    fsm->path = path;
     return rc;
 }
 
@@ -1098,9 +354,9 @@ static int fsmRmdir(const char *path)
               path, (rc < 0 ? strerror(errno) : ""));
     if (rc < 0)
        switch (errno) {
-       case ENOENT:        rc = CPIOERR_ENOENT;    break;
-       case ENOTEMPTY:     rc = CPIOERR_ENOTEMPTY; break;
-       default:            rc = CPIOERR_RMDIR_FAILED; break;
+       case ENOENT:        rc = RPMERR_ENOENT;    break;
+       case ENOTEMPTY:     rc = RPMERR_ENOTEMPTY; break;
+       default:            rc = RPMERR_RMDIR_FAILED; break;
        }
     return rc;
 }
@@ -1112,7 +368,7 @@ static int fsmMkdir(const char *path, mode_t mode)
        rpmlog(RPMLOG_DEBUG, " %8s (%s, 0%04o) %s\n", __func__,
               path, (unsigned)(mode & 07777),
               (rc < 0 ? strerror(errno) : ""));
-    if (rc < 0)        rc = CPIOERR_MKDIR_FAILED;
+    if (rc < 0)        rc = RPMERR_MKDIR_FAILED;
     return rc;
 }
 
@@ -1127,7 +383,7 @@ static int fsmMkfifo(const char *path, mode_t mode)
     }
 
     if (rc < 0)
-       rc = CPIOERR_MKFIFO_FAILED;
+       rc = RPMERR_MKFIFO_FAILED;
 
     return rc;
 }
@@ -1144,24 +400,24 @@ static int fsmMknod(const char *path, mode_t mode, dev_t dev)
     }
 
     if (rc < 0)
-       rc = CPIOERR_MKNOD_FAILED;
+       rc = RPMERR_MKNOD_FAILED;
 
     return rc;
 }
 
 /**
  * Create (if necessary) directories not explicitly included in package.
- * @param dnli         file state machine data
- * @param sehandle     selinux label handle (bah)
+ * @param files                file data
+ * @param fs           file states
  * @param plugins      rpm plugins handle
  * @return             0 on success
  */
-static int fsmMkdirs(rpmfi fi, rpmfs fs, struct selabel_handle *sehandle, rpmPlugins plugins)
+static int fsmMkdirs(rpmfiles files, rpmfs fs, rpmPlugins plugins)
 {
-    DNLI_t dnli = dnlInitIterator(fi, fs, 0);
+    DNLI_t dnli = dnlInitIterator(files, fs, 0);
     struct stat sb;
     const char *dpath;
-    int dc = rpmfiDC(fi);
+    int dc = rpmfilesDC(files);
     int rc = 0;
     int i;
     int ldnlen = 0;
@@ -1213,21 +469,35 @@ static int fsmMkdirs(rpmfi fi, rpmfs fs, struct selabel_handle *sehandle, rpmPlu
            if (rc == 0 && S_ISDIR(sb.st_mode)) {
                /* Move pre-existing path marker forward. */
                dnlx[dc] = (te - dn);
-           } else if (rc == CPIOERR_ENOENT) {
+           } else if (rc == RPMERR_ENOENT) {
                *te = '\0';
                mode_t mode = S_IFDIR | (_dirPerms & 07777);
-               rc = fsmMkdir(dn, mode);
+               rpmFsmOp op = (FA_CREATE|FAF_UNOWNED);
+
+               /* Run fsm file pre hook for all plugins */
+               rc = rpmpluginsCallFsmFilePre(plugins, NULL, dn, mode, op);
+
+               if (!rc)
+                   rc = fsmMkdir(dn, mode);
+
                if (!rc) {
-                   rc = fsmSetSELabel(sehandle, dn, mode);
+                   rc = rpmpluginsCallFsmFilePrepare(plugins, NULL, dn, dn,
+                                                     mode, op);
+               }
 
+               /* Run fsm file post hook for all plugins */
+               rpmpluginsCallFsmFilePost(plugins, NULL, dn, mode, op, rc);
+
+               if (!rc) {
                    rpmlog(RPMLOG_DEBUG,
                            "%s directory created with perms %04o\n",
                            dn, (unsigned)(mode & 07777));
                }
+
                if (!rc) {
-                   /* Run file closed hook for all plugins */
-                    rc = rpmpluginsCallFsmCommit(plugins, dn, mode, DIR_TYPE_UNOWNED);
-               }
+                       /* Run file closed hook for all plugins */
+                       rc = rpmpluginsCallFsmCommit(plugins, dn, mode, DIR_TYPE_UNOWNED);
+               }
                *te = '/';
            }
            if (rc)
@@ -1267,72 +537,14 @@ static void removeSBITS(const char *path)
     }
 }
 
-/********************************************************************/
-
-static void fsmReset(FSM_t fsm)
-{
-    fsm->path = _free(fsm->path);
-    fsm->postpone = 0;
-    fsm->diskchecked = fsm->exists = 0;
-    fsm->action = FA_UNKNOWN;
-    fsm->osuffix = NULL;
-    fsm->nsuffix = NULL;
-    memset(&(fsm->sb), 0, sizeof(fsm->sb));
-    memset(&(fsm->osb), 0, sizeof(fsm->sb));
-}
-
-static int fsmInit(FSM_t fsm)
+static void fsmDebug(const char *fpath, rpmFileAction action,
+                    const struct stat *st)
 {
-    int rc = 0;
-
-    /* On non-install, mode must be known so that dirs don't get suffix. */
-    if (fsm->goal != FSM_PKGINSTALL) {
-       rpmfi fi = fsmGetFi(fsm);
-       fsm->sb.st_mode = rpmfiFModeIndex(fi, fsm->ix);
-    }
-
-    /* Generate file path. */
-    rc = fsmMapPath(fsm, fsm->ix);
-    if (rc) return rc;
-
-    /* Perform lstat/stat for disk file. */
-    if (fsm->path != NULL &&
-       !(fsm->goal == FSM_PKGINSTALL && S_ISREG(fsm->sb.st_mode)))
-    {
-       int dolstat = !(fsm->mapFlags & CPIO_FOLLOW_SYMLINKS);
-       rc = fsmStat(fsm->path, dolstat, &fsm->osb);
-       if (rc == CPIOERR_ENOENT) {
-           // errno = saveerrno; XXX temporary commented out
-           rc = 0;
-           fsm->exists = 0;
-       } else if (rc == 0) {
-           fsm->exists = 1;
-       }
-    } else {
-       /* Skip %ghost files on build. */
-       fsm->exists = 0;
-    }
-    fsm->diskchecked = 1;
-    if (rc) return rc;
-
-    /* On non-install, the disk file stat is what's remapped. */
-    if (fsm->goal != FSM_PKGINSTALL)
-       fsm->sb = fsm->osb;                     /* structure assignment */
-
-    /* Remap file perms, owner, and group. */
-    rc = fsmMapAttrs(fsm);
-    if (rc) return rc;
-
-    fsm->postpone = XFA_SKIPPING(fsm->action);
-
     rpmlog(RPMLOG_DEBUG, "%-10s %06o%3d (%4d,%4d)%6d %s\n",
-          fileActionString(fsm->action), (int)fsm->sb.st_mode,
-          (int)fsm->sb.st_nlink, (int)fsm->sb.st_uid,
-          (int)fsm->sb.st_gid, (int)fsm->sb.st_size,
-           (fsm->path ? fsm->path : ""));
-
-    return rc;
-
+          fileActionString(action), (int)st->st_mode,
+          (int)st->st_nlink, (int)st->st_uid,
+          (int)st->st_gid, (int)st->st_size,
+           (fpath ? fpath : ""));
 }
 
 static int fsmSymlink(const char *opath, const char *path)
@@ -1345,29 +557,26 @@ static int fsmSymlink(const char *opath, const char *path)
     }
 
     if (rc < 0)
-       rc = CPIOERR_SYMLINK_FAILED;
+       rc = RPMERR_SYMLINK_FAILED;
     return rc;
 }
 
-static int fsmUnlink(const char *path, cpioMapFlags mapFlags)
+static int fsmUnlink(const char *path)
 {
     int rc = 0;
-    if (mapFlags & CPIO_SBIT_CHECK)
-        removeSBITS(path);
+    removeSBITS(path);
     rc = unlink(path);
     if (_fsm_debug)
        rpmlog(RPMLOG_DEBUG, " %8s (%s) %s\n", __func__,
               path, (rc < 0 ? strerror(errno) : ""));
     if (rc < 0)
-       rc = (errno == ENOENT ? CPIOERR_ENOENT : CPIOERR_UNLINK_FAILED);
+       rc = (errno == ENOENT ? RPMERR_ENOENT : RPMERR_UNLINK_FAILED);
     return rc;
 }
 
-static int fsmRename(const char *opath, const char *path,
-                    cpioMapFlags mapFlags)
+static int fsmRename(const char *opath, const char *path)
 {
-    if (mapFlags & CPIO_SBIT_CHECK)
-        removeSBITS(path);
+    removeSBITS(path);
     int rc = rename(opath, path);
 #if defined(ETXTBSY) && defined(__HPUX__)
     /* XXX HP-UX (and other os'es) don't permit rename to busy files. */
@@ -1382,30 +591,19 @@ static int fsmRename(const char *opath, const char *path,
     if (_fsm_debug)
        rpmlog(RPMLOG_DEBUG, " %8s (%s, %s) %s\n", __func__,
               opath, path, (rc < 0 ? strerror(errno) : ""));
-    if (rc < 0)        rc = CPIOERR_RENAME_FAILED;
+    if (rc < 0)
+       rc = (errno == EISDIR ? RPMERR_EXIST_AS_DIR : RPMERR_RENAME_FAILED);
     return rc;
 }
 
-
-static int fsmChown(const char *path, uid_t uid, gid_t gid)
+static int fsmRemove(const char *path, mode_t mode)
 {
-    int rc = chown(path, uid, gid);
-    if (rc < 0) {
-       struct stat st;
-       if (lstat(path, &st) == 0 && st.st_uid == uid && st.st_gid == gid)
-           rc = 0;
-    }
-    if (_fsm_debug)
-       rpmlog(RPMLOG_DEBUG, " %8s (%s, %d, %d) %s\n", __func__,
-              path, (int)uid, (int)gid,
-              (rc < 0 ? strerror(errno) : ""));
-    if (rc < 0)        rc = CPIOERR_CHOWN_FAILED;
-    return rc;
+    return S_ISDIR(mode) ? fsmRmdir(path) : fsmUnlink(path);
 }
 
-static int fsmLChown(const char *path, uid_t uid, gid_t gid)
+static int fsmChown(const char *path, mode_t mode, uid_t uid, gid_t gid)
 {
-    int rc = lchown(path, uid, gid);
+    int rc = S_ISLNK(mode) ? lchown(path, uid, gid) : chown(path, uid, gid);
     if (rc < 0) {
        struct stat st;
        if (lstat(path, &st) == 0 && st.st_uid == uid && st.st_gid == gid)
@@ -1415,7 +613,7 @@ static int fsmLChown(const char *path, uid_t uid, gid_t gid)
        rpmlog(RPMLOG_DEBUG, " %8s (%s, %d, %d) %s\n", __func__,
               path, (int)uid, (int)gid,
               (rc < 0 ? strerror(errno) : ""));
-    if (rc < 0)        rc = CPIOERR_CHOWN_FAILED;
+    if (rc < 0)        rc = RPMERR_CHOWN_FAILED;
     return rc;
 }
 
@@ -1431,76 +629,90 @@ static int fsmChmod(const char *path, mode_t mode)
        rpmlog(RPMLOG_DEBUG, " %8s (%s, 0%04o) %s\n", __func__,
               path, (unsigned)(mode & 07777),
               (rc < 0 ? strerror(errno) : ""));
-    if (rc < 0)        rc = CPIOERR_CHMOD_FAILED;
+    if (rc < 0)        rc = RPMERR_CHMOD_FAILED;
     return rc;
 }
 
-static int fsmUtime(const char *path, time_t mtime)
+static int fsmUtime(const char *path, mode_t mode, time_t mtime)
 {
     int rc = 0;
-    struct utimbuf stamp;
-    stamp.actime = mtime;
-    stamp.modtime = mtime;
-    rc = utime(path, &stamp);
+    struct timeval stamps[2] = {
+       { .tv_sec = mtime, .tv_usec = 0 },
+       { .tv_sec = mtime, .tv_usec = 0 },
+    };
+
+#if HAVE_LUTIMES
+    rc = lutimes(path, stamps);
+#else
+    if (!S_ISLNK(mode))
+       rc = utimes(path, stamps);
+#endif
+    
     if (_fsm_debug)
        rpmlog(RPMLOG_DEBUG, " %8s (%s, 0x%x) %s\n", __func__,
               path, (unsigned)mtime, (rc < 0 ? strerror(errno) : ""));
-    if (rc < 0)        rc = CPIOERR_UTIME_FAILED;
+    if (rc < 0)        rc = RPMERR_UTIME_FAILED;
+    /* ...but utime error is not critical for directories */
+    if (rc && S_ISDIR(mode))
+       rc = 0;
     return rc;
 }
 
-static int fsmVerify(FSM_t fsm)
+static int fsmVerify(const char *path, rpmfi fi, const struct stat *fsb)
 {
     int rc;
-    struct stat * st = &fsm->sb;
-    struct stat * ost = &fsm->osb;
     int saveerrno = errno;
+    struct stat dsb;
+    mode_t mode = rpmfiFMode(fi);
 
-    if (fsm->diskchecked && !fsm->exists) {
-        return CPIOERR_ENOENT;
-    }
-    if (S_ISREG(st->st_mode)) {
+    rc = fsmStat(path, 1, &dsb);
+    if (rc)
+       return rc;
+
+    if (S_ISREG(mode)) {
        /* HP-UX (and other os'es) don't permit unlink on busy files. */
-       char *rmpath = rstrscat(NULL, fsm->path, "-RPMDELETE", NULL);
-       rc = fsmRename(fsm->path, rmpath, fsm->mapFlags);
+       char *rmpath = rstrscat(NULL, path, "-RPMDELETE", NULL);
+       rc = fsmRename(path, rmpath);
        /* XXX shouldn't we take unlink return code here? */
        if (!rc)
-           (void) fsmUnlink(rmpath, fsm->mapFlags);
+           (void) fsmUnlink(rmpath);
        else
-           rc = CPIOERR_UNLINK_FAILED;
+           rc = RPMERR_UNLINK_FAILED;
        free(rmpath);
-        return (rc ? rc : CPIOERR_ENOENT);     /* XXX HACK */
-    } else if (S_ISDIR(st->st_mode)) {
-        if (S_ISDIR(ost->st_mode)) return 0;
-        if (S_ISLNK(ost->st_mode)) {
-            rc = fsmStat(fsm->path, 0, &fsm->osb);
-            if (rc == CPIOERR_ENOENT) rc = 0;
+        return (rc ? rc : RPMERR_ENOENT);      /* XXX HACK */
+    } else if (S_ISDIR(mode)) {
+        if (S_ISDIR(dsb.st_mode)) return 0;
+        if (S_ISLNK(dsb.st_mode)) {
+           uid_t luid = dsb.st_uid;
+            rc = fsmStat(path, 0, &dsb);
+            if (rc == RPMERR_ENOENT) rc = 0;
             if (rc) return rc;
             errno = saveerrno;
-            if (S_ISDIR(ost->st_mode)) return 0;
+           /* Only permit directory symlinks by target owner and root */
+            if (S_ISDIR(dsb.st_mode) && (luid == 0 || luid == fsb->st_uid))
+                   return 0;
         }
-    } else if (S_ISLNK(st->st_mode)) {
-        if (S_ISLNK(ost->st_mode)) {
+    } else if (S_ISLNK(mode)) {
+        if (S_ISLNK(dsb.st_mode)) {
             char buf[8 * BUFSIZ];
             size_t len;
-            rc = fsmReadLink(fsm->path, buf, 8 * BUFSIZ, &len);
+            rc = fsmReadLink(path, buf, 8 * BUFSIZ, &len);
             errno = saveerrno;
             if (rc) return rc;
-           /* FSM_PROCESS puts link target to fsm->buf. */
-            if (rstreq(fsm->buf, buf)) return 0;
+            if (rstreq(rpmfiFLink(fi), buf)) return 0;
         }
-    } else if (S_ISFIFO(st->st_mode)) {
-        if (S_ISFIFO(ost->st_mode)) return 0;
-    } else if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
-        if ((S_ISCHR(ost->st_mode) || S_ISBLK(ost->st_mode)) &&
-            (ost->st_rdev == st->st_rdev)) return 0;
-    } else if (S_ISSOCK(st->st_mode)) {
-        if (S_ISSOCK(ost->st_mode)) return 0;
+    } else if (S_ISFIFO(mode)) {
+        if (S_ISFIFO(dsb.st_mode)) return 0;
+    } else if (S_ISCHR(mode) || S_ISBLK(mode)) {
+        if ((S_ISCHR(dsb.st_mode) || S_ISBLK(dsb.st_mode)) &&
+            (dsb.st_rdev == rpmfiFRdev(fi))) return 0;
+    } else if (S_ISSOCK(mode)) {
+        if (S_ISSOCK(dsb.st_mode)) return 0;
     }
     /* XXX shouldn't do this with commit/undo. */
-    rc = fsmUnlink(fsm->path, fsm->mapFlags);
-    if (rc == 0)       rc = CPIOERR_ENOENT;
-    return (rc ? rc : CPIOERR_ENOENT); /* XXX HACK */
+    rc = fsmUnlink(path);
+    if (rc == 0)       rc = RPMERR_ENOENT;
+    return (rc ? rc : RPMERR_ENOENT);  /* XXX HACK */
 }
 
 #define        IS_DEV_LOG(_x)  \
@@ -1512,88 +724,101 @@ static int fsmVerify(FSM_t fsm)
 
 
 /* Rename pre-existing modified or unmanaged file. */
-static int fsmBackup(FSM_t fsm)
+static int fsmBackup(rpmfi fi, rpmFileAction action)
 {
     int rc = 0;
+    const char *suffix = NULL;
 
-    /* FIXME: %ghost can have backup action but no suffix */
-    if ((fsm->action == FA_SAVE || fsm->action == FA_BACKUP) && fsm->osuffix) {
-        char * opath = fsmFsPath(fsm, S_ISDIR(fsm->sb.st_mode), NULL);
-        char * path = fsmFsPath(fsm, 0, fsm->osuffix);
-        rc = fsmRename(opath, path, fsm->mapFlags);
-        if (!rc) {
-            rpmlog(RPMLOG_WARNING, _("%s saved as %s\n"), opath, path);
-            fsm->exists = 0; /* it doesn't exist anymore... */
-        }
-        free(path);
-        free(opath);
+    if (!(rpmfiFFlags(fi) & RPMFILE_GHOST)) {
+       switch (action) {
+       case FA_SAVE:
+           suffix = SUFFIX_RPMSAVE;
+           break;
+       case FA_BACKUP:
+           suffix = SUFFIX_RPMORIG;
+           break;
+       default:
+           break;
+       }
+    }
+
+    if (suffix) {
+       char * opath = fsmFsPath(fi, NULL);
+       char * path = fsmFsPath(fi, suffix);
+       rc = fsmRename(opath, path);
+       if (!rc) {
+           rpmlog(RPMLOG_WARNING, _("%s saved as %s\n"), opath, path);
+       }
+       free(path);
+       free(opath);
     }
     return rc;
 }
 
-static int fsmCommit(FSM_t fsm, int ix)
+static int fsmSetmeta(const char *path, rpmfi fi, rpmPlugins plugins,
+                     rpmFileAction action, const struct stat * st,
+                     int nofcaps)
+{
+    int rc = 0;
+    const char *dest = rpmfiFN(fi);
+
+    if (!rc && !getuid()) {
+       rc = fsmChown(path, st->st_mode, st->st_uid, st->st_gid);
+    }
+    if (!rc && !S_ISLNK(st->st_mode)) {
+       rc = fsmChmod(path, st->st_mode);
+    }
+    /* Set file capabilities (if enabled) */
+    if (!rc && !nofcaps && S_ISREG(st->st_mode) && !getuid()) {
+       rc = fsmSetFCaps(path, rpmfiFCaps(fi));
+    }
+    if (!rc) {
+       rc = fsmUtime(path, st->st_mode, rpmfiFMtime(fi));
+    }
+    if (!rc) {
+       rc = rpmpluginsCallFsmFilePrepare(plugins, fi,
+                                         path, dest, st->st_mode, action);
+    }
+
+    return rc;
+}
+
+static int fsmCommit(char **path, rpmfi fi, rpmFileAction action, const char *suffix, rpmPlugins plugins)
 {
     int rc = 0;
-    struct stat * st = &fsm->sb;
 
     /* XXX Special case /dev/log, which shouldn't be packaged anyways */
-    if (!S_ISSOCK(st->st_mode) && !IS_DEV_LOG(fsm->path)) {
-       /* Backup on-disk file if needed. Directories are handled earlier */
-       if (!S_ISDIR(st->st_mode))
-           rc = fsmBackup(fsm);
-        /* Rename temporary to final file name. */
-        if (!S_ISDIR(st->st_mode) && (fsm->suffix || fsm->nsuffix)) {
-            char *npath = fsmFsPath(fsm, 0, fsm->nsuffix);
-            rc = fsmRename(fsm->path, npath, fsm->mapFlags);
-            if (!rc && fsm->nsuffix) {
-                char * opath = fsmFsPath(fsm, 0, NULL);
-                rpmlog(RPMLOG_WARNING, _("%s created as %s\n"),
-                       opath, npath);
-                free(opath);
-            }
-            free(fsm->path);
-            fsm->path = npath;
-        }
-        /* Set file security context (if enabled) */
-        if (!rc && !getuid()) {
-            rc = fsmSetSELabel(fsm->sehandle, fsm->path, fsm->sb.st_mode);
-        }
+    if (!(S_ISSOCK(rpmfiFMode(fi)) && IS_DEV_LOG(*path))) {
+               const char *nsuffix = (action == FA_ALTNAME) ? SUFFIX_RPMNEW : NULL;
+               char *dest = *path;
+               /* Construct final destination path (nsuffix is usually NULL) */
+               if (suffix)
+                   dest = fsmFsPath(fi, nsuffix);
+
+               /* Rename temporary to final file name if needed. */
+               if (dest != *path) {
+                   rc = fsmRename(*path, dest);
+                   if (!rc && nsuffix) {
+                       char * opath = fsmFsPath(fi, NULL);
+                       rpmlog(RPMLOG_WARNING, _("%s created as %s\n"),
+                              opath, dest);
+                       free(opath);
+                   }
+                   free(*path);
+                   *path = dest;
+               }
         /* Call fsm commit hook for all plugins */
         if (!rc) {
-            rc = rpmpluginsCallFsmCommit(fsm->plugins, fsm->path, fsm->sb.st_mode, DIR_TYPE_NORMAL);
-        }
-        if (S_ISLNK(st->st_mode)) {
-            if (!rc && !getuid())
-                rc = fsmLChown(fsm->path, fsm->sb.st_uid, fsm->sb.st_gid);
-        } else {
-            rpmfi fi = fsmGetFi(fsm);
-            if (!rc && !getuid())
-                rc = fsmChown(fsm->path, fsm->sb.st_uid, fsm->sb.st_gid);
-            if (!rc)
-                rc = fsmChmod(fsm->path, fsm->sb.st_mode);
-            if (!rc) {
-                rc = fsmUtime(fsm->path, rpmfiFMtimeIndex(fi, ix));
-                /* utime error is not critical for directories */
-                if (rc && S_ISDIR(st->st_mode))
-                    rc = 0;
-            }
-            /* Set file capabilities (if enabled) */
-            if (!rc && !S_ISDIR(st->st_mode) && !getuid()) {
-                rc = fsmSetFCaps(fsm->path, rpmfiFCapsIndex(fi, ix));
-            }
+            rc = rpmpluginsCallFsmCommit(plugins, *path, rpmfiFMode(fi), DIR_TYPE_NORMAL);
         }
     }
 
-    if (rc && fsm->failedFile && *fsm->failedFile == NULL) {
-        *fsm->failedFile = fsm->path;
-        fsm->path = NULL;
-    }
     return rc;
 }
 
 /**
  * Return formatted string representation of file disposition.
- * @param a            file dispostion
+ * @param a            file disposition
  * @return             formatted string
  */
 static const char * fileActionString(rpmFileAction a)
@@ -1601,8 +826,6 @@ static const char * fileActionString(rpmFileAction a)
     switch (a) {
     case FA_UNKNOWN:   return "unknown";
     case FA_CREATE:    return "create";
-    case FA_COPYOUT:   return "copyout";
-    case FA_COPYIN:    return "copyin";
     case FA_BACKUP:    return "backup";
     case FA_SAVE:      return "save";
     case FA_SKIP:      return "skip";
@@ -1611,14 +834,15 @@ static const char * fileActionString(rpmFileAction a)
     case FA_SKIPNSTATE: return "skipnstate";
     case FA_SKIPNETSHARED: return "skipnetshared";
     case FA_SKIPCOLOR: return "skipcolor";
+    case FA_TOUCH:     return "touch";
     default:           return "???";
     }
 }
 
 /* Remember any non-regular file state for recording in the rpmdb */
-static void setFileState(rpmfs fs, int i, rpmFileAction action)
+static void setFileState(rpmfs fs, int i)
 {
-    switch (action) {
+    switch (rpmfsGetAction(fs, i)) {
     case FA_SKIPNSTATE:
        rpmfsSetState(fs, i, RPMFILE_STATE_NOTINSTALLED);
        break;
@@ -1628,219 +852,223 @@ static void setFileState(rpmfs fs, int i, rpmFileAction action)
     case FA_SKIPCOLOR:
        rpmfsSetState(fs, i, RPMFILE_STATE_WRONGCOLOR);
        break;
+    case FA_TOUCH:
+       rpmfsSetState(fs, i, RPMFILE_STATE_NORMAL);
+       break;
     default:
        break;
     }
 }
 
-int rpmPackageFilesInstall(rpmts ts, rpmte te, rpmfi fi, FD_t cfd,
+int rpmPackageFilesInstall(rpmts ts, rpmte te, rpmfiles files,
               rpmpsm psm, char ** failedFile)
 {
+    FD_t payload = rpmtePayload(te);
+    rpmfi fi = rpmfiNewArchiveReader(payload, files, RPMFI_ITER_READ_ARCHIVE);
     rpmfs fs = rpmteGetFileStates(te);
-    FSM_t fsm = fsmNew(FSM_PKGINSTALL, fs, fi, failedFile);
-    rpmcpio_t archive = rpmcpioOpen(cfd, O_RDONLY);
-    struct stat * st = &fsm->sb;
+    rpmPlugins plugins = rpmtsPlugins(ts);
+    struct stat sb;
     int saveerrno = errno;
     int rc = 0;
-    int nodigest = (rpmtsFlags(ts) & RPMTRANS_FLAG_NOFILEDIGEST);
-
-    if (!rpmteIsSource(te))
-       fsm->mapFlags |= CPIO_SBIT_CHECK;
-
-    if (archive == NULL)
-       rc = CPIOERR_INTERNAL;
+    int nodigest = (rpmtsFlags(ts) & RPMTRANS_FLAG_NOFILEDIGEST) ? 1 : 0;
+    int nofcaps = (rpmtsFlags(ts) & RPMTRANS_FLAG_NOCAPS) ? 1 : 0;
+    int firsthardlink = -1;
+    FD_t firstlinkfile = NULL;
+    int skip;
+    rpmFileAction action;
+    char *tid = NULL;
+    const char *suffix;
+    char *fpath = NULL;
+
+    if (fi == NULL) {
+       rc = RPMERR_BAD_MAGIC;
+       goto exit;
+    }
 
-    fsm->sehandle = rpmtsSELabelHandle(ts);
-    fsm->plugins = rpmtsPlugins(ts);
-        
     /* transaction id used for temporary path suffix while installing */
-    rasprintf(&fsm->suffix, ";%08x", (unsigned)rpmtsGetTid(ts));
+    rasprintf(&tid, ";%08x", (unsigned)rpmtsGetTid(ts));
 
     /* Detect and create directories not explicitly in package. */
-    if (!rc) {
-       rc = fsmMkdirs(fi, rpmteGetFileStates(te), fsm->sehandle, fsm->plugins);
-    }
+    rc = fsmMkdirs(files, fs, plugins);
 
     while (!rc) {
-       hardLink_t li = NULL;
-
-        /* Clean fsm, free'ing memory. */
-       fsmReset(fsm);
-
        /* Read next payload header. */
-        rc = rpmcpioHeaderRead(archive, &(fsm->path), &(fsm->sb));
+       rc = rpmfiNext(fi);
 
-       /* Detect and exit on end-of-payload. */
-       if (rc == CPIOERR_HDR_TRAILER) {
-           rc = 0;
+       if (rc < 0) {
+           if (rc == RPMERR_ITER_END)
+               rc = 0;
            break;
        }
 
-       if (rc) break;
-
-       /* Identify mapping index. */
-       fsm->ix = mapFind(fsm->iter, fsm->path);
-
-       /* Mapping error */
-       if (fsm->ix < 0) {
-           if (fsm->failedFile && *fsm->failedFile == NULL)
-               *fsm->failedFile = xstrdup(fsm->path);
-           rc = CPIOERR_UNMAPPED_FILE;
-           break;
+       action = rpmfsGetAction(fs, rpmfiFX(fi));
+       skip = XFA_SKIPPING(action);
+       suffix = S_ISDIR(rpmfiFMode(fi)) ? NULL : tid;
+       if (action != FA_TOUCH) {
+           fpath = fsmFsPath(fi, suffix);
+       } else {
+           fpath = fsmFsPath(fi, "");
        }
 
-        rc = fsmInit(fsm);
+       /* Remap file perms, owner, and group. */
+       rc = rpmfiStat(fi, 1, &sb);
 
-        /* Exit on error. */
-        if (rc) {
-            fsm->postpone = 1;
-            break;
-        }
+       fsmDebug(fpath, action, &sb);
 
-       /* Run fsm init hook for all plugins */
-        rc = rpmpluginsCallFsmInit(fsm->plugins, fsm->path, fsm->sb.st_mode);
-        
         /* Exit on error. */
-        if (rc) {
-            fsm->postpone = 1;
+        if (rc)
             break;
-        }
-       
-       if (S_ISREG(fsm->sb.st_mode) && fsm->sb.st_nlink > 1)
-           fsm->postpone = saveHardLink(fsm, &li);
-
-       setFileState(rpmteGetFileStates(te), fsm->ix, fsm->action);
-
-        if (!fsm->postpone) {
-            if (S_ISREG(st->st_mode)) {
-                rc = fsmVerify(fsm);
-                if (!(rc == CPIOERR_ENOENT)) return rc;
-                rc = expandRegular(fsm, psm, archive, nodigest);
-            } else if (S_ISDIR(st->st_mode)) {
-               /* Directories replacing something need early backup */
-                rc = fsmBackup(fsm);
-                rc = fsmVerify(fsm);
-                if (rc == CPIOERR_ENOENT) {
-                    mode_t mode = st->st_mode;
+               
+       /* Run fsm init hook for all plugins */
+       //FIXME. functions related with msm.
+       rc = rpmpluginsCallFsmInit(plugins, fpath, sb.st_mode);
+
+       /* Run fsm file pre hook for all plugins */
+       rc = rpmpluginsCallFsmFilePre(plugins, fi, fpath,
+                                     sb.st_mode, action);
+       if (rc) {
+           skip = 1;
+       } else {
+           setFileState(fs, rpmfiFX(fi));
+       }
+
+        if (!skip) {
+           int setmeta = 1;
+
+           /* Directories replacing something need early backup */
+           if (!suffix) {
+               rc = fsmBackup(fi, action);
+           }
+           /* Assume file does't exist when tmp suffix is in use */
+           if (!suffix) {
+               rc = fsmVerify(fpath, fi, &sb);
+           } else {
+               rc = (action == FA_TOUCH) ? 0 : RPMERR_ENOENT;
+           }
+
+            if (S_ISREG(sb.st_mode)) {
+               if (rc == RPMERR_ENOENT) {
+                   rc = fsmMkfile(fi, fpath, files, psm, nodigest,
+                                  &setmeta, &firsthardlink, &firstlinkfile);
+               }
+            } else if (S_ISDIR(sb.st_mode)) {
+                if (rc == RPMERR_ENOENT) {
+                    mode_t mode = sb.st_mode;
                     mode &= ~07777;
                     mode |=  00700;
-                    rc = fsmMkdir(fsm->path, mode);
+                    rc = fsmMkdir(fpath, mode);
                 }
-            } else if (S_ISLNK(st->st_mode)) {
-                if ((st->st_size + 1) > fsm->bufsize) {
-                    rc = CPIOERR_HDR_SIZE;
-                } else if (rpmcpioRead(archive, fsm->buf, st->st_size) != st->st_size) {
-                    rc = CPIOERR_READ_FAILED;
-                } else {
-
-                    fsm->buf[st->st_size] = '\0';
-                    /* fsmVerify() assumes link target in fsm->buf */
-                    rc = fsmVerify(fsm);
-                    if (rc == CPIOERR_ENOENT) {
-                        rc = fsmSymlink(fsm->buf, fsm->path);
-                    }
-                }
-            } else if (S_ISFIFO(st->st_mode)) {
-                /* This mimics cpio S_ISSOCK() behavior but probably isnt' right */
-                rc = fsmVerify(fsm);
-                if (rc == CPIOERR_ENOENT) {
-                    rc = fsmMkfifo(fsm->path, 0000);
+            } else if (S_ISLNK(sb.st_mode)) {
+               if (rc == RPMERR_ENOENT) {
+                   rc = fsmSymlink(rpmfiFLink(fi), fpath);
+               }
+            } else if (S_ISFIFO(sb.st_mode)) {
+                /* This mimics cpio S_ISSOCK() behavior but probably isn't right */
+                if (rc == RPMERR_ENOENT) {
+                    rc = fsmMkfifo(fpath, 0000);
                 }
-            } else if (S_ISCHR(st->st_mode) ||
-                       S_ISBLK(st->st_mode) ||
-                       S_ISSOCK(st->st_mode))
+            } else if (S_ISCHR(sb.st_mode) ||
+                       S_ISBLK(sb.st_mode) ||
+                       S_ISSOCK(sb.st_mode))
             {
-                rc = fsmVerify(fsm);
-                if (rc == CPIOERR_ENOENT) {
-                    rc = fsmMknod(fsm->path, fsm->sb.st_mode, fsm->sb.st_rdev);
+                if (rc == RPMERR_ENOENT) {
+                    rc = fsmMknod(fpath, sb.st_mode, sb.st_rdev);
                 }
             } else {
                 /* XXX Special case /dev/log, which shouldn't be packaged anyways */
-                if (!IS_DEV_LOG(fsm->path))
-                    rc = CPIOERR_UNKNOWN_FILETYPE;
+                if (!IS_DEV_LOG(fpath))
+                    rc = RPMERR_UNKNOWN_FILETYPE;
             }
-            if (li != NULL) {
-                li->createdPath = li->linkIndex;
-                rc = fsmMakeLinks(fsm, li);
-            }
-        }
+           /* Set permissions, timestamps etc for non-hardlink entries */
+           if (!rc && setmeta) {
+               rc = fsmSetmeta(fpath, fi, plugins, action, &sb, nofcaps);
+           }
+        } else if (firsthardlink >= 0 && rpmfiArchiveHasContent(fi)) {
+           /* we skip the hard linked file containing the content */
+           /* write the content to the first used instead */
+           char *fn = rpmfilesFN(files, firsthardlink);
+           rc = rpmfiArchiveReadToFilePsm(fi, firstlinkfile, nodigest, psm);
+           wfd_close(&firstlinkfile);
+           firsthardlink = -1;
+           free(fn);
+       }
 
         if (rc) {
-            if (!fsm->postpone) {
+            if (!skip) {
                 /* XXX only erase if temp fn w suffix is in use */
-                if (fsm->suffix) {
-                    if (S_ISDIR(st->st_mode)) {
-                        (void) fsmRmdir(fsm->path);
-                    } else {
-                        (void) fsmUnlink(fsm->path, fsm->mapFlags);
-                    }
+                if (suffix && (action != FA_TOUCH)) {
+                   (void) fsmRemove(fpath, sb.st_mode);
                 }
                 errno = saveerrno;
-                if (fsm->failedFile && *fsm->failedFile == NULL)
-                    *fsm->failedFile = xstrdup(fsm->path);
             }
+        } else {
+           /* Notify on success. */
+           rpmpsmNotify(psm, RPMCALLBACK_INST_PROGRESS, rpmfiArchiveTell(fi));
 
-            break;
-        }
+           if (!skip) {
+               /* Backup file if needed. Directories are handled earlier */
+               if (suffix)
+                   rc = fsmBackup(fi, action);
 
-        /* Notify on success. */
-        rpmpsmNotify(psm, RPMCALLBACK_INST_PROGRESS, rpmcpioTell(archive));
+               if (!rc)
+                   rc = fsmCommit(&fpath, fi, action, suffix, plugins);
+           }
+       }
 
-        if (!fsm->postpone) {
-            rc = ((S_ISREG(st->st_mode) && st->st_nlink > 1)
-                  ? fsmCommitLinks(fsm) : fsmCommit(fsm, fsm->ix));
-        }
-        if (rc) {
-            break;
-        }
+       if (rc)
+           *failedFile = xstrdup(fpath);
+
+       /* Run fsm file post hook for all plugins */
+       rpmpluginsCallFsmFilePost(plugins, fi, fpath,
+                                 sb.st_mode, action, rc);
+       fpath = _free(fpath);
     }
 
-    if (!rc)
-       rc = checkHardLinks(fsm);
+    rpmswAdd(rpmtsOp(ts, RPMTS_OP_UNCOMPRESS), fdOp(payload, FDSTAT_READ));
+    rpmswAdd(rpmtsOp(ts, RPMTS_OP_DIGEST), fdOp(payload, FDSTAT_DIGEST));
+
+exit:
 
     /* No need to bother with close errors on read */
-    rpmcpioFree(archive);
-    fsmFree(fsm);
+    rpmfiArchiveClose(fi);
+    rpmfiFree(fi);
+    Fclose(payload);
+    free(tid);
+    free(fpath);
 
     return rc;
 }
 
 
-int rpmPackageFilesRemove(rpmts ts, rpmte te, rpmfi fi,
+int rpmPackageFilesRemove(rpmts ts, rpmte te, rpmfiles files,
               rpmpsm psm, char ** failedFile)
 {
+    rpmfi fi = rpmfilesIter(files, RPMFI_ITER_BACK);
     rpmfs fs = rpmteGetFileStates(te);
-    FSM_t fsm = fsmNew(FSM_PKGERASE, fs, fi, failedFile);
+    rpmPlugins plugins = rpmtsPlugins(ts);
+    struct stat sb;
     int rc = 0;
+    char *fpath = NULL;
 
-    if (!rpmteIsSource(te))
-       fsm->mapFlags |= CPIO_SBIT_CHECK;
+    while (!rc && rpmfiNext(fi) >= 0) {
+       rpmFileAction action = rpmfsGetAction(fs, rpmfiFX(fi));
+       fpath = fsmFsPath(fi, NULL);
+       rc = fsmStat(fpath, 1, &sb);
 
-    while (!rc) {
-        /* Clean fsm, free'ing memory. */
-       fsmReset(fsm);
-
-       /* Identify mapping index. */
-       fsm->ix = mapNextIterator(fsm->iter);
+       fsmDebug(fpath, action, &sb);
 
-        /* Exit on end-of-payload. */
-        if (fsm->ix < 0)
-            break;
+       /* Run fsm file pre hook for all plugins */
+       rc = rpmpluginsCallFsmFilePre(plugins, fi, fpath,
+                                     sb.st_mode, action);
 
-        rc = fsmInit(fsm);
-
-       if (!fsm->postpone)
-           rc = fsmBackup(fsm);
+       if (!XFA_SKIPPING(action))
+           rc = fsmBackup(fi, action);
 
         /* Remove erased files. */
-        if (!fsm->postpone && fsm->action == FA_ERASE) {
-           int missingok = (fsm->fflags & (RPMFILE_MISSINGOK | RPMFILE_GHOST));
+        if (action == FA_ERASE) {
+           int missingok = (rpmfiFFlags(fi) & (RPMFILE_MISSINGOK | RPMFILE_GHOST));
 
-            if (S_ISDIR(fsm->sb.st_mode)) {
-                rc = fsmRmdir(fsm->path);
-            } else {
-                rc = fsmUnlink(fsm->path, fsm->mapFlags);
-           }
+           rc = fsmRemove(fpath, sb.st_mode);
 
            /*
             * Missing %ghost or %missingok entries are not errors.
@@ -1849,7 +1077,7 @@ int rpmPackageFilesRemove(rpmts ts, rpmte te, rpmfi fi,
             * and complaining about job already done seems like kinderkarten
             * level "But it was MY turn!" whining...
             */
-           if (rc == CPIOERR_ENOENT && missingok) {
+           if (rc == RPMERR_ENOENT && missingok) {
                rc = 0;
            }
 
@@ -1858,112 +1086,41 @@ int rpmPackageFilesRemove(rpmts ts, rpmte te, rpmfi fi,
             * to track at least some of the expected failures though,
             * such as when we knowingly left config file backups etc behind.
             */
-           if (rc == CPIOERR_ENOTEMPTY) {
+           if (rc == RPMERR_ENOTEMPTY) {
                rc = 0;
            }
 
            if (rc) {
                int lvl = strict_erasures ? RPMLOG_ERR : RPMLOG_WARNING;
                rpmlog(lvl, _("%s %s: remove failed: %s\n"),
-                       S_ISDIR(fsm->sb.st_mode) ? _("directory") : _("file"),
-                       fsm->path, strerror(errno));
+                       S_ISDIR(sb.st_mode) ? _("directory") : _("file"),
+                       fpath, strerror(errno));
             }
         }
+
+       /* Run fsm file post hook for all plugins */
+       rpmpluginsCallFsmFilePost(plugins, fi, fpath,
+                                 sb.st_mode, action, rc);
+
         /* XXX Failure to remove is not (yet) cause for failure. */
         if (!strict_erasures) rc = 0;
 
-        if (rc) break;
+       if (rc)
+           *failedFile = xstrdup(fpath);
 
-        /* Notify on success. */
-        /* On erase we're iterating backwards, fixup for progress */
-        rpm_loff_t amount = (fsm->ix >= 0) ?
-            rpmfiFC(fsmGetFi(fsm)) - fsm->ix : 0;
-        rpmpsmNotify(psm, RPMCALLBACK_UNINST_PROGRESS, amount);
+       if (rc == 0) {
+           /* Notify on success. */
+           /* On erase we're iterating backwards, fixup for progress */
+           rpm_loff_t amount = rpmfiFC(fi) - rpmfiFX(fi);
+           rpmpsmNotify(psm, RPMCALLBACK_UNINST_PROGRESS, amount);
+       }
+       fpath = _free(fpath);
     }
 
-    fsmFree(fsm);
+    free(fpath);
+    rpmfiFree(fi);
 
     return rc;
 }
 
 
-int rpmPackageFilesArchive(rpmfi fi, int isSrc, FD_t cfd,
-              rpm_loff_t * archiveSize, char ** failedFile)
-{
-    rpmfs fs = rpmfsNew(rpmfiFC(fi), 0);;
-    FSM_t fsm = fsmNew(FSM_PKGBUILD, fs, fi, failedFile);;
-    rpmcpio_t archive = rpmcpioOpen(cfd, O_WRONLY);
-    int rc = 0;
-
-    fsm->mapFlags |= CPIO_MAP_TYPE;
-    if (isSrc) 
-       fsm->mapFlags |= CPIO_FOLLOW_SYMLINKS;
-
-    if (archive == NULL) {
-       rc = CPIOERR_INTERNAL;
-    } else {
-       int ghost, i, fc = rpmfiFC(fi);
-
-       /* XXX Is this actually still needed? */
-       for (i = 0; i < fc; i++) {
-           ghost = (rpmfiFFlagsIndex(fi, i) & RPMFILE_GHOST);
-           rpmfsSetAction(fs, i, ghost ? FA_SKIP : FA_COPYOUT);
-       }
-    }
-           
-    while (!rc) {
-       fsmReset(fsm);
-
-       /* Identify mapping index. */
-       fsm->ix = mapNextIterator(fsm->iter);
-
-        /* Exit on end-of-payload. */
-        if (fsm->ix < 0)
-            break;
-
-        rc = fsmInit(fsm);
-
-        /* Exit on error. */
-        if (rc) {
-            fsm->postpone = 1;
-            break;
-        }
-
-       if (S_ISREG(fsm->sb.st_mode) && fsm->sb.st_nlink > 1)
-           fsm->postpone = saveHardLink(fsm, NULL);
-
-        if (fsm->postpone || fsm->fflags & RPMFILE_GHOST) /* XXX Don't if %ghost file. */
-            continue;
-        /* Hardlinks are handled later */
-        if (!(S_ISREG(fsm->sb.st_mode) && fsm->sb.st_nlink > 1)) {
-            /* Copy file into archive. */
-            rc = writeFile(fsm, 1, archive, fsm->ix);
-        }
-
-        if (rc) {
-            if (!fsm->postpone) {
-                if (fsm->failedFile && *fsm->failedFile == NULL)
-                    *fsm->failedFile = xstrdup(fsm->path);
-            }
-
-            break;
-        }
-    }
-
-    /* Flush partial sets of hard linked files. */
-    if (!rc)
-        rc = writeLinks(fsm, archive);
-
-    /* Finish the payload stream */
-    if (!rc)
-       rc = rpmcpioClose(archive);
-
-    if (archiveSize)
-       *archiveSize = (rc == 0) ? rpmcpioTell(archive) : 0;
-
-    rpmcpioFree(archive);
-    rpmfsFree(fs);
-    fsmFree(fsm);
-
-    return rc;
-}
index 7f191140620eaa4275eab978094addad1799301b..7a75caf5ab200734cff4339ff30243ed40bdcdf2 100644 (file)
--- a/lib/fsm.h
+++ b/lib/fsm.h
@@ -17,22 +17,21 @@ typedef struct rpmpsm_s * rpmpsm;
 /**
  * Execute a file actions for package
  * @param ts           transaction set
- * @param fi           transaction element file info
- * @param cfd
+ * @param te           transaction set element
+ * @param files                transaction element file info
  * @param psm          owner psm (or NULL)
- * @retval archiveSize pointer to archive size
  * @retval failedFile  pointer to first file name that failed (malloced)
  * @return             0 on success
  */
 
-int rpmPackageFilesInstall(rpmts ts, rpmte te, rpmfi fi, FD_t cfd,
+int rpmPackageFilesInstall(rpmts ts, rpmte te, rpmfiles files,
               rpmpsm psm, char ** failedFile);
 
-int rpmPackageFilesRemove(rpmts ts, rpmte te, rpmfi fi,
+int rpmPackageFilesRemove(rpmts ts, rpmte te, rpmfiles files,
               rpmpsm psm, char ** failedFile);
 
-int rpmPackageFilesArchive(rpmfi fi, int isSrc, FD_t cfd,
-              rpm_loff_t * archiveSize, char ** failedFile);
+RPM_GNUC_INTERNAL
+int rpmfiArchiveReadToFilePsm(rpmfi fi, FD_t fd, int nodigest, rpmpsm psm);
 
 RPM_GNUC_INTERNAL
 void rpmpsmNotify(rpmpsm psm, int what, rpm_loff_t amount);
index 90079f307b0ab38498e850a51165892b620991cf..0d50f0dafe74f2ca5e47f7e3702a50a12aa40d51 100644 (file)
@@ -11,6 +11,7 @@
 #include "system.h"
 #include <netdb.h>
 #include <errno.h>
+#include <inttypes.h>
 #include <rpm/rpmtypes.h>
 #include <rpm/rpmstring.h>
 #include "lib/header_internal.h"
@@ -69,8 +70,13 @@ static const int typeSizes[16] =  {
     0
 };
 
+enum headerSorted_e {
+    HEADERSORT_NONE    = 0,    /* Not sorted */
+    HEADERSORT_OFFSET  = 1,    /* Sorted by offset (on-disk format) */
+    HEADERSORT_INDEX   = 2,    /* Sorted by index  */
+};
+
 enum headerFlags_e {
-    HEADERFLAG_SORTED    = (1 << 0), /*!< Are header entries sorted? */
     HEADERFLAG_ALLOCATED = (1 << 1), /*!< Is 1st header region allocated? */
     HEADERFLAG_LEGACY    = (1 << 2), /*!< Header came from legacy source? */
     HEADERFLAG_DEBUG     = (1 << 3), /*!< Debug this header? */
@@ -78,6 +84,17 @@ enum headerFlags_e {
 
 typedef rpmFlags headerFlags;
 
+/** \ingroup header
+ * A single tag from a Header.
+ */
+typedef struct indexEntry_s * indexEntry;
+struct indexEntry_s {
+    struct entryInfo_s info;   /*!< Description of tag data. */
+    rpm_data_t data;           /*!< Location of tag data. */
+    int length;                        /*!< No. bytes of data. */
+    int rdlen;                 /*!< No. bytes of data in region. */
+};
+
 /** \ingroup header
  * The Header data structure.
  */
@@ -88,13 +105,14 @@ struct headerToken_s {
     int indexAlloced;          /*!< Allocated size of tag array. */
     unsigned int instance;     /*!< Rpmdb instance (offset) */
     headerFlags flags;
+    int sorted;                        /*!< Current sort method */
     int nrefs;                 /*!< Reference count. */
 };
 
 /** \ingroup header
  * Maximum no. of bytes permitted in a header.
  */
-static const size_t headerMaxbytes = (32*1024*1024);
+static const size_t headerMaxbytes = (256*1024*1024);
 
 #define        INDEX_MALLOC_SIZE       8
 
@@ -102,16 +120,62 @@ static const size_t headerMaxbytes = (32*1024*1024);
        (((_e)->info.tag >= RPMTAG_HEADERIMAGE) && ((_e)->info.tag < RPMTAG_HEADERREGIONS))
 #define        ENTRY_IN_REGION(_e)     ((_e)->info.offset < 0)
 
+#define        REGION_TAG_TYPE         RPM_BIN_TYPE
+#define        REGION_TAG_COUNT        sizeof(struct entryInfo_s)
+
+/**
+ * Sanity check on no. of tags.
+ * This check imposes a limit of 65K tags, more than enough.
+ */
+#define HEADER_TAGS_MAX 0x0000ffff
+#define hdrchkTags(_ntags)      ((_ntags) & (~HEADER_TAGS_MAX))
+
+/**
+ * Sanity check on tag values.
+ * Catches out nasties like negative values and multiple regions.
+ **/
+#define hdrchkTag(_tag) ((_tag) < HEADER_I18NTABLE)
+
+/**
+ * Sanity check on type values.
+ */
+#define hdrchkType(_type) ((_type) < RPM_MIN_TYPE || (_type) > RPM_MAX_TYPE)
+
+/**
+ * Sanity check on data size and/or offset and/or count.
+ * This check imposes a limit of 256 MB -- file signatures
+ * may require a lot of space in the header.
+ */
+#define HEADER_DATA_MAX 0x0fffffff
+#define hdrchkData(_nbytes) ((_nbytes) & (~HEADER_DATA_MAX))
+
+/**
+ * Sanity check on data alignment for data type.
+ */
+#define hdrchkAlign(_type, _off)       ((_off) & (typeAlign[_type]-1))
+
+/**
+ * Sanity check on range of data offset.
+ */
+#define hdrchkRange(_dl, _off)         ((_off) < 0 || (_off) > (_dl))
+
+static int dataLength(rpm_tagtype_t type, rpm_constdata_t p, rpm_count_t count,
+                        int onDisk, rpm_constdata_t pend);
+
+#ifndef htonll
 /* Convert a 64bit value to network byte order. */
 RPM_GNUC_CONST
 static uint64_t htonll(uint64_t n)
 {
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
     uint32_t *i = (uint32_t*)&n;
     uint32_t b = i[0];
     i[0] = htonl(i[1]);
     i[1] = htonl(b);
+#endif
     return n;
 }
+#endif
 
 Header headerLink(Header h)
 {
@@ -156,11 +220,11 @@ Header headerFree(Header h)
     return NULL;
 }
 
-static Header headerCreate(void *blob, unsigned int pvlen, int32_t indexLen)
+static Header headerCreate(void *blob, int32_t indexLen)
 {
     Header h = xcalloc(1, sizeof(*h));
     if (blob) {
-       h->blob = (pvlen > 0) ? memcpy(xmalloc(pvlen), blob, pvlen) : blob;
+       h->blob = blob;
        h->indexAlloced = indexLen + 1;
        h->indexUsed = indexLen;
     } else {
@@ -168,7 +232,7 @@ static Header headerCreate(void *blob, unsigned int pvlen, int32_t indexLen)
        h->indexUsed = 0;
     }
     h->instance = 0;
-    h->flags |= HEADERFLAG_SORTED;
+    h->sorted = HEADERSORT_NONE;
 
     h->index = (h->indexAlloced
        ? xcalloc(h->indexAlloced, sizeof(*h->index))
@@ -180,34 +244,50 @@ static Header headerCreate(void *blob, unsigned int pvlen, int32_t indexLen)
 
 Header headerNew(void)
 {
-    return headerCreate(NULL, 0, 0);
+    return headerCreate(NULL, 0);
 }
 
-int headerVerifyInfo(int il, int dl, const void * pev, void * iv, int negate)
+static rpmRC hdrblobVerifyInfo(hdrblob blob, char **emsg)
 {
-    entryInfo pe = (entryInfo) pev;
-    entryInfo info = iv;
-    int i;
+    struct entryInfo_s info;
+    int i, len = 0;
+    int32_t end = 0;
+    const char *ds = (const char *) blob->dataStart;
+    int32_t il = (blob->regionTag) ? blob->il-1 : blob->il;
+    entryInfo pe = (blob->regionTag) ? blob->pe+1 : blob->pe;
 
     for (i = 0; i < il; i++) {
-       info->tag = ntohl(pe[i].tag);
-       info->type = ntohl(pe[i].type);
-       info->offset = ntohl(pe[i].offset);
-       if (negate)
-           info->offset = -info->offset;
-       info->count = ntohl(pe[i].count);
-
-       if (hdrchkType(info->type))
-           return i;
-       if (hdrchkAlign(info->type, info->offset))
-           return i;
-       if (hdrchkRange(dl, info->offset))
-           return i;
-       if (hdrchkData(info->count))
-           return i;
+       ei2h(&pe[i], &info);
+
+       /* Previous data must not overlap */
+       if (end > info.offset)
+           goto err;
+
+       if (hdrchkTag(info.tag))
+           goto err;
+       if (hdrchkType(info.type))
+           goto err;
+       if (hdrchkAlign(info.type, info.offset))
+           goto err;
+       if (hdrchkRange(blob->dl, info.offset))
+           goto err;
+
+       /* Verify the data actually fits */
+       len = dataLength(info.type, ds + info.offset,
+                        info.count, 1, ds + blob->dl);
+       end = info.offset + len;
+       if (hdrchkRange(blob->dl, end) || len <= 0)
+           goto err;
+    }
+    return 0; /* Everything ok */
 
+err:
+    if (emsg) {
+       rasprintf(emsg,
+                 _("tag[%d]: BAD, tag %d type %d offset %d count %d len %d"),
+                   i, info.tag, info.type, info.offset, info.count, len);
     }
-    return -1;
+    return i + 1;
 }
 
 static int indexCmp(const void * avp, const void * bvp)
@@ -216,11 +296,11 @@ static int indexCmp(const void * avp, const void * bvp)
     return (ap->info.tag - bp->info.tag);
 }
 
-void headerSort(Header h)
+static void headerSort(Header h)
 {
-    if (!(h->flags & HEADERFLAG_SORTED)) {
+    if (h->sorted != HEADERSORT_INDEX) {
        qsort(h->index, h->indexUsed, sizeof(*h->index), indexCmp);
-       h->flags |= HEADERFLAG_SORTED;
+       h->sorted = HEADERSORT_INDEX;
     }
 }
 
@@ -239,11 +319,11 @@ static int offsetCmp(const void * avp, const void * bvp)
     return rc;
 }
 
-void headerUnsort(Header h)
+static void headerUnsort(Header h)
 {
-    if (h->flags & HEADERFLAG_SORTED) {
+    if (h->sorted != HEADERSORT_OFFSET) {
        qsort(h->index, h->indexUsed, sizeof(*h->index), offsetCmp);
-       h->flags &= ~HEADERFLAG_SORTED;
+       h->sorted = HEADERSORT_OFFSET;
     }
 }
 
@@ -270,13 +350,8 @@ unsigned headerSizeof(Header h, int magicp)
 
     headerSort(h);
 
-    switch (magicp) {
-    case HEADER_MAGIC_YES:
+    if (magicp == HEADER_MAGIC_YES)
        size += sizeof(rpm_header_magic);
-       break;
-    case HEADER_MAGIC_NO:
-       break;
-    }
 
     size += 2 * sizeof(int32_t);       /* count of index entries */
 
@@ -284,7 +359,7 @@ unsigned headerSizeof(Header h, int magicp)
        /* Regions go in as is ... */
         if (ENTRY_IS_REGION(entry)) {
            size += entry->length;
-           /* XXX Legacy regions do not include the region tag and data. */
+           /* Reserve space for legacy region tag + data */
            if (i == 0 && (h->flags & HEADERFLAG_LEGACY))
                size += sizeof(struct entryInfo_s) + entry->info.count;
            continue;
@@ -313,6 +388,8 @@ static inline int strtaglen(const char *str, rpm_count_t c, const char *end)
     const char *s;
 
     if (end) {
+       if (str >= end)
+           return -1;
        while ((s = memchr(start, '\0', end-start))) {
            if (--c == 0 || s > end)
                break;
@@ -407,10 +484,7 @@ static int regionSwab(indexEntry entry, int il, int dl,
     for (; il > 0; il--, pe++) {
        struct indexEntry_s ie;
 
-       ie.info.tag = ntohl(pe->tag);
-       ie.info.type = ntohl(pe->type);
-       ie.info.count = ntohl(pe->count);
-       ie.info.offset = ntohl(pe->offset);
+       ei2h(pe, &ie.info);
 
        if (hdrchkType(ie.info.type))
            return -1;
@@ -507,7 +581,7 @@ void * headerExport(Header h, unsigned int *bsize)
 
            il += ril;
            dl += entry->rdlen + entry->info.count;
-           /* XXX Legacy regions do not include the region tag and data. */
+           /* Reserve space for legacy region tag */
            if (i == 0 && (h->flags & HEADERFLAG_LEGACY))
                il += 1;
 
@@ -580,7 +654,7 @@ void * headerExport(Header h, unsigned int *bsize)
            src = (char *)entry->data;
            rdlen = entry->rdlen;
 
-           /* XXX Legacy regions do not include the region tag and data. */
+           /* Legacy headers don't have regions originally, create one */
            if (i == 0 && (h->flags & HEADERFLAG_LEGACY)) {
                int32_t stei[4];
 
@@ -720,7 +794,8 @@ indexEntry findEntry(Header h, rpmTagVal tag, rpm_tagtype_t type)
     struct indexEntry_s key;
 
     if (h == NULL) return NULL;
-    if (!(h->flags & HEADERFLAG_SORTED)) headerSort(h);
+    if (h->sorted != HEADERSORT_INDEX)
+       headerSort(h);
 
     key.info.tag = tag;
 
@@ -750,7 +825,7 @@ int headerDel(Header h, rpmTagVal tag)
     entry = findEntry(h, tag, RPM_NULL_TYPE);
     if (!entry) return 1;
 
-    /* Make sure entry points to the first occurence of this tag. */
+    /* Make sure entry points to the first occurrence of this tag. */
     while (entry > h->index && (entry - 1)->info.tag == tag)  
        entry--;
 
@@ -778,92 +853,46 @@ int headerDel(Header h, rpmTagVal tag)
     return 0;
 }
 
-Header headerImport(void * blob, unsigned int bsize, headerImportFlags flags)
+rpmRC hdrblobImport(hdrblob blob, int fast, Header *hdrp, char **emsg)
 {
-    const int32_t * ei = (int32_t *) blob;
-    int32_t il = ntohl(ei[0]);         /* index length */
-    int32_t dl = ntohl(ei[1]);         /* data length */
-    unsigned int pvlen = sizeof(il) + sizeof(dl) +
-                   (il * sizeof(struct entryInfo_s)) + dl;;
     Header h = NULL;
-    entryInfo pe;
-    unsigned char * dataStart;
-    unsigned char * dataEnd;
     indexEntry entry; 
     int rdlen;
-    int fast = (flags & HEADERIMPORT_FAST);
-
-    /* Sanity checks on header intro. */
-    if (bsize && bsize != pvlen)
-       goto errxit;
-    if (hdrchkTags(il) || hdrchkData(dl) || pvlen >= headerMaxbytes)
-       goto errxit;
-
-    h = headerCreate(blob, (flags & HEADERIMPORT_COPY) ? pvlen : 0, il);
 
-    ei = h->blob; /* In case we had to copy */
-    pe = (entryInfo) &ei[2];
-    dataStart = (unsigned char *) (pe + il);
-    dataEnd = dataStart + dl;
+    h = headerCreate(blob->ei, blob->il);
 
     entry = h->index;
-    if (!(htonl(pe->tag) < RPMTAG_HEADERI18NTABLE)) {
+    if (!(htonl(blob->pe->tag) < RPMTAG_HEADERI18NTABLE)) {
+       /* An original v3 header, create a legacy region entry for it */
        h->flags |= HEADERFLAG_LEGACY;
        entry->info.type = REGION_TAG_TYPE;
        entry->info.tag = RPMTAG_HEADERIMAGE;
        entry->info.count = REGION_TAG_COUNT;
-       entry->info.offset = ((unsigned char *)pe - dataStart); /* negative offset */
-
-       entry->data = pe;
-       entry->length = pvlen - sizeof(il) - sizeof(dl);
-       rdlen = regionSwab(entry+1, il, 0, pe,
-                          dataStart, dataEnd, entry->info.offset, fast);
-       if (rdlen != dl)
+       entry->info.offset = ((unsigned char *)blob->pe - blob->dataStart); /* negative offset */
+
+       entry->data = blob->pe;
+       entry->length = blob->pvlen - sizeof(blob->il) - sizeof(blob->dl);
+       rdlen = regionSwab(entry+1, blob->il, 0, blob->pe,
+                          blob->dataStart, blob->dataEnd,
+                          entry->info.offset, fast);
+       if (rdlen != blob->dl)
            goto errxit;
        entry->rdlen = rdlen;
        h->indexUsed++;
     } else {
-       int32_t rdl;
+       /* Either a v4 header or an "upgraded" v3 header with a legacy region */
        int32_t ril;
 
        h->flags &= ~HEADERFLAG_LEGACY;
-
-       entry->info.type = htonl(pe->type);
-       entry->info.count = htonl(pe->count);
-       entry->info.tag = htonl(pe->tag);
-
-       if (!ENTRY_IS_REGION(entry))
-           goto errxit;
-       if (entry->info.type != REGION_TAG_TYPE)
-           goto errxit;
-       if (entry->info.count != REGION_TAG_COUNT)
-           goto errxit;
-
-       {   int off = ntohl(pe->offset);
-
-           if (off) {
-               size_t nb = REGION_TAG_COUNT;
-               int32_t stei[nb];
-               if (hdrchkRange(dl, (off + nb)))
-                   goto errxit;
-               /* XXX Hmm, why the copy? */
-               memcpy(&stei, dataStart + off, nb);
-               rdl = -ntohl(stei[2]);  /* negative offset */
-               ril = rdl/sizeof(*pe);
-               if (hdrchkTags(ril) || hdrchkData(rdl))
-                   goto errxit;
-           } else {
-               ril = il;
-               rdl = (ril * sizeof(struct entryInfo_s));
-               entry->info.tag = RPMTAG_HEADERIMAGE;
-           }
-       }
-       entry->info.offset = -rdl;      /* negative offset */
-
-       entry->data = pe;
-       entry->length = pvlen - sizeof(il) - sizeof(dl);
-       rdlen = regionSwab(entry+1, ril-1, 0, pe+1,
-                          dataStart, dataEnd, entry->info.offset, fast);
+       ei2h(blob->pe, &entry->info);
+       ril = (entry->info.offset != 0) ? blob->ril : blob->il;
+
+       entry->info.offset = -(ril * sizeof(*blob->pe)); /* negative offset */
+       entry->data = blob->pe;
+       entry->length = blob->pvlen - sizeof(blob->il) - sizeof(blob->dl);
+       rdlen = regionSwab(entry+1, ril-1, 0, blob->pe+1,
+                          blob->dataStart, blob->dataEnd,
+                          entry->info.offset, fast);
        if (rdlen < 0)
            goto errxit;
        entry->rdlen = rdlen;
@@ -874,8 +903,8 @@ Header headerImport(void * blob, unsigned int bsize, headerImportFlags flags)
            int rid = entry->info.offset+1;
 
            /* Load dribble entries from region. */
-           rdlen = regionSwab(newEntry, ne, rdlen, pe+ril,
-                               dataStart, dataEnd, rid, fast);
+           rdlen = regionSwab(newEntry, ne, rdlen, blob->pe+ril,
+                               blob->dataStart, blob->dataEnd, rid, fast);
            if (rdlen < 0)
                goto errxit;
 
@@ -902,24 +931,29 @@ Header headerImport(void * blob, unsigned int bsize, headerImportFlags flags)
 
        rdlen += REGION_TAG_COUNT;
 
-       if (rdlen != dl)
+       if (rdlen != blob->dl)
            goto errxit;
     }
 
-    h->flags &= ~HEADERFLAG_SORTED;
+    /* Force sorting, dribble lookups can cause early sort on partial header */
+    h->sorted = HEADERSORT_NONE;
     headerSort(h);
     h->flags |= HEADERFLAG_ALLOCATED;
+    if (hdrp)
+       *hdrp = h;
 
-    return h;
+    /* We own the memory now, avoid double-frees */
+    blob->ei = NULL;
+
+    return RPMRC_OK;
 
 errxit:
     if (h) {
-       if (flags & HEADERIMPORT_COPY)
-           free(h->blob);
        free(h->index);
        free(h);
+       rasprintf(emsg, _("hdr load: BAD"));
     }
-    return NULL;
+    return RPMRC_FAIL;
 }
 
 Header headerReload(Header h, rpmTagVal tag)
@@ -956,54 +990,14 @@ Header headerCopyLoad(const void * uh)
 
 Header headerRead(FD_t fd, int magicp)
 {
-    int32_t block[4];
-    int32_t * ei = NULL;
-    int32_t il;
-    int32_t dl;
     Header h = NULL;
-    unsigned int len, blen;
-
-    if (magicp == HEADER_MAGIC_YES) {
-       int32_t magic;
-
-       if (Freadall(fd, block, 4*sizeof(*block)) != 4*sizeof(*block))
-           goto exit;
-
-       magic = block[0];
+    struct hdrblob_s blob;
+    char *buf = NULL;
 
-       if (memcmp(&magic, rpm_header_magic, sizeof(magic)))
-           goto exit;
+    if (hdrblobRead(fd, magicp, 0, 0, &blob, &buf) == RPMRC_OK)
+       hdrblobImport(&blob, 0, &h, &buf);
 
-       il = ntohl(block[2]);
-       dl = ntohl(block[3]);
-    } else {
-       if (Freadall(fd, block, 2*sizeof(*block)) != 2*sizeof(*block))
-           goto exit;
-
-       il = ntohl(block[0]);
-       dl = ntohl(block[1]);
-    }
-
-    blen = (il * sizeof(struct entryInfo_s)) + dl;
-    len = sizeof(il) + sizeof(dl) + blen;
-
-    /* Sanity checks on header intro. */
-    if (hdrchkTags(il) || hdrchkData(dl) || len > headerMaxbytes)
-       goto exit;
-
-    ei = xmalloc(len);
-    ei[0] = htonl(il);
-    ei[1] = htonl(dl);
-
-    if (Freadall(fd, (char *)&ei[2], blen) != blen)
-       goto exit;
-    
-    h = headerImport(ei, len, 0);
-
-exit:
-    if (h == NULL && ei != NULL) {
-       free(ei);
-    }
+    free(buf);
     return h;
 }
 
@@ -1011,19 +1005,15 @@ int headerWrite(FD_t fd, Header h, int magicp)
 {
     ssize_t nb;
     unsigned int length;
-    void * uh;
+    void * uh = headerExport(h, &length);
 
-    uh = headerExport(h, &length);
     if (uh == NULL)
        return 1;
-    switch (magicp) {
-    case HEADER_MAGIC_YES:
-       nb = Fwrite(rpm_header_magic, sizeof(uint8_t), sizeof(rpm_header_magic), fd);
+
+    if (magicp == HEADER_MAGIC_YES) {
+       nb = Fwrite(rpm_header_magic, sizeof(rpm_header_magic), 1, fd);
        if (nb != sizeof(rpm_header_magic))
            goto exit;
-       break;
-    case HEADER_MAGIC_NO:
-       break;
     }
 
     nb = Fwrite(uh, sizeof(char), length, fd);
@@ -1040,6 +1030,16 @@ int headerIsEntry(Header h, rpmTagVal tag)
        
 }
 
+/* simple heuristic to find out if the header is from * a source rpm
+ * or not: source rpms contain at least the spec file and have all
+ * files in one directory with an empty name.
+ */
+int headerIsSourceHeuristic(Header h)
+{
+    indexEntry entry = findEntry(h, RPMTAG_DIRNAMES, RPM_STRING_ARRAY_TYPE);
+    return entry && entry->info.count == 1 && entry->data && !*(const char *)entry->data;
+}
+
 /** \ingroup header
  * Retrieve data from header entry.
  * Relevant flags (others are ignored), if neither is set allocation
@@ -1050,7 +1050,6 @@ int headerIsEntry(Header h, rpmTagVal tag)
  * @todo Permit retrieval of regions other than HEADER_IMUTABLE.
  * @param entry                header entry
  * @param td           tag data container
- * @param minMem       string pointers refer to header memory?
  * @param flags                flags to control memory allocation
  * @return             1 on success, otherwise error.
  */
@@ -1167,6 +1166,7 @@ static int copyTdEntry(const indexEntry entry, rpmtd td, headerGetFlags flags)
     }
     td->type = entry->info.type;
     td->count = count;
+    td->size = entry->length;
 
     if (td->data && entry->data != td->data) {
        td->flags |= RPMTD_ALLOCED;
@@ -1311,18 +1311,10 @@ static int intGetTdEntry(Header h, rpmtd td, headerGetFlags flags)
        return 0;
     }
 
-    if (flags & HEADERGET_RAW) {
+    if (entry->info.type == RPM_I18NSTRING_TYPE && !(flags & HEADERGET_RAW))
+       rc = copyI18NEntry(h, entry, td, flags);
+    else
        rc = copyTdEntry(entry, td, flags);
-    } else {
-       switch (entry->info.type) {
-       case RPM_I18NSTRING_TYPE:
-           rc = copyI18NEntry(h, entry, td, flags);
-           break;
-       default:
-           rc = copyTdEntry(entry, td, flags);
-           break;
-       }
-    }
 
     if (rc == 0)
        td->flags |= RPMTD_INVALID;
@@ -1438,7 +1430,7 @@ static int intAddEntry(Header h, rpmtd td)
     entry->length = length;
 
     if (h->indexUsed > 0 && td->tag < h->index[h->indexUsed-1].info.tag)
-       h->flags &= ~HEADERFLAG_SORTED;
+       h->sorted = HEADERSORT_NONE;
     h->indexUsed++;
 
     return 1;
@@ -1650,7 +1642,7 @@ int headerMod(Header h, rpmtd td)
     if (data == NULL)
        return 0;
 
-    /* make sure entry points to the first occurence of this tag */
+    /* make sure entry points to the first occurrence of this tag */
     while (entry > h->index && (entry - 1)->info.tag == td->tag)  
        entry--;
 
@@ -1773,3 +1765,277 @@ ssize_t Freadall(FD_t fd, void * buf, ssize_t size)
     return total;
 }
 
+static rpmRC hdrblobVerifyRegion(rpmTagVal regionTag, int exact_size,
+                       hdrblob blob, char **buf)
+{
+    rpmRC rc = RPMRC_FAIL;
+    struct entryInfo_s trailer, einfo;
+    unsigned char * regionEnd = NULL;
+
+    /* Check that we have at least on tag */
+    if (blob->il < 1) {
+       rasprintf(buf, _("region: no tags"));
+       goto exit;
+    }
+
+    /* Convert the 1st tag element. */
+    ei2h(blob->pe, &einfo);
+
+    if (!regionTag && (einfo.tag == RPMTAG_HEADERSIGNATURES ||
+                      einfo.tag == RPMTAG_HEADERIMMUTABLE ||
+                      einfo.tag == RPMTAG_HEADERIMAGE)) {
+       regionTag = einfo.tag;
+    }
+
+    /* Is there an immutable header region tag? */
+    if (!(einfo.tag == regionTag)) {
+       rc = RPMRC_NOTFOUND;
+       goto exit;
+    }
+
+    /* Is the region tag sane? */
+    if (!(einfo.type == REGION_TAG_TYPE && einfo.count == REGION_TAG_COUNT)) {
+       rasprintf(buf,
+               _("region tag: BAD, tag %d type %d offset %d count %d"),
+               einfo.tag, einfo.type, einfo.offset, einfo.count);
+       goto exit;
+    }
+
+    /* Is the trailer within the data area? */
+    if (hdrchkRange(blob->dl, einfo.offset + REGION_TAG_COUNT)) {
+       rasprintf(buf,
+               _("region offset: BAD, tag %d type %d offset %d count %d"),
+               einfo.tag, einfo.type, einfo.offset, einfo.count);
+       goto exit;
+    }
+
+    /* Is there an immutable header region tag trailer? */
+    memset(&trailer, 0, sizeof(trailer));
+    regionEnd = blob->dataStart + einfo.offset;
+    (void) memcpy(&trailer, regionEnd, REGION_TAG_COUNT);
+    regionEnd += REGION_TAG_COUNT;
+    blob->rdl = regionEnd - blob->dataStart;
+
+    ei2h(&trailer, &einfo);
+    /* Trailer offset is negative and has a special meaning */
+    einfo.offset = -einfo.offset;
+    if (!(einfo.tag == regionTag &&
+         einfo.type == REGION_TAG_TYPE && einfo.count == REGION_TAG_COUNT))
+    {
+       rasprintf(buf,
+               _("region trailer: BAD, tag %d type %d offset %d count %d"),
+               einfo.tag, einfo.type, einfo.offset, einfo.count);
+       goto exit;
+    }
+
+    /* Does the region actually fit within the header? */
+    blob->ril = einfo.offset/sizeof(*blob->pe);
+    if ((einfo.offset % sizeof(*blob->pe)) || hdrchkRange(blob->il, blob->ril) ||
+                                       hdrchkRange(blob->dl, blob->rdl)) {
+       rasprintf(buf, _("region %d size: BAD, ril %d il %d rdl %d dl %d"),
+                       regionTag, blob->ril, blob->il, blob->rdl, blob->dl);
+       goto exit;
+    }
+
+    /* In package files region size is expected to match header size. */
+    if (exact_size && !(blob->il == blob->ril && blob->dl == blob->rdl)) {
+       rasprintf(buf,
+               _("region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"),
+               regionTag, blob->il, blob->ril, blob->dl, blob->rdl);
+       goto exit;
+    }
+
+    blob->regionTag = regionTag;
+    rc = RPMRC_OK;
+
+exit:
+    return rc;
+}
+
+
+static rpmRC hdrblobVerifyLengths(rpmTagVal regionTag, uint32_t il, uint32_t dl,
+                                 char **emsg) {
+    uint32_t il_max = HEADER_TAGS_MAX;
+    uint32_t dl_max = HEADER_DATA_MAX;
+    if (regionTag == RPMTAG_HEADERSIGNATURES) {
+       il_max = 32;
+       dl_max = 64 * 1024 * 1024;
+    }
+    if (hdrchkRange(il_max, il)) {
+       rasprintf(emsg, _("hdr tags: BAD, no. of tags(%" PRIu32 ") out of range"), il);
+       return RPMRC_FAIL;
+    }
+    if (hdrchkRange(dl_max, dl)) {
+       rasprintf(emsg, _("hdr data: BAD, no. of bytes(%" PRIu32 ") out of range"), dl);
+       return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+rpmRC hdrblobRead(FD_t fd, int magic, int exact_size, rpmTagVal regionTag, hdrblob blob, char **emsg)
+{
+    int32_t block[4];
+    int32_t *bs = (magic != 0) ? &block[0] : &block[2];
+    int blen = (magic != 0) ? sizeof(block) : sizeof(block) / 2;
+    int32_t il;
+    int32_t dl;
+    int32_t * ei = NULL;
+    size_t uc;
+    size_t nb;
+    rpmRC rc = RPMRC_FAIL;             /* assume failure */
+    int xx;
+
+    memset(block, 0, sizeof(block));
+    if ((xx = Freadall(fd, bs, blen)) != blen) {
+       rasprintf(emsg,
+               _("hdr size(%d): BAD, read returned %d"), blen, xx);
+       goto exit;
+    }
+    if (magic && memcmp(block, rpm_header_magic, sizeof(rpm_header_magic))) {
+       rasprintf(emsg, _("hdr magic: BAD"));
+       goto exit;
+    }
+    il = ntohl(block[2]);
+    dl = ntohl(block[3]);
+    if (hdrblobVerifyLengths(regionTag, il, dl, emsg))
+       goto exit;
+
+    nb = (il * sizeof(struct entryInfo_s)) + dl;
+    uc = sizeof(il) + sizeof(dl) + nb;
+    ei = xmalloc(uc);
+    ei[0] = block[2];
+    ei[1] = block[3];
+    if ((xx = Freadall(fd, (char *)&ei[2], nb)) != nb) {
+       rasprintf(emsg, _("hdr blob(%zd): BAD, read returned %d"), nb, xx);
+       goto exit;
+    }
+
+    if (regionTag == RPMTAG_HEADERSIGNATURES) {
+       size_t sigSize = uc + sizeof(rpm_header_magic);
+       size_t pad = (8 - (sigSize % 8)) % 8;
+       size_t trc;
+       if (pad && (trc = Freadall(fd, block, pad)) != pad) {
+           rasprintf(emsg, _("sigh pad(%zd): BAD, read %zd bytes"), pad, trc);
+           goto exit;
+       }
+    }
+
+    rc = hdrblobInit(ei, uc, regionTag, exact_size, blob, emsg);
+
+exit:
+    if (rc != RPMRC_OK) {
+       free(ei);
+       blob->ei = NULL;
+       if (emsg && *emsg && regionTag == RPMTAG_HEADERSIGNATURES) {
+           /* rstrscat() cannot handle overlap even if it claims so */
+           char *tmp = rstrscat(NULL, _("signature "), *emsg, NULL);
+           free(*emsg);
+           *emsg = tmp;
+       }
+    }
+
+    return rc;
+}
+
+rpmRC hdrblobInit(const void *uh, size_t uc,
+               rpmTagVal regionTag, int exact_size,
+               struct hdrblob_s *blob, char **emsg)
+{
+    rpmRC rc = RPMRC_FAIL;
+    memset(blob, 0, sizeof(*blob));
+    if (uc && uc < 8) {
+       rasprintf(emsg, _("hdr length: BAD"));
+       goto exit;
+    }
+
+    blob->ei = (int32_t *) uh; /* discards const */
+    blob->il = ntohl((uint32_t)(blob->ei[0]));
+    blob->dl = ntohl((uint32_t)(blob->ei[1]));
+    if (hdrblobVerifyLengths(regionTag, blob->il, blob->dl, emsg) != RPMRC_OK)
+       goto exit;
+
+    blob->pe = (entryInfo) &(blob->ei[2]);
+    blob->pvlen = sizeof(blob->il) + sizeof(blob->dl) +
+                 (blob->il * sizeof(*blob->pe)) + blob->dl;
+    blob->dataStart = (uint8_t *) (blob->pe + blob->il);
+    blob->dataEnd = blob->dataStart + blob->dl;
+
+    /* Is the blob the right size? */
+    if (blob->pvlen >= headerMaxbytes || (uc && blob->pvlen != uc)) {
+       rasprintf(emsg, _("blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"),
+                       blob->pvlen, blob->il, blob->dl);
+       goto exit;
+    }
+
+    if (hdrblobVerifyRegion(regionTag, exact_size, blob, emsg) == RPMRC_FAIL)
+       goto exit;
+
+    /* Sanity check the rest of the header structure. */
+    if (hdrblobVerifyInfo(blob, emsg))
+       goto exit;
+
+    rc = RPMRC_OK;
+
+exit:
+    return rc;
+}
+
+rpmRC hdrblobGet(hdrblob blob, uint32_t tag, rpmtd td)
+{
+    rpmRC rc = RPMRC_NOTFOUND;
+    struct indexEntry_s entry;
+    struct entryInfo_s einfo;
+    const struct entryInfo_s *pe = blob->pe;
+    uint32_t ntag = htonl(tag);
+    int tsize;
+
+    memset(&einfo, 0, sizeof(einfo));
+    rpmtdReset(td);
+
+    for (int i = 1; i < blob->il; i++, pe++) {
+       if (pe->tag != ntag)
+           continue;
+       ei2h(pe, &einfo);
+
+       /* We can only handle non-byteswappable data */
+       tsize = typeSizes[einfo.type];
+       if (tsize != 1 && tsize != -1)
+           return RPMRC_FAIL;
+
+       entry.info = einfo; /* struct assignment */
+       entry.data = blob->dataStart + einfo.offset;
+       entry.length = dataLength(einfo.type, blob->dataStart + einfo.offset,
+                        einfo.count, 1, blob->dataEnd);
+       entry.rdlen = 0;
+       td->tag = einfo.tag;
+       rc = copyTdEntry(&entry, td, HEADERGET_MINMEM) ? RPMRC_OK : RPMRC_FAIL;
+       break;
+    }
+    return rc;
+}
+
+Header headerImport(void * blob, unsigned int bsize, headerImportFlags flags)
+{
+    Header h = NULL;
+    struct hdrblob_s hblob;
+    char *buf = NULL;
+    void * b = blob;
+
+    if (flags & HEADERIMPORT_COPY) {
+       if (bsize == 0 && hdrblobInit(b, 0, 0, 0, &hblob, &buf) == RPMRC_OK)
+           bsize = hblob.pvlen;
+       if (bsize == 0)
+           goto exit;
+       b = memcpy(xmalloc(bsize), b, bsize);
+    }
+
+    /* Sanity checks on header intro. */
+    if (hdrblobInit(b, bsize, 0, 0, &hblob, &buf) == RPMRC_OK)
+       hdrblobImport(&hblob, (flags & HEADERIMPORT_FAST), &h, &buf);
+
+exit:
+    if (h == NULL && b != blob)
+       free(b);
+    free(buf);
+
+    return h;
+}
index ddaba4f686997decdaeedd237dacc8bd3a94649d..a616deefc3ef0c2b972b90c4dcac02673a43b499 100644 (file)
@@ -54,18 +54,6 @@ Header headerFree( Header h);
  */
 Header headerLink(Header h);
 
-/** \ingroup header
- * Sort tags in header.
- * @param h            header
- */
-void headerSort(Header h);
-
-/** \ingroup header
- * Restore tags in header to original ordering.
- * @param h            header
- */
-void headerUnsort(Header h);
-
 /** \ingroup header
  * Return size of on-disk header representation in bytes.
  * @param h            header
@@ -74,17 +62,6 @@ void headerUnsort(Header h);
  */
 unsigned int headerSizeof(Header h, int magicp);
 
-/** \ingroup header
- * Perform simple sanity and range checks on header tag(s).
- * @param il           no. of tags in header
- * @param dl           no. of bytes in header data.
- * @param pev          1st element in tag array, big-endian
- * @param iv           failing (or last) tag element, host-endian
- * @param negate       negative offset expected?
- * @return             -1 on success, otherwise failing tag element index
- */
-int headerVerifyInfo(int il, int dl, const void * pev, void * iv, int negate);
-
 /** \ingroup header
  * Convert header to on-disk representation.
  * @deprecated         Use headerExport() instead
@@ -245,9 +222,9 @@ int headerPut(Header h, rpmtd td, headerPutFlags flags);
  * @return             1 on success, 0 on failure
  * 
  */
+int headerPutBin(Header h, rpmTagVal tag, const uint8_t *val, rpm_count_t size);
 int headerPutString(Header h, rpmTagVal tag, const char *val);
 int headerPutStringArray(Header h, rpmTagVal tag, const char **val, rpm_count_t size);
-int headerPutBin(Header h, rpmTagVal tag, const uint8_t *val, rpm_count_t size);
 int headerPutChar(Header h, rpmTagVal tag, const char *val, rpm_count_t size);
 int headerPutUint8(Header h, rpmTagVal tag, const uint8_t *val, rpm_count_t size);
 int headerPutUint16(Header h, rpmTagVal tag, const uint16_t *val, rpm_count_t size);
@@ -347,65 +324,6 @@ int headerNext(HeaderIterator hi, rpmtd td);
  */
 rpmTagVal headerNextTag(HeaderIterator hi);
 
-/** \ingroup header
- * Return name, version, release strings from header.
- * @param h            header
- * @retval *np         name pointer (or NULL)
- * @retval *vp         version pointer (or NULL)
- * @retval *rp         release pointer (or NULL)
- * @return             0 always
- */
-RPM_GNUC_DEPRECATED
-int headerNVR(Header h,
-               const char ** np,
-               const char ** vp,
-               const char ** rp);
-
-/** \ingroup header
- * Return name, epoch, version, release, arch strings from header.
- * @param h            header
- * @retval *np         name pointer (or NULL)
- * @retval *ep         epoch pointer (or NULL)
- * @retval *vp         version pointer (or NULL)
- * @retval *rp         release pointer (or NULL)
- * @retval *ap         arch pointer (or NULL)
- * @return             0 always
- */
-RPM_GNUC_DEPRECATED
-int headerNEVRA(Header h,
-               const char ** np,
-               uint32_t ** ep,
-               const char ** vp,
-               const char ** rp,
-               const char ** ap);
-
-/** \ingroup header
- * Return (malloc'd) header name-version-release string.
- * @param h            header
- * @retval np          name tag value
- * @return             name-version-release string
- */
-RPM_GNUC_DEPRECATED
-char * headerGetNEVR(Header h, const char ** np );
-
-/** \ingroup header
- * Return (malloc'd) header name-version-release.arch string.
- * @param h            header
- * @retval np          name tag value
- * @return             name-version-release string
- */
-RPM_GNUC_DEPRECATED
-char * headerGetNEVRA(Header h, const char ** np );
-
-/* \ingroup header
- * Return (malloc'd) header (epoch:)version-release string.
- * @param h            header
- * @retval np          name tag value (or NULL)
- * @return             (epoch:)version-release string
- */
-RPM_GNUC_DEPRECATED
-char * headerGetEVR(Header h, const char **np);
-
 /** \ingroup header
  * Return any non-array tag from header, converted to string
  * @param h            header
@@ -430,14 +348,6 @@ const char * headerGetString(Header h, rpmTagVal tag);
  */
 uint64_t headerGetNumber(Header h, rpmTagVal tag);
 
-/** \ingroup header
- * Return header color.
- * @param h            header
- * @return             header color
- */
-RPM_GNUC_DEPRECATED
-rpm_color_t headerGetColor(Header h);
-
 /** \ingroup header
  * Check if header is a source or binary package header
  * @param h            header
index f51435fee82a8c0c372508c89b3430ed00ccaeec..76b7ed5a7837d34d4272fa8cdaab29f2743dc8a0 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <rpm/header.h>
+#include <netinet/in.h>
 
 /** \ingroup header
  * Description of tag data.
@@ -18,51 +19,60 @@ struct entryInfo_s {
     rpm_count_t count;         /*!< Number of tag elements. */
 };
 
-#define        REGION_TAG_TYPE         RPM_BIN_TYPE
-#define        REGION_TAG_COUNT        sizeof(struct entryInfo_s)
+typedef struct hdrblob_s * hdrblob;
+struct hdrblob_s {
+    int32_t *ei;
+    int32_t il;
+    int32_t dl;
+    entryInfo pe;
+    int32_t pvlen;
+    uint8_t *dataStart;
+    uint8_t *dataEnd;
 
-/** \ingroup header
- * A single tag from a Header.
- */
-typedef struct indexEntry_s * indexEntry;
-struct indexEntry_s {
-    struct entryInfo_s info;   /*!< Description of tag data. */
-    rpm_data_t data;           /*!< Location of tag data. */
-    int length;                        /*!< No. bytes of data. */
-    int rdlen;                 /*!< No. bytes of data in region. */
+    rpmTagVal regionTag;
+    int32_t ril;
+    int32_t rdl;
 };
 
-/**
- * Sanity check on no. of tags.
- * This check imposes a limit of 65K tags, more than enough.
- */
-#define hdrchkTags(_ntags)      ((_ntags) & 0xffff0000)
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-/**
- * Sanity check on type values.
- */
-#define hdrchkType(_type) ((_type) < RPM_MIN_TYPE || (_type) > RPM_MAX_TYPE)
+/* convert entry info to host endianess */
+static inline void ei2h(const struct entryInfo_s *pe, struct entryInfo_s *info)
+{
+    info->tag = ntohl(pe->tag);
+    info->type = ntohl(pe->type);
+    info->offset = ntohl(pe->offset);
+    info->count = ntohl(pe->count);
+}
 
-/**
- * Sanity check on data size and/or offset and/or count.
- * This check imposes a limit of 16 MB, more than enough.
- */
-#define HEADER_DATA_MAX 0x00ffffff
-#define hdrchkData(_nbytes) ((_nbytes) & (~HEADER_DATA_MAX))
+static inline void ei2td(const struct entryInfo_s *info,
+                 unsigned char * dataStart, size_t len,
+                 struct rpmtd_s *td)
+{
+    td->tag = info->tag;
+    td->type = info->type;
+    td->count = info->count;
+    td->size = len;
+    td->data = dataStart + info->offset;
+    td->ix = -1;
+    td->flags = RPMTD_IMMUTABLE;
+}
 
-/**
- * Sanity check on data alignment for data type.
- */
-#define hdrchkAlign(_type, _off)       ((_off) & (typeAlign[_type]-1))
+RPM_GNUC_INTERNAL
+rpmRC hdrblobInit(const void *uh, size_t uc,
+               rpmTagVal regionTag, int exact_size,
+               struct hdrblob_s *blob, char **emsg);
 
-/**
- * Sanity check on range of data offset.
- */
-#define hdrchkRange(_dl, _off)         ((_off) < 0 || (_off) > (_dl))
+RPM_GNUC_INTERNAL
+rpmRC hdrblobRead(FD_t fd, int magic, int exact_size, rpmTagVal regionTag, hdrblob blob, char **emsg);
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+RPM_GNUC_INTERNAL
+rpmRC hdrblobImport(hdrblob blob, int fast, Header *hdrp, char **emsg);
+
+RPM_GNUC_INTERNAL
+rpmRC hdrblobGet(hdrblob blob, uint32_t tag, rpmtd td);
 
 /** \ingroup header
  * Set header instance (rpmdb record number)
@@ -75,6 +85,14 @@ void headerSetInstance(Header h, unsigned int instance);
 /* Package IO helper to consolidate partial read and error handling */
 RPM_GNUC_INTERNAL
 ssize_t Freadall(FD_t fd, void * buf, ssize_t size);
+
+/* XXX here only temporarily */
+RPM_GNUC_INTERNAL
+rpmTagVal headerMergeLegacySigs(Header h, Header sigh, char **msg);
+RPM_GNUC_INTERNAL
+void applyRetrofits(Header h, int leadtype);
+RPM_GNUC_INTERNAL
+int headerIsSourceHeuristic(Header h);
 #ifdef __cplusplus
 }   
 #endif
index a865ee7a8809837ffe282d9b2941ff5a2667d098..fdb3aadb7b7565b197919da1be6a72b9b041b4f2 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "system.h"
 
+#include <stdarg.h>
 #include <rpm/header.h>
 #include <rpm/rpmtag.h>
 #include <rpm/rpmstring.h>
@@ -20,7 +21,7 @@
  */
 typedef struct sprintfTag_s * sprintfTag;
 struct sprintfTag_s {
-    headerTagFormatFunction fmt;
+    headerFmt fmt;
     rpmTagVal tag;
     int justOne;
     char * format;
@@ -217,6 +218,25 @@ static char * hsaReserve(headerSprintfArgs hsa, size_t need)
     return hsa->val + hsa->vallen;
 }
 
+RPM_GNUC_PRINTF(2, 3)
+static void hsaError(headerSprintfArgs hsa, const char *fmt, ...)
+{
+    /* Use thread local static buffer as headerFormat() errmsg arg is const */
+    static __thread char errbuf[BUFSIZ];
+
+    if (fmt == NULL) {
+       hsa->errmsg = NULL;
+    } else {
+       va_list ap;
+
+       va_start(ap, fmt);
+       vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
+       va_end(ap);
+
+       hsa->errmsg = errbuf;
+    }
+}
+
 /**
  * Search tags for a name.
  * @param hsa          headerSprintf args
@@ -246,7 +266,7 @@ static int findTag(headerSprintfArgs hsa, sprintfToken token, const char * name)
 
     /* Search extensions for specific format. */
     if (stag->type != NULL)
-       stag->fmt = rpmHeaderFormatFuncByName(stag->type);
+       stag->fmt = rpmHeaderFormatByName(stag->type);
 
     return stag->fmt ? 0 : 1;
 }
@@ -333,13 +353,13 @@ static int parseFormat(headerSprintfArgs hsa, char * str,
            chptr = start;
            while (*chptr && *chptr != '{' && *chptr != '%') {
                if (!risdigit(*chptr) && *chptr != '-') {
-                   hsa->errmsg = _("invalid field width");
+                   hsaError(hsa, _("invalid field width"));
                    goto errxit;
                }
                chptr++;
            }
            if (!*chptr || *chptr == '%') {
-               hsa->errmsg = _("missing { after %");
+               hsaError(hsa, _("missing { after %%"));
                goto errxit;
            }
 
@@ -361,7 +381,7 @@ static int parseFormat(headerSprintfArgs hsa, char * str,
            dst = next = start;
            while (*next && *next != '}') next++;
            if (!*next) {
-               hsa->errmsg = _("missing } after %{");
+               hsaError(hsa, _("missing } after %%{"));
                goto errxit;
            }
            *next++ = '\0';
@@ -372,7 +392,7 @@ static int parseFormat(headerSprintfArgs hsa, char * str,
            if (*chptr != '\0') {
                *chptr++ = '\0';
                if (!*chptr) {
-                   hsa->errmsg = _("empty tag format");
+                   hsaError(hsa, _("empty tag format"));
                    goto errxit;
                }
                token->u.tag.type = chptr;
@@ -383,14 +403,14 @@ static int parseFormat(headerSprintfArgs hsa, char * str,
            }
            
            if (!*start) {
-               hsa->errmsg = _("empty tag name");
+               hsaError(hsa, _("empty tag name"));
                goto errxit;
            }
 
            token->type = PTOK_TAG;
 
            if (findTag(hsa, token, start)) {
-               hsa->errmsg = _("unknown tag");
+               hsaError(hsa, _("unknown tag: \"%s\""), start);
                goto errxit;
            }
 
@@ -410,7 +430,7 @@ static int parseFormat(headerSprintfArgs hsa, char * str,
            }
 
            if (!start) {
-               hsa->errmsg = _("] expected at end of array");
+               hsaError(hsa, _("] expected at end of array"));
                goto errxit;
            }
 
@@ -422,7 +442,7 @@ static int parseFormat(headerSprintfArgs hsa, char * str,
 
        case ']':
            if (state != PARSER_IN_ARRAY) {
-               hsa->errmsg = _("unexpected ]");
+               hsaError(hsa, _("unexpected ]"));
                goto errxit;
            }
            *start++ = '\0';
@@ -432,7 +452,7 @@ static int parseFormat(headerSprintfArgs hsa, char * str,
 
        case '}':
            if (state != PARSER_IN_EXPR) {
-               hsa->errmsg = _("unexpected }");
+               hsaError(hsa, _("unexpected }"));
                goto errxit;
            }
            *start++ = '\0';
@@ -483,19 +503,19 @@ static int parseExpression(headerSprintfArgs hsa, sprintfToken token,
     char * chptr;
     char * end;
 
-    hsa->errmsg = NULL;
+    hsaError(hsa, NULL);
     chptr = str;
     while (*chptr && *chptr != '?') chptr++;
 
     if (*chptr != '?') {
-       hsa->errmsg = _("? expected in expression");
+       hsaError(hsa, _("? expected in expression"));
        return 1;
     }
 
     *chptr++ = '\0';;
 
     if (*chptr != '{') {
-       hsa->errmsg = _("{ expected after ? in expression");
+       hsaError(hsa, _("{ expected after ? in expression"));
        return 1;
     }
 
@@ -507,7 +527,7 @@ static int parseExpression(headerSprintfArgs hsa, sprintfToken token,
 
     /* XXX fix segfault on "rpm -q rpm --qf='%|NAME?{%}:{NAME}|\n'"*/
     if (!(end && *end)) {
-       hsa->errmsg = _("} expected in expression");
+       hsaError(hsa, _("} expected in expression"));
        token->u.cond.ifFormat =
                freeFormat(token->u.cond.ifFormat, token->u.cond.numIfTokens);
        return 1;
@@ -515,7 +535,7 @@ static int parseExpression(headerSprintfArgs hsa, sprintfToken token,
 
     chptr = end;
     if (*chptr != ':' && *chptr != '|') {
-       hsa->errmsg = _(": expected following ? subexpression");
+       hsaError(hsa, _(": expected following ? subexpression"));
        token->u.cond.ifFormat =
                freeFormat(token->u.cond.ifFormat, token->u.cond.numIfTokens);
        return 1;
@@ -533,7 +553,7 @@ static int parseExpression(headerSprintfArgs hsa, sprintfToken token,
        chptr++;
 
        if (*chptr != '{') {
-           hsa->errmsg = _("{ expected after : in expression");
+           hsaError(hsa, _("{ expected after : in expression"));
            token->u.cond.ifFormat =
                freeFormat(token->u.cond.ifFormat, token->u.cond.numIfTokens);
            return 1;
@@ -547,7 +567,7 @@ static int parseExpression(headerSprintfArgs hsa, sprintfToken token,
 
        /* XXX fix segfault on "rpm -q rpm --qf='%|NAME?{a}:{%}|{NAME}\n'" */
        if (!(end && *end)) {
-           hsa->errmsg = _("} expected in expression");
+           hsaError(hsa, _("} expected in expression"));
            token->u.cond.ifFormat =
                freeFormat(token->u.cond.ifFormat, token->u.cond.numIfTokens);
            return 1;
@@ -555,7 +575,7 @@ static int parseExpression(headerSprintfArgs hsa, sprintfToken token,
 
        chptr = end;
        if (*chptr != '|') {
-           hsa->errmsg = _("| expected at end of expression");
+           hsaError(hsa, _("| expected at end of expression"));
            token->u.cond.ifFormat =
                freeFormat(token->u.cond.ifFormat, token->u.cond.numIfTokens);
            token->u.cond.elseFormat =
@@ -624,9 +644,9 @@ static char * formatValue(headerSprintfArgs hsa, sprintfTag tag, int element)
     char * t, * te;
     rpmtd td;
 
-    if ((td = getData(hsa, tag->tag))) {
+    if ((td = getData(hsa, tag->tag)) && td->count > element) {
        td->ix = element; /* Ick, use iterators instead */
-       val = tag->fmt(td);
+       val = rpmHeaderFormatCall(tag->fmt, td);
     } else {
        val = xstrdup("(none)");
     }
@@ -748,16 +768,10 @@ static char * singleSprintf(headerSprintfArgs hsa, sprintfToken token,
            found = 1;
            count = rpmtdCount(td);
 
-           if (numElements > 1 && count != numElements)
-           switch (td->type) {
-           default:
-               hsa->errmsg =
-                       _("array iterator used with different sized arrays");
+           if (numElements > 0 && count != numElements) {
+               hsaError(hsa,
+                       _("array iterator used with different sized arrays"));
                return NULL;
-               break;
-           case RPM_BIN_TYPE:
-           case RPM_STRING_TYPE:
-               break;
            }
            if (count > numElements)
                numElements = count;
@@ -821,13 +835,6 @@ static unsigned int tagId(rpmTagVal tag)
     return tag;
 }
 
-static rpmtd tagFree(rpmtd td)
-{
-    rpmtdFreeData(td);
-    rpmtdFree(td);
-    return NULL;
-}
-
 char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg) 
 {
     struct headerSprintfArgs_s hsa;
@@ -845,7 +852,7 @@ char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg)
     if (parseFormat(&hsa, hsa.fmt, &hsa.format, &hsa.numTokens, NULL, PARSER_BEGIN))
        goto exit;
 
-    hsa.cache = tagCacheCreate(128, tagId, tagCmp, NULL, tagFree);
+    hsa.cache = tagCacheCreate(128, tagId, tagCmp, NULL, rpmtdFree);
     hsa.val = xstrdup("");
 
     tag =
index a9f1221eb19e493056eb32491e94397e55b5e0ee..2003219b61da658c26224655e4c8b87775c987de 100644 (file)
@@ -1,5 +1,5 @@
 /** \ingroup rpmdb
- * \file lib/hdrNVR.c
+ * \file lib/headerutil.c
  */
 
 #include "system.h"
@@ -7,63 +7,10 @@
 #include <rpm/rpmtypes.h>
 #include <rpm/header.h>
 #include <rpm/rpmstring.h>
+#include <rpm/rpmds.h>
 
 #include "debug.h"
 
-static int NEVRA(Header h, const char **np,
-                uint32_t **ep, const char **vp, const char **rp,
-                const char **ap)
-{
-    if (np) *np = headerGetString(h, RPMTAG_NAME);
-    if (vp) *vp = headerGetString(h, RPMTAG_VERSION);
-    if (rp) *rp = headerGetString(h, RPMTAG_RELEASE);
-    if (ap) *ap = headerGetString(h, RPMTAG_ARCH);
-    if (ep) {
-       struct rpmtd_s td;
-       headerGet(h, RPMTAG_EPOCH, &td, HEADERGET_DEFAULT);
-       *ep = rpmtdGetUint32(&td);
-    }
-    return 0;
-}
-
-int headerNVR(Header h, const char **np, const char **vp, const char **rp)
-{
-    return NEVRA(h, np, NULL, vp, rp, NULL);
-}
-
-int headerNEVRA(Header h, const char **np,
-               uint32_t **ep, const char **vp, const char **rp,
-               const char **ap)
-{
-    return NEVRA(h, np, ep, vp, rp, ap);
-}
-
-static char *getNEVRA(Header h, rpmTag tag, const char **np)
-{
-    if (np) *np = headerGetString(h, RPMTAG_NAME);
-    return headerGetAsString(h, tag);
-}
-
-char * headerGetNEVR(Header h, const char ** np)
-{
-    return getNEVRA(h, RPMTAG_NEVR, np);
-}
-
-char * headerGetNEVRA(Header h, const char ** np)
-{
-    return getNEVRA(h, RPMTAG_NEVRA, np);
-}
-
-char * headerGetEVR(Header h, const char ** np)
-{
-    return getNEVRA(h, RPMTAG_EVR, np);
-}
-
-rpm_color_t headerGetColor(Header h)
-{
-    return headerGetNumber(h, RPMTAG_HEADERCOLOR);
-}
-
 int headerIsSource(Header h)
 {
     return (!headerIsEntry(h, RPMTAG_SOURCERPM));
@@ -84,7 +31,7 @@ Header headerCopy(Header h)
     }
     headerFreeIterator(hi);
 
-    return headerReload(nh, RPMTAG_HEADERIMAGE);
+    return nh;
 }
 
 void headerCopyTags(Header headerFrom, Header headerTo, 
@@ -243,3 +190,229 @@ int headerPutBin(Header h, rpmTagVal tag, const uint8_t *val, rpm_count_t size)
     return headerPutType(h, tag, RPM_BIN_TYPE, val, size);
 }
 
+static int dncmp(const void * a, const void * b)
+{
+    const char *const * first = a;
+    const char *const * second = b;
+    return strcmp(*first, *second);
+}
+
+static void compressFilelist(Header h)
+{
+    struct rpmtd_s fileNames;
+    char ** dirNames;
+    const char ** baseNames;
+    uint32_t * dirIndexes;
+    rpm_count_t count, realCount = 0;
+    int i;
+    int dirIndex = -1;
+
+    /*
+     * This assumes the file list is already sorted, and begins with a
+     * single '/'. That assumption isn't critical, but it makes things go
+     * a bit faster.
+     */
+
+    if (headerIsEntry(h, RPMTAG_DIRNAMES)) {
+       headerDel(h, RPMTAG_OLDFILENAMES);
+       return;         /* Already converted. */
+    }
+
+    if (!headerGet(h, RPMTAG_OLDFILENAMES, &fileNames, HEADERGET_MINMEM)) 
+       return;
+    count = rpmtdCount(&fileNames);
+    if (count < 1) 
+       return;
+
+    dirNames = xmalloc(sizeof(*dirNames) * count);     /* worst case */
+    baseNames = xmalloc(sizeof(*dirNames) * count);
+    dirIndexes = xmalloc(sizeof(*dirIndexes) * count);
+
+    /* HACK. Source RPM, so just do things differently */
+    {  const char *fn = rpmtdGetString(&fileNames);
+       if (fn && *fn != '/') {
+           dirIndex = 0;
+           dirNames[dirIndex] = xstrdup("");
+           while ((i = rpmtdNext(&fileNames)) >= 0) {
+               dirIndexes[i] = dirIndex;
+               baseNames[i] = rpmtdGetString(&fileNames);
+               realCount++;
+           }
+           goto exit;
+       }
+    }
+
+    /* 
+     * XXX EVIL HACK, FIXME:
+     * This modifies (and then restores) a const string from rpmtd
+     * through basename retrieved from strrchr() which silently 
+     * casts away const on return.
+     */
+    while ((i = rpmtdNext(&fileNames)) >= 0) {
+       char ** needle;
+       char savechar;
+       char * baseName;
+       size_t len;
+       char *filename = (char *) rpmtdGetString(&fileNames); /* HACK HACK */
+
+       if (filename == NULL)   /* XXX can't happen */
+           continue;
+       baseName = strrchr(filename, '/');
+       if (baseName == NULL) {
+           baseName = filename;
+       } else {
+           baseName += 1;
+       }
+       len = baseName - filename;
+       needle = dirNames;
+       savechar = *baseName;
+       *baseName = '\0';
+       if (dirIndex < 0 ||
+           (needle = bsearch(&filename, dirNames, dirIndex + 1, sizeof(dirNames[0]), dncmp)) == NULL) {
+           char *s = xmalloc(len + 1);
+           rstrlcpy(s, filename, len + 1);
+           dirIndexes[realCount] = ++dirIndex;
+           dirNames[dirIndex] = s;
+       } else
+           dirIndexes[realCount] = needle - dirNames;
+
+       *baseName = savechar;
+       baseNames[realCount] = baseName;
+       realCount++;
+    }
+
+exit:
+    if (count > 0) {
+       headerPutUint32(h, RPMTAG_DIRINDEXES, dirIndexes, realCount);
+       headerPutStringArray(h, RPMTAG_BASENAMES, baseNames, realCount);
+       headerPutStringArray(h, RPMTAG_DIRNAMES, 
+                            (const char **) dirNames, dirIndex + 1);
+    }
+
+    rpmtdFreeData(&fileNames);
+    for (i = 0; i <= dirIndex; i++) {
+       free(dirNames[i]);
+    }
+    free(dirNames);
+    free(baseNames);
+    free(dirIndexes);
+
+    headerDel(h, RPMTAG_OLDFILENAMES);
+}
+
+static void expandFilelist(Header h)
+{
+    struct rpmtd_s filenames;
+
+    if (!headerIsEntry(h, RPMTAG_OLDFILENAMES)) {
+       (void) headerGet(h, RPMTAG_FILENAMES, &filenames, HEADERGET_EXT);
+       if (rpmtdCount(&filenames) < 1)
+           return;
+       rpmtdSetTag(&filenames, RPMTAG_OLDFILENAMES);
+       headerPut(h, &filenames, HEADERPUT_DEFAULT);
+       rpmtdFreeData(&filenames);
+    }
+
+    (void) headerDel(h, RPMTAG_DIRNAMES);
+    (void) headerDel(h, RPMTAG_BASENAMES);
+    (void) headerDel(h, RPMTAG_DIRINDEXES);
+}
+
+/*
+ * Up to rpm 3.0.4, packages implicitly provided their own name-version-release.
+ * Retrofit an explicit "Provides: name = epoch:version-release.
+ */
+static void providePackageNVR(Header h)
+{
+    const char *name = headerGetString(h, RPMTAG_NAME);
+    char *pEVR = headerGetAsString(h, RPMTAG_EVR);
+    rpmsenseFlags pFlags = RPMSENSE_EQUAL;
+    int bingo = 1;
+    struct rpmtd_s pnames;
+    rpmds hds, nvrds;
+
+    /* Generate provides for this package name-version-release. */
+    if (!(name && pEVR))
+       return;
+
+    /*
+     * Rpm prior to 3.0.3 does not have versioned provides.
+     * If no provides at all are available, we can just add.
+     */
+    if (!headerGet(h, RPMTAG_PROVIDENAME, &pnames, HEADERGET_MINMEM)) {
+       goto exit;
+    }
+
+    /*
+     * Otherwise, fill in entries on legacy packages.
+     */
+    if (!headerIsEntry(h, RPMTAG_PROVIDEVERSION)) {
+       while (rpmtdNext(&pnames) >= 0) {
+           rpmsenseFlags fdummy = RPMSENSE_ANY;
+
+           headerPutString(h, RPMTAG_PROVIDEVERSION, "");
+           headerPutUint32(h, RPMTAG_PROVIDEFLAGS, &fdummy, 1);
+       }
+       goto exit;
+    }
+
+    /* see if we already have this provide */
+    hds = rpmdsNew(h, RPMTAG_PROVIDENAME, 0);
+    nvrds = rpmdsSingle(RPMTAG_PROVIDENAME, name, pEVR, pFlags);
+    if (rpmdsFind(hds, nvrds) >= 0) {
+       bingo = 0;
+    }
+    rpmdsFree(hds);
+    rpmdsFree(nvrds);
+    
+
+exit:
+    if (bingo) {
+       headerPutString(h, RPMTAG_PROVIDENAME, name);
+       headerPutString(h, RPMTAG_PROVIDEVERSION, pEVR);
+       headerPutUint32(h, RPMTAG_PROVIDEFLAGS, &pFlags, 1);
+    }
+    rpmtdFreeData(&pnames);
+    free(pEVR);
+}
+
+static void legacyRetrofit(Header h)
+{
+    /*
+     * The file list was moved to a more compressed format which not
+     * only saves memory (nice), but gives fingerprinting a nice, fat
+     * speed boost (very nice). Go ahead and convert old headers to
+     * the new style (this is a noop for new headers).
+     */
+     compressFilelist(h);
+
+    /* Retrofit "Provide: name = EVR" for binary packages. */
+    if (!headerIsSource(h)) {
+       providePackageNVR(h);
+    }
+}
+
+int headerConvert(Header h, int op)
+{
+    int rc = 1;
+
+    if (h == NULL)
+       return 0;
+
+    switch (op) {
+    case HEADERCONV_EXPANDFILELIST:
+       expandFilelist(h);
+       break;
+    case HEADERCONV_COMPRESSFILELIST:
+       compressFilelist(h);
+       break;
+    case HEADERCONV_RETROFIT_V3:
+       legacyRetrofit(h);
+       break;
+    default:
+       rc = 0;
+       break;
+    }
+    return rc;
+};
+
diff --git a/lib/legacy.c b/lib/legacy.c
deleted file mode 100644 (file)
index 422c2b0..0000000
+++ /dev/null
@@ -1,379 +0,0 @@
-/**
- * \file lib/legacy.c
- */
-
-#include "system.h"
-
-#include <rpm/header.h>
-#include <rpm/rpmmacro.h>
-#include <rpm/rpmstring.h>
-#include <rpm/rpmfi.h>
-#include <rpm/rpmds.h>
-
-#include "debug.h"
-
-static int dncmp(const void * a, const void * b)
-{
-    const char *const * first = a;
-    const char *const * second = b;
-    return strcmp(*first, *second);
-}
-
-static void compressFilelist(Header h)
-{
-    struct rpmtd_s fileNames;
-    char ** dirNames;
-    const char ** baseNames;
-    uint32_t * dirIndexes;
-    rpm_count_t count;
-    int i;
-    int dirIndex = -1;
-
-    /*
-     * This assumes the file list is already sorted, and begins with a
-     * single '/'. That assumption isn't critical, but it makes things go
-     * a bit faster.
-     */
-
-    if (headerIsEntry(h, RPMTAG_DIRNAMES)) {
-       headerDel(h, RPMTAG_OLDFILENAMES);
-       return;         /* Already converted. */
-    }
-
-    if (!headerGet(h, RPMTAG_OLDFILENAMES, &fileNames, HEADERGET_MINMEM)) 
-       return;
-    count = rpmtdCount(&fileNames);
-    if (count < 1) 
-       return;
-
-    dirNames = xmalloc(sizeof(*dirNames) * count);     /* worst case */
-    baseNames = xmalloc(sizeof(*dirNames) * count);
-    dirIndexes = xmalloc(sizeof(*dirIndexes) * count);
-
-    /* HACK. Source RPM, so just do things differently */
-    {  const char *fn = rpmtdGetString(&fileNames);
-       if (fn && *fn != '/') {
-           dirIndex = 0;
-           dirNames[dirIndex] = xstrdup("");
-           while ((i = rpmtdNext(&fileNames)) >= 0) {
-               dirIndexes[i] = dirIndex;
-               baseNames[i] = rpmtdGetString(&fileNames);
-           }
-           goto exit;
-       }
-    }
-
-    /* 
-     * XXX EVIL HACK, FIXME:
-     * This modifies (and then restores) a const string from rpmtd
-     * through basename retrieved from strrchr() which silently 
-     * casts away const on return.
-     */
-    while ((i = rpmtdNext(&fileNames)) >= 0) {
-       char ** needle;
-       char savechar;
-       char * baseName;
-       size_t len;
-       char *filename = (char *) rpmtdGetString(&fileNames); /* HACK HACK */
-
-       if (filename == NULL)   /* XXX can't happen */
-           continue;
-       baseName = strrchr(filename, '/') + 1;
-       len = baseName - filename;
-       needle = dirNames;
-       savechar = *baseName;
-       *baseName = '\0';
-       if (dirIndex < 0 ||
-           (needle = bsearch(&filename, dirNames, dirIndex + 1, sizeof(dirNames[0]), dncmp)) == NULL) {
-           char *s = xmalloc(len + 1);
-           rstrlcpy(s, filename, len + 1);
-           dirIndexes[i] = ++dirIndex;
-           dirNames[dirIndex] = s;
-       } else
-           dirIndexes[i] = needle - dirNames;
-
-       *baseName = savechar;
-       baseNames[i] = baseName;
-    }
-
-exit:
-    if (count > 0) {
-       headerPutUint32(h, RPMTAG_DIRINDEXES, dirIndexes, count);
-       headerPutStringArray(h, RPMTAG_BASENAMES, baseNames, count);
-       headerPutStringArray(h, RPMTAG_DIRNAMES, 
-                            (const char **) dirNames, dirIndex + 1);
-    }
-
-    rpmtdFreeData(&fileNames);
-    for (i = 0; i <= dirIndex; i++) {
-       free(dirNames[i]);
-    }
-    free(dirNames);
-    free(baseNames);
-    free(dirIndexes);
-
-    headerDel(h, RPMTAG_OLDFILENAMES);
-}
-
-static void expandFilelist(Header h)
-{
-    struct rpmtd_s filenames;
-
-    if (!headerIsEntry(h, RPMTAG_OLDFILENAMES)) {
-       (void) headerGet(h, RPMTAG_FILENAMES, &filenames, HEADERGET_EXT);
-       if (rpmtdCount(&filenames) < 1)
-           return;
-       rpmtdSetTag(&filenames, RPMTAG_OLDFILENAMES);
-       headerPut(h, &filenames, HEADERPUT_DEFAULT);
-       rpmtdFreeData(&filenames);
-    }
-
-    (void) headerDel(h, RPMTAG_DIRNAMES);
-    (void) headerDel(h, RPMTAG_BASENAMES);
-    (void) headerDel(h, RPMTAG_DIRINDEXES);
-}
-
-/*
- * Up to rpm 3.0.4, packages implicitly provided their own name-version-release.
- * Retrofit an explicit "Provides: name = epoch:version-release.
- */
-static void providePackageNVR(Header h)
-{
-    const char *name = headerGetString(h, RPMTAG_NAME);
-    char *pEVR = headerGetAsString(h, RPMTAG_EVR);
-    rpmsenseFlags pFlags = RPMSENSE_EQUAL;
-    int bingo = 1;
-    struct rpmtd_s pnames;
-    rpmds hds, nvrds;
-
-    /* Generate provides for this package name-version-release. */
-    if (!(name && pEVR))
-       return;
-
-    /*
-     * Rpm prior to 3.0.3 does not have versioned provides.
-     * If no provides at all are available, we can just add.
-     */
-    if (!headerGet(h, RPMTAG_PROVIDENAME, &pnames, HEADERGET_MINMEM)) {
-       goto exit;
-    }
-
-    /*
-     * Otherwise, fill in entries on legacy packages.
-     */
-    if (!headerIsEntry(h, RPMTAG_PROVIDEVERSION)) {
-       while (rpmtdNext(&pnames) >= 0) {
-           rpmsenseFlags fdummy = RPMSENSE_ANY;
-
-           headerPutString(h, RPMTAG_PROVIDEVERSION, "");
-           headerPutUint32(h, RPMTAG_PROVIDEFLAGS, &fdummy, 1);
-       }
-       goto exit;
-    }
-
-    /* see if we already have this provide */
-    hds = rpmdsNew(h, RPMTAG_PROVIDENAME, 0);
-    nvrds = rpmdsSingle(RPMTAG_PROVIDENAME, name, pEVR, pFlags);
-    if (rpmdsFind(hds, nvrds) >= 0) {
-       bingo = 0;
-    }
-    rpmdsFree(hds);
-    rpmdsFree(nvrds);
-    
-
-exit:
-    if (bingo) {
-       headerPutString(h, RPMTAG_PROVIDENAME, name);
-       headerPutString(h, RPMTAG_PROVIDEVERSION, pEVR);
-       headerPutUint32(h, RPMTAG_PROVIDEFLAGS, &pFlags, 1);
-    }
-    rpmtdFreeData(&pnames);
-    free(pEVR);
-}
-
-static void legacyRetrofit(Header h)
-{
-    /*
-     * The file list was moved to a more compressed format which not
-     * only saves memory (nice), but gives fingerprinting a nice, fat
-     * speed boost (very nice). Go ahead and convert old headers to
-     * the new style (this is a noop for new headers).
-     */
-     compressFilelist(h);
-
-    /* Retrofit "Provide: name = EVR" for binary packages. */
-    if (!headerIsSource(h)) {
-       providePackageNVR(h);
-    }
-}
-
-int headerConvert(Header h, int op)
-{
-    int rc = 1;
-
-    if (h == NULL)
-       return 0;
-
-    switch (op) {
-    case HEADERCONV_EXPANDFILELIST:
-       expandFilelist(h);
-       break;
-    case HEADERCONV_COMPRESSFILELIST:
-       compressFilelist(h);
-       break;
-    case HEADERCONV_RETROFIT_V3:
-       legacyRetrofit(h);
-       break;
-    default:
-       rc = 0;
-       break;
-    }
-    return rc;
-};
-
-/*
- * Backwards compatibility wrappers for legacy interfaces.
- * Remove these some day...
- */
-#define _RPM_4_4_COMPAT
-#include <rpm/rpmlegacy.h>
-
-/* dumb macro to avoid 50 copies of this code while converting... */
-#define TDWRAP() \
-    if (type) \
-       *type = td.type; \
-    if (p) \
-       *p = td.data; \
-    else \
-       rpmtdFreeData(&td); \
-    if (c) \
-       *c = td.count
-
-int headerRemoveEntry(Header h, rpm_tag_t tag)
-{
-    return headerDel(h, tag);
-}
-
-static void *_headerFreeData(rpm_data_t data, rpm_tagtype_t type)
-{
-    if (data) {
-       if (type == RPM_FORCEFREE_TYPE ||
-           type == RPM_STRING_ARRAY_TYPE ||
-           type == RPM_I18NSTRING_TYPE ||
-           type == RPM_BIN_TYPE)
-               free(data);
-    }
-    return NULL;
-}
-
-void * headerFreeData(rpm_data_t data, rpm_tagtype_t type)
-{
-    return _headerFreeData(data, type);
-}
-
-void * headerFreeTag(Header h, rpm_data_t data, rpm_tagtype_t type)
-{
-    return _headerFreeData(data, type);
-}
-
-static int headerGetWrap(Header h, rpm_tag_t tag,
-               rpm_tagtype_t * type,
-               rpm_data_t * p,
-               rpm_count_t * c,
-               headerGetFlags flags)
-{
-    struct rpmtd_s td;
-    int rc;
-
-    rc = headerGet(h, tag, &td, flags);
-    TDWRAP();
-    return rc;
-}
-
-int headerGetEntry(Header h, rpm_tag_t tag,
-                       rpm_tagtype_t * type,
-                       rpm_data_t * p,
-                       rpm_count_t * c)
-{
-    return headerGetWrap(h, tag, type, p, c, HEADERGET_DEFAULT);
-}
-
-int headerGetEntryMinMemory(Header h, rpm_tag_t tag,
-                       rpm_tagtype_t * type,
-                       rpm_data_t * p,
-                       rpm_count_t * c)
-{
-    return headerGetWrap(h, tag, type, (rpm_data_t) p, c, HEADERGET_MINMEM);
-}
-
-/* XXX shut up compiler warning from missing prototype */
-int headerGetRawEntry(Header h, rpm_tag_t tag, rpm_tagtype_t * type, rpm_data_t * p,
-               rpm_count_t * c);
-
-int headerGetRawEntry(Header h, rpm_tag_t tag, rpm_tagtype_t * type, rpm_data_t * p,
-               rpm_count_t * c)
-{
-    if (p == NULL) 
-       return headerIsEntry(h, tag);
-
-    return headerGetWrap(h, tag, type, p, c, HEADERGET_RAW);
-}
-
-int headerNextIterator(HeaderIterator hi,
-               rpm_tag_t * tag,
-               rpm_tagtype_t * type,
-               rpm_data_t * p,
-               rpm_count_t * c)
-{
-    struct rpmtd_s td;
-    int rc;
-
-    rc = headerNext(hi, &td);
-    if (tag)
-       *tag = td.tag;
-    TDWRAP();
-    return rc;
-}
-
-int headerModifyEntry(Header h, rpm_tag_t tag, rpm_tagtype_t type,
-                       rpm_constdata_t p, rpm_count_t c)
-{
-    struct rpmtd_s td = {
-       .tag = tag,
-       .type = type,
-       .data = (void *) p,
-       .count = c,
-    };
-    return headerMod(h, &td);
-}
-
-static int headerPutWrap(Header h, rpm_tag_t tag, rpm_tagtype_t type,
-               rpm_constdata_t p, rpm_count_t c, headerPutFlags flags)
-{
-    struct rpmtd_s td = {
-       .tag = tag,
-       .type = type,
-       .data = (void *) p,
-       .count = c,
-    };
-    return headerPut(h, &td, flags);
-}
-
-int headerAddOrAppendEntry(Header h, rpm_tag_t tag, rpm_tagtype_t type,
-               rpm_constdata_t p, rpm_count_t c)
-{
-    return headerPutWrap(h, tag, type, p, c, HEADERPUT_APPEND);
-}
-
-int headerAppendEntry(Header h, rpm_tag_t tag, rpm_tagtype_t type,
-               rpm_constdata_t p, rpm_count_t c)
-{
-    return headerPutWrap(h, tag, type, p, c, HEADERPUT_APPEND);
-}
-
-int headerAddEntry(Header h, rpm_tag_t tag, rpm_tagtype_t type,
-               rpm_constdata_t p, rpm_count_t c)
-{
-    return headerPutWrap(h, tag, type, p, c, HEADERPUT_DEFAULT);
-}
-#undef _RPM_4_4_COMPAT
index 5d71f3f258b156480b840184c9815f38ea46f602..71c4c912c226a9c2b86faafecfde7e16986077b7 100644 (file)
@@ -94,8 +94,8 @@ rpmRC rpmReadPackageManifest(FD_t fd, int * argcPtr, char *** argvPtr)
            s++;
        if (*s == '\0') continue;
 
-       /* Sanity checks: skip obviously binary lines and dash (for stdin) */
-       if (*s < 32 || rstreq(s, "-")) {
+       /* Sanity checks: skip obviously binary lines */
+       if (*s < 32) {
            s = NULL;
            rpmrc = RPMRC_NOTFOUND;
            goto exit;
@@ -117,6 +117,14 @@ rpmRC rpmReadPackageManifest(FD_t fd, int * argcPtr, char *** argvPtr)
     rpmrc = (rpmGlob(s, &ac, &av) == 0 ? RPMRC_OK : RPMRC_FAIL);
     if (rpmrc != RPMRC_OK) goto exit;
 
+    /* Sanity check: skip dash (for stdin) */
+    for (i = 0; i < ac; i++) {
+       if (rstreq(av[i], "-")) {
+           rpmrc = RPMRC_NOTFOUND;
+           goto exit;
+       }
+    }
+
     rpmlog(RPMLOG_DEBUG, "adding %d args from manifest.\n", ac);
 
     /* Count non-NULL args, keeping track of 1st arg after last NULL. */
diff --git a/lib/merge.c b/lib/merge.c
deleted file mode 100644 (file)
index 738ad7a..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-#ifndef __APPLE__
-/*-
- * Copyright (c) 1992, 1993
- *     The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Peter McIlroy.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)merge.c    8.2 (Berkeley) 2/14/94";
-#endif /* LIBC_SCCS and not lint */
-
-/*
- * Hybrid exponential search/linear search merge sort with hybrid
- * natural/pairwise first pass.  Requires about .3% more comparisons
- * for random data than LSMS with pairwise first pass alone.
- * It works for objects as small as two bytes.
- */
-
-#define NATURAL
-#define THRESHOLD 16   /* Best choice for natural merge cut-off. */
-
-/* #define NATURAL to get hybrid natural merge.
- * (The default is pairwise merging.)
- */
-
-#include "system.h"
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include "lib/rpmdb_internal.h" /* XXX for mergesort */
-
-#define ISIZE sizeof(int)
-#define PSIZE sizeof(unsigned char *)
-#define ICOPY_LIST(src, dst, last)                             \
-       do                                                      \
-       *(int*)dst = *(int*)src, src += ISIZE, dst += ISIZE;    \
-       while(src < last)
-#define ICOPY_ELT(src, dst, i)                                 \
-       do                                                      \
-       *(int*) dst = *(int*) src, src += ISIZE, dst += ISIZE;  \
-       while (i -= ISIZE)
-
-#define CCOPY_LIST(src, dst, last)             \
-       do                                      \
-               *dst++ = *src++;                \
-       while (src < last)
-#define CCOPY_ELT(src, dst, i)                 \
-       do                                      \
-               *dst++ = *src++;                \
-       while (i -= 1)
-
-/*
- * Find the next possible pointer head.  (Trickery for forcing an array
- * to do double duty as a linked list when objects do not align with word
- * boundaries.
- */
-/* Assumption: PSIZE is a power of 2. */
-#define EVAL(p) (unsigned char **)                                     \
-    ((unsigned char *)0 +                                              \
-       (((unsigned char *)p + PSIZE - 1 - (unsigned char *) 0) & ~(PSIZE - 1)))
-
-#define        swap(a, b) {                                    \
-               s = b;                                  \
-               i = size;                               \
-               do {                                    \
-                       tmp = *a; *a++ = *s; *s++ = tmp; \
-               } while (--i);                          \
-               a -= size;                              \
-       }
-#define reverse(bot, top) {                            \
-       s = top;                                        \
-       do {                                            \
-               i = size;                               \
-               do {                                    \
-                       tmp = *bot; *bot++ = *s; *s++ = tmp; \
-               } while (--i);                          \
-               s -= size2;                             \
-       } while(bot < s);                               \
-}
-
-/*
- * This is to avoid out-of-bounds addresses in sorting the
- * last 4 elements.
- */
-static void
-insertionsort(unsigned char *a, size_t n, size_t size,
-               int (*cmp) (const void *, const void *))
-{
-       unsigned char *ai, *s, *t, *u, tmp;
-       int i;
-
-       for (ai = a+size; --n >= 1; ai += size)
-               for (t = ai; t > a; t -= size) {
-                       u = t - size;
-                       if (cmp(u, t) <= 0)
-                               break;
-                       swap(u, t);
-               }
-}
-
-/*
- * Optional hybrid natural/pairwise first pass.  Eats up list1 in runs of
- * increasing order, list2 in a corresponding linked list.  Checks for runs
- * when THRESHOLD/2 pairs compare with same sense.  (Only used when NATURAL
- * is defined.  Otherwise simple pairwise merging is used.)
- */
-static void
-setup(unsigned char *list1, unsigned char *list2,
-               size_t n, size_t size, int (*cmp) (const void *, const void *))
-{
-       int i, length, size2, tmp, sense;
-       unsigned char *f1, *f2, *s, *l2, *last, *p2;
-
-       size2 = size*2;
-       if (n <= 5) {
-               insertionsort(list1, n, size, cmp);
-               *EVAL(list2) = (unsigned char*) list2 + n*size;
-               return;
-       }
-       /*
-        * Avoid running pointers out of bounds; limit n to evens
-        * for simplicity.
-        */
-       i = 4 + (n & 1);
-       insertionsort(list1 + (n - i) * size, i, size, cmp);
-       last = list1 + size * (n - i);
-       *EVAL(list2 + (last - list1)) = list2 + n * size;
-
-#ifdef NATURAL
-       p2 = list2;
-       f1 = list1;
-       sense = (cmp(f1, f1 + size) > 0);
-       for (; f1 < last; sense = !sense) {
-               length = 2;
-                                       /* Find pairs with same sense. */
-               for (f2 = f1 + size2; f2 < last; f2 += size2) {
-                       if ((cmp(f2, f2+ size) > 0) != sense)
-                               break;
-                       length += 2;
-               }
-               if (length < THRESHOLD) {               /* Pairwise merge */
-                       do {
-                               p2 = *EVAL(p2) = f1 + size2 - list1 + list2;
-                               if (sense > 0)
-                                       swap (f1, f1 + size);
-                       } while ((f1 += size2) < f2);
-               } else {                                /* Natural merge */
-                       l2 = f2;
-                       for (f2 = f1 + size2; f2 < l2; f2 += size2) {
-                               if ((cmp(f2-size, f2) > 0) != sense) {
-                                       p2 = *EVAL(p2) = f2 - list1 + list2;
-                                       if (sense > 0)
-                                               reverse(f1, f2-size);
-                                       f1 = f2;
-                               }
-                       }
-                       if (sense > 0)
-                               reverse (f1, f2-size);
-                       f1 = f2;
-                       if (f2 < last || cmp(f2 - size, f2) > 0)
-                               p2 = *EVAL(p2) = f2 - list1 + list2;
-                       else
-                               p2 = *EVAL(p2) = list2 + n*size;
-               }
-       }
-#else          /* pairwise merge only. */
-       for (f1 = list1, p2 = list2; f1 < last; f1 += size2) {
-               p2 = *EVAL(p2) = p2 + size2;
-               if (cmp (f1, f1 + size) > 0)
-                       swap(f1, f1 + size);
-       }
-#endif /* NATURAL */
-}
-
-/*
- * Arguments are as for qsort.
- */
-int
-mergesort(void *base, size_t nmemb, size_t size,
-               int (*cmp) (const void *, const void *))
-{
-       register int i, sense;
-       int big, iflag;
-       register unsigned char *f1, *f2, *t, *b, *q, *l1, *l2;
-       register unsigned char *tp2;
-       unsigned char *list2;
-       unsigned char *list1;
-       unsigned char *p2, *p, *last, **p1;
-
-       if (size < PSIZE / 2) {         /* Pointers must fit into 2 * size. */
-               errno = EINVAL;
-               return (-1);
-       }
-
-       if (nmemb == 0)
-               return (0);
-
-       /*
-        * XXX
-        * Stupid subtraction for the Cray.
-        */
-       iflag = 0;
-       if (!(size % ISIZE) && !(((char *)base - (char *)0) % ISIZE))
-               iflag = 1;
-
-       if ((list2 = malloc(nmemb * size + PSIZE)) == NULL)
-               return (-1);
-
-       list1 = base;
-       setup(list1, list2, nmemb, size, cmp);
-       last = list2 + nmemb * size;
-       i = big = 0;
-       while (*EVAL(list2) != last) {
-           l2 = list1;
-           p1 = EVAL(list1);
-           for (tp2 = p2 = list2; p2 != last; p1 = EVAL(l2)) {
-               p2 = *EVAL(p2);
-               f1 = l2;
-               f2 = l1 = list1 + (p2 - list2);
-               if (p2 != last)
-                       p2 = *EVAL(p2);
-               l2 = list1 + (p2 - list2);
-               while (f1 < l1 && f2 < l2) {
-                       if ((*cmp)(f1, f2) <= 0) {
-                               q = f2;
-                               b = f1, t = l1;
-                               sense = -1;
-                       } else {
-                               q = f1;
-                               b = f2, t = l2;
-                               sense = 0;
-                       }
-                       if (!big) {     /* here i = 0 */
-                               while ((b += size) < t && cmp(q, b) >sense)
-                                       if (++i == 6) {
-                                               big = 1;
-                                               goto EXPONENTIAL;
-                                       }
-                       } else {
-EXPONENTIAL:                   for (i = size; ; i <<= 1)
-                                       if ((p = (b + i)) >= t) {
-                                               if ((p = t - size) > b &&
-                                                   (*cmp)(q, p) <= sense)
-                                                       t = p;
-                                               else
-                                                       b = p;
-                                               break;
-                                       } else if ((*cmp)(q, p) <= sense) {
-                                               t = p;
-                                               if (i == size)
-                                                       big = 0;
-                                               goto FASTCASE;
-                                       } else
-                                               b = p;
-                               while (t > b+size) {
-                                       i = (((t - b) / size) >> 1) * size;
-                                       if ((*cmp)(q, p = b + i) <= sense)
-                                               t = p;
-                                       else
-                                               b = p;
-                               }
-                               goto COPY;
-FASTCASE:                      while (i > size)
-                                       if ((*cmp)(q,
-                                               p = b + (i >>= 1)) <= sense)
-                                               t = p;
-                                       else
-                                               b = p;
-COPY:                          b = t;
-                       }
-                       i = size;
-                       if (q == f1) {
-                               if (iflag) {
-                                       ICOPY_LIST(f2, tp2, b);
-                                       ICOPY_ELT(f1, tp2, i);
-                               } else {
-                                       CCOPY_LIST(f2, tp2, b);
-                                       CCOPY_ELT(f1, tp2, i);
-                               }
-                       } else {
-                               if (iflag) {
-                                       ICOPY_LIST(f1, tp2, b);
-                                       ICOPY_ELT(f2, tp2, i);
-                               } else {
-                                       CCOPY_LIST(f1, tp2, b);
-                                       CCOPY_ELT(f2, tp2, i);
-                               }
-                       }
-               }
-               if (f2 < l2) {
-                       if (iflag)
-                               ICOPY_LIST(f2, tp2, l2);
-                       else
-                               CCOPY_LIST(f2, tp2, l2);
-               } else if (f1 < l1) {
-                       if (iflag)
-                               ICOPY_LIST(f1, tp2, l1);
-                       else
-                               CCOPY_LIST(f1, tp2, l1);
-               }
-               *p1 = l2;
-           }
-           tp2 = list1;        /* swap list1, list2 */
-           list1 = list2;
-           list2 = tp2;
-           last = list2 + nmemb*size;
-       }
-       if (base == list2) {
-               memmove(list2, list1, nmemb*size);
-               list2 = list1;
-       }
-       free(list2);
-       return (0);
-}
-#else
-/* mergesort is implemented in System on Mac OS X */
-#endif /* __APPLE__ */
index 15c9e3111c245178e541a0b1f3b418ee398df2c2..74e94a2e78c68afefa91f7867ea9bf0c01f1cbaf 100644 (file)
@@ -9,6 +9,9 @@
 #include <string.h>
 #include <rpm/rpmtypes.h>
 #include <rpm/header.h>                /* for headerGetFlags typedef, duh.. */
+#include "lib/rpmfs.h"
+
+typedef const struct headerFmt_s * headerFmt;
 
 #ifdef __cplusplus
 extern "C" {
@@ -24,18 +27,43 @@ char * rpmVerifyString(uint32_t verifyResult, const char *pad);
 RPM_GNUC_INTERNAL
 char * rpmFFlagsString(uint32_t fflags, const char *pad);
 
-typedef char * (*headerTagFormatFunction) (rpmtd td);
 typedef int (*headerTagTagFunction) (Header h, rpmtd td, headerGetFlags hgflags);
 
 RPM_GNUC_INTERNAL
 headerTagTagFunction rpmHeaderTagFunc(rpmTagVal tag);
 
 RPM_GNUC_INTERNAL
-headerTagFormatFunction rpmHeaderFormatFuncByName(const char *fmt);
+headerFmt rpmHeaderFormatByName(const char *fmt);
+
+RPM_GNUC_INTERNAL
+headerFmt rpmHeaderFormatByValue(rpmtdFormats fmt);
+
+RPM_GNUC_INTERNAL
+char * rpmHeaderFormatCall(headerFmt fmt, rpmtd td);
+
+RPM_GNUC_INTERNAL
+int headerFindSpec(Header h);
+
+/**
+ * Relocate files in header.
+ * @todo multilib file dispositions need to be checked.
+ * @param relocs               relocations
+ * @param numRelocations       number of relocations
+ * @param fs                   file state set
+ * @param h                    package header to relocate
+ */
+RPM_GNUC_INTERNAL
+void rpmRelocateFileList(rpmRelocation *relocs, int numRelocations, rpmfs fs, Header h);
 
 RPM_GNUC_INTERNAL
-headerTagFormatFunction rpmHeaderFormatFuncByValue(rpmtdFormats fmt);
+int rpmRelocateSrpmFileList(Header h, const char *rootDir);
 
+RPM_GNUC_INTERNAL
+void rpmRelocationBuild(Header h, rpmRelocation *rawrelocs,
+               int *rnrelocs, rpmRelocation **rrelocs, uint8_t **rbadrelocs);
+
+RPM_GNUC_INTERNAL
+void rpmAtExit(void);
 #ifdef __cplusplus
 }
 #endif
index c0ef5470a6ff7c18078e2fe5df5c217d64ea0d40..7a1dd10fdc5eeabe0725e514ca7e5b374e218310 100644 (file)
@@ -67,7 +67,8 @@ static void rpmTSIFree(tsortInfo tsi)
 
 static inline int addSingleRelation(rpmte p,
                                    rpmte q,
-                                   rpmsenseFlags dsflags)
+                                   rpmsenseFlags dsflags,
+                                   int reversed)
 {
     struct tsortInfo_s *tsi_p, *tsi_q;
     relation rel;
@@ -80,9 +81,7 @@ static inline int addSingleRelation(rpmte p,
 
     /* Erasures are reversed installs. */
     if (teType == TR_REMOVED) {
-       rpmte r = p;
-       p = q;
-       q = r;
+       reversed = ! reversed;
        flags = isErasePreReq(dsflags);
     } else {
        flags = isInstallPreReq(dsflags);
@@ -94,32 +93,62 @@ static inline int addSingleRelation(rpmte p,
            RPMSENSE_SCRIPT_PRE : RPMSENSE_SCRIPT_PREUN;
     }
 
+    if (reversed) {
+       rpmte r = p;
+       p = q;
+       q = r;
+    }
+
     tsi_p = rpmteTSI(p);
     tsi_q = rpmteTSI(q);
 
     /* if relation got already added just update the flags */
-    if (tsi_q->tsi_relations && tsi_q->tsi_relations->rel_suc == tsi_p) {
+    if (!reversed &&
+       tsi_q->tsi_relations && tsi_q->tsi_relations->rel_suc == tsi_p) {
+       /* must be latest one added to q as we add all rels to p at once */
        tsi_q->tsi_relations->rel_flags |= flags;
-       tsi_p->tsi_forward_relations->rel_flags |= flags;
-       return 0;
+       /* search entry in p */
+       for (struct relation_s * tsi = tsi_p->tsi_forward_relations;
+            tsi; tsi = tsi->rel_next) {
+           if (tsi->rel_suc == tsi_q) {
+               tsi->rel_flags |= flags;
+               return 0;
+           }
+       }
+       assert(0);
     }
 
-    /* Record next "q <- p" relation (i.e. "p" requires "q"). */
-    if (p != q) {
-       /* bump p predecessor count */
-       tsi_p->tsi_count++;
+    /* if relation got already added just update the flags */
+    if (reversed && tsi_q->tsi_forward_relations &&
+       tsi_q->tsi_forward_relations->rel_suc == tsi_p) {
+       /* must be latest one added to q as we add all rels to p at once */
+       tsi_q->tsi_forward_relations->rel_flags |= flags;
+       /* search entry in p */
+       for (struct relation_s * tsi = tsi_p->tsi_relations;
+            tsi; tsi = tsi->rel_next) {
+           if (tsi->rel_suc == tsi_q) {
+               tsi->rel_flags |= flags;
+               return 0;
+           }
+       }
+       assert(0);
     }
 
+    /* Record next "q <- p" relation (i.e. "p" requires "q"). */
+
+    /* bump p predecessor count */
+    tsi_p->tsi_count++;
+
     rel = xcalloc(1, sizeof(*rel));
     rel->rel_suc = tsi_p;
     rel->rel_flags = flags;
 
     rel->rel_next = tsi_q->tsi_relations;
     tsi_q->tsi_relations = rel;
-    if (p != q) {
-       /* bump q successor count */
-       tsi_q->tsi_qcnt++;
-    }
+
+    
+    /* bump q successor count */
+    tsi_q->tsi_qcnt++;
 
     rel = xcalloc(1, sizeof(*rel));
     rel->rel_suc = tsi_q;
@@ -134,6 +163,7 @@ static inline int addSingleRelation(rpmte p,
 /**
  * Record next "q <- p" relation (i.e. "p" requires "q").
  * @param ts           transaction set
+ * @param al           packages list
  * @param p            predecessor (i.e. package that "Requires: q")
  * @param requires     relation
  * @return             0 always
@@ -141,7 +171,8 @@ static inline int addSingleRelation(rpmte p,
 static inline int addRelation(rpmts ts,
                              rpmal al,
                              rpmte p,
-                             rpmds requires)
+                             rpmds requires,
+                             int reversed)
 {
     rpmte q;
     rpmsenseFlags dsflags;
@@ -152,47 +183,35 @@ static inline int addRelation(rpmts ts,
     if (dsflags & (RPMSENSE_RPMLIB|RPMSENSE_CONFIG|RPMSENSE_PRETRANS|RPMSENSE_POSTTRANS))
        return 0;
 
-    q = rpmalSatisfiesDepend(al, requires);
+    if (rpmdsIsRich(requires)) {
+       rpmds ds1, ds2;
+       rpmrichOp op;
+       if (rpmdsParseRichDep(requires, &ds1, &ds2, &op, NULL) == RPMRC_OK) {
+           if (op != RPMRICHOP_ELSE)
+               addRelation(ts, al, p, ds1, reversed);
+           if (op == RPMRICHOP_IF || op == RPMRICHOP_UNLESS) {
+             rpmds ds21, ds22;
+             rpmrichOp op2;
+             if (rpmdsParseRichDep(requires, &ds21, &ds22, &op2, NULL) == RPMRC_OK && op2 == RPMRICHOP_ELSE) {
+                 addRelation(ts, al, p, ds22, reversed);
+             }
+             ds21 = rpmdsFree(ds21);
+             ds22 = rpmdsFree(ds22);
+           }
+           if (op == RPMRICHOP_AND || op == RPMRICHOP_OR)
+               addRelation(ts, al, p, ds2, reversed);
+           ds1 = rpmdsFree(ds1);
+           ds2 = rpmdsFree(ds2);
+       }
+       return 0;
+    }
+    q = rpmalSatisfiesDepend(al, p, requires);
 
     /* Avoid deps outside this transaction and self dependencies */
     if (q == NULL || q == p)
        return 0;
 
-    addSingleRelation(p, q, dsflags);
-
-    return 0;
-}
-
-/*
- * Collections might have special ordering requirements. Notably
- * sepolicy collection requires having all the bits in the collection
- * close to each other. We try to ensure this by creating a strongly
- * connected component of such "grouped" collections, by introducing 
- * an artificial relation loop across the all its members.
- */
-static int addCollRelations(rpmal al, rpmte p, ARGV_t *seenColls)
-{
-    ARGV_const_t qcolls;
-
-    for (qcolls = rpmteCollections(p); qcolls && *qcolls; qcolls++) {
-       char * flags;
-       if (argvSearch(*seenColls, *qcolls, NULL))
-           continue;
-
-       flags = rstrscat(NULL, "%{__collection_", *qcolls, "_flags}", NULL);
-       if (rpmExpandNumeric(flags) & 0x1) {
-           rpmte *tes = rpmalAllInCollection(al, *qcolls);
-           for (rpmte *te = tes; te && *te; te++) {
-               rpmte next = (*(te + 1) != NULL) ? *(te + 1) : *tes;
-               addSingleRelation(*te, next, RPMSENSE_ANY);
-           }
-           _free(tes);
-       }
-       free(flags);
-
-       argvAdd(seenColls, *qcolls);
-       argvSort(*seenColls, NULL);
-    }
+    addSingleRelation(p, q, dsflags, reversed);
 
     return 0;
 }
@@ -552,7 +571,6 @@ int rpmtsOrder(rpmts ts)
     scc SCCs;
     int nelem = rpmtsNElements(ts);
     tsortInfo sortInfo = xcalloc(nelem, sizeof(struct tsortInfo_s));
-    ARGV_t seenColls = NULL;
 
     (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_ORDER), 0);
 
@@ -571,22 +589,43 @@ int rpmtsOrder(rpmts ts)
        rpmal al = (rpmteType(p) == TR_REMOVED) ? 
                   erasedPackages : tsmem->addedPackages;
        rpmds requires = rpmdsInit(rpmteDS(p, RPMTAG_REQUIRENAME));
+       rpmds recommends = rpmdsInit(rpmteDS(p, RPMTAG_RECOMMENDNAME));
+       rpmds suggests = rpmdsInit(rpmteDS(p, RPMTAG_SUGGESTNAME));
+       rpmds supplements = rpmdsInit(rpmteDS(p, RPMTAG_SUPPLEMENTNAME));
+       rpmds enhances = rpmdsInit(rpmteDS(p, RPMTAG_ENHANCENAME));
        rpmds order = rpmdsInit(rpmteDS(p, RPMTAG_ORDERNAME));
 
        while (rpmdsNext(requires) >= 0) {
            /* Record next "q <- p" relation (i.e. "p" requires "q"). */
-           (void) addRelation(ts, al, p, requires);
+           (void) addRelation(ts, al, p, requires, 0);
+       }
+
+       while (rpmdsNext(recommends) >= 0) {
+           /* Record next "q <- p" relation (i.e. "p" recommends "q"). */
+           (void) addRelation(ts, al, p, recommends, 0);
+       }
+
+       while (rpmdsNext(suggests) >= 0) {
+           /* Record next "q <- p" relation (i.e. "p" suggests "q"). */
+           (void) addRelation(ts, al, p, suggests, 0);
        }
 
        while (rpmdsNext(order) >= 0) {
            /* Record next "q <- p" ordering request */
-           (void) addRelation(ts, al, p, order);
+           (void) addRelation(ts, al, p, order, 0);
        }
 
-       addCollRelations(al, p, &seenColls);
+       while (rpmdsNext(supplements) >= 0) {
+           /* Record next "p -> q" relation (i.e. "q" supplemented by "p"). */
+           (void) addRelation(ts, al, p, supplements, 1);
+       }
+
+       while (rpmdsNext(enhances) >= 0) {
+           /* Record next "p <- q" relation (i.e. "q" is enhanced by  "p"). */
+           (void) addRelation(ts, al, p, enhances, 1);
+       }
     }
 
-    seenColls = argvFree(seenColls);
     rpmtsiFree(pi);
 
     newOrder = xcalloc(tsmem->orderCount, sizeof(*newOrder));
index 157c969007d575a8895ce7e53810a645b5e4d62c..74cd9f479f0b6f3e58bff26b93590f04beb2de4c 100644 (file)
@@ -5,6 +5,7 @@
 #include "system.h"
 
 #include <netinet/in.h>
+#include <pthread.h>
 
 #include <rpm/rpmlib.h>                        /* XXX RPMSIGTAG, other sig stuff */
 #include <rpm/rpmts.h>
 #include <rpm/rpmkeyring.h>
 
 #include "lib/rpmlead.h"
-#include "lib/signature.h"
-#include "rpmio/digest.h"
 #include "rpmio/rpmio_internal.h"      /* fd digest bits */
 #include "lib/header_internal.h"       /* XXX headerCheck */
+#include "lib/rpmvs.h"
 
 #include "lib/rpmplugins.h"     /* rpm plugins hooks */
 
 #include "debug.h"
 
-static const unsigned int nkeyids_max = 256;
-static unsigned int nkeyids = 0;
-static unsigned int nextkeyid  = 0;
-static unsigned int * keyids;
 
+struct taglate_s {
+    rpmTagVal stag;
+    rpmTagVal xtag;
+    rpm_count_t count;
+} const xlateTags[] = {
+    { RPMSIGTAG_SIZE, RPMTAG_SIGSIZE, 1 },
+    { RPMSIGTAG_PGP, RPMTAG_SIGPGP, 0 },
+    { RPMSIGTAG_MD5, RPMTAG_SIGMD5, 16 },
+    { RPMSIGTAG_GPG, RPMTAG_SIGGPG, 0 },
+    /* { RPMSIGTAG_PGP5, RPMTAG_SIGPGP5, 0 }, */ /* long obsolete, dont use */
+    { RPMSIGTAG_PAYLOADSIZE, RPMTAG_ARCHIVESIZE, 1 },
+    { RPMSIGTAG_SHA1, RPMTAG_SHA1HEADER, 1 },
+    { RPMSIGTAG_SHA256, RPMTAG_SHA256HEADER, 1 },
+    { RPMSIGTAG_DSA, RPMTAG_DSAHEADER, 0 },
+    { RPMSIGTAG_RSA, RPMTAG_RSAHEADER, 0 },
+    { RPMSIGTAG_LONGSIZE, RPMTAG_LONGSIGSIZE, 1 },
+    { RPMSIGTAG_LONGARCHIVESIZE, RPMTAG_LONGARCHIVESIZE, 1 },
+    { 0 }
+};
 /** \ingroup header
  * Translate and merge legacy signature tags into header.
  * @param h            header (dest)
  * @param sigh         signature header (src)
  */
-static void headerMergeLegacySigs(Header h, Header sigh)
+rpmTagVal headerMergeLegacySigs(Header h, Header sigh, char **msg)
 {
-    HeaderIterator hi;
+    const struct taglate_s *xl;
     struct rpmtd_s td;
 
-    hi = headerInitIterator(sigh);
-    for (; headerNext(hi, &td); rpmtdFreeData(&td))
-    {
-       switch (td.tag) {
-       /* XXX Translate legacy signature tag values. */
-       case RPMSIGTAG_SIZE:
-           td.tag = RPMTAG_SIGSIZE;
+    rpmtdReset(&td);
+    for (xl = xlateTags; xl->stag; xl++) {
+       /* There mustn't be one in the main header */
+       if (headerIsEntry(h, xl->xtag))
            break;
-       case RPMSIGTAG_PGP:
-           td.tag = RPMTAG_SIGPGP;
-           break;
-       case RPMSIGTAG_MD5:
-           td.tag = RPMTAG_SIGMD5;
-           break;
-       case RPMSIGTAG_GPG:
-           td.tag = RPMTAG_SIGGPG;
-           break;
-       case RPMSIGTAG_PGP5:
-           td.tag = RPMTAG_SIGPGP5;
-           break;
-       case RPMSIGTAG_PAYLOADSIZE:
-           td.tag = RPMTAG_ARCHIVESIZE;
-           break;
-       case RPMSIGTAG_SHA1:
-       case RPMSIGTAG_DSA:
-       case RPMSIGTAG_RSA:
-       default:
-           if (!(td.tag >= HEADER_SIGBASE && td.tag < HEADER_TAGBASE))
-               continue;
-           break;
-       }
-       if (td.data == NULL) continue;  /* XXX can't happen */
-       if (!headerIsEntry(h, td.tag)) {
-           if (hdrchkType(td.type))
-               continue;
-           if (td.count < 0 || hdrchkData(td.count))
-               continue;
-           switch(td.type) {
-           case RPM_NULL_TYPE:
-               continue;
+       if (headerGet(sigh, xl->stag, &td, HEADERGET_RAW|HEADERGET_MINMEM)) {
+           /* Translate legacy tags */
+           if (xl->stag != xl->xtag)
+               td.tag = xl->xtag;
+           /* Ensure type and tag size match expectations */
+           if (td.type != rpmTagGetTagType(td.tag))
                break;
-           case RPM_CHAR_TYPE:
-           case RPM_INT8_TYPE:
-           case RPM_INT16_TYPE:
-           case RPM_INT32_TYPE:
-           case RPM_INT64_TYPE:
-               if (td.count != 1)
-                   continue;
+           if (td.count < 1 || td.count > 16*1024*1024)
                break;
-           case RPM_STRING_TYPE:
-           case RPM_BIN_TYPE:
-               if (td.count >= 16*1024)
-                   continue;
+           if (xl->count && td.count != xl->count)
                break;
-           case RPM_STRING_ARRAY_TYPE:
-           case RPM_I18NSTRING_TYPE:
-               continue;
+           if (!headerPut(h, &td, HEADERPUT_DEFAULT))
                break;
-           }
-           (void) headerPut(h, &td, HEADERPUT_DEFAULT);
+           rpmtdFreeData(&td);
        }
     }
-    headerFreeIterator(hi);
+    rpmtdFreeData(&td);
+
+    if (xl->stag) {
+       rasprintf(msg, "invalid signature tag %s (%d)",
+                       rpmTagGetName(xl->xtag), xl->xtag);
+    }
+
+    return xl->stag;
 }
 
 /**
  * Remember current key id.
- * @param dig          OpenPGP packet containter
+ * XXX: This s*** needs to die. Hook it into keyring or sumthin...
+ * @param keyid                signature keyid
  * @return             0 if new keyid, otherwise 1
  */
-static int stashKeyid(pgpDigParams sigp)
+static int stashKeyid(unsigned int keyid)
 {
-    unsigned int keyid;
+    static pthread_mutex_t keyid_lock = PTHREAD_MUTEX_INITIALIZER;
+    static const unsigned int nkeyids_max = 256;
+    static unsigned int nkeyids = 0;
+    static unsigned int nextkeyid  = 0;
+    static unsigned int * keyids;
+
     int i;
+    int seen = 0;
 
-    if (sigp == NULL)
+    if (keyid == 0)
        return 0;
 
-    keyid = pgpGrab(sigp->signid+4, 4);
-    if (keyid == 0)
+    /* Just pretend we didn't see the keyid if we fail to lock */
+    if (pthread_mutex_lock(&keyid_lock))
        return 0;
 
     if (keyids != NULL)
     for (i = 0; i < nkeyids; i++) {
-       if (keyid == keyids[i])
-           return 1;
+       if (keyid == keyids[i]) {
+           seen = 1;
+           goto exit;
+        }
     }
 
     if (nkeyids < nkeyids_max) {
@@ -134,346 +124,86 @@ static int stashKeyid(pgpDigParams sigp)
     nextkeyid++;
     nextkeyid %= nkeyids_max;
 
-    return 0;
+exit:
+    pthread_mutex_unlock(&keyid_lock);
+    return seen;
 }
 
-int parsePGPSig(rpmtd sigtd, const char *type, const char *fn,
-                pgpDigParams *sig)
+static rpmRC handleHdrVS(struct rpmsinfo_s *sinfo, rpmRC rc, const char *msg, void *cbdata)
 {
-    int rc = pgpPrtParams(sigtd->data, sigtd->count, PGPTAG_SIGNATURE, sig);
-
-    if (rc != 0) {
-       if (type && fn) {
-           rpmlog(RPMLOG_ERR,
-                  _("skipping %s %s with unverifiable signature\n"), type, fn);
-       } else if (type) {
-           rpmlog(RPMLOG_ERR,
-                  _("skipping %s with unverifiable signature\n"), type);
-       }
+    char **buf  = cbdata;
+    if (buf) {
+       char *vsmsg = rpmsinfoMsg(sinfo, rc, msg);
+       *buf = rstrscat(buf, "\n", vsmsg, NULL);
+       free(vsmsg);
     }
     return rc;
 }
 
-/*
- * Argument monster to verify header-only signature/digest if there is
- * one, otherwisereturn RPMRC_NOTFOUND to signal for plain sanity check.
- */
-static rpmRC headerSigVerify(rpmKeyring keyring, rpmVSFlags vsflags,
-                            int il, int dl, int ril, int rdl,
-                            entryInfo pe, unsigned char * dataStart,
-                            char **buf)
+static void updateHdrDigests(rpmDigestBundle bundle, struct hdrblob_s *blob)
 {
-    size_t siglen = 0;
-    rpmRC rc = RPMRC_FAIL;
-    pgpDigParams sig = NULL;
-    struct rpmtd_s sigtd;
-    struct entryInfo_s info, einfo;
-    unsigned int hashalgo = 0;
-
-    rpmtdReset(&sigtd);
-    memset(&info, 0, sizeof(info));
-    memset(&einfo, 0, sizeof(einfo));
-
-    /* Find a header-only digest/signature tag. */
-    for (int i = ril; i < il; i++) {
-       if (headerVerifyInfo(1, dl, pe+i, &einfo, 0) != -1) {
-           rasprintf(buf,
-               _("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
-               i, einfo.tag, einfo.type,
-               einfo.offset, einfo.count);
-           goto exit;
-       }
-
-       switch (einfo.tag) {
-       case RPMTAG_SHA1HEADER: {
-           size_t blen = 0;
-           unsigned const char * b;
-           if (vsflags & RPMVSF_NOSHA1HEADER)
-               break;
-           for (b = dataStart + einfo.offset; *b != '\0'; b++) {
-               if (strchr("0123456789abcdefABCDEF", *b) == NULL)
-                   break;
-               blen++;
-           }
-           if (einfo.type != RPM_STRING_TYPE || *b != '\0' || blen != 40)
-           {
-               rasprintf(buf, _("hdr SHA1: BAD, not hex\n"));
-               goto exit;
-           }
-           if (info.tag == 0) {
-               info = einfo;   /* structure assignment */
-               siglen = blen + 1;
-           }
-           } break;
-       case RPMTAG_RSAHEADER:
-           if (vsflags & RPMVSF_NORSAHEADER)
-               break;
-           if (einfo.type != RPM_BIN_TYPE) {
-               rasprintf(buf, _("hdr RSA: BAD, not binary\n"));
-               goto exit;
-           }
-           info = einfo;       /* structure assignment */
-           siglen = info.count;
-           break;
-       case RPMTAG_DSAHEADER:
-           if (vsflags & RPMVSF_NODSAHEADER)
-               break;
-           if (einfo.type != RPM_BIN_TYPE) {
-               rasprintf(buf, _("hdr DSA: BAD, not binary\n"));
-               goto exit;
-           }
-           info = einfo;       /* structure assignment */
-           siglen = info.count;
-           break;
-       default:
-           break;
-       }
-    }
-
-    /* No header-only digest/signature found, get outta here */
-    if (info.tag == 0) {
-       rc = RPMRC_NOTFOUND;
-       goto exit;
-    }
-
-    sigtd.tag = info.tag;
-    sigtd.type = info.type;
-    sigtd.count = info.count;
-    sigtd.data = memcpy(xmalloc(siglen), dataStart + info.offset, siglen);
-    sigtd.flags = RPMTD_ALLOCED;
-
-    switch (info.tag) {
-    case RPMTAG_RSAHEADER:
-    case RPMTAG_DSAHEADER:
-       if (parsePGPSig(&sigtd, "header", NULL, &sig))
-           goto exit;
-       hashalgo = pgpDigParamsAlgo(sig, PGPVAL_HASHALGO);
-       break;
-    case RPMTAG_SHA1HEADER:
-       hashalgo = PGPHASHALGO_SHA1;
-       break;
-    default:
-       break;
-    }
-
-    if (hashalgo) {
-       DIGEST_CTX ctx = rpmDigestInit(hashalgo, RPMDIGEST_NONE);
-       int32_t ildl[2] = { htonl(ril), htonl(rdl) };
-
-       rpmDigestUpdate(ctx, rpm_header_magic, sizeof(rpm_header_magic));
-       rpmDigestUpdate(ctx, ildl, sizeof(ildl));
-       rpmDigestUpdate(ctx, pe, (ril * sizeof(*pe)));
-       rpmDigestUpdate(ctx, dataStart, rdl);
+    int32_t ildl[2] = { htonl(blob->ril), htonl(blob->rdl) };
 
-       rc = rpmVerifySignature(keyring, &sigtd, sig, ctx, buf);
-
-       rpmDigestFinal(ctx, NULL, NULL, 0);
-    }
-
-exit:
-    rpmtdFreeData(&sigtd);
-    pgpDigParamsFree(sig);
-
-    return rc;
+    rpmDigestBundleUpdate(bundle, rpm_header_magic, sizeof(rpm_header_magic));
+    rpmDigestBundleUpdate(bundle, ildl, sizeof(ildl));
+    rpmDigestBundleUpdate(bundle, blob->pe, (blob->ril * sizeof(*blob->pe)));
+    rpmDigestBundleUpdate(bundle, blob->dataStart, blob->rdl);
 }
 
-static rpmRC headerVerify(rpmKeyring keyring, rpmVSFlags vsflags,
-                         const void * uh, size_t uc, char ** msg)
+rpmRC headerCheck(rpmts ts, const void * uh, size_t uc, char ** msg)
 {
-    char *buf = NULL;
-    int32_t * ei = (int32_t *) uh;
-    int32_t il = ntohl(ei[0]);
-    int32_t dl = ntohl(ei[1]);
-    entryInfo pe = (entryInfo) &ei[2];
-    int32_t pvlen = sizeof(il) + sizeof(dl) + (il * sizeof(*pe)) + dl;
-    unsigned char * dataStart = (unsigned char *) (pe + il);
-    struct indexEntry_s entry;
-    struct entryInfo_s info;
-    int32_t ril = 0;
-    unsigned char * regionEnd = NULL;
-    rpmRC rc = RPMRC_FAIL;     /* assume failure */
-
-    /* Is the blob the right size? */
-    if (uc > 0 && pvlen != uc) {
-       rasprintf(&buf, _("blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"),
-               (int)uc, (int)il, (int)dl);
-       goto exit;
-    }
-
-    memset(&entry, 0, sizeof(entry));
-    memset(&info, 0, sizeof(info));
-
-    /* Check (and convert) the 1st tag element. */
-    if (headerVerifyInfo(1, dl, pe, &entry.info, 0) != -1) {
-       rasprintf(&buf, _("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
-               0, entry.info.tag, entry.info.type,
-               entry.info.offset, entry.info.count);
-       goto exit;
-    }
+    rpmRC rc = RPMRC_FAIL;
+    rpmVSFlags vsflags = rpmtsVSFlags(ts) | RPMVSF_NEEDPAYLOAD;
+    rpmKeyring keyring = rpmtsGetKeyring(ts, 1);
+    struct hdrblob_s blob;
 
-    /* Is there an immutable header region tag? */
-    if (!(entry.info.tag == RPMTAG_HEADERIMMUTABLE)) {
-       rc = RPMRC_NOTFOUND;
-       goto exit;
-    }
+    if (hdrblobInit(uh, uc, 0, 0, &blob, msg) == RPMRC_OK) {
+       struct rpmvs_s *vs = rpmvsCreate(&blob, vsflags);
+       rpmDigestBundle bundle = rpmDigestBundleNew();
 
-    /* Is the region tag sane? */
-    if (!(entry.info.type == REGION_TAG_TYPE &&
-         entry.info.count == REGION_TAG_COUNT)) {
-       rasprintf(&buf,
-               _("region tag: BAD, tag %d type %d offset %d count %d\n"),
-               entry.info.tag, entry.info.type,
-               entry.info.offset, entry.info.count);
-       goto exit;
-    }
+       rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
 
-    /* Is the trailer within the data area? */
-    if (entry.info.offset + REGION_TAG_COUNT > dl) {
-       rasprintf(&buf, 
-               _("region offset: BAD, tag %d type %d offset %d count %d\n"),
-               entry.info.tag, entry.info.type,
-               entry.info.offset, entry.info.count);
-       goto exit;
-    }
+       rpmvsInitDigests(vs, RPMSIG_HEADER, bundle);
+       updateHdrDigests(bundle, &blob);
 
-    /* Is there an immutable header region tag trailer? */
-    regionEnd = dataStart + entry.info.offset;
-    (void) memcpy(&info, regionEnd, REGION_TAG_COUNT);
-    regionEnd += REGION_TAG_COUNT;
-
-    if (headerVerifyInfo(1, il * sizeof(*pe), &info, &entry.info, 1) != -1 ||
-       !(entry.info.tag == RPMTAG_HEADERIMMUTABLE
-       && entry.info.type == REGION_TAG_TYPE
-       && entry.info.count == REGION_TAG_COUNT))
-    {
-       rasprintf(&buf, 
-               _("region trailer: BAD, tag %d type %d offset %d count %d\n"),
-               entry.info.tag, entry.info.type,
-               entry.info.offset, entry.info.count);
-       goto exit;
-    }
-    memset(&info, 0, sizeof(info));
+       rc = rpmvsVerifyItems(rpmtsPlugins(ts), vs, RPMSIG_HEADER, bundle, keyring,
+                               handleHdrVS, msg);
 
-    /* Is the no. of tags in the region less than the total no. of tags? */
-    ril = entry.info.offset/sizeof(*pe);
-    if ((entry.info.offset % sizeof(*pe)) || ril > il) {
-       rasprintf(&buf, _("region size: BAD, ril(%d) > il(%d)\n"), ril, il);
-       goto exit;
-    }
+       rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), uc);
 
-    /* Verify header-only digest/signature if there is one we can use. */
-    rc = headerSigVerify(keyring, vsflags,
-                        il, dl, ril, (regionEnd - dataStart),
-                        pe, dataStart, &buf);
+       if (rc == RPMRC_OK && msg != NULL && *msg == NULL)
+           rasprintf(msg, "Header sanity check: OK");
 
-exit:
-    /* If no header-only digest/signature, then do simple sanity check. */
-    if (rc == RPMRC_NOTFOUND) {
-       int xx = headerVerifyInfo(ril-1, dl, pe+1, &entry.info, 0);
-       if (xx != -1) {
-           rasprintf(&buf,
-               _("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
-               xx+1, entry.info.tag, entry.info.type,
-               entry.info.offset, entry.info.count);
-           rc = RPMRC_FAIL;
-       } else {
-           rasprintf(&buf, "Header sanity check: OK\n");
-           rc = RPMRC_OK;
-       }
+       rpmDigestBundleFree(bundle);
+       rpmvsFree(vs);
     }
 
-    if (msg) 
-       *msg = buf;
-    else
-       free(buf);
-
-    return rc;
-}
-
-rpmRC headerCheck(rpmts ts, const void * uh, size_t uc, char ** msg)
-{
-    rpmRC rc;
-    rpmVSFlags vsflags = rpmtsVSFlags(ts);
-    rpmKeyring keyring = rpmtsGetKeyring(ts, 1);
-
-    rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
-    rc = headerVerify(keyring, vsflags, uh, uc, msg);
-    rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), uc);
     rpmKeyringFree(keyring);
 
     return rc;
 }
 
-static rpmRC rpmpkgReadHeader(rpmKeyring keyring, rpmVSFlags vsflags, 
-                      FD_t fd, Header *hdrp, char ** msg)
+rpmRC rpmReadHeader(rpmts ts, FD_t fd, Header *hdrp, char ** msg)
 {
     char *buf = NULL;
-    int32_t block[4];
-    int32_t il;
-    int32_t dl;
-    int32_t * ei = NULL;
-    size_t uc;
-    size_t nb;
+    struct hdrblob_s blob;
     Header h = NULL;
     rpmRC rc = RPMRC_FAIL;             /* assume failure */
-    int xx;
 
     if (hdrp)
        *hdrp = NULL;
     if (msg)
        *msg = NULL;
 
-    memset(block, 0, sizeof(block));
-    if ((xx = Freadall(fd, block, sizeof(block))) != sizeof(block)) {
-       rasprintf(&buf, 
-               _("hdr size(%d): BAD, read returned %d\n"), (int)sizeof(block), xx);
-       goto exit;
-    }
-    if (memcmp(block, rpm_header_magic, sizeof(rpm_header_magic))) {
-       rasprintf(&buf, _("hdr magic: BAD\n"));
-       goto exit;
-    }
-    il = ntohl(block[2]);
-    if (hdrchkTags(il)) {
-       rasprintf(&buf, _("hdr tags: BAD, no. of tags(%d) out of range\n"), il);
-       goto exit;
-    }
-    dl = ntohl(block[3]);
-    if (hdrchkData(dl)) {
-       rasprintf(&buf,
-                 _("hdr data: BAD, no. of bytes(%d) out of range\n"), dl);
-       goto exit;
-    }
-
-    nb = (il * sizeof(struct entryInfo_s)) + dl;
-    uc = sizeof(il) + sizeof(dl) + nb;
-    ei = xmalloc(uc);
-    ei[0] = block[2];
-    ei[1] = block[3];
-    if ((xx = Freadall(fd, (char *)&ei[2], nb)) != nb) {
-       rasprintf(&buf, _("hdr blob(%zd): BAD, read returned %d\n"), nb, xx);
-       goto exit;
-    }
-
-    /* Sanity check header tags */
-    rc = headerVerify(keyring, vsflags, ei, uc, &buf);
-    if (rc != RPMRC_OK)
+    if (hdrblobRead(fd, 1, 1, RPMTAG_HEADERIMMUTABLE, &blob, &buf) != RPMRC_OK)
        goto exit;
 
     /* OK, blob looks sane, load the header. */
-    h = headerImport(ei, uc, 0);
-    if (h == NULL) {
-       free(buf);
-       rasprintf(&buf, _("hdr load: BAD\n"));
-       rc = RPMRC_FAIL;
-        goto exit;
-    }
-    ei = NULL; /* XXX will be freed with header */
+    rc = hdrblobImport(&blob, 0, &h, &buf);
     
 exit:
     if (hdrp && h && rc == RPMRC_OK)
        *hdrp = headerLink(h);
-    free(ei);
     headerFree(h);
 
     if (msg != NULL && *msg == NULL && buf != NULL) {
@@ -485,241 +215,100 @@ exit:
     return rc;
 }
 
-rpmRC rpmReadHeader(rpmts ts, FD_t fd, Header *hdrp, char ** msg)
-{
-    rpmRC rc;
-    rpmKeyring keyring = rpmtsGetKeyring(ts, 1);
-    rpmVSFlags vsflags = rpmtsVSFlags(ts);
-
-    rc = rpmpkgReadHeader(keyring, vsflags, fd, hdrp, msg);
-
-    rpmKeyringFree(keyring);
-    return rc;
-}
-
-static rpmRC rpmpkgRead(rpmPlugins plugins, rpmKeyring keyring, rpmVSFlags vsflags, 
-                       FD_t fd, const char * fn, Header * hdrp)
+void applyRetrofits(Header h, int leadtype)
 {
-    pgpDigParams sig = NULL;
-    char buf[8*BUFSIZ];
-    ssize_t count;
-    Header sigh = NULL;
-    rpmTagVal sigtag;
-    struct rpmtd_s sigtd;
-    Header h = NULL;
-    char * msg = NULL;
-    rpmRC rc = RPMRC_FAIL;     /* assume failure */
-    int leadtype = -1;
-    headerGetFlags hgeflags = HEADERGET_DEFAULT;
-    DIGEST_CTX ctx = NULL;
-
-    if (hdrp) *hdrp = NULL;
-    if (fn == NULL)
-       fn = Fdescr(fd);
-
-    rpmtdReset(&sigtd);
-
-    if ((rc = rpmLeadRead(fd, NULL, &leadtype, &msg)) != RPMRC_OK) {
-       /* Avoid message spew on manifests */
-       if (rc != RPMRC_NOTFOUND) 
-           rpmlog(RPMLOG_ERR, "%s: %s\n", fn, msg);
-       free(msg);
-       goto exit;
-    }
-
-    /* Read the signature header. */
-    rc = rpmReadSignature(fd, &sigh, RPMSIGTYPE_HEADERSIG, &msg);
-    switch (rc) {
-    default:
-       rpmlog(RPMLOG_ERR, _("%s: rpmReadSignature failed: %s"), fn,
-               (msg && *msg ? msg : "\n"));
-       msg = _free(msg);
-       goto exit;
-       break;
-    case RPMRC_OK:
-       if (sigh == NULL) {
-           rpmlog(RPMLOG_ERR, _("%s: No signature available\n"), fn);
-           rc = RPMRC_FAIL;
-           goto exit;
+    /*
+     * Make sure that either RPMTAG_SOURCERPM or RPMTAG_SOURCEPACKAGE
+     * is set. Use a simple heuristic to find the type if both are unset.
+     */
+    if (!headerIsEntry(h, RPMTAG_SOURCERPM) && !headerIsEntry(h, RPMTAG_SOURCEPACKAGE)) {
+       /* the heuristic needs the compressed file list */
+       if (headerIsEntry(h, RPMTAG_OLDFILENAMES))
+           headerConvert(h, HEADERCONV_COMPRESSFILELIST);
+       if (headerIsSourceHeuristic(h)) {
+           /* Retrofit RPMTAG_SOURCEPACKAGE to srpms for compatibility */
+           uint32_t one = 1;
+           headerPutUint32(h, RPMTAG_SOURCEPACKAGE, &one, 1);
+       } else {
+           /*
+            * Make sure binary rpms have RPMTAG_SOURCERPM set as that's
+            * what we use for differentiating binary vs source elsewhere.
+            */
+           headerPutString(h, RPMTAG_SOURCERPM, "(none)");
        }
-       break;
     }
-    msg = _free(msg);
-
-#define        _chk(_mask, _tag) \
-       (sigtag == 0 && !(vsflags & (_mask)) && headerIsEntry(sigh, (_tag)))
 
     /*
-     * Figger the most effective available signature.
-     * Prefer signatures over digests, then header-only over header+payload.
-     * DSA will be preferred over RSA if both exist because tested first.
-     * Note that NEEDPAYLOAD prevents header+payload signatures and digests.
+     * Convert legacy headers on the fly. Not having immutable region
+     * equals a truly ancient package, do full retrofit. OTOH newer
+     * packages might have been built with --nodirtokens, test and handle
+     * the non-compressed filelist case separately.
      */
-    sigtag = 0;
-    if (_chk(RPMVSF_NODSAHEADER, RPMSIGTAG_DSA)) {
-       sigtag = RPMSIGTAG_DSA;
-    } else if (_chk(RPMVSF_NORSAHEADER, RPMSIGTAG_RSA)) {
-       sigtag = RPMSIGTAG_RSA;
-    } else if (_chk(RPMVSF_NODSA|RPMVSF_NEEDPAYLOAD, RPMSIGTAG_GPG)) {
-       sigtag = RPMSIGTAG_GPG;
-       fdInitDigest(fd, PGPHASHALGO_SHA1, 0);
-    } else if (_chk(RPMVSF_NORSA|RPMVSF_NEEDPAYLOAD, RPMSIGTAG_PGP)) {
-       sigtag = RPMSIGTAG_PGP;
-       fdInitDigest(fd, PGPHASHALGO_MD5, 0);
-    } else if (_chk(RPMVSF_NOSHA1HEADER, RPMSIGTAG_SHA1)) {
-       sigtag = RPMSIGTAG_SHA1;
-    } else if (_chk(RPMVSF_NOMD5|RPMVSF_NEEDPAYLOAD, RPMSIGTAG_MD5)) {
-       sigtag = RPMSIGTAG_MD5;
-       fdInitDigest(fd, PGPHASHALGO_MD5, 0);
-    }
-
-    /* Read the metadata, computing digest(s) on the fly. */
-    h = NULL;
-    msg = NULL;
-
-    rc = rpmpkgReadHeader(keyring, vsflags, fd, &h, &msg);
-
-    if (rc != RPMRC_OK || h == NULL) {
-       rpmlog(RPMLOG_ERR, _("%s: headerRead failed: %s"), fn,
-               (msg && *msg ? msg : "\n"));
-       msg = _free(msg);
-       goto exit;
-    }
-    msg = _free(msg);
-
-    /* Any digests or signatures to check? */
-    if (sigtag == 0) {
-       rc = RPMRC_OK;
-       goto exit;
-    }
-
-    /* Retrieve the tag parameters from the signature header. */
-    if (!headerGet(sigh, sigtag, &sigtd, hgeflags)) {
-       rc = RPMRC_FAIL;
-       goto exit;
-    }
-
-    switch (sigtag) {
-    case RPMSIGTAG_RSA:
-    case RPMSIGTAG_DSA:
-       if (parsePGPSig(&sigtd, "package", fn, &sig)) {
-           rc = RPMRC_FAIL;
-           goto exit;
-       }
-       /* fallthrough */
-    case RPMSIGTAG_SHA1:
-    {  struct rpmtd_s utd;
-       unsigned int hashalgo = (sigtag == RPMSIGTAG_SHA1) ?
-                               PGPHASHALGO_SHA1 :
-                               pgpDigParamsAlgo(sig, PGPVAL_HASHALGO);
-
-       if (!headerGet(h, RPMTAG_HEADERIMMUTABLE, &utd, hgeflags))
-           break;
-       ctx = rpmDigestInit(hashalgo, RPMDIGEST_NONE);
-       (void) rpmDigestUpdate(ctx, rpm_header_magic, sizeof(rpm_header_magic));
-       (void) rpmDigestUpdate(ctx, utd.data, utd.count);
-       rpmtdFreeData(&utd);
-    }  break;
-    case RPMSIGTAG_GPG:
-    case RPMSIGTAG_PGP5:       /* XXX legacy */
-    case RPMSIGTAG_PGP:
-       if (parsePGPSig(&sigtd, "package", fn, &sig)) {
-           rc = RPMRC_FAIL;
-           goto exit;
-       }
-       /* fallthrough */
-    case RPMSIGTAG_MD5:
-       /* Legacy signatures need the compressed payload in the digest too. */
-       while ((count = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0) {}
-       if (count < 0) {
-           rpmlog(RPMLOG_ERR, _("%s: Fread failed: %s\n"),
-                                       fn, Fstrerror(fd));
-           rc = RPMRC_FAIL;
-           goto exit;
-       }
+    if (!headerIsEntry(h, RPMTAG_HEADERIMMUTABLE))
+       headerConvert(h, HEADERCONV_RETROFIT_V3);
+    else if (headerIsEntry(h, RPMTAG_OLDFILENAMES))
+       headerConvert(h, HEADERCONV_COMPRESSFILELIST);
+}
 
-       ctx = rpmDigestBundleDupCtx(fdGetBundle(fd),(sigtag == RPMSIGTAG_MD5) ?
-                                   PGPHASHALGO_MD5 :
-                                   pgpDigParamsAlgo(sig, PGPVAL_HASHALGO));
-       break;
-    default:
-       break;
-    }
+struct pkgdata_s {
+    const char *fn;
+    rpmRC rc;
+};
 
-    /** @todo Implement disable/enable/warn/error/anal policy. */
-    rc = rpmVerifySignature(keyring, &sigtd, sig, ctx, &msg);
-    
-    /* Run verify hook for all plugins */
-    rc = rpmpluginsCallVerify(plugins, keyring, &sigtd, sig, ctx, rc);
-       
+static rpmRC handlePkgVS(struct rpmsinfo_s *sinfo, rpmRC rc, const char *msg, void *cbdata)
+{
+    struct pkgdata_s *pkgdata = cbdata;
+    int lvl = RPMLOG_DEBUG;
+    char *vsmsg = rpmsinfoMsg(sinfo, rc, msg);
     switch (rc) {
     case RPMRC_OK:             /* Signature is OK. */
-       rpmlog(RPMLOG_DEBUG, "%s: %s", fn, msg);
        break;
     case RPMRC_NOTTRUSTED:     /* Signature is OK, but key is not trusted. */
     case RPMRC_NOKEY:          /* Public key is unavailable. */
        /* XXX Print NOKEY/NOTTRUSTED warning only once. */
-    {  int lvl = (stashKeyid(sig) ? RPMLOG_DEBUG : RPMLOG_WARNING);
-       rpmlog(lvl, "%s: %s", fn, msg);
-    }  break;
-    case RPMRC_NOTFOUND:       /* Signature is unknown type. */
-       rpmlog(RPMLOG_WARNING, "%s: %s", fn, msg);
+       if (stashKeyid(sinfo->keyid) == 0)
+           lvl = RPMLOG_WARNING;
+       break;
+    case RPMRC_NOTFOUND:       /* Signature/digest not present. */
+       lvl = RPMLOG_WARNING;
        break;
     default:
     case RPMRC_FAIL:           /* Signature does not verify. */
-       rpmlog(RPMLOG_ERR, "%s: %s", fn, msg);
+       lvl = RPMLOG_ERR;
        break;
     }
-    free(msg);
 
-exit:
-    if (rc != RPMRC_FAIL && h != NULL && hdrp != NULL) {
-       /* Retrofit RPMTAG_SOURCEPACKAGE to srpms for compatibility */
-       if (leadtype == RPMLEAD_SOURCE && headerIsSource(h)) {
-           if (!headerIsEntry(h, RPMTAG_SOURCEPACKAGE)) {
-               uint32_t one = 1;
-               headerPutUint32(h, RPMTAG_SOURCEPACKAGE, &one, 1);
-           }
-       }
-       /*
-        * Try to make sure binary rpms have RPMTAG_SOURCERPM set as that's
-        * what we use for differentiating binary vs source elsewhere.
-        */
-       if (!headerIsEntry(h, RPMTAG_SOURCEPACKAGE) && headerIsSource(h)) {
-           headerPutString(h, RPMTAG_SOURCERPM, "(none)");
-       }
-       /* 
-         * Convert legacy headers on the fly. Not having immutable region
-         * equals a truly ancient package, do full retrofit. OTOH newer
-         * packages might have been built with --nodirtokens, test and handle
-         * the non-compressed filelist case separately.
-         */
-       if (!headerIsEntry(h, RPMTAG_HEADERIMMUTABLE))
-           headerConvert(h, HEADERCONV_RETROFIT_V3);
-       else if (headerIsEntry(h, RPMTAG_OLDFILENAMES))
-           headerConvert(h, HEADERCONV_COMPRESSFILELIST);
-       
-       /* Append (and remap) signature tags to the metadata. */
-       headerMergeLegacySigs(h, sigh);
+    rpmlog(lvl, "%s: %s\n", pkgdata->fn, vsmsg);
 
-       /* Bump reference count for return. */
-       *hdrp = headerLink(h);
-    }
-    rpmtdFreeData(&sigtd);
-    rpmDigestFinal(ctx, NULL, NULL, 0);
-    h = headerFree(h);
-    pgpDigParamsFree(sig);
-    sigh = rpmFreeSignature(sigh);
+    /* Remember actual return code, but don't override a previous failure */
+    if (rc && pkgdata->rc != RPMRC_FAIL)
+       pkgdata->rc = rc;
+
+    /* Preserve traditional behavior for now: only failure prevents read */
+    if (rc != RPMRC_FAIL)
+       rc = RPMRC_OK;
+
+    free(vsmsg);
     return rc;
 }
 
 rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
 {
-    rpmRC rc;
-    rpmVSFlags vsflags = rpmtsVSFlags(ts);
+    rpmVSFlags vsflags = rpmtsVSFlags(ts) | RPMVSF_NEEDPAYLOAD;
     rpmKeyring keyring = rpmtsGetKeyring(ts, 1);
+    struct pkgdata_s pkgdata = {
+       .fn = fn ? fn : Fdescr(fd),
+       .rc = RPMRC_OK,
+    };
+
+    /* XXX: lots of 3rd party software relies on the behavior */
+    if (hdrp)
+       *hdrp = NULL;
 
-    rc = rpmpkgRead(rpmtsPlugins(ts), keyring, vsflags, fd, fn, hdrp);
+    rpmRC rc = rpmpkgRead(rpmtsPlugins(ts), keyring, vsflags, fd, handlePkgVS, &pkgdata, hdrp);
+    /* If there was a "substatus" (NOKEY in practise), return that instead */
+    if (rc == RPMRC_OK && pkgdata.rc)
+       rc = pkgdata.rc;
 
     rpmKeyringFree(keyring);
 
index 541e8c4ab170e472869e125a5cf8a3c4ecf34b9d..b7f48da368e3128492c8f3d77f7ad7866c6794ae 100644 (file)
@@ -4,7 +4,6 @@
  */
 
 #include "system.h"
-const char *__progname;
 
 #include <rpm/rpmcli.h>
 #include <rpm/rpmlib.h>                /* rpmEVR, rpmReadConfigFiles etc */
@@ -20,6 +19,7 @@ const char *__progname;
 #define POPT_PREDEFINE         -996
 #define POPT_DBPATH            -995
 #define POPT_UNDEFINE          -994
+#define POPT_PIPE              -993
 
 static int _debug = 0;
 
@@ -69,6 +69,27 @@ void rpmcliConfigured(void)
        exit(EXIT_FAILURE);
 }
 
+static int cliDefine(const char *arg, int predefine)
+{
+    int rc;
+    char *s, *t;
+    /* XXX Convert '-' in macro name to underscore, skip leading %. */
+    s = t = xstrdup(arg);
+    while (*t && !risspace(*t)) {
+       if (*t == '-') *t = '_';
+       t++;
+    }
+    t = s;
+    if (*t == '%') t++;
+
+    rc = rpmDefineMacro(NULL, t, RMIL_CMDLINE);
+    if (!predefine && rc == 0)
+       (void) rpmDefineMacro(rpmCLIMacroContext, t, RMIL_CMDLINE);
+
+    free(s);
+    return rc;
+}
+
 /**
  */
 static void rpmcliAllArgCallback( poptContext con,
@@ -87,43 +108,32 @@ static void rpmcliAllArgCallback( poptContext con,
        rpmIncreaseVerbosity();
        break;
     case POPT_PREDEFINE:
-       (void) rpmDefineMacro(NULL, arg, RMIL_CMDLINE);
+       if (cliDefine(arg, 1))
+           exit(EXIT_FAILURE);
        break;
     case 'D':
-    {   char *s, *t;
-       /* XXX Convert '-' in macro name to underscore, skip leading %. */
-       s = t = xstrdup(arg);
-       while (*t && !risspace(*t)) {
-           if (*t == '-') *t = '_';
-           t++;
-       }
-       t = s;
-       if (*t == '%') t++;
-       /* XXX Predefine macro if not initialized yet. */
-       if (rpmcliInitialized < 0)
-           (void) rpmDefineMacro(NULL, t, RMIL_CMDLINE);
        rpmcliConfigured();
-       (void) rpmDefineMacro(NULL, t, RMIL_CMDLINE);
-       (void) rpmDefineMacro(rpmCLIMacroContext, t, RMIL_CMDLINE);
-       free(s);
+       if (cliDefine(arg, 0))
+           exit(EXIT_FAILURE);
        break;
-    }
     case POPT_UNDEFINE:
        rpmcliConfigured();
        if (*arg == '%')
            arg++;
-       delMacro(NULL, arg);
+       rpmPopMacro(NULL, arg);
        break;
     case 'E':
        rpmcliConfigured();
-       {   char *val = rpmExpand(arg, NULL);
+       {   char *val = NULL;
+           if (rpmExpandMacros(NULL, arg, &val, 0) < 0)
+               exit(EXIT_FAILURE);
            fprintf(stdout, "%s\n", val);
            free(val);
        }
        break;
     case POPT_DBPATH:
        rpmcliConfigured();
-       addMacro(NULL, "_dbpath", NULL, arg, RMIL_CMDLINE);
+       rpmPushMacro(NULL, "_dbpath", NULL, arg, RMIL_CMDLINE);
        break;
     case POPT_SHOWVERSION:
        printVersion(stdout);
@@ -138,6 +148,16 @@ static void rpmcliAllArgCallback( poptContext con,
        rpmDisplayQueryTags(stdout);
        exit(EXIT_SUCCESS);
        break;
+    case POPT_PIPE:
+       if (rpmcliPipeOutput) {
+           fprintf(stderr,
+                   _("%s: error: more than one --pipe specified "
+                     "(incompatible popt aliases?)\n"), xgetprogname());
+           exit(EXIT_FAILURE);
+       }
+       rpmcliPipeOutput = xstrdup(arg);
+       break;
+       
     case RPMCLI_POPT_NODIGEST:
        rpmcliQueryFlags |= VERIFY_DIGEST;
        break;
@@ -149,6 +169,10 @@ static void rpmcliAllArgCallback( poptContext con,
     case RPMCLI_POPT_NOHDRCHK:
        rpmcliQueryFlags |= VERIFY_HDRCHK;
        break;
+
+    case RPMCLI_POPT_TARGETPLATFORM:
+       rpmcliInitialized = rpmReadConfigFiles(rpmcliRcfile, arg);
+       break;
     }
 }
 
@@ -172,10 +196,17 @@ struct poptOption rpmcliAllPoptTable[] = {
  { "eval", 'E', POPT_ARG_STRING, 0, 'E',
        N_("print macro expansion of EXPR"),
        N_("'EXPR'") },
+ { "target", '\0', POPT_ARG_STRING, NULL,  RPMCLI_POPT_TARGETPLATFORM,
+        N_("Specify target platform"), N_("CPU-VENDOR-OS") },
  { "macros", '\0', POPT_ARG_STRING, &macrofiles, 0,
        N_("read <FILE:...> instead of default file(s)"),
        N_("<FILE:...>") },
 
+ /* XXX this is a bit out of place here but kinda unavoidable... */
+ { "noplugins", '\0', POPT_BIT_SET,
+       &rpmIArgs.transFlags, RPMTRANS_FLAG_NOPLUGINS,
+       N_("don't enable any plugins"), NULL },
+
  { "nodigest", '\0', 0, 0, RPMCLI_POPT_NODIGEST,
         N_("don't verify package digest(s)"), NULL },
  { "nohdrchk", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOHDRCHK,
@@ -183,7 +214,7 @@ struct poptOption rpmcliAllPoptTable[] = {
  { "nosignature", '\0', 0, 0, RPMCLI_POPT_NOSIGNATURE,
         N_("don't verify package signature(s)"), NULL },
 
- { "pipe", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, &rpmcliPipeOutput, 0,
+ { "pipe", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_PIPE,
        N_("send stdout to CMD"),
        N_("CMD") },
  { "rcfile", '\0', POPT_ARG_STRING, &rpmcliRcfile, 0,
@@ -244,14 +275,6 @@ rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable)
     int rc;
     const char *ctx, *execPath;
 
-    setprogname(argv[0]);       /* Retrofit glibc __progname */
-
-    /* XXX glibc churn sanity */
-    if (__progname == NULL) {
-       if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
-       else __progname = argv[0];
-    }
-
 #if defined(ENABLE_NLS)
     (void) setlocale(LC_ALL, "" );
 
@@ -268,7 +291,7 @@ rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable)
     }
 
     /* XXX hack to get popt working from build tree wrt lt-foo names */
-    ctx = rstreqn(__progname, "lt-", 3) ? __progname + 3 : __progname;
+    ctx = rstreqn(xgetprogname(), "lt-", 3) ? xgetprogname() + 3 : xgetprogname();
 
     optCon = poptGetContext(ctx, argc, (const char **)argv, optionsTable, 0);
     {
@@ -285,12 +308,12 @@ rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable)
     /* Process all options, whine if unknown. */
     while ((rc = poptGetNextOpt(optCon)) > 0) {
        fprintf(stderr, _("%s: option table misconfigured (%d)\n"),
-               __progname, rc);
+               xgetprogname(), rc);
        exit(EXIT_FAILURE);
     }
 
     if (rc < -1) {
-       fprintf(stderr, "%s: %s: %s\n", __progname,
+       fprintf(stderr, "%s: %s: %s\n", xgetprogname(),
                poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
                poptStrerror(rc));
        exit(EXIT_FAILURE);
index 8c1ff6edb99df9b9f941c19371dcf038b80dcc03..8272fa80f384befa5d066a974290370ae5b591fa 100644 (file)
@@ -26,7 +26,7 @@ struct rpmInstallArguments_s rpmIArgs = {
 RPM_GNUC_NORETURN
 static void argerror(const char * desc)
 {
-    fprintf(stderr, _("%s: %s\n"), __progname, desc);
+    fprintf(stderr, _("%s: %s\n"), xgetprogname(), desc);
     exit(EXIT_FAILURE);
 }
 
@@ -87,6 +87,10 @@ static void installArgCallback( poptContext con,
        ia->transFlags |= RPMTRANS_FLAG_NOCONTEXTS;
        break;
 
+    case RPMCLI_POPT_NOCAPS:
+       ia->transFlags |= RPMTRANS_FLAG_NOCAPS;
+       break;
+
     case RPMCLI_POPT_FORCE:
        ia->probFilter |=
                ( RPMPROB_FILTER_REPLACEPKG
@@ -181,6 +185,8 @@ struct poptOption rpmInstallPoptTable[] = {
        N_("don't verify digest of files (obsolete)"), NULL },
  { "nocontexts", '\0',0,  NULL, RPMCLI_POPT_NOCONTEXTS,
        N_("don't install file security contexts"), NULL},
+ { "nocaps", '\0',0,  NULL, RPMCLI_POPT_NOCAPS,
+       N_("don't install file capabilities"), NULL},
 
  { "noorder", '\0', POPT_BIT_SET,
        &rpmIArgs.installInterfaceFlags, INSTALL_NOORDER,
@@ -202,6 +208,12 @@ struct poptOption rpmInstallPoptTable[] = {
  { "nopostun", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
        RPMTRANS_FLAG_NOPOSTUN,
        N_("do not execute %%postun scriptlet (if any)"), NULL },
+ { "nopretrans", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
+       RPMTRANS_FLAG_NOPRETRANS,
+       N_("do not execute %%pretrans scriptlet (if any)"), NULL },
+ { "noposttrans", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
+       RPMTRANS_FLAG_NOPOSTTRANS,
+       N_("do not execute %%posttrans scriptlet (if any)"), NULL },
 
  { "notriggers", '\0', POPT_BIT_SET, &rpmIArgs.transFlags, _noTransTriggers,
        N_("do not execute any scriptlet(s) triggered by this package"), NULL},
@@ -218,10 +230,6 @@ struct poptOption rpmInstallPoptTable[] = {
        &rpmIArgs.transFlags, RPMTRANS_FLAG_NOTRIGGERPOSTUN,
        N_("do not execute any %%triggerpostun scriptlet(s)"), NULL},
 
- { "nocollections", '\0', POPT_BIT_SET,
-       &rpmIArgs.transFlags, RPMTRANS_FLAG_NOCOLLECTIONS,
-       N_("do not perform any collection actions"), NULL},
-
  { "oldpackage", '\0', POPT_BIT_SET,
        &rpmIArgs.probFilter, RPMPROB_FILTER_OLDPACKAGE,
        N_("upgrade to an old version of the package (--force on upgrades does this automatically)"),
@@ -247,6 +255,10 @@ struct poptOption rpmInstallPoptTable[] = {
        &rpmIArgs.installInterfaceFlags, (INSTALL_UPGRADE|INSTALL_INSTALL),
        N_("upgrade package(s)"),
        N_("<packagefile>+") },
+ { "reinstall", '\0', POPT_BIT_SET,
+       &rpmIArgs.installInterfaceFlags, (INSTALL_REINSTALL|INSTALL_INSTALL),
+       N_("reinstall package(s)"),
+       N_("<packagefile>+") },
 
    POPT_TABLEEND
 };
index 3db17b0ab153aa6cc14b11fc3b50b9afd6d67bb1..e3ea2d7bc1793cc59e6fa8969189829a89d66003 100644 (file)
@@ -21,6 +21,10 @@ struct rpmQVKArguments_s rpmQVKArgs;
 #define POPT_QUERYBYPKGID      -1007
 #define POPT_QUERYBYHDRID      -1008
 #define POPT_QUERYBYTID                -1010
+#define POPT_WHATRECOMMENDS    -1011
+#define POPT_WHATSUGGESTS      -1012
+#define POPT_WHATSUPPLEMENTS   -1013
+#define POPT_WHATENHANCES      -1014
 
 /* ========== Query/Verify/Signature source args */
 static void rpmQVSourceArgCallback( poptContext con,
@@ -45,6 +49,10 @@ static void rpmQVSourceArgCallback( poptContext con,
     case 'p': qva->qva_source |= RPMQV_RPM; break;
     case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES; break;
     case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES; break;
+    case POPT_WHATRECOMMENDS: qva->qva_source |= RPMQV_WHATRECOMMENDS; break;
+    case POPT_WHATSUGGESTS: qva->qva_source |= RPMQV_WHATSUGGESTS; break;
+    case POPT_WHATSUPPLEMENTS: qva->qva_source |= RPMQV_WHATSUPPLEMENTS; break;
+    case POPT_WHATENHANCES: qva->qva_source |= RPMQV_WHATENHANCES; break;
     case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY; break;
     case POPT_QUERYBYPKGID: qva->qva_source |= RPMQV_PKGID; break;
     case POPT_QUERYBYHDRID: qva->qva_source |= RPMQV_HDRID; break;
@@ -93,6 +101,14 @@ struct poptOption rpmQVSourcePoptTable[] = {
        N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
  { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES, 
        N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
+ { "whatrecommends", '\0', 0, 0, POPT_WHATRECOMMENDS,
+       N_("query/verify the package(s) which recommends a dependency"), "CAPABILITY" },
+ { "whatsuggests", '\0', 0, 0, POPT_WHATSUGGESTS,
+       N_("query/verify the package(s) which suggests a dependency"), "CAPABILITY" },
+ { "whatsupplements", '\0', 0, 0, POPT_WHATSUPPLEMENTS,
+       N_("query/verify the package(s) which supplements a dependency"), "CAPABILITY" },
+ { "whatenhances", '\0', 0, 0, POPT_WHATENHANCES,
+       N_("query/verify the package(s) which enhances a dependency"), "CAPABILITY" },
 
  { "noglob", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_NOGLOB,
        N_("do not glob arguments"), NULL},
@@ -115,6 +131,7 @@ static void queryArgCallback(poptContext con,
     case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
     case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
     case 'L': qva->qva_flags |= QUERY_FOR_LICENSE | QUERY_FOR_LIST; break;
+    case 'A': qva->qva_flags |= QUERY_FOR_ARTIFACT | QUERY_FOR_LIST; break;
     case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
     case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
        break;
@@ -144,6 +161,10 @@ static void queryArgCallback(poptContext con,
        qva->qva_flags |= VERIFY_CONTEXTS;
        break;
 
+    case RPMCLI_POPT_NOCAPS:
+       qva->qva_flags |= VERIFY_CAPS;
+       break;
+
 #ifdef NOTYET
     case RPMCLI_POPT_FORCE:
        ia->probFilter |=
@@ -174,6 +195,8 @@ struct poptOption rpmQueryPoptTable[] = {
        N_("list all documentation files"), NULL },
  { "licensefiles", 'L', 0, 0, 'L',
        N_("list all license files"), NULL },
+ { "artifactfiles", 'A', 0, 0, 'A',
+       N_("list all artifact files"), NULL },
  { "dump", '\0', 0, 0, POPT_DUMP,
        N_("dump basic file information"), NULL },
  { NULL, 'i', POPT_ARGFLAG_DOC_HIDDEN, 0, 'i',
@@ -182,9 +205,15 @@ struct poptOption rpmQueryPoptTable[] = {
        N_("list files in package"), NULL },
 
  /* Duplicate file attr flags from packages into command line options. */
- { "noghost", '\0', POPT_BIT_CLR|POPT_ARGFLAG_DOC_HIDDEN,
+ { "noghost", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
        &rpmQVKArgs.qva_fflags, RPMFILE_GHOST,
         N_("skip %%ghost files"), NULL },
+ { "noconfig", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
+       &rpmQVKArgs.qva_fflags, RPMFILE_CONFIG,
+        N_("skip %%config files"), NULL },
+ { "noartifact", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
+       &rpmQVKArgs.qva_fflags, RPMFILE_ARTIFACT,
+        N_("skip %%artifact files"), NULL },
 
  { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0, 
        POPT_QUERYFORMAT, NULL, NULL },
@@ -228,12 +257,11 @@ struct poptOption rpmVerifyPoptTable[] = {
  { "nordev", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
        &rpmQVKArgs.qva_flags, VERIFY_RDEV,
         N_("don't verify mode of files"), NULL },
- { "nocaps", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
-       &rpmQVKArgs.qva_flags, VERIFY_CAPS,
-       N_("don't verify capabilities of files"), NULL },
 
  { "nocontexts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCONTEXTS,
        N_("don't verify file security contexts"), NULL },
+ { "nocaps", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCAPS,
+       N_("don't verify capabilities of files"), NULL },
  { "nofiles", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FILES,
        N_("don't verify files in package"), NULL},
  { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS,
index fcc6749cc2d36903910fc3af0d2ea77585d39c3b..2c6c9c55009cfff72dbe96742e56a547bfba761f 100644 (file)
--- a/lib/psm.c
+++ b/lib/psm.c
 #include <rpm/rpmstring.h>
 #include <rpm/argv.h>
 
-#include "lib/cpio.h"
 #include "lib/fsm.h"           /* XXX CPIO_FOO/FSM_FOO constants */
 #include "lib/rpmchroot.h"
 #include "lib/rpmfi_internal.h" /* XXX replaced/states... */
 #include "lib/rpmte_internal.h"        /* XXX internal apis */
 #include "lib/rpmdb_internal.h" /* rpmdbAdd/Remove */
-#include "lib/rpmts_internal.h" /* ts->plugins */
+#include "lib/rpmts_internal.h" /* rpmtsPlugins() etc */
+#include "lib/rpmds_internal.h" /* rpmdsFilterTi() */
 #include "lib/rpmscript.h"
+#include "lib/misc.h"
+#include "lib/rpmtriggers.h"
 
 #include "lib/rpmplugins.h"
 
 #include "debug.h"
 
-typedef enum pkgStage_e {
-    PSM_UNKNOWN                =  0,
-    PSM_INIT           =  1,
-    PSM_PRE            =  2,
-    PSM_PROCESS                =  3,
-    PSM_POST           =  4,
-    PSM_UNDO           =  5,
-    PSM_FINI           =  6,
-
-    PSM_CREATE         = 17,
-    PSM_DESTROY                = 23,
-
-    PSM_SCRIPT         = 53,
-    PSM_TRIGGERS       = 54,
-    PSM_IMMED_TRIGGERS = 55,
-
-    PSM_RPMDB_ADD      = 98,
-    PSM_RPMDB_REMOVE   = 99
-
-} pkgStage;
-
 struct rpmpsm_s {
     rpmts ts;                  /*!< transaction set */
     rpmte te;                  /*!< current transaction element */
-    rpmfi fi;                  /*!< transaction element file info */
-    const char * goalName;
-    char * failedFile;
-    rpmTagVal scriptTag;       /*!< Scriptlet data tag. */
-    int npkgs_installed;       /*!< No. of installed instances. */
+    rpmfiles files;            /*!< transaction element file info */
     int scriptArg;             /*!< Scriptlet package arg. */
-    rpmsenseFlags sense;       /*!< One of RPMSENSE_TRIGGER{PREIN,IN,UN,POSTUN}. */
     int countCorrection;       /*!< 0 if installing, -1 if removing. */
     rpmCallbackType what;      /*!< Callback type. */
     rpm_loff_t amount;         /*!< Callback amount. */
     rpm_loff_t total;          /*!< Callback total. */
-    pkgGoal goal;
-    pkgStage stage;            /*!< Current psm stage. */
-    pkgStage nstage;           /*!< Next psm stage. */
 
     int nrefs;                 /*!< Reference count. */
 };
 
-static rpmpsm rpmpsmNew(rpmts ts, rpmte te);
+static rpmpsm rpmpsmNew(rpmts ts, rpmte te, pkgGoal goal);
+static rpmRC rpmpsmUnpack(rpmpsm psm);
 static rpmpsm rpmpsmFree(rpmpsm psm);
-static rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage);
-
-/**
- * Macros to be defined from per-header tag values.
- * @todo Should other macros be added from header when installing a package?
- */
-static struct tagMacro {
-    const char *macroname;     /*!< Macro name to define. */
-    rpmTag tag;                        /*!< Header tag to use for value. */
-} const tagMacros[] = {
-    { "name",          RPMTAG_NAME },
-    { "version",       RPMTAG_VERSION },
-    { "release",       RPMTAG_RELEASE },
-    { "epoch",         RPMTAG_EPOCH },
-    { NULL, 0 }
-};
-
-/**
- * Define per-header macros.
- * @param h            header
- * @return             0 always
- */
-static void rpmInstallLoadMacros(Header h)
-{
-    const struct tagMacro * tagm;
-
-    for (tagm = tagMacros; tagm->macroname != NULL; tagm++) {
-       struct rpmtd_s td;
-       char *body;
-       if (!headerGet(h, tagm->tag, &td, HEADERGET_DEFAULT))
-           continue;
-
-       switch (rpmtdType(&td)) {
-       default:
-           body = rpmtdFormat(&td, RPMTD_FORMAT_STRING, NULL);
-           addMacro(NULL, tagm->macroname, NULL, body, -1);
-           free(body);
-           break;
-       case RPM_NULL_TYPE:
-           break;
-       }
-       rpmtdFreeData(&td);
-    }
-}
+static const char * pkgGoalString(pkgGoal goal);
 
 /**
  * Adjust file states in database for files shared with this package:
@@ -133,9 +64,9 @@ static rpmRC markReplacedFiles(const rpmpsm psm)
     sharedFileInfo sfi;
     rpmdbMatchIterator mi;
     Header h;
-    int * offsets;
+    unsigned int * offsets;
     unsigned int prev;
-    int num;
+    unsigned int num;
 
     if (!replaced)
        return RPMRC_OK;
@@ -227,17 +158,12 @@ static int rpmlibDeps(Header h)
 rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd,
                char ** specFilePtr, char ** cookie)
 {
-    rpmfi fi = NULL;
-    char * specFile = NULL;
-    const char *rootdir = rpmtsRootDir(ts);
     Header h = NULL;
     rpmpsm psm = NULL;
     rpmte te = NULL;
     rpmRC rpmrc;
     int specix = -1;
-    struct rpmtd_s filenames;
 
-    rpmtdReset(&filenames);
     rpmrc = rpmReadPackageFile(ts, fd, NULL, &h);
     switch (rpmrc) {
     case RPMRC_NOTTRUSTED:
@@ -262,51 +188,9 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd,
     if (!rpmlibDeps(h))
        goto exit;
 
-    if (headerGet(h, RPMTAG_BASENAMES, &filenames, HEADERGET_ALLOC)) {
-       struct rpmtd_s td;
-       const char *str;
-       const char *_cookie = headerGetString(h, RPMTAG_COOKIE);
-       if (cookie && _cookie) *cookie = xstrdup(_cookie);
-       
-       /* Try to find spec by file flags */
-       if (_cookie && headerGet(h, RPMTAG_FILEFLAGS, &td, HEADERGET_MINMEM)) {
-           rpmfileAttrs *flags;
-           while (specix < 0 && (flags = rpmtdNextUint32(&td))) {
-               if (*flags & RPMFILE_SPECFILE)
-                   specix = rpmtdGetIndex(&td);
-           }
-       }
-       /* Still no spec? Look by filename. */
-       while (specix < 0 && (str = rpmtdNextString(&filenames))) {
-           if (rpmFileHasSuffix(str, ".spec")) 
-               specix = rpmtdGetIndex(&filenames);
-       }
-    }
-
-    if (rootdir && rstreq(rootdir, "/"))
-       rootdir = NULL;
-
-    /* Macros need to be added before trying to create directories */
-    rpmInstallLoadMacros(h);
+    specix = headerFindSpec(h);
 
-    if (specix >= 0) {
-       const char *bn;
-
-       headerDel(h, RPMTAG_BASENAMES);
-       headerDel(h, RPMTAG_DIRNAMES);
-       headerDel(h, RPMTAG_DIRINDEXES);
-
-       rpmtdInit(&filenames);
-       for (int i = 0; (bn = rpmtdNextString(&filenames)); i++) {
-           int spec = (i == specix);
-           char *fn = rpmGenPath(rpmtsRootDir(ts),
-                                 spec ? "%{_specdir}" : "%{_sourcedir}", bn);
-           headerPutString(h, RPMTAG_OLDFILENAMES, fn);
-           if (spec) specFile = xstrdup(fn);
-           free(fn);
-       }
-       headerConvert(h, HEADERCONV_COMPRESSFILELIST);
-    } else {
+    if (specix < 0) {
        rpmlog(RPMLOG_ERR, _("source package contains no .spec file\n"));
        goto exit;
     };
@@ -322,142 +206,50 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd,
     rpmteSetFd(te, fd);
 
     rpmteSetHeader(te, h);
-    fi = rpmfiNew(ts, h, RPMTAG_BASENAMES, RPMFI_KEEPHEADER);
-    h = headerFree(h);
-
-    if (fi == NULL) {
-       goto exit;
-    }
-    fi->apath = filenames.data; /* Ick */
-    rpmteSetFI(te, fi);
-    fi = rpmfiFree(fi);
-
-    if (rpmMkdirs(rpmtsRootDir(ts), "%{_topdir}:%{_sourcedir}:%{_specdir}")) {
-       goto exit;
-    }
 
     {
        /* set all files to be installed */
        rpmfs fs = rpmteGetFileStates(te);
-       int i;
-       unsigned int fc = rpmfiFC(fi);
-       for (i=0; i<fc; i++) rpmfsSetAction(fs, i, FA_CREATE);
+       int fc = rpmfsFC(fs);
+       for (int i = 0; i < fc; i++)
+           rpmfsSetAction(fs, i, FA_CREATE);
     }
 
-    psm = rpmpsmNew(ts, te);
-    psm->goal = PKG_INSTALL;
+    psm = rpmpsmNew(ts, te, PKG_INSTALL);
 
-       /* FIX: psm->fi->dnl should be owned. */
-    if (rpmpsmStage(psm, PSM_PROCESS) == RPMRC_OK)
+    if (rpmpsmUnpack(psm) == RPMRC_OK)
        rpmrc = RPMRC_OK;
 
-    (void) rpmpsmStage(psm, PSM_FINI);
     rpmpsmFree(psm);
 
 exit:
-    if (specFilePtr && specFile && rpmrc == RPMRC_OK)
-       *specFilePtr = specFile;
-    else
-       free(specFile);
-
-    headerFree(h);
-    rpmfiFree(fi);
+    if (rpmrc == RPMRC_OK && specix >= 0) {
+       if (cookie)
+           *cookie = headerGetAsString(h, RPMTAG_COOKIE);
+       if (specFilePtr) {
+           rpmfiles files = rpmteFiles(te);
+           *specFilePtr = rpmfilesFN(files, specix);
+           rpmfilesFree(files);
+       }
+    }
 
     /* XXX nuke the added package(s). */
-    rpmtsClean(ts);
+    headerFree(h);
+    rpmtsEmpty(ts);
 
     return rpmrc;
 }
 
-static rpmTagVal triggertag(rpmsenseFlags sense) 
-{
-    rpmTagVal tag = RPMTAG_NOT_FOUND;
-    switch (sense) {
-    case RPMSENSE_TRIGGERIN:
-       tag = RPMTAG_TRIGGERIN;
-       break;
-    case RPMSENSE_TRIGGERUN:
-       tag = RPMTAG_TRIGGERUN;
-       break;
-    case RPMSENSE_TRIGGERPOSTUN:
-       tag = RPMTAG_TRIGGERPOSTUN;
-       break;
-    case RPMSENSE_TRIGGERPREIN:
-       tag = RPMTAG_TRIGGERPREIN;
-       break;
-    default:
-       break;
-    }
-    return tag;
-}
-
-/**
- * Run a scriptlet with args.
- *
- * Run a script with an interpreter. If the interpreter is not specified,
- * /bin/sh will be used. If the interpreter is /bin/sh, then the args from
- * the header will be ignored, passing instead arg1 and arg2.
- *
- * @param psm          package state machine data
- * @param prefixes     install prefixes
- * @param script       scriptlet from header
- * @param arg1         no. instances of package installed after scriptlet exec
- *                     (-1 is no arg)
- * @param arg2         ditto, but for the target package
- * @return             0 on success
- */
-static rpmRC runScript(rpmpsm psm, ARGV_const_t prefixes, 
-                      rpmScript script, int arg1, int arg2)
-{
-    rpmRC stoprc, rc = RPMRC_OK;
-    rpmTagVal stag = rpmScriptTag(script);
-    FD_t sfd = NULL;
-    int warn_only = (stag != RPMTAG_PREIN &&
-                    stag != RPMTAG_PREUN &&
-                    stag != RPMTAG_PRETRANS &&
-                    stag != RPMTAG_VERIFYSCRIPT);
-    int selinux = !(rpmtsFlags(psm->ts) & RPMTRANS_FLAG_NOCONTEXTS);
-
-    sfd = rpmtsNotify(psm->ts, psm->te, RPMCALLBACK_SCRIPT_START, stag, 0);
-    if (sfd == NULL)
-       sfd = rpmtsScriptFd(psm->ts);
-
-    rpmtsSuspendResumeDBLock(psm->ts, 0);
-    rpmswEnter(rpmtsOp(psm->ts, RPMTS_OP_SCRIPTLETS), 0);
-    rc = rpmScriptRun(script, arg1, arg2, sfd,
-                     prefixes, warn_only, selinux, psm->ts->plugins);
-    rpmswExit(rpmtsOp(psm->ts, RPMTS_OP_SCRIPTLETS), 0);
-    rpmtsSuspendResumeDBLock(psm->ts, 1);
-
-    /* Map warn-only errors to "notfound" for script stop callback */
-    stoprc = (rc != RPMRC_OK && warn_only) ? RPMRC_NOTFOUND : rc;
-    rpmtsNotify(psm->ts, psm->te, RPMCALLBACK_SCRIPT_STOP, stag, stoprc);
-
-    /* 
-     * Notify callback for all errors. "total" abused for warning/error,
-     * rc only reflects whether the condition prevented install/erase 
-     * (which is only happens with %prein and %preun scriptlets) or not.
-     */
-    if (rc != RPMRC_OK) {
-       if (warn_only) {
-           rc = RPMRC_OK;
-       }
-       rpmtsNotify(psm->ts, psm->te, RPMCALLBACK_SCRIPT_ERROR, stag, rc);
-    }
-
-    return rc;
-}
-
-static rpmRC runInstScript(rpmpsm psm)
+static rpmRC runInstScript(rpmpsm psm, rpmTagVal scriptTag)
 {
     rpmRC rc = RPMRC_OK;
     struct rpmtd_s pfx;
     Header h = rpmteHeader(psm->te);
-    rpmScript script = rpmScriptFromTag(h, psm->scriptTag);
+    rpmScript script = rpmScriptFromTag(h, scriptTag);
 
     if (script) {
        headerGet(h, RPMTAG_INSTPREFIXES, &pfx, HEADERGET_ALLOC|HEADERGET_ARGV);
-       rc = runScript(psm, pfx.data, script, psm->scriptArg, -1);
+       rc = runScript(psm->ts, psm->te, h, pfx.data, script, psm->scriptArg, -1);
        rpmtdFreeData(&pfx);
     }
 
@@ -470,18 +262,19 @@ static rpmRC runInstScript(rpmpsm psm)
 /**
  * Execute triggers.
  * @todo Trigger on any provides, not just package NVR.
- * @param psm          package state machine data
+ * @param ts           transaction set
+ * @param te           transaction element
+ * @param sense                trigger type
  * @param sourceH      header of trigger source
  * @param trigH                header of triggered package
  * @param arg2
  * @param triggersAlreadyRun
  * @return
  */
-static rpmRC handleOneTrigger(const rpmpsm psm,
-                       Header sourceH, Header trigH,
+static rpmRC handleOneTrigger(rpmts ts, rpmte te, rpmsenseFlags sense,
+                       Header sourceH, Header trigH, int countCorrection,
                        int arg2, unsigned char * triggersAlreadyRun)
 {
-    const rpmts ts = psm->ts;
     rpmds trigger = rpmdsInit(rpmdsNew(trigH, RPMTAG_TRIGGERNAME, 0));
     struct rpmtd_s pfx;
     const char * sourceName = headerGetString(sourceH, RPMTAG_NAME);
@@ -496,10 +289,9 @@ static rpmRC handleOneTrigger(const rpmpsm psm,
     (void) rpmdsSetNoPromote(trigger, 1);
 
     while ((i = rpmdsNext(trigger)) >= 0) {
-       struct rpmtd_s tindexes;
        uint32_t tix;
 
-       if (!(rpmdsFlags(trigger) & psm->sense))
+       if (!(rpmdsFlags(trigger) & sense))
            continue;
 
        if (!rstreq(rpmdsN(trigger), sourceName))
@@ -509,15 +301,7 @@ static rpmRC handleOneTrigger(const rpmpsm psm,
        if (!rpmdsAnyMatchesDep(sourceH, trigger, 1))
            continue;
 
-       if (!headerGet(trigH, RPMTAG_TRIGGERINDEX, &tindexes, HEADERGET_MINMEM))
-           continue;
-
-       if (rpmtdSetIndex(&tindexes, i) < 0) {
-           rpmtdFreeData(&tindexes);
-           continue;
-       }
-
-       tix = rpmtdGetNumber(&tindexes);
+       tix = rpmdsTi(trigger);
        if (triggersAlreadyRun == NULL || triggersAlreadyRun[tix] == 0) {
            int arg1 = rpmdbCountPackages(rpmtsGetRdb(ts), triggerName);
 
@@ -526,10 +310,9 @@ static rpmRC handleOneTrigger(const rpmpsm psm,
                rc = RPMRC_FAIL;
            } else {
                rpmScript script = rpmScriptFromTriggerTag(trigH,
-                                                triggertag(psm->sense), tix);
-               arg1 += psm->countCorrection;
-               rc = runScript(psm, pfx.data, script, arg1, arg2);
-
+                            triggertag(sense), RPMSCRIPT_NORMALTRIGGER, tix);
+               arg1 += countCorrection;
+               rc = runScript(ts, te, trigH, pfx.data, script, arg1, arg2);
                if (triggersAlreadyRun != NULL)
                    triggersAlreadyRun[tix] = 1;
 
@@ -537,8 +320,6 @@ static rpmRC handleOneTrigger(const rpmpsm psm,
            }
        }
 
-       rpmtdFreeData(&tindexes);
-
        /*
         * Each target/source header pair can only result in a single
         * script being run.
@@ -555,9 +336,10 @@ static rpmRC handleOneTrigger(const rpmpsm psm,
 /**
  * Run trigger scripts in the database that are fired by this header.
  * @param psm          package state machine data
+ * @param sense                trigger type
  * @return             0 on success
  */
-static rpmRC runTriggers(rpmpsm psm)
+static rpmRC runTriggers(rpmpsm psm, rpmsenseFlags sense)
 {
     const rpmts ts = psm->ts;
     int numPackage = -1;
@@ -575,14 +357,13 @@ static rpmRC runTriggers(rpmpsm psm)
     {  Header triggeredH;
        Header h = rpmteHeader(psm->te);
        rpmdbMatchIterator mi;
-       int countCorrection = psm->countCorrection;
 
-       psm->countCorrection = 0;
        mi = rpmtsInitIterator(ts, RPMDBI_TRIGGERNAME, N, 0);
-       while((triggeredH = rpmdbNextIterator(mi)) != NULL)
-           nerrors += handleOneTrigger(psm, h, triggeredH, numPackage, NULL);
+       while ((triggeredH = rpmdbNextIterator(mi)) != NULL) {
+           nerrors += handleOneTrigger(ts, NULL, sense, h, triggeredH,
+                                       0, numPackage, NULL);
+       }
        rpmdbFreeIterator(mi);
-       psm->countCorrection = countCorrection;
        headerFree(h);
     }
 
@@ -592,9 +373,10 @@ static rpmRC runTriggers(rpmpsm psm)
 /**
  * Run triggers from this header that are fired by headers in the database.
  * @param psm          package state machine data
+ * @param sense                trigger type
  * @return             0 on success
  */
-static rpmRC runImmedTriggers(rpmpsm psm)
+static rpmRC runImmedTriggers(rpmpsm psm, rpmsenseFlags sense)
 {
     const rpmts ts = psm->ts;
     unsigned char * triggersRun;
@@ -620,8 +402,10 @@ static rpmRC runImmedTriggers(rpmpsm psm)
        
            mi = rpmtsInitIterator(ts, RPMDBI_NAME, trigName, 0);
 
-           while((sourceH = rpmdbNextIterator(mi)) != NULL) {
-               nerrors += handleOneTrigger(psm, sourceH, h,
+           while ((sourceH = rpmdbNextIterator(mi)) != NULL) {
+               nerrors += handleOneTrigger(psm->ts, psm->te,
+                               sense, sourceH, h,
+                               psm->countCorrection,
                                rpmdbGetIteratorCount(mi),
                                triggersRun);
            }
@@ -641,7 +425,7 @@ exit:
 static rpmpsm rpmpsmFree(rpmpsm psm)
 {
     if (psm) {
-       rpmfiFree(psm->fi);
+       rpmfilesFree(psm->files);
        rpmtsFree(psm->ts),
        /* XXX rpmte not refcounted yet */
        memset(psm, 0, sizeof(*psm)); /* XXX trash and burn */
@@ -650,12 +434,55 @@ static rpmpsm rpmpsmFree(rpmpsm psm)
     return NULL;
 }
 
-static rpmpsm rpmpsmNew(rpmts ts, rpmte te)
+static rpmpsm rpmpsmNew(rpmts ts, rpmte te, pkgGoal goal)
 {
     rpmpsm psm = xcalloc(1, sizeof(*psm));
     psm->ts = rpmtsLink(ts);
-    psm->fi = rpmfiLink(rpmteFI(te));
+    psm->files = rpmteFiles(te);
     psm->te = te; /* XXX rpmte not refcounted yet */
+    if (!rpmteIsSource(te)) {
+       /*
+        * When we run scripts, we pass an argument which is the number of
+        * versions of this package that will be installed when we are
+        * finished.
+        */
+       int npkgs_installed = rpmdbCountPackages(rpmtsGetRdb(ts), rpmteN(te));
+       switch (goal) {
+       case PKG_INSTALL:
+       case PKG_PRETRANS:
+           psm->scriptArg = npkgs_installed + 1;
+           psm->countCorrection = 0;
+           break;
+       case PKG_ERASE:
+           psm->scriptArg = npkgs_installed - 1;
+           psm->countCorrection = -1;
+           break;
+       case PKG_VERIFY:
+       case PKG_POSTTRANS:
+           psm->scriptArg = npkgs_installed;
+           psm->countCorrection = 0;
+           break;
+       default:
+           break;
+       }
+    }
+
+    if (goal == PKG_INSTALL) {
+       Header h = rpmteHeader(te);
+       psm->total = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);
+       headerFree(h);
+    } else if (goal == PKG_ERASE) {
+       psm->total = rpmfilesFC(psm->files);
+    }
+    /* Fake up something for packages with no files */
+    if (psm->total == 0)
+       psm->total = 100;
+
+    if (goal == PKG_INSTALL || goal == PKG_ERASE) {
+       rpmlog(RPMLOG_DEBUG, "%s: %s has %d files\n", pkgGoalString(goal),
+           rpmteNEVRA(psm->te), rpmfilesFC(psm->files));
+    }
+
     return psm;
 }
 
@@ -685,14 +512,13 @@ void rpmpsmNotify(rpmpsm psm, int what, rpm_loff_t amount)
  */
 static void markReplacedInstance(rpmts ts, rpmte te)
 {
-    /* this must match rpmNameVersionCompare in depends.c */
     rpmdbMatchIterator mi = rpmtsInitIterator(ts, RPMDBI_NAME, rpmteN(te), 0);
     rpmdbSetIteratorRE(mi, RPMTAG_EPOCH, RPMMIRE_STRCMP, rpmteE(te));
     rpmdbSetIteratorRE(mi, RPMTAG_VERSION, RPMMIRE_STRCMP, rpmteV(te));
     rpmdbSetIteratorRE(mi, RPMTAG_RELEASE, RPMMIRE_STRCMP, rpmteR(te));
-    rpmdbSetIteratorRE(mi, RPMTAG_ARCH, RPMMIRE_STRCMP, rpmteA(te));
     /* XXX shouldn't we also do this on colorless transactions? */
     if (rpmtsColor(ts)) {
+       rpmdbSetIteratorRE(mi, RPMTAG_ARCH, RPMMIRE_STRCMP, rpmteA(te));
        rpmdbSetIteratorRE(mi, RPMTAG_OS, RPMMIRE_STRCMP, rpmteO(te));
     }
 
@@ -703,323 +529,293 @@ static void markReplacedInstance(rpmts ts, rpmte te)
     rpmdbFreeIterator(mi);
 }
 
-static rpmRC rpmpsmNext(rpmpsm psm, pkgStage nstage)
+static rpmRC dbAdd(rpmts ts, rpmte te)
 {
-    psm->nstage = nstage;
-    return rpmpsmStage(psm, psm->nstage);
+    Header h = rpmteHeader(te);
+    rpm_time_t installTime = (rpm_time_t) time(NULL);
+    rpmfs fs = rpmteGetFileStates(te);
+    rpm_count_t fc = rpmfsFC(fs);
+    rpm_fstate_t * fileStates = rpmfsGetStates(fs);
+    rpm_color_t tscolor = rpmtsColor(ts);
+    rpm_tid_t tid = rpmtsGetTid(ts);
+    rpmRC rc;
+
+    if (fileStates != NULL && fc > 0) {
+       headerPutChar(h, RPMTAG_FILESTATES, fileStates, fc);
+    }
+
+    headerPutUint32(h, RPMTAG_INSTALLTID, &tid, 1);
+    headerPutUint32(h, RPMTAG_INSTALLTIME, &installTime, 1);
+    headerPutUint32(h, RPMTAG_INSTALLCOLOR, &tscolor, 1);
+
+    (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DBADD), 0);
+    rc = (rpmdbAdd(rpmtsGetRdb(ts), h) == 0) ? RPMRC_OK : RPMRC_FAIL;
+    (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DBADD), 0);
+
+    if (rc == RPMRC_OK) {
+       rpmteSetDBInstance(te, headerGetInstance(h));
+       packageHashAddEntry(ts->members->installedPackages,
+                           headerGetInstance(h), te);
+    }
+    headerFree(h);
+    return rc;
 }
 
-static rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
+static rpmRC dbRemove(rpmts ts, rpmte te)
 {
-    const rpmts ts = psm->ts;
-    rpmfi fi = psm->fi;
+    rpmRC rc;
+
+    (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DBREMOVE), 0);
+    rc = (rpmdbRemove(rpmtsGetRdb(ts), rpmteDBInstance(te)) == 0) ?
+                                               RPMRC_OK : RPMRC_FAIL;
+    (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DBREMOVE), 0);
+
+    if (rc == RPMRC_OK)
+       rpmteSetDBInstance(te, 0);
+    return rc;
+}
+
+static rpmRC rpmpsmUnpack(rpmpsm psm)
+{
+    char *failedFile = NULL;
+    int fsmrc = 0;
+    int saved_errno = 0;
     rpmRC rc = RPMRC_OK;
 
-    switch (stage) {
-    case PSM_UNKNOWN:
-       break;
-    case PSM_INIT:
-       rpmlog(RPMLOG_DEBUG, "%s: %s has %d files\n",
-               psm->goalName, rpmteNEVR(psm->te), rpmfiFC(fi));
+    rpmpsmNotify(psm, RPMCALLBACK_INST_START, 0);
+    /* make sure first progress call gets made */
+    rpmpsmNotify(psm, RPMCALLBACK_INST_PROGRESS, 0);
 
-       /*
-        * When we run scripts, we pass an argument which is the number of
-        * versions of this package that will be installed when we are
-        * finished.
-        */
-       psm->npkgs_installed = rpmdbCountPackages(rpmtsGetRdb(ts), rpmteN(psm->te));
-       if (psm->npkgs_installed < 0) {
-           rc = RPMRC_FAIL;
-           break;
+    if (!(rpmtsFlags(psm->ts) & RPMTRANS_FLAG_JUSTDB)) {
+       if (rpmfilesFC(psm->files) > 0) {
+           fsmrc = rpmPackageFilesInstall(psm->ts, psm->te, psm->files,
+                                  psm, &failedFile);
+           saved_errno = errno;
        }
+    }
 
-       if (psm->goal == PKG_INSTALL) {
-           Header h = rpmteHeader(psm->te);
-           psm->scriptArg = psm->npkgs_installed + 1;
+    /* XXX make sure progress reaches 100% */
+    rpmpsmNotify(psm, RPMCALLBACK_INST_PROGRESS, psm->total);
+    rpmpsmNotify(psm, RPMCALLBACK_INST_STOP, psm->total);
+
+    if (fsmrc) {
+       char *emsg;
+       errno = saved_errno;
+       emsg = rpmfileStrerror(fsmrc);
+       rpmlog(RPMLOG_ERR,
+               _("unpacking of archive failed%s%s: %s\n"),
+               (failedFile != NULL ? _(" on file ") : ""),
+               (failedFile != NULL ? failedFile : ""),
+               emsg);
+       free(emsg);
+       rc = RPMRC_FAIL;
+
+       /* XXX notify callback on error. */
+       rpmtsNotify(psm->ts, psm->te, RPMCALLBACK_UNPACK_ERROR, 0, 0);
+    }
+    free(failedFile);
+    return rc;
+}
 
-           psm->amount = 0;
-           psm->total = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);
-           /* fake up something for packages with no files */
-           if (psm->total == 0)
-               psm->total = 100;
+static rpmRC rpmpsmRemove(rpmpsm psm)
+{
+    char *failedFile = NULL;
+    int fsmrc = 0;
+
+    rpmpsmNotify(psm, RPMCALLBACK_UNINST_START, 0);
+    /* make sure first progress call gets made */
+    rpmpsmNotify(psm, RPMCALLBACK_UNINST_PROGRESS, 0);
+
+    /* XXX should't we log errors from here? */
+    if (!(rpmtsFlags(psm->ts) & RPMTRANS_FLAG_JUSTDB)) {
+       if (rpmfilesFC(psm->files) > 0) {
+           fsmrc = rpmPackageFilesRemove(psm->ts, psm->te, psm->files,
+                                         psm, &failedFile);
+       }
+    }
+    /* XXX make sure progress reaches 100% */
+    rpmpsmNotify(psm, RPMCALLBACK_UNINST_PROGRESS, psm->total);
+    rpmpsmNotify(psm, RPMCALLBACK_UNINST_STOP, psm->total);
 
-           /* HACK: reinstall abuses te instance to remove old header */
-           if (rpmtsFilterFlags(ts) & RPMPROB_FILTER_REPLACEPKG)
-               markReplacedInstance(ts, psm->te);
+    free(failedFile);
+    return (fsmrc == 0) ? RPMRC_OK : RPMRC_FAIL;
+}
 
-           if (rpmfiFC(fi) > 0) {
-               struct rpmtd_s filenames;
-               rpmTag ftag = RPMTAG_FILENAMES;
-       
-               if (headerIsEntry(h, RPMTAG_ORIGBASENAMES)) {
-                   ftag = RPMTAG_ORIGFILENAMES;
-               }
-               headerGet(h, ftag, &filenames, HEADERGET_EXT);
-               fi->apath = filenames.data; /* Ick.. */
-           }
-           headerFree(h);
-       }
-       if (psm->goal == PKG_ERASE) {
-           psm->scriptArg = psm->npkgs_installed - 1;
+static rpmRC rpmPackageInstall(rpmts ts, rpmpsm psm)
+{
+    rpmRC rc = RPMRC_OK;
+    int once = 1;
 
-           psm->amount = 0;
-           psm->total = rpmfiFC(fi) ? rpmfiFC(fi) : 100;
-       }
-       break;
-    case PSM_PRE:
-       if (psm->goal == PKG_INSTALL) {
-           psm->scriptTag = RPMTAG_PREIN;
-           psm->sense = RPMSENSE_TRIGGERPREIN;
-           psm->countCorrection = 0;   /* XXX is this correct?!? */
-
-           if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERPREIN)) {
-               /* Run triggers in other package(s) this package sets off. */
-               rc = rpmpsmNext(psm, PSM_TRIGGERS);
-               if (rc) break;
-
-               /* Run triggers in this package other package(s) set off. */
-               rc = rpmpsmNext(psm, PSM_IMMED_TRIGGERS);
-               if (rc) break;
-           }
+    rpmswEnter(rpmtsOp(psm->ts, RPMTS_OP_INSTALL), 0);
+    while (once--) {
+       /* HACK: replacepkgs abuses te instance to remove old header */
+       if (rpmtsFilterFlags(psm->ts) & RPMPROB_FILTER_REPLACEPKG)
+           markReplacedInstance(ts, psm->te);
 
-           if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPRE)) {
-               rc = rpmpsmNext(psm, PSM_SCRIPT);
-               if (rc) break;
-           }
-       }
 
-       if (psm->goal == PKG_ERASE) {
-           psm->scriptTag = RPMTAG_PREUN;
-           psm->sense = RPMSENSE_TRIGGERUN;
-           psm->countCorrection = -1;
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERPREIN)) {
+           /* Run triggers in other package(s) this package sets off. */
+           rc = runTriggers(psm, RPMSENSE_TRIGGERPREIN);
+           if (rc) break;
 
-           if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERUN)) {
-               /* Run triggers in this package other package(s) set off. */
-               rc = rpmpsmNext(psm, PSM_IMMED_TRIGGERS);
-               if (rc) break;
+           /* Run triggers in this package other package(s) set off. */
+           rc = runImmedTriggers(psm, RPMSENSE_TRIGGERPREIN);
+           if (rc) break;
+       }
 
-               /* Run triggers in other package(s) this package sets off. */
-               rc = rpmpsmNext(psm, PSM_TRIGGERS);
-               if (rc) break;
-           }
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPRE)) {
+           rc = runInstScript(psm, RPMTAG_PREIN);
+           if (rc) break;
+       }
+
+       rc = rpmpsmUnpack(psm);
+       if (rc) break;
 
-           if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPREUN))
-               rc = rpmpsmNext(psm, PSM_SCRIPT);
+       /*
+        * If this package has already been installed, remove it from
+        * the database before adding the new one.
+        */
+       if (rpmteDBInstance(psm->te)) {
+           rc = dbRemove(ts, psm->te);
+           if (rc) break;
        }
-       break;
-    case PSM_PROCESS:
-       if (psm->goal == PKG_INSTALL) {
-           int fsmrc = 0;
-
-           rpmpsmNotify(psm, RPMCALLBACK_INST_START, 0);
-           /* make sure first progress call gets made */
-           rpmpsmNotify(psm, RPMCALLBACK_INST_PROGRESS, 0);
-
-           if (rpmfiFC(fi) > 0 && !(rpmtsFlags(ts) & RPMTRANS_FLAG_JUSTDB)) {
-               rpmtransFlags oldtsflags;
-               FD_t payload = rpmtePayload(psm->te);
-               if (payload == NULL) {
-                   rc = RPMRC_FAIL;
-                   break;
-               }
 
-               oldtsflags = rpmtsFlags(ts);
-               if (headerIsEntry(fi->h, RPMTAG_REMOVETID))
-                   (void) rpmtsSetFlags(ts, oldtsflags | RPMTRANS_FLAG_NOMD5);
+       rc = dbAdd(ts, psm->te);
+       if (rc) break;
 
-               fsmrc = rpmPackageFilesInstall(psm->ts, psm->te, psm->fi,
-                                 payload, psm, &psm->failedFile);
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERIN)) {
+           /* Run upper file triggers i. e. with higher priorities */
+           /* Run file triggers in other package(s) this package sets off. */
+           rc = runFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERIN,
+                               RPMSCRIPT_FILETRIGGER, 1);
+           if (rc) break;
 
-               rpmswAdd(rpmtsOp(psm->ts, RPMTS_OP_UNCOMPRESS),
-                        fdOp(payload, FDSTAT_READ));
-               rpmswAdd(rpmtsOp(psm->ts, RPMTS_OP_DIGEST),
-                        fdOp(payload, FDSTAT_DIGEST));
+           /* Run file triggers in this package other package(s) set off. */
+           rc = runImmedFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERIN,
+                                   RPMSCRIPT_FILETRIGGER, 1);
+           if (rc) break;
+       }
 
-               if (headerIsEntry(fi->h, RPMTAG_REMOVETID))
-                   (void) rpmtsSetFlags(ts, oldtsflags);
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPOST)) {
+           rc = runInstScript(psm, RPMTAG_POSTIN);
+           if (rc) break;
+       }
 
-               Fclose(payload);
-           }
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERIN)) {
+           /* Run triggers in other package(s) this package sets off. */
+           rc = runTriggers(psm, RPMSENSE_TRIGGERIN);
+           if (rc) break;
 
-           /* XXX make sure progress reaches 100% */
-           rpmpsmNotify(psm, 0, psm->total);
-           rpmpsmNotify(psm, RPMCALLBACK_INST_STOP, psm->total);
+           /* Run triggers in this package other package(s) set off. */
+           rc = runImmedTriggers(psm, RPMSENSE_TRIGGERIN);
+           if (rc) break;
 
-           if (fsmrc) {
-               rpmlog(RPMLOG_ERR,
-                       _("unpacking of archive failed%s%s: %s\n"),
-                       (psm->failedFile != NULL ? _(" on file ") : ""),
-                       (psm->failedFile != NULL ? psm->failedFile : ""),
-                       rpmcpioStrerror(fsmrc));
-               rc = RPMRC_FAIL;
+           /* Run lower file triggers i. e. with lower priorities */
+           /* Run file triggers in other package(s) this package sets off. */
+           rc = runFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERIN,
+                               RPMSCRIPT_FILETRIGGER, 2);
+           if (rc) break;
 
-               /* XXX notify callback on error. */
-               rpmtsNotify(ts, psm->te, RPMCALLBACK_UNPACK_ERROR, 0, 0);
-               break;
-           }
+           /* Run file triggers in this package other package(s) set off. */
+           rc = runImmedFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERIN,
+                                   RPMSCRIPT_FILETRIGGER, 2);
+           if (rc) break;
        }
-       if (psm->goal == PKG_ERASE) {
-           if (rpmtsFlags(ts) & RPMTRANS_FLAG_JUSTDB)  break;
 
-           rpmpsmNotify(psm, RPMCALLBACK_UNINST_START, 0);
-           /* make sure first progress call gets made */
-           rpmpsmNotify(psm, RPMCALLBACK_UNINST_PROGRESS, 0);
+       rc = markReplacedFiles(psm);
+    }
 
-           /* XXX should't we log errors from here? */
-           if (rpmfiFC(fi) > 0 && !(rpmtsFlags(ts) & RPMTRANS_FLAG_JUSTDB)) {
-               rc = rpmPackageFilesRemove(psm->ts, psm->te, psm->fi,
-                                 psm, &psm->failedFile);
-           }
+    rpmswExit(rpmtsOp(psm->ts, RPMTS_OP_INSTALL), 0);
 
-           /* XXX make sure progress reaches 100% */
-           rpmpsmNotify(psm, 0, psm->total);
-           rpmpsmNotify(psm, RPMCALLBACK_UNINST_STOP, psm->total);
-       }
-       break;
-    case PSM_POST:
-       if (psm->goal == PKG_INSTALL) {
-           rpm_time_t installTime = (rpm_time_t) time(NULL);
-           rpmfs fs = rpmteGetFileStates(psm->te);
-           rpm_count_t fc = rpmfsFC(fs);
-           rpm_fstate_t * fileStates = rpmfsGetStates(fs);
-           Header h = rpmteHeader(psm->te);
-           rpm_color_t tscolor = rpmtsColor(ts);
-
-           if (fileStates != NULL && fc > 0) {
-               headerPutChar(h, RPMTAG_FILESTATES, fileStates, fc);
-           }
+    return rc;
+}
 
-           headerPutUint32(h, RPMTAG_INSTALLTIME, &installTime, 1);
-           headerPutUint32(h, RPMTAG_INSTALLCOLOR, &tscolor, 1);
-           headerFree(h);
-
-           /*
-            * If this package has already been installed, remove it from
-            * the database before adding the new one.
-            */
-           if (rpmteDBInstance(psm->te)) {
-               rc = rpmpsmNext(psm, PSM_RPMDB_REMOVE);
-               if (rc) break;
-           }
+static rpmRC rpmPackageErase(rpmts ts, rpmpsm psm)
+{
+    rpmRC rc = RPMRC_OK;
+    int once = 1;
+
+    rpmswEnter(rpmtsOp(psm->ts, RPMTS_OP_ERASE), 0);
+    while (once--) {
 
-           rc = rpmpsmNext(psm, PSM_RPMDB_ADD);
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERUN)) {
+           /* Run file triggers in this package other package(s) set off. */
+           rc = runImmedFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERUN,
+                                   RPMSCRIPT_FILETRIGGER, 1);
            if (rc) break;
 
-           psm->scriptTag = RPMTAG_POSTIN;
-           psm->sense = RPMSENSE_TRIGGERIN;
-           psm->countCorrection = 0;
+           /* Run file triggers in other package(s) this package sets off. */
+           rc = runFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERUN,
+                               RPMSCRIPT_FILETRIGGER, 1);
+           if (rc) break;
 
-           if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPOST)) {
-               rc = rpmpsmNext(psm, PSM_SCRIPT);
-               if (rc) break;
-           }
-           if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERIN)) {
-               /* Run triggers in other package(s) this package sets off. */
-               rc = rpmpsmNext(psm, PSM_TRIGGERS);
-               if (rc) break;
-
-               /* Run triggers in this package other package(s) set off. */
-               rc = rpmpsmNext(psm, PSM_IMMED_TRIGGERS);
-               if (rc) break;
-           }
+           /* Run triggers in this package other package(s) set off. */
+           rc = runImmedTriggers(psm, RPMSENSE_TRIGGERUN);
+           if (rc) break;
 
-           rc = markReplacedFiles(psm);
+           /* Run triggers in other package(s) this package sets off. */
+           rc = runTriggers(psm, RPMSENSE_TRIGGERUN);
+           if (rc) break;
+       }
 
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPREUN)) {
+           rc = runInstScript(psm, RPMTAG_PREUN);
+           if (rc) break;
        }
-       if (psm->goal == PKG_ERASE) {
 
-           psm->scriptTag = RPMTAG_POSTUN;
-           psm->sense = RPMSENSE_TRIGGERPOSTUN;
-           psm->countCorrection = -1;
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERUN)) {
+           /* Run file triggers in this package other package(s) set off. */
+           rc = runImmedFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERUN,
+                                   RPMSCRIPT_FILETRIGGER, 2);
+           if (rc) break;
 
-           if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPOSTUN)) {
-               rc = rpmpsmNext(psm, PSM_SCRIPT);
-               if (rc) break;
-           }
+           /* Run file triggers in other package(s) this package sets off. */
+           rc = runFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERUN,
+                               RPMSCRIPT_FILETRIGGER, 2);
+           if (rc) break;
+       }
 
-           if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERPOSTUN)) {
-               /* Run triggers in other package(s) this package sets off. */
-               rc = rpmpsmNext(psm, PSM_TRIGGERS);
-               if (rc) break;
-           }
+       rc = rpmpsmRemove(psm);
+       if (rc) break;
 
-           rc = rpmpsmNext(psm, PSM_RPMDB_REMOVE);
-       }
-       break;
-    case PSM_UNDO:
-       break;
-    case PSM_FINI:
-       if (rc) {
-           if (psm->failedFile)
-               rpmlog(RPMLOG_ERR,
-                       _("%s failed on file %s: %s\n"),
-                       psm->goalName, psm->failedFile, rpmcpioStrerror(rc));
-           else
-               rpmlog(RPMLOG_ERR, _("%s failed: %s\n"),
-                       psm->goalName, rpmcpioStrerror(rc));
-
-           /* XXX notify callback on error. */
-           rpmtsNotify(ts, psm->te, RPMCALLBACK_CPIO_ERROR, 0, 0);
+       /* Run file triggers in other package(s) this package sets off. */
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERPOSTUN)) {
+           rc = runFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERPOSTUN,
+                               RPMSCRIPT_FILETRIGGER, 1);
        }
 
-       psm->failedFile = _free(psm->failedFile);
-
-       fi->apath = _free(fi->apath);
-       break;
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOPOSTUN)) {
+           rc = runInstScript(psm, RPMTAG_POSTUN);
+           if (rc) break;
+       }
 
-    case PSM_CREATE:
-       break;
-    case PSM_DESTROY:
-       break;
-    case PSM_SCRIPT:   /* Run current package scriptlets. */
-       rc = runInstScript(psm);
-       break;
-    case PSM_TRIGGERS:
-       /* Run triggers in other package(s) this package sets off. */
-       rc = runTriggers(psm);
-       break;
-    case PSM_IMMED_TRIGGERS:
-       /* Run triggers in this package other package(s) set off. */
-       rc = runImmedTriggers(psm);
-       break;
+       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOTRIGGERPOSTUN)) {
+           /* Run triggers in other package(s) this package sets off. */
+           rc = runTriggers(psm, RPMSENSE_TRIGGERPOSTUN);
+           if (rc) break;
 
-    case PSM_RPMDB_ADD: {
-       Header h = rpmteHeader(psm->te);
+           /* Run file triggers in other package(s) this package sets off. */
+           rc = runFileTriggers(psm->ts, psm->te, RPMSENSE_TRIGGERPOSTUN,
+                               RPMSCRIPT_FILETRIGGER, 2);
+       }
+       if (rc) break;
 
-       if (!headerIsEntry(h, RPMTAG_INSTALLTID)) {
-           rpm_tid_t tid = rpmtsGetTid(ts);
-           if (tid != 0 && tid != (rpm_tid_t)-1)
-               headerPutUint32(h, RPMTAG_INSTALLTID, &tid, 1);
+       if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERPOSTUN))) {
+           /* Prepare post transaction uninstall triggers */
+           rpmtriggersPrepPostUnTransFileTrigs(psm->ts, psm->te);
        }
-       
-       (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DBADD), 0);
-       rc = (rpmdbAdd(rpmtsGetRdb(ts), h) == 0) ? RPMRC_OK : RPMRC_FAIL;
-       (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DBADD), 0);
 
-       if (rc == RPMRC_OK)
-           rpmteSetDBInstance(psm->te, headerGetInstance(h));
-       headerFree(h);
-    }   break;
-
-    case PSM_RPMDB_REMOVE:
-       (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DBREMOVE), 0);
-       rc = (rpmdbRemove(rpmtsGetRdb(ts), rpmteDBInstance(psm->te)) == 0) ?
-                                                   RPMRC_OK : RPMRC_FAIL;
-       (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DBREMOVE), 0);
-       if (rc == RPMRC_OK)
-           rpmteSetDBInstance(psm->te, 0);
-       break;
+       rc = dbRemove(ts, psm->te);
+    }
 
-    default:
-       break;
-   }
+    rpmswExit(rpmtsOp(psm->ts, RPMTS_OP_ERASE), 0);
 
     return rc;
 }
 
 static const char * pkgGoalString(pkgGoal goal)
 {
-    switch(goal) {
+    switch (goal) {
     case PKG_INSTALL:  return "  install";
     case PKG_ERASE:    return "    erase";
     case PKG_VERIFY:   return "   verify";
@@ -1038,42 +834,39 @@ rpmRC rpmpsmRun(rpmts ts, rpmte te, pkgGoal goal)
     if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)
        return RPMRC_OK;
 
-    psm = rpmpsmNew(ts, te);
+    psm = rpmpsmNew(ts, te, goal);
     if (rpmChrootIn() == 0) {
-       rpmtsOpX op;
-       psm->goal = goal;
-       psm->goalName = pkgGoalString(goal);
+       /* Run pre transaction element hook for all plugins */
+       rc = rpmpluginsCallPsmPre(rpmtsPlugins(ts), te);
 
-       switch (goal) {
-       case PKG_INSTALL:
-       case PKG_ERASE:
-           /* Run pre transaction element hook for all plugins */
-           if (rpmpluginsCallPsmPre(ts->plugins, te) != RPMRC_FAIL) {
-
-               op = (goal == PKG_INSTALL) ? RPMTS_OP_INSTALL : RPMTS_OP_ERASE;
-               rpmswEnter(rpmtsOp(psm->ts, op), 0);
-
-               rc = rpmpsmNext(psm, PSM_INIT);
-               if (!rc) rc = rpmpsmNext(psm, PSM_PRE);
-               if (!rc) rc = rpmpsmNext(psm, PSM_PROCESS);
-               if (!rc) rc = rpmpsmNext(psm, PSM_POST);
-               (void) rpmpsmNext(psm, PSM_FINI);
-
-               rpmswExit(rpmtsOp(psm->ts, op), 0);
+       if (!rc) {
+           switch (goal) {
+           case PKG_INSTALL:
+               rc = rpmPackageInstall(ts, psm);
+               break;
+           case PKG_ERASE:
+               rc = rpmPackageErase(ts, psm);
+               break;
+           case PKG_PRETRANS:
+           case PKG_POSTTRANS:
+           case PKG_VERIFY:
+               rc = runInstScript(psm, goal);
+               break;
+           case PKG_TRANSFILETRIGGERIN:
+               rc = runImmedFileTriggers(ts, te, RPMSENSE_TRIGGERIN,
+                                           RPMSCRIPT_TRANSFILETRIGGER, 0);
+               break;
+           case PKG_TRANSFILETRIGGERUN:
+               rc = runImmedFileTriggers(ts, te, RPMSENSE_TRIGGERUN,
+                                           RPMSCRIPT_TRANSFILETRIGGER, 0);
+               break;
+           default:
+               break;
            }
-
-           /* Run post transaction element hook for all plugins */
-           rpmpluginsCallPsmPost(ts->plugins, te, rc);
-           break;
-       case PKG_PRETRANS:
-       case PKG_POSTTRANS:
-       case PKG_VERIFY:
-           psm->scriptTag = goal;
-           rc = rpmpsmStage(psm, PSM_SCRIPT);
-           break;
-       default:
-           break;
        }
+       /* Run post transaction element hook for all plugins */
+       rpmpluginsCallPsmPost(rpmtsPlugins(ts), te, rc);
+
        /* XXX an error here would require a full abort */
        (void) rpmChrootOut();
     }
index 6f2d593a7a1a1bcbe1ddb7e3ccbbfed9bf4750e0..d857ae5bc9cc74da2778c5de47752c757c4a3892 100644 (file)
@@ -14,6 +14,7 @@
 #include <rpm/rpmdb.h>
 #include <rpm/rpmfi.h>
 #include <rpm/rpmts.h>
+#include <rpm/rpmsq.h>
 #include <rpm/rpmlog.h>
 #include <rpm/rpmfileutil.h>   /* rpmCleanPath */
 
@@ -30,21 +31,16 @@ static void printFileInfo(const char * name,
                          unsigned int mtime,
                          unsigned short rdev, unsigned int nlink,
                          const char * owner, const char * group,
-                         const char * linkto)
+                         const char * linkto, time_t now)
 {
     char sizefield[21];
     char ownerfield[8+1], groupfield[8+1];
     char timefield[100];
     time_t when = mtime;  /* important if sizeof(int32_t) ! sizeof(time_t) */
     struct tm * tm;
-    static time_t now;
     char * perms = rpmPermsString(mode);
     char *link = NULL;
 
-    /* On first call, grab snapshot of now */
-    if (now == 0)
-       now = time(NULL);
-
     rstrlcpy(ownerfield, owner, sizeof(ownerfield));
     rstrlcpy(groupfield, group, sizeof(groupfield));
 
@@ -99,6 +95,7 @@ int showQueryPackage(QVA_t qva, rpmts ts, Header h)
     rpmfi fi = NULL;
     rpmfiFlags fiflags =  (RPMFI_NOHEADER | RPMFI_FLAGS_QUERY);
     int rc = 0;                /* XXX FIXME: need real return code */
+    time_t now = 0;
 
     if (qva->qva_queryFormat != NULL) {
        const char *errstr;
@@ -150,8 +147,12 @@ int showQueryPackage(QVA_t qva, rpmts ts, Header h)
        if ((qva->qva_flags & QUERY_FOR_LICENSE) && !(fflags & RPMFILE_LICENSE))
            continue;
 
-       /* If not querying %ghost, skip ghost files. */
-       if ((qva->qva_fflags & RPMFILE_GHOST) && (fflags & RPMFILE_GHOST))
+       /* If querying only ... yes we know the drill, and this is dumb. */
+       if ((qva->qva_flags & QUERY_FOR_ARTIFACT) && !(fflags & RPMFILE_ARTIFACT))
+           continue;
+
+       /* Skip on attributes (eg from --noghost) */
+       if (fflags & qva->qva_fflags)
            continue;
 
        if (qva->qva_flags & QUERY_FOR_STATE) {
@@ -219,11 +220,14 @@ int showQueryPackage(QVA_t qva, rpmts ts, Header h)
            }
 
            if (fuser && fgroup) {
+               /* On first call, grab snapshot of now */
+               if (now == 0)
+                   now = time(NULL);
                if (buf) {
                    rpmlog(RPMLOG_NOTICE, "%s", buf);
                }
                printFileInfo(fn, fsize, fmode, fmtime, frdev, fnlink,
-                                       fuser, fgroup, flink);
+                                       fuser, fgroup, flink, now);
            } else {
                rpmlog(RPMLOG_ERR,
                        _("package has neither file owner or id lists\n"));
@@ -262,7 +266,6 @@ void rpmDisplayQueryTags(FILE * fp)
        }
        fprintf(fp, "\n");
     }
-    rpmtdFreeData(names);
     rpmtdFree(names);
 }
 
@@ -274,7 +277,7 @@ static int rpmgiShowMatches(QVA_t qva, rpmts ts, rpmgi gi)
     while ((h = rpmgiNext(gi)) != NULL) {
        int rc;
 
-       rpmdbCheckSignals();
+       rpmsqPoll();
        if ((rc = qva->qva_showPackage(qva, ts, h)) != 0)
            ec = rc;
        headerFree(h);
@@ -292,7 +295,7 @@ static int rpmcliShowMatches(QVA_t qva, rpmts ts, rpmdbMatchIterator mi)
 
     while ((h = rpmdbNextIterator(mi)) != NULL) {
        int rc;
-       rpmdbCheckSignals();
+       rpmsqPoll();
        if ((rc = qva->qva_showPackage(qva, ts, h)) != 0)
            ec = rc;
     }
@@ -305,7 +308,7 @@ static rpmdbMatchIterator initQueryIterator(QVA_t qva, rpmts ts, const char * ar
     int i;
     rpmdbMatchIterator mi = NULL;
 
-    (void) rpmdbCheckSignals();
+    (void) rpmsqPoll();
 
     if (qva->qva_showPackage == NULL)
        goto exit;
@@ -385,6 +388,34 @@ static rpmdbMatchIterator initQueryIterator(QVA_t qva, rpmts ts, const char * ar
        }
        break;
 
+    case RPMQV_WHATRECOMMENDS:
+       mi = rpmtsInitIterator(ts, RPMDBI_RECOMMENDNAME, arg, 0);
+       if (mi == NULL) {
+           rpmlog(RPMLOG_NOTICE, _("no package recommends %s\n"), arg);
+       }
+       break;
+
+    case RPMQV_WHATSUGGESTS:
+       mi = rpmtsInitIterator(ts, RPMDBI_SUGGESTNAME, arg, 0);
+       if (mi == NULL) {
+           rpmlog(RPMLOG_NOTICE, _("no package suggests %s\n"), arg);
+       }
+       break;
+
+    case RPMQV_WHATSUPPLEMENTS:
+       mi = rpmtsInitIterator(ts, RPMDBI_SUPPLEMENTNAME, arg, 0);
+       if (mi == NULL) {
+           rpmlog(RPMLOG_NOTICE, _("no package supplements %s\n"), arg);
+       }
+       break;
+
+    case RPMQV_WHATENHANCES:
+       mi = rpmtsInitIterator(ts, RPMDBI_ENHANCENAME, arg, 0);
+       if (mi == NULL) {
+           rpmlog(RPMLOG_NOTICE, _("no package enhances %s\n"), arg);
+       }
+       break;
+
     case RPMQV_WHATPROVIDES:
        if (arg[0] != '/' && arg[0] != '.') {
            mi = rpmtsInitIterator(ts, RPMDBI_PROVIDENAME, arg, 0);
@@ -455,7 +486,9 @@ static rpmdbMatchIterator initQueryIterator(QVA_t qva, rpmts ts, const char * ar
        }
        mi = rpmdbFreeIterator(mi);
        if (! matches) {
-           rpmlog(RPMLOG_NOTICE, _("package %s is not installed\n"), arg);
+           size_t l = strlen(arg);
+           if (!(l > 4 && !strcmp(arg + l - 4, ".rpm")))
+               rpmlog(RPMLOG_NOTICE, _("package %s is not installed\n"), arg);
        } else {
            mi = rpmtsInitIterator(ts, RPMDBI_LABEL, arg, 0);
        }
@@ -520,6 +553,7 @@ int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_const_t argv)
        break;
     }
     case RPMQV_SPECRPMS:
+    case RPMQV_SPECBUILTRPMS:
     case RPMQV_SPECSRPM:
        for (ARGV_const_t arg = argv; arg && *arg; arg++) {
            ec += ((qva->qva_specQuery != NULL)
@@ -530,6 +564,14 @@ int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_const_t argv)
        for (ARGV_const_t arg = argv; arg && *arg; arg++) {
            rpmdbMatchIterator mi = initQueryIterator(qva, ts, *arg);
            ec += rpmcliShowMatches(qva, ts, mi);
+           if (mi == NULL && qva->qva_source == RPMQV_PACKAGE) {
+               size_t l = strlen(*arg);
+               if (l > 4 && !strcmp(*arg + l - 4, ".rpm")) {
+                   rpmgi gi = rpmgiNew(ts, giFlags, argv);
+                   ec += rpmgiShowMatches(qva, ts, gi);
+                   rpmgiFree(gi);
+               }
+           }
            rpmdbFreeIterator(mi);
        }
        break;
diff --git a/lib/relocation.c b/lib/relocation.c
new file mode 100644 (file)
index 0000000..3ba4cfe
--- /dev/null
@@ -0,0 +1,560 @@
+#include "system.h"
+
+#include <rpm/rpmtypes.h>
+#include <rpm/header.h>
+#include <rpm/rpmfi.h>
+#include <rpm/rpmfileutil.h>
+#include <rpm/rpmmacro.h>
+#include <rpm/rpmlog.h>
+
+#include "lib/rpmfs.h"
+#include "lib/misc.h"
+
+#include "debug.h"
+
+/**
+ * Identify a file type.
+ * @param ft           file type
+ * @return             string to identify a file type
+ */
+static
+const char * ftstring (rpmFileTypes ft)
+{
+    switch (ft) {
+    case XDIR: return "directory";
+    case CDEV: return "char dev";
+    case BDEV: return "block dev";
+    case LINK: return "link";
+    case SOCK: return "sock";
+    case PIPE: return "fifo/pipe";
+    case REG:  return "file";
+    default:   return "unknown file type";
+    }
+}
+
+static char **duparray(char ** src, int size)
+{
+    char **dest = xmalloc((size+1) * sizeof(*dest));
+    for (int i = 0; i < size; i++) {
+       dest[i] = xstrdup(src[i]);
+    }
+    free(src);
+    return dest;
+}
+
+static int addPrefixes(Header h, rpmRelocation *relocations, int numRelocations)
+{
+    struct rpmtd_s validRelocs;
+    const char *validprefix;
+    const char ** actualRelocations;
+    int numActual = 0;
+
+    headerGet(h, RPMTAG_PREFIXES, &validRelocs, HEADERGET_MINMEM);
+    /*
+     * If no relocations are specified (usually the case), then return the
+     * original header. If there are prefixes, however, then INSTPREFIXES
+     * should be added for RPM_INSTALL_PREFIX environ variables in scriptlets, 
+     * but, since relocateFileList() can be called more than once for 
+     * the same header, don't bother if already present.
+     */
+    if (relocations == NULL || numRelocations == 0) {
+       if (rpmtdCount(&validRelocs) > 0) {
+           if (!headerIsEntry(h, RPMTAG_INSTPREFIXES)) {
+               rpmtdSetTag(&validRelocs, RPMTAG_INSTPREFIXES);
+               headerPut(h, &validRelocs, HEADERPUT_DEFAULT);
+           }
+           rpmtdFreeData(&validRelocs);
+       }
+       return 0;
+    }
+
+    actualRelocations = xmalloc(rpmtdCount(&validRelocs) * sizeof(*actualRelocations));
+    rpmtdInit(&validRelocs);
+    while ((validprefix = rpmtdNextString(&validRelocs))) {
+       int j;
+       for (j = 0; j < numRelocations; j++) {
+           if (relocations[j].oldPath == NULL || /* XXX can't happen */
+               !rstreq(validprefix, relocations[j].oldPath))
+               continue;
+           /* On install, a relocate to NULL means skip the path. */
+           if (relocations[j].newPath) {
+               actualRelocations[numActual] = relocations[j].newPath;
+               numActual++;
+           }
+           break;
+       }
+       if (j == numRelocations) {
+           actualRelocations[numActual] = validprefix;
+           numActual++;
+       }
+    }
+    rpmtdFreeData(&validRelocs);
+
+    if (numActual) {
+       headerPutStringArray(h, RPMTAG_INSTPREFIXES, actualRelocations, numActual);
+    }
+    free(actualRelocations);
+    /* When any relocations are present there'll be more work to do */
+    return 1;
+}
+
+static void saveOrig(Header h)
+{
+       struct rpmtd_s td;
+       headerGet(h, RPMTAG_BASENAMES, &td, HEADERGET_MINMEM);
+       rpmtdSetTag(&td, RPMTAG_ORIGBASENAMES);
+       headerPut(h, &td, HEADERPUT_DEFAULT);
+       rpmtdFreeData(&td);
+
+       headerGet(h, RPMTAG_DIRNAMES, &td, HEADERGET_MINMEM);
+       rpmtdSetTag(&td, RPMTAG_ORIGDIRNAMES);
+       headerPut(h, &td, HEADERPUT_DEFAULT);
+       rpmtdFreeData(&td);
+
+       headerGet(h, RPMTAG_DIRINDEXES, &td, HEADERGET_MINMEM);
+       rpmtdSetTag(&td, RPMTAG_ORIGDIRINDEXES);
+       headerPut(h, &td, HEADERPUT_DEFAULT);
+       rpmtdFreeData(&td);
+}
+
+void rpmRelocateFileList(rpmRelocation *relocations, int numRelocations, 
+                        rpmfs fs, Header h)
+{
+    char ** baseNames;
+    char ** dirNames;
+    uint32_t * dirIndexes;
+    rpm_count_t fileCount, dirCount;
+    int nrelocated = 0;
+    int fileAlloced = 0;
+    char * fn = NULL;
+    int haveRelocatedBase = 0;
+    size_t maxlen = 0;
+    int i, j;
+    struct rpmtd_s bnames, dnames, dindexes, fmodes;
+
+    if (!addPrefixes(h, relocations, numRelocations))
+       return;
+
+    if (rpmIsDebug()) {
+       rpmlog(RPMLOG_DEBUG, "========== relocations\n");
+       for (i = 0; i < numRelocations; i++) {
+           if (relocations[i].oldPath == NULL) continue; /* XXX can't happen */
+           if (relocations[i].newPath == NULL)
+               rpmlog(RPMLOG_DEBUG, "%5d exclude  %s\n",
+                       i, relocations[i].oldPath);
+           else
+               rpmlog(RPMLOG_DEBUG, "%5d relocate %s -> %s\n",
+                       i, relocations[i].oldPath, relocations[i].newPath);
+       }
+    }
+
+    for (i = 0; i < numRelocations; i++) {
+       if (relocations[i].newPath == NULL) continue;
+       size_t len = strlen(relocations[i].newPath);
+       if (len > maxlen) maxlen = len;
+    }
+
+    headerGet(h, RPMTAG_BASENAMES, &bnames, HEADERGET_MINMEM);
+    headerGet(h, RPMTAG_DIRINDEXES, &dindexes, HEADERGET_ALLOC);
+    headerGet(h, RPMTAG_DIRNAMES, &dnames, HEADERGET_MINMEM);
+    headerGet(h, RPMTAG_FILEMODES, &fmodes, HEADERGET_MINMEM);
+    /* TODO XXX ugh.. use rpmtd iterators & friends instead */
+    baseNames = bnames.data;
+    dirIndexes = dindexes.data;
+    fileCount = rpmtdCount(&bnames);
+    dirCount = rpmtdCount(&dnames);
+    /* XXX TODO: use rpmtdDup() instead */
+    dirNames = dnames.data = duparray(dnames.data, dirCount);
+    dnames.flags |= RPMTD_PTR_ALLOCED;
+
+    /*
+     * For all relocations, we go through sorted file/relocation lists 
+     * backwards so that /usr/local relocations take precedence over /usr 
+     * ones.
+     */
+
+    /* Relocate individual paths. */
+
+    for (i = fileCount - 1; i >= 0; i--) {
+       rpmFileTypes ft;
+       int fnlen;
+
+       size_t len = maxlen +
+               strlen(dirNames[dirIndexes[i]]) + strlen(baseNames[i]) + 1;
+       if (len >= fileAlloced) {
+           fileAlloced = len * 2;
+           fn = xrealloc(fn, fileAlloced);
+       }
+
+assert(fn != NULL);            /* XXX can't happen */
+       *fn = '\0';
+       fnlen = stpcpy( stpcpy(fn, dirNames[dirIndexes[i]]), baseNames[i]) - fn;
+
+       /*
+        * See if this file path needs relocating.
+        */
+       /*
+        * XXX FIXME: Would a bsearch of the (already sorted) 
+        * relocation list be a good idea?
+        */
+       for (j = numRelocations - 1; j >= 0; j--) {
+           if (relocations[j].oldPath == NULL) /* XXX can't happen */
+               continue;
+           len = !rstreq(relocations[j].oldPath, "/")
+               ? strlen(relocations[j].oldPath)
+               : 0;
+
+           if (fnlen < len)
+               continue;
+           /*
+            * Only subdirectories or complete file paths may be relocated. We
+            * don't check for '\0' as our directory names all end in '/'.
+            */
+           if (!(fn[len] == '/' || fnlen == len))
+               continue;
+
+           if (!rstreqn(relocations[j].oldPath, fn, len))
+               continue;
+           break;
+       }
+       if (j < 0) continue;
+
+       rpmtdSetIndex(&fmodes, i);
+       ft = rpmfiWhatis(rpmtdGetNumber(&fmodes));
+
+       /* On install, a relocate to NULL means skip the path. */
+       if (relocations[j].newPath == NULL) {
+           if (ft == XDIR) {
+               /* Start with the parent, looking for directory to exclude. */
+               for (j = dirIndexes[i]; j < dirCount; j++) {
+                   len = strlen(dirNames[j]) - 1;
+                   while (len > 0 && dirNames[j][len-1] == '/') len--;
+                   if (fnlen != len)
+                       continue;
+                   if (!rstreqn(fn, dirNames[j], fnlen))
+                       continue;
+                   break;
+               }
+           }
+           rpmfsSetAction(fs, i, FA_SKIPNSTATE);
+           rpmlog(RPMLOG_DEBUG, "excluding %s %s\n",
+                  ftstring(ft), fn);
+           continue;
+       }
+
+       /* Relocation on full paths only, please. */
+       if (fnlen != len) continue;
+
+       rpmlog(RPMLOG_DEBUG, "relocating %s to %s\n",
+              fn, relocations[j].newPath);
+       nrelocated++;
+
+       strcpy(fn, relocations[j].newPath);
+       {   char * te = strrchr(fn, '/');
+           if (te) {
+               if (te > fn) te++;      /* root is special */
+               fnlen = te - fn;
+           } else
+               te = fn + strlen(fn);
+           if (!rstreq(baseNames[i], te)) { /* basename changed too? */
+               if (!haveRelocatedBase) {
+                   /* XXX TODO: use rpmtdDup() instead */
+                   bnames.data = baseNames = duparray(baseNames, fileCount);
+                   bnames.flags |= RPMTD_PTR_ALLOCED;
+                   haveRelocatedBase = 1;
+               }
+               free(baseNames[i]);
+               baseNames[i] = xstrdup(te);
+           }
+           *te = '\0';                 /* terminate new directory name */
+       }
+
+       /* Does this directory already exist in the directory list? */
+       for (j = 0; j < dirCount; j++) {
+           if (fnlen != strlen(dirNames[j]))
+               continue;
+           if (!rstreqn(fn, dirNames[j], fnlen))
+               continue;
+           break;
+       }
+       
+       if (j < dirCount) {
+           dirIndexes[i] = j;
+           continue;
+       }
+
+       /* Creating new paths is a pita */
+       dirNames = dnames.data = xrealloc(dnames.data, 
+                              sizeof(*dirNames) * (dirCount + 1));
+
+       dirNames[dirCount] = xstrdup(fn);
+       dirIndexes[i] = dirCount;
+       dirCount++;
+       dnames.count++;
+    }
+
+    /* Finish off by relocating directories. */
+    for (i = dirCount - 1; i >= 0; i--) {
+       for (j = numRelocations - 1; j >= 0; j--) {
+
+           if (relocations[j].oldPath == NULL) /* XXX can't happen */
+               continue;
+           size_t len = !rstreq(relocations[j].oldPath, "/")
+               ? strlen(relocations[j].oldPath)
+               : 0;
+
+           if (len && !rstreqn(relocations[j].oldPath, dirNames[i], len))
+               continue;
+
+           /*
+            * Only subdirectories or complete file paths may be relocated. We
+            * don't check for '\0' as our directory names all end in '/'.
+            */
+           if (dirNames[i][len] != '/')
+               continue;
+
+           if (relocations[j].newPath) { /* Relocate the path */
+               char *t = NULL;
+               rstrscat(&t, relocations[j].newPath, (dirNames[i] + len), NULL);
+               /* Unfortunately rpmCleanPath strips the trailing slash.. */
+               (void) rpmCleanPath(t);
+               rstrcat(&t, "/");
+
+               rpmlog(RPMLOG_DEBUG,
+                      "relocating directory %s to %s\n", dirNames[i], t);
+               free(dirNames[i]);
+               dirNames[i] = t;
+               nrelocated++;
+           }
+       }
+    }
+
+    /* Save original filenames in header and replace (relocated) filenames. */
+    if (nrelocated) {
+       saveOrig(h);
+       headerMod(h, &bnames);
+       headerMod(h, &dnames);
+       headerMod(h, &dindexes);
+    }
+
+    rpmtdFreeData(&bnames);
+    rpmtdFreeData(&dnames);
+    rpmtdFreeData(&dindexes);
+    rpmtdFreeData(&fmodes);
+    free(fn);
+}
+
+/**
+ * Macros to be defined from per-header tag values.
+ * @todo Should other macros be added from header when installing a package?
+ */
+static struct tagMacro {
+    const char *macroname;     /*!< Macro name to define. */
+    rpmTag tag;                        /*!< Header tag to use for value. */
+} const tagMacros[] = {
+    { "name",          RPMTAG_NAME },
+    { "version",       RPMTAG_VERSION },
+    { "release",       RPMTAG_RELEASE },
+    { "epoch",         RPMTAG_EPOCH },
+    { NULL, 0 }
+};
+
+/**
+ * Define or undefine per-header macros.
+ * @param h            header
+ * @param define       define/undefine?
+ * @return             0 always
+ */
+static void rpmInstallLoadMacros(Header h, int define)
+{
+    const struct tagMacro * tagm;
+
+    for (tagm = tagMacros; tagm->macroname != NULL; tagm++) {
+       struct rpmtd_s td;
+       char *body;
+       if (!headerGet(h, tagm->tag, &td, HEADERGET_DEFAULT))
+           continue;
+
+       /*
+        * Undefine doesn't need the actual data for anything, but
+        * this way ensures we only undefine what was defined earlier.
+        */
+       if (define) {
+           body = rpmtdFormat(&td, RPMTD_FORMAT_STRING, NULL);
+           rpmPushMacro(NULL, tagm->macroname, NULL, body, -1);
+           free(body);
+       } else {
+           rpmPopMacro(NULL, tagm->macroname);
+       }
+       rpmtdFreeData(&td);
+    }
+}
+
+int headerFindSpec(Header h)
+{
+    struct rpmtd_s filenames;
+    int specix = -1;
+
+    if (headerGet(h, RPMTAG_BASENAMES, &filenames, HEADERGET_MINMEM)) {
+       struct rpmtd_s td;
+       const char *str;
+       
+       /* Try to find spec by file flags */
+       if (headerGet(h, RPMTAG_FILEFLAGS, &td, HEADERGET_MINMEM)) {
+           rpmfileAttrs *flags;
+           while (specix < 0 && (flags = rpmtdNextUint32(&td))) {
+               if (*flags & RPMFILE_SPECFILE)
+                   specix = rpmtdGetIndex(&td);
+           }
+           rpmtdFreeData(&td);
+       }
+       /* Still no spec? Look by filename. */
+       while (specix < 0 && (str = rpmtdNextString(&filenames))) {
+           if (rpmFileHasSuffix(str, ".spec")) 
+               specix = rpmtdGetIndex(&filenames);
+       }
+       rpmtdFreeData(&filenames);
+    }
+    return specix;
+}
+
+/*
+ * Source rpms only contain basenames, on install the full paths are
+ * constructed with %{_specdir} and %{_sourcedir} macros. Because
+ * of that regular relocation wont work, we need to do it the hard
+ * way. Return spec file index on success, -1 on errors.
+ */
+int rpmRelocateSrpmFileList(Header h, const char *rootDir)
+{
+    int specix = headerFindSpec(h);
+
+    if (specix >= 0) {
+       const char *bn;
+       struct rpmtd_s filenames;
+       /* save original file names */
+       saveOrig(h);
+
+       headerDel(h, RPMTAG_BASENAMES);
+       headerDel(h, RPMTAG_DIRNAMES);
+       headerDel(h, RPMTAG_DIRINDEXES);
+
+       /* Macros need to be added before trying to create directories */
+       rpmInstallLoadMacros(h, 1);
+
+       /* ALLOC is needed as we modify the header */
+       headerGet(h, RPMTAG_ORIGBASENAMES, &filenames, HEADERGET_ALLOC);
+       for (int i = 0; (bn = rpmtdNextString(&filenames)); i++) {
+           int spec = (i == specix);
+           char *fn = rpmGenPath(rootDir,
+                                 spec ? "%{_specdir}" : "%{_sourcedir}", bn);
+           headerPutString(h, RPMTAG_OLDFILENAMES, fn);
+           free(fn);
+       }
+       rpmtdFreeData(&filenames);
+       headerConvert(h, HEADERCONV_COMPRESSFILELIST);
+       rpmInstallLoadMacros(h, 0);
+    }
+
+    return specix;
+}
+
+/* stupid bubble sort, but it's probably faster here */
+static void sortRelocs(rpmRelocation *relocations, int numRelocations)
+{
+    for (int i = 0; i < numRelocations; i++) {
+       int madeSwap = 0;
+       for (int j = 1; j < numRelocations; j++) {
+           rpmRelocation tmpReloc;
+           if (relocations[j - 1].oldPath == NULL || /* XXX can't happen */
+               relocations[j    ].oldPath == NULL || /* XXX can't happen */
+               strcmp(relocations[j - 1].oldPath, relocations[j].oldPath) <= 0)
+               continue;
+           tmpReloc = relocations[j - 1];
+           relocations[j - 1] = relocations[j];
+           relocations[j] = tmpReloc;
+           madeSwap = 1;
+       }
+       if (!madeSwap) break;
+    }
+}
+
+static char * stripTrailingChar(char * s, char c)
+{
+    char * t;
+    for (t = s + strlen(s) - 1; *t == c && t >= s; t--)
+       *t = '\0';
+    return s;
+}
+
+void rpmRelocationBuild(Header h, rpmRelocation *rawrelocs,
+               int *rnrelocs, rpmRelocation **rrelocs, uint8_t **rbadrelocs)
+{
+    int i;
+    struct rpmtd_s validRelocs;
+    rpmRelocation * relocs = NULL;
+    uint8_t *badrelocs = NULL;
+    int nrelocs = 0;
+
+    for (rpmRelocation *r = rawrelocs; r->oldPath || r->newPath; r++)
+       nrelocs++;
+
+    headerGet(h, RPMTAG_PREFIXES, &validRelocs, HEADERGET_MINMEM);
+    relocs = xmalloc(sizeof(*relocs) * (nrelocs+1));
+
+    /* Build sorted relocation list from raw relocations. */
+    for (i = 0; i < nrelocs; i++) {
+       char * t;
+
+       /*
+        * Default relocations (oldPath == NULL) are handled in the UI,
+        * not rpmlib.
+        */
+       if (rawrelocs[i].oldPath == NULL) continue; /* XXX can't happen */
+
+       /* FIXME: Trailing /'s will confuse us greatly. Internal ones will 
+          too, but those are more trouble to fix up. :-( */
+       t = xstrdup(rawrelocs[i].oldPath);
+       relocs[i].oldPath = (t[0] == '/' && t[1] == '\0')
+           ? t
+           : stripTrailingChar(t, '/');
+
+       /* An old path w/o a new path is valid, and indicates exclusion */
+       if (rawrelocs[i].newPath) {
+           int valid = 0;
+           const char *validprefix;
+
+           t = xstrdup(rawrelocs[i].newPath);
+           relocs[i].newPath = (t[0] == '/' && t[1] == '\0')
+               ? t
+               : stripTrailingChar(t, '/');
+
+               /* FIX:  relocations[i].oldPath == NULL */
+           /* Verify that the relocation's old path is in the header. */
+           rpmtdInit(&validRelocs);
+           while ((validprefix = rpmtdNextString(&validRelocs))) {
+               if (rstreq(validprefix, relocs[i].oldPath)) {
+                   valid = 1;
+                   break;
+               }
+           }
+
+           if (!valid) {
+               if (badrelocs == NULL)
+                   badrelocs = xcalloc(nrelocs, sizeof(*badrelocs));
+               badrelocs[i] = 1;
+           }
+       } else {
+           relocs[i].newPath = NULL;
+       }
+    }
+    relocs[i].oldPath = NULL;
+    relocs[i].newPath = NULL;
+    sortRelocs(relocs, nrelocs);
+    
+    rpmtdFreeData(&validRelocs);
+
+    *rrelocs = relocs;
+    *rnrelocs = nrelocs;
+    *rbadrelocs = badrelocs;
+}
+
index 71f25916a520efea37aa52248e21d1bdaba21881..ca7ab053ed0c9aa82eea06497ecaa44e68f114b9 100644 (file)
@@ -27,7 +27,7 @@ struct availablePackage_s {
     rpmte p;                    /*!< transaction member */
     rpmds provides;            /*!< Provides: dependencies. */
     rpmds obsoletes;           /*!< Obsoletes: dependencies. */
-    rpmfi fi;                  /*!< File info set. */
+    rpmfiles fi;               /*!< File info set. */
 };
 
 /** \ingroup rpmdep
@@ -38,11 +38,6 @@ typedef struct availableIndexEntry_s {
     unsigned int entryIx;      /*!< Dependency index. */
 } * availableIndexEntry;
 
-struct fileNameEntry_s {
-    rpmsid dirName;
-    rpmsid baseName;
-};
-
 #undef HASHTYPE
 #undef HTKEYTYPE
 #undef HTDATATYPE
@@ -52,12 +47,18 @@ struct fileNameEntry_s {
 #include "lib/rpmhash.H"
 #include "lib/rpmhash.C"
 
+typedef struct availableIndexFileEntry_s {
+    rpmsid dirName;
+    rpmalNum pkgNum;           /*!< Containing package index. */
+    unsigned int entryIx;      /*!< Dependency index. */
+} * availableIndexFileEntry;
+
 #undef HASHTYPE
 #undef HTKEYTYPE
 #undef HTDATATYPE
 #define HASHTYPE rpmalFileHash
-#define HTKEYTYPE struct fileNameEntry_s
-#define HTDATATYPE struct availableIndexEntry_s
+#define HTKEYTYPE rpmsid
+#define HTDATATYPE struct availableIndexFileEntry_s
 #include "lib/rpmhash.H"
 #include "lib/rpmhash.C"
 
@@ -76,6 +77,7 @@ struct rpmal_s {
     rpmtransFlags tsflags;     /*!< Transaction control flags. */
     rpm_color_t tscolor;       /*!< Transaction color. */
     rpm_color_t prefcolor;     /*!< Transaction preferred color. */
+    fingerPrintCache fpc;
 };
 
 /**
@@ -87,6 +89,7 @@ static void rpmalFreeIndex(rpmal al)
     al->providesHash = rpmalDepHashFree(al->providesHash);
     al->obsoletesHash = rpmalDepHashFree(al->obsoletesHash);
     al->fileHash = rpmalFileHashFree(al->fileHash);
+    al->fpc = fpCacheFree(al->fpc);
 }
 
 rpmal rpmalCreate(rpmstrPool pool, int delta, rpmtransFlags tsflags,
@@ -125,7 +128,7 @@ rpmal rpmalFree(rpmal al)
     for (i = 0; i < al->size; i++, alp++) {
        alp->obsoletes = rpmdsFree(alp->obsoletes);
        alp->provides = rpmdsFree(alp->provides);
-       alp->fi = rpmfiFree(alp->fi);
+       alp->fi = rpmfilesFree(alp->fi);
     }
     al->pool = rpmstrPoolFree(al->pool);
     al->list = _free(al->list);
@@ -146,19 +149,6 @@ static int sidCmp(rpmsid a, rpmsid b)
     return (a != b);
 }
 
-static unsigned int fileHash(struct fileNameEntry_s file)
-{
-    return file.dirName ^ file.baseName;
-}
-
-static int fileCompare(struct fileNameEntry_s one, struct fileNameEntry_s two)
-{
-    int rc = (one.dirName != two.dirName);;
-    if (!rc)
-       rc = (one.baseName != two.baseName);
-    return rc;
-}
-
 void rpmalDel(rpmal al, rpmte p)
 {
     availablePackage alp;
@@ -181,11 +171,10 @@ void rpmalDel(rpmal al, rpmte p)
     alp->p = NULL;
 }
 
-static void rpmalAddFiles(rpmal al, rpmalNum pkgNum, rpmfi fi)
+static void rpmalAddFiles(rpmal al, rpmalNum pkgNum, rpmfiles fi)
 {
-    struct fileNameEntry_s fileName;
-    struct availableIndexEntry_s fileEntry;
-    int fc = rpmfiFC(fi);
+    struct availableIndexFileEntry_s fileEntry;
+    int fc = rpmfilesFC(fi);
     rpm_color_t ficolor;
     int skipdoc = (al->tsflags & RPMTRANS_FLAG_NODOCS);
     int skipconf = (al->tsflags & RPMTRANS_FLAG_NOCONFIGS);
@@ -194,22 +183,20 @@ static void rpmalAddFiles(rpmal al, rpmalNum pkgNum, rpmfi fi)
 
     for (int i = 0; i < fc; i++) {
        /* Ignore colored provides not in our rainbow. */
-        ficolor = rpmfiFColorIndex(fi, i);
+        ficolor = rpmfilesFColor(fi, i);
         if (al->tscolor && ficolor && !(al->tscolor & ficolor))
             continue;
 
        /* Ignore files that wont be installed */
-       if (skipdoc && (rpmfiFFlagsIndex(fi, i) & RPMFILE_DOC))
+       if (skipdoc && (rpmfilesFFlags(fi, i) & RPMFILE_DOC))
            continue;
-       if (skipconf && (rpmfiFFlagsIndex(fi, i) & RPMFILE_CONFIG))
+       if (skipconf && (rpmfilesFFlags(fi, i) & RPMFILE_CONFIG))
            continue;
 
-       fileName.dirName = rpmfiDNIdIndex(fi, rpmfiDIIndex(fi, i));
-       fileName.baseName = rpmfiBNIdIndex(fi, i);
-
+       fileEntry.dirName = rpmfilesDNId(fi, rpmfilesDI(fi, i));
        fileEntry.entryIx = i;
 
-       rpmalFileHashAddEntry(al->fileHash, fileName, fileEntry);
+       rpmalFileHashAddEntry(al->fileHash, rpmfilesBNId(fi, i), fileEntry);
     }
 }
 
@@ -275,7 +262,7 @@ void rpmalAdd(rpmal al, rpmte p)
 
     alp->provides = rpmdsLink(rpmteDS(p, RPMTAG_PROVIDENAME));
     alp->obsoletes = rpmdsLink(rpmteDS(p, RPMTAG_OBSOLETENAME));
-    alp->fi = rpmfiLink(rpmteFI(p));
+    alp->fi = rpmteFiles(p);
 
     /*
      * Transition-time safe-guard to catch private-pool uses.
@@ -286,7 +273,7 @@ void rpmalAdd(rpmal al, rpmte p)
      * NULL pool from NULL alp->provides in numerous cases?
      */
     {
-       rpmstrPool fipool = rpmfiPool(alp->fi);
+       rpmstrPool fipool = rpmfilesPool(alp->fi);
        rpmstrPool dspool = rpmdsPool(alp->provides);
        
        assert(fipool == NULL || fipool == al->pool);
@@ -312,10 +299,10 @@ static void rpmalMakeFileIndex(rpmal al)
     for (i = 0; i < al->size; i++) {
        alp = al->list + i;
        if (alp->fi != NULL)
-           fileCnt += rpmfiFC(alp->fi);
+           fileCnt += rpmfilesFC(alp->fi);
     }
     al->fileHash = rpmalFileHashCreate(fileCnt/4+128,
-                                      fileHash, fileCompare, NULL, NULL);
+                                      sidHash, sidCmp, NULL, NULL);
     for (i = 0; i < al->size; i++) {
        alp = al->list + i;
        rpmalAddFiles(al, i, alp->fi);
@@ -403,7 +390,7 @@ rpmte * rpmalAllObsoletes(rpmal al, rpmds ds)
     return ret;
 }
 
-static rpmte * rpmalAllFileSatisfiesDepend(const rpmal al, const char *fileName)
+static rpmte * rpmalAllFileSatisfiesDepend(const rpmal al, const char *fileName, const rpmds filterds)
 {
     const char *slash; 
     rpmte * ret = NULL;
@@ -413,31 +400,45 @@ static rpmte * rpmalAllFileSatisfiesDepend(const rpmal al, const char *fileName)
 
     /* Split path into dirname and basename components for lookup */
     if ((slash = strrchr(fileName, '/')) != NULL) {
-       availableIndexEntry result;
+       availableIndexFileEntry result;
        int resultCnt = 0;
        size_t bnStart = (slash - fileName) + 1;
-       struct fileNameEntry_s fne;
-
-       fne.baseName = rpmstrPoolId(al->pool, fileName + bnStart, 0);
-       fne.dirName = rpmstrPoolIdn(al->pool, fileName, bnStart, 0);
+       rpmsid baseName;
 
        if (al->fileHash == NULL)
            rpmalMakeFileIndex(al);
 
-       rpmalFileHashGetEntry(al->fileHash, fne, &result, &resultCnt, NULL);
+       baseName = rpmstrPoolId(al->pool, fileName + bnStart, 0);
+       if (!baseName)
+           return NULL;        /* no match possible */
+
+       rpmalFileHashGetEntry(al->fileHash, baseName, &result, &resultCnt, NULL);
 
        if (resultCnt > 0) {
            int i, found;
            ret = xmalloc((resultCnt+1) * sizeof(*ret));
+           fingerPrint * fp = NULL;
+           rpmsid dirName = rpmstrPoolIdn(al->pool, fileName, bnStart, 1);
+
+           if (!al->fpc)
+               al->fpc = fpCacheCreate(1001, NULL);
+           fpLookup(al->fpc, rpmstrPoolStr(al->pool, dirName), fileName + bnStart, &fp);
 
            for (found = i = 0; i < resultCnt; i++) {
                availablePackage alp = al->list + result[i].pkgNum;
-               if (alp->p == NULL) // deleted
+               if (alp->p == NULL) /* deleted */
+                   continue;
+               /* ignore self-conflicts/obsoletes */
+               if (filterds && rpmteDS(alp->p, rpmdsTagN(filterds)) == filterds)
+                   continue;
+               if (result[i].dirName != dirName &&
+                   !fpLookupEquals(al->fpc, fp, rpmstrPoolStr(al->pool, result[i].dirName), fileName + bnStart))
                    continue;
 
                ret[found] = alp->p;
                found++;
            }
+           _free(fp);
            ret[found] = NULL;
        }
     }
@@ -454,6 +455,8 @@ rpmte * rpmalAllSatisfiesDepend(const rpmal al, const rpmds ds)
     availableIndexEntry result;
     int resultCnt;
     int obsolete;
+    rpmTagVal dtag;
+    rpmds filterds = NULL;
 
     availablePackage alp;
     int rc;
@@ -461,11 +464,14 @@ rpmte * rpmalAllSatisfiesDepend(const rpmal al, const rpmds ds)
     if (al == NULL || ds == NULL || (nameId = rpmdsNId(ds)) == 0)
        return ret;
 
-    obsolete = (rpmdsTagN(ds) == RPMTAG_OBSOLETENAME);
+    dtag = rpmdsTagN(ds);
+    obsolete = (dtag == RPMTAG_OBSOLETENAME);
+    if (dtag == RPMTAG_OBSOLETENAME || dtag == RPMTAG_CONFLICTNAME)
+       filterds = ds;
     name = rpmstrPoolStr(al->pool, nameId);
     if (!obsolete && *name == '/') {
        /* First, look for files "contained" in package ... */
-       ret = rpmalAllFileSatisfiesDepend(al, name);
+       ret = rpmalAllFileSatisfiesDepend(al, name, filterds);
        if (ret != NULL && *ret != NULL) {
            rpmdsNotify(ds, "(added files)", 0);
            return ret;
@@ -486,52 +492,70 @@ rpmte * rpmalAllSatisfiesDepend(const rpmal al, const rpmds ds)
 
     for (found=i=0; i<resultCnt; i++) {
        alp = al->list + result[i].pkgNum;
-       if (alp->p == NULL) // deleted
+       if (alp->p == NULL) /* deleted */
            continue;
-       ix = result[i].entryIx;
-
-       /* Obsoletes are on package name, filter out other provide matches */
-       if (obsolete && !rstreq(rpmdsNIndex(alp->provides, ix), rpmteN(alp->p)))
+       /* ignore self-conflicts/obsoletes */
+       if (filterds && rpmteDS(alp->p, rpmdsTagN(filterds)) == filterds)
            continue;
+       ix = result[i].entryIx;
 
-       rc = rpmdsCompareIndex(alp->provides, ix, ds, rpmdsIx(ds));
-
-       if (rc) {
-           rpmdsNotify(ds, "(added provide)", 0);
-           ret[found] = alp->p;
-           found++;
+       if (obsolete) {
+           /* Obsoletes are on package NEVR only */
+           rpmds thisds;
+           if (!rstreq(rpmdsNIndex(alp->provides, ix), rpmteN(alp->p)))
+               continue;
+           thisds = rpmteDS(alp->p, RPMTAG_NAME);
+           rc = rpmdsCompareIndex(thisds, rpmdsIx(thisds), ds, rpmdsIx(ds));
+       } else {
+           rc = rpmdsCompareIndex(alp->provides, ix, ds, rpmdsIx(ds));
        }
+
+       if (rc)
+           ret[found++] = alp->p;
     }
 
-    if (found)
+    if (found) {
+       rpmdsNotify(ds, "(added provide)", 0);
        ret[found] = NULL;
-    else
+    } else {
        ret = _free(ret);
+    }
 
     return ret;
 }
 
 rpmte
-rpmalSatisfiesDepend(const rpmal al, const rpmds ds)
+rpmalSatisfiesDepend(const rpmal al, const rpmte te, const rpmds ds)
 {
     rpmte *providers = rpmalAllSatisfiesDepend(al, ds);
     rpmte best = NULL;
+    int bestscore = 0;
 
     if (providers) {
-       if (al->tscolor) {
+       rpm_color_t dscolor = rpmdsColor(ds);
+       for (rpmte *p = providers; *p; p++) {
+           int score = 0;
+
            /*
-            * For colored dependencies, try to find a matching provider.
+            * For colored dependencies, prefer a matching colored provider.
             * Otherwise prefer provider of ts preferred color.
             */
-           rpm_color_t dscolor = rpmdsColor(ds);
-           for (rpmte *p = providers; *p; p++) {
+           if (al->tscolor) {
                rpm_color_t tecolor = rpmteColor(*p);
                if (dscolor) {
-                   if (dscolor == tecolor) best = *p;
+                   if (dscolor == tecolor) score += 2;
                } else if (al->prefcolor) {
-                   if (al->prefcolor == tecolor) best = *p;
+                   if (al->prefcolor == tecolor) score += 2;
                }
-               if (best) break;
+           }
+
+           /* Being self-provided is a bonus */
+           if (*p == te)
+               score += 1;
+
+           if (score > bestscore) {
+               bestscore = score;
+               best = *p;
            }
        }
        /* if not decided by now, just pick first match */
@@ -541,27 +565,13 @@ rpmalSatisfiesDepend(const rpmal al, const rpmds ds)
     return best;
 }
 
-rpmte *
-rpmalAllInCollection(const rpmal al, const char *collname)
+unsigned int
+rpmalLookupTE(const rpmal al, const rpmte te)
 {
-    rpmte *ret = NULL;
-    int found = 0;
     rpmalNum pkgNum;
-
-    if (!al || !al->list || !collname)
-       return NULL;
-
-    for (pkgNum = 0; pkgNum < al->size; pkgNum++) {
-       rpmte p = al->list[pkgNum].p;
-       if (rpmteHasCollection(p, collname)) {
-           ret = xrealloc(ret, sizeof(*ret) * (found + 1 + 1));
-           ret[found] = p;
-           found++;
-       }
-    }
-    if (ret) {
-       ret[found] = NULL;
-    }
-
-    return ret;
+    for (pkgNum=0; pkgNum < al->size; pkgNum++)
+       if (al->list[pkgNum].p == te)
+           break;
+    return pkgNum < al->size ? pkgNum : (unsigned int)-1;
 }
+
index 6f1327bdb3e8bd3116e87f352781091a019e38dc..10fe756d4367939481aca685ebb348426fd4cf9e 100644 (file)
@@ -73,22 +73,21 @@ rpmte * rpmalAllSatisfiesDepend(const rpmal al, const rpmds ds);
 /**
  * Lookup best provider for a dependency in the available list
  * @param al           available list
+ * @param te           transaction element
  * @param ds           dependency set
  * @return             best provider for the dependency, NULL if none
  */
 RPM_GNUC_INTERNAL
-rpmte rpmalSatisfiesDepend(const rpmal al, const rpmds ds);
+rpmte rpmalSatisfiesDepend(const rpmal al, const rpmte te, const rpmds ds);
 
 /**
- * Get a list of transaction elements that are memebers of a collection in the
- * available list
- * @param al           available list
- * @param collname     collection name to search for
- * @return             NULL-terminated list of transaction elements that are
- *                     members of the specified collection
+ * Return index of a transaction element  in the available list
+ * @param al           available list
+ * @param te           transaction element
+ * @return             index, (unsigned int)-1 if not found
  */
 RPM_GNUC_INTERNAL
-rpmte * rpmalAllInCollection(const rpmal al, const char * collname);
+unsigned int rpmalLookupTE(const rpmal al, const rpmte te);
 
 #ifdef __cplusplus
 }
diff --git a/lib/rpmarchive.h b/lib/rpmarchive.h
new file mode 100644 (file)
index 0000000..c864e5b
--- /dev/null
@@ -0,0 +1,149 @@
+#ifndef H_ARCHIVE
+#define H_ARCHIVE
+
+/** \ingroup payload
+ * \file lib/rpmarchive.h
+ * File archive (aka payload) API.
+ */
+
+#define RPMERR_CHECK_ERRNO    -32768
+
+/** \ingroup payload
+ * Error codes for archive and file handling
+ */
+enum rpmfilesErrorCodes {
+       RPMERR_ITER_END         = -1,
+       RPMERR_BAD_MAGIC        = -2,
+       RPMERR_BAD_HEADER       = -3,
+       RPMERR_HDR_SIZE = -4,
+       RPMERR_UNKNOWN_FILETYPE= -5,
+       RPMERR_MISSING_FILE     = -6,
+       RPMERR_DIGEST_MISMATCH  = -7,
+       RPMERR_INTERNAL = -8,
+       RPMERR_UNMAPPED_FILE    = -9,
+       RPMERR_ENOENT           = -10,
+       RPMERR_ENOTEMPTY        = -11,
+       RPMERR_FILE_SIZE        = -12,
+       RPMERR_ITER_SKIP        = -13,
+       RPMERR_EXIST_AS_DIR     = -14,
+
+       RPMERR_OPEN_FAILED      = -32768,
+       RPMERR_CHMOD_FAILED     = -32769,
+       RPMERR_CHOWN_FAILED     = -32770,
+       RPMERR_WRITE_FAILED     = -32771,
+       RPMERR_UTIME_FAILED     = -32772,
+       RPMERR_UNLINK_FAILED    = -32773,
+       RPMERR_RENAME_FAILED    = -32774,
+       RPMERR_SYMLINK_FAILED   = -32775,
+       RPMERR_STAT_FAILED      = -32776,
+       RPMERR_LSTAT_FAILED     = -32777,
+       RPMERR_MKDIR_FAILED     = -32778,
+       RPMERR_RMDIR_FAILED     = -32779,
+       RPMERR_MKNOD_FAILED     = -32780,
+       RPMERR_MKFIFO_FAILED    = -32781,
+       RPMERR_LINK_FAILED      = -32782,
+       RPMERR_READLINK_FAILED  = -32783,
+       RPMERR_READ_FAILED      = -32784,
+       RPMERR_COPY_FAILED      = -32785,
+       RPMERR_LSETFCON_FAILED  = -32786,
+       RPMERR_SETCAP_FAILED    = -32787,
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** \ingroup payload
+ * Return formatted error message on payload handling failure.
+ * @param rc           error code
+ * @return             formatted error string (malloced)
+ */
+char * rpmfileStrerror(int rc);
+
+/** \ingroup payload
+ * Get new file iterator for writing the archive content.
+ * The returned rpmfi will only visit the files needing some content.
+ * You need to provide the content using rpmfiArchiveWrite() or
+ * rpmfiArchiveWriteFile(). Make sure to close the rpmfi with
+ * rpmfiArchiveClose() to get the trailer written.
+ * rpmfiSetFX() is not supported for this type of iterator.
+ * @param fd           file
+ * @param files         file info
+ * @return             new rpmfi
+ */
+rpmfi rpmfiNewArchiveWriter(FD_t fd, rpmfiles files);
+
+/** \ingroup payload
+ * Get new file iterator for looping over the archive content.
+ * Returned rpmfi visites files in the order they are read from the payload.
+ * Content of the regular files can be retrieved with rpmfiArchiveRead() or
+ * rpmfiArchiveReadToFile() when they are visited with rpmfiNext().
+ * rpmfiSetFX() is not supported for this type of iterator.
+ * @param fd           file
+ * @param files         file info
+ * @param itype                how to handle hard links. See rpmFileIter.
+ * @return             new rpmfi
+ */
+    rpmfi rpmfiNewArchiveReader(FD_t fd, rpmfiles files, int itype);
+
+/** \ingroup payload
+ * Close payload archive
+ * @param fi           file info
+ * @return             > 0 on error
+ */
+int rpmfiArchiveClose(rpmfi fi);
+
+/** \ingroup payload
+ * Return current position in payload archive
+ * @param fi           file info
+ * @return             position
+ */
+rpm_loff_t rpmfiArchiveTell(rpmfi fi);
+
+/** \ingroup payload
+ * Write content into current file in archive
+ * @param fi           file info
+ * @param buf          pointer to content
+ * @param size         number of bytes to write
+ * @return             bytes actually written
+ */
+size_t rpmfiArchiveWrite(rpmfi fi, const void * buf, size_t size);
+
+/** \ingroup payload
+ * Write content from given file into current file in archive
+ * @param fi           file info
+ * @param fd           file descriptor of file to read
+ * @return             > 0 on error
+ */
+int rpmfiArchiveWriteFile(rpmfi fi, FD_t fd);
+
+/** \ingroup payload
+ * Read content from current file in archive
+ * @param fi           file info
+ * @param buf          pointer to buffer
+ * @param size         number of bytes to read
+ * @return             bytes actually read
+ */
+size_t rpmfiArchiveRead(rpmfi fi, void * buf, size_t size);
+
+/** \ingroup payload
+ * Has current file content stored in the archive
+ * @param fi            file info
+ * @ return            1 for regular files but 0 for hardlinks without content
+ */
+int rpmfiArchiveHasContent(rpmfi fi);
+
+/** \ingroup payload
+ * Write content from current file in archive to a file
+ * @param fi           file info
+ * @param fd           file descriptor of file to write to
+ * @param nodigest     omit checksum check if 1
+ * @return             > 0 on error
+ */
+int rpmfiArchiveReadToFile(rpmfi fi, FD_t fd, int nodigest);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_ARCHIVE */
index b3b05c6c1e131e35eb029a2f3ba3f40d0b66836b..f07892d0a06e1f7e605bf29b9bb5125a1c4dcf95 100644 (file)
@@ -1,6 +1,12 @@
 #ifndef _RPMCALLBACK_H
 #define _RPMCALLBACK_H
 
+/** \ingroup rpmcallback
+ *  \file lib/rpmcallback.h
+ *
+ *  (un)install callbacks
+ */
+
 #include <rpm/rpmtypes.h>
 
 #ifdef __cplusplus
@@ -31,9 +37,22 @@ typedef enum rpmCallbackType_e {
     RPMCALLBACK_SCRIPT_START   = (1 << 16),
     RPMCALLBACK_SCRIPT_STOP    = (1 << 17),
     RPMCALLBACK_INST_STOP      = (1 << 18),
+    RPMCALLBACK_ELEM_PROGRESS  = (1 << 19),
 } rpmCallbackType;
 
-/**
+/** \ingroup rpmts
+ * Function pointer type for rpmtsSetNotifyCallback() triggered by
+ * rpmtsNotify()
+ *
+ * @param h            related header or NULL
+ * @param what         kind of notification (See RPMCALLBACK_ constants above)
+ * @param amount       number of bytes/packages already processed or
+ *                     tag of the scriptlet involved
+ *                     or 0 or some other number
+ * @param total                total number of bytes/packages to be processed or
+ *                     return code of the scriptlet or 0
+ * @param key          result of rpmteKey() of related rpmte or 0
+ * @param data         user data as passed to rpmtsSetNotifyCallback()
  */
 typedef void * (*rpmCallbackFunction)
                (const void * h, 
index 0d3e95ad716e2472aa093158c9b059f5f278be5d..26a81efab03e698d392df7425838bd1a6180f9f8 100644 (file)
@@ -11,7 +11,7 @@
 #include <rpm/rpmpgp.h>
 #include <rpm/rpmcli.h>
 #include <rpm/rpmfileutil.h>   /* rpmMkTemp() */
-#include <rpm/rpmdb.h>
+#include <rpm/rpmsq.h>
 #include <rpm/rpmts.h>
 #include <rpm/rpmlog.h>
 #include <rpm/rpmstring.h>
@@ -19,7 +19,8 @@
 
 #include "rpmio/rpmio_internal.h"      /* fdSetBundle() */
 #include "lib/rpmlead.h"
-#include "lib/signature.h"
+#include "lib/header_internal.h"
+#include "lib/rpmvs.h"
 
 #include "debug.h"
 
@@ -35,14 +36,31 @@ static int doImport(rpmts ts, const char *fn, char *buf, ssize_t blen)
 
     do {
        uint8_t *pkt = NULL;
+       uint8_t *pkti = NULL;
        size_t pktlen = 0;
+       size_t certlen;
        
        /* Read pgp packet. */
        if (pgpParsePkts(start, &pkt, &pktlen) == PGPARMOR_PUBKEY) {
-           /* Import pubkey packet(s). */
-           if (rpmtsImportPubkey(ts, pkt, pktlen) != RPMRC_OK) {
-               rpmlog(RPMLOG_ERR, _("%s: key %d import failed.\n"), fn, keyno);
-               res++;
+           pkti = pkt;
+
+           /* Iterate over certificates in pkt */
+           while (pktlen > 0) {
+               if (pgpPubKeyCertLen(pkti, pktlen, &certlen)) {
+                   rpmlog(RPMLOG_ERR, _("%s: key %d import failed.\n"), fn,
+                           keyno);
+                   res++;
+                   break;
+               }
+
+               /* Import pubkey certificate. */
+               if (rpmtsImportPubkey(ts, pkti, certlen) != RPMRC_OK) {
+                   rpmlog(RPMLOG_ERR, _("%s: key %d import failed.\n"), fn,
+                           keyno);
+                   res++;
+               }
+               pkti += certlen;
+               pktlen -= certlen;
            }
        } else {
            rpmlog(RPMLOG_ERR, _("%s: key %d not an armored public key.\n"),
@@ -102,308 +120,156 @@ int rpmcliImportPubkeys(rpmts ts, ARGV_const_t argv)
     return res;
 }
 
-/**
- * @todo If the GPG key was known available, the md5 digest could be skipped.
- */
-static int readFile(FD_t fd, const char * fn,
-                   rpmDigestBundle plbundle, rpmDigestBundle hdrbundle)
+static int readFile(FD_t fd, char **msg)
 {
     unsigned char buf[4*BUFSIZ];
     ssize_t count;
-    int rc = 1;
-    Header h = NULL;
-    char *msg = NULL;
-
-    /* Read the header from the package. */
-    if (rpmReadHeader(NULL, fd, &h, &msg) != RPMRC_OK) {
-       rpmlog(RPMLOG_ERR, _("%s: headerRead failed: %s\n"), fn, msg);
-       goto exit;
-    }
-
-    if (headerIsEntry(h, RPMTAG_HEADERIMMUTABLE)) {
-       struct rpmtd_s utd;
-    
-       if (!headerGet(h, RPMTAG_HEADERIMMUTABLE, &utd, HEADERGET_DEFAULT)){
-           rpmlog(RPMLOG_ERR, 
-                   _("%s: Immutable header region could not be read. "
-                   "Corrupted package?\n"), fn);
-           goto exit;
-       }
-       rpmDigestBundleUpdate(hdrbundle, rpm_header_magic, sizeof(rpm_header_magic));
-       rpmDigestBundleUpdate(hdrbundle, utd.data, utd.count);
-       rpmtdFreeData(&utd);
-    }
 
     /* Read the payload from the package. */
     while ((count = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0) {}
-    if (count < 0) {
-       rpmlog(RPMLOG_ERR, _("%s: Fread failed: %s\n"), fn, Fstrerror(fd));
-       goto exit;
-    }
+    if (count < 0)
+       rasprintf(msg, _("Fread failed: %s"), Fstrerror(fd));
 
-    rc = 0;
-
-exit:
-    free(msg);
-    headerFree(h);
-    return rc;
+    return (count != 0);
 }
 
-/* 
- * Figure best available signature. 
- * XXX TODO: Similar detection in rpmReadPackageFile(), unify these.
- */
-static rpmTagVal bestSig(Header sigh, int nosignatures, int nodigests)
-{
-    rpmTagVal sigtag = 0;
-    if (sigtag == 0 && !nosignatures) {
-       if (headerIsEntry(sigh, RPMSIGTAG_DSA))
-           sigtag = RPMSIGTAG_DSA;
-       else if (headerIsEntry(sigh, RPMSIGTAG_RSA))
-           sigtag = RPMSIGTAG_RSA;
-       else if (headerIsEntry(sigh, RPMSIGTAG_GPG))
-           sigtag = RPMSIGTAG_GPG;
-       else if (headerIsEntry(sigh, RPMSIGTAG_PGP))
-           sigtag = RPMSIGTAG_PGP;
-    }
-    if (sigtag == 0 && !nodigests) {
-       if (headerIsEntry(sigh, RPMSIGTAG_MD5))
-           sigtag = RPMSIGTAG_MD5;
-       else if (headerIsEntry(sigh, RPMSIGTAG_SHA1))
-           sigtag = RPMSIGTAG_SHA1;    /* XXX never happens */
-    }
-    return sigtag;
-}
+struct vfydata_s {
+    int seen;
+    int bad;
+};
 
-static const char *sigtagname(rpmTagVal sigtag, int upper)
+static rpmRC formatVerbose(struct rpmsinfo_s *sinfo, rpmRC sigres, const char *result, void *cbdata)
 {
-    const char *n = NULL;
-
-    switch (sigtag) {
-    case RPMSIGTAG_SIZE:
-       n = (upper ? "SIZE" : "size");
-       break;
-    case RPMSIGTAG_SHA1:
-       n = (upper ? "SHA1" : "sha1");
-       break;
-    case RPMSIGTAG_MD5:
-       n = (upper ? "MD5" : "md5");
-       break;
-    case RPMSIGTAG_RSA:
-       n = (upper ? "RSA" : "rsa");
-       break;
-    case RPMSIGTAG_PGP5:       /* XXX legacy */
-    case RPMSIGTAG_PGP:
-       n = (upper ? "(MD5) PGP" : "(md5) pgp");
-       break;
-    case RPMSIGTAG_DSA:
-       n = (upper ? "(SHA1) DSA" : "(sha1) dsa");
-       break;
-    case RPMSIGTAG_GPG:
-       n = (upper ? "GPG" : "gpg");
-       break;
-    default:
-       n = (upper ? "?UnknownSigatureType?" : "???");
-       break;
-    }
-    return n;
+    char *vsmsg = rpmsinfoMsg(sinfo, sigres, result);
+    rpmlog(RPMLOG_NOTICE, "    %s\n", vsmsg);
+    free(vsmsg);
+    return sigres;
 }
 
-/* 
- * Format sigcheck result for output, appending the message spew to buf and
- * bad/missing keyids to keyprob.
- *
- * In verbose mode, just dump it all. Otherwise ok signatures
- * are dumped lowercase, bad sigs uppercase and for PGP/GPG
- * if misssing/untrusted key it's uppercase in parenthesis
- * and stash the key id as <SIGTYPE>#<keyid>. Pfft.
- */
-static void formatResult(rpmTagVal sigtag, rpmRC sigres, const char *result,
-                        int havekey, char **keyprob, char **buf)
+/* Failures are uppercase, in parenthesis if NOKEY. Otherwise lowercase. */
+static rpmRC formatDefault(struct rpmsinfo_s *sinfo, rpmRC sigres, const char *result, void *cbdata)
 {
-    char *msg = NULL;
-    if (rpmIsVerbose()) {
-       rasprintf(&msg, "    %s", result);
-    } else { 
-       /* Check for missing / untrusted keys in result. */
-       const char *signame = sigtagname(sigtag, (sigres != RPMRC_OK));
-       
-       if (havekey && (sigres == RPMRC_NOKEY || sigres == RPMRC_NOTTRUSTED)) {
-           const char *tempKey = strstr(result, "ey ID");
-           if (tempKey) {
-               char keyid[sizeof(pgpKeyID_t) + 1];
-               rstrlcpy(keyid, tempKey + 6, sizeof(keyid));
-               rstrscat(keyprob, " ", signame, "#", keyid, NULL);
-           }
-       }
-       rasprintf(&msg, (*keyprob ? "(%s) " : "%s "), signame);
-    }
-    rstrcat(buf, msg);
-    free(msg);
+    struct vfydata_s *vd = cbdata;
+    vd->seen |= sinfo->type;
+    if (sigres != RPMRC_OK)
+       vd->bad |= sinfo->type;
+    return sigres;
 }
 
-static int rpmpkgVerifySigs(rpmKeyring keyring, rpmQueryFlags flags,
-                          FD_t fd, const char *fn)
+rpmRC rpmpkgRead(rpmPlugins plugins, rpmKeyring keyring, rpmVSFlags flags, FD_t fd,
+                           rpmsinfoCb cb, void *cbdata, Header *hdrp)
 {
 
-    char *buf = NULL;
-    char *missingKeys = NULL; 
-    char *untrustedKeys = NULL;
-    struct rpmtd_s sigtd;
-    rpmTagVal sigtag;
-    pgpDigParams sig = NULL;
-    Header sigh = NULL;
-    HeaderIterator hi = NULL;
     char * msg = NULL;
-    int res = 1; /* assume failure */
-    rpmRC rc;
+    rpmRC xx, rc = RPMRC_FAIL; /* assume failure */
     int failed = 0;
-    int nodigests = !(flags & VERIFY_DIGEST);
-    int nosignatures = !(flags & VERIFY_SIGNATURE);
-    rpmDigestBundle plbundle = rpmDigestBundleNew();
-    rpmDigestBundle hdrbundle = rpmDigestBundleNew();
-
-    if ((rc = rpmLeadRead(fd, NULL, NULL, &msg)) != RPMRC_OK) {
-       rpmlog(RPMLOG_ERR, "%s: %s\n", fn, msg);
-       free(msg);
+    int leadtype = -1;
+    struct hdrblob_s sigblob, blob;
+    struct rpmvs_s *sigset = NULL;
+    Header h = NULL;
+    Header sigh = NULL;
+    rpmDigestBundle bundle = fdGetBundle(fd, 1); /* freed with fd */
+
+    memset(&blob, 0, sizeof(blob));
+    memset(&sigblob, 0, sizeof(sigblob));
+
+    if ((xx = rpmLeadRead(fd, &leadtype, &msg)) != RPMRC_OK) {
+       /* Avoid message spew on manifests */
+       if (xx == RPMRC_NOTFOUND)
+           msg = _free(msg);
+       rc = xx;
        goto exit;
     }
 
-    rc = rpmReadSignature(fd, &sigh, RPMSIGTYPE_HEADERSIG, &msg);
-    switch (rc) {
-    default:
-       rpmlog(RPMLOG_ERR, _("%s: rpmReadSignature failed: %s"), fn,
-                   (msg && *msg ? msg : "\n"));
-       msg = _free(msg);
+    /* Read the signature header. Might not be in a contiguous region. */
+    if (hdrblobRead(fd, 1, 0, RPMTAG_HEADERSIGNATURES, &sigblob, &msg))
        goto exit;
-       break;
-    case RPMRC_OK:
-       if (sigh == NULL) {
-           rpmlog(RPMLOG_ERR, _("%s: No signature available\n"), fn);
-           goto exit;
-       }
-       break;
-    }
-    msg = _free(msg);
-
-    /* Grab a hint of what needs doing to avoid duplication. */
-    sigtag = bestSig(sigh, nosignatures, nodigests);
-
-    /* XXX RSA needs the hash_algo, so decode early. */
-    if (sigtag == RPMSIGTAG_RSA || sigtag == RPMSIGTAG_PGP ||
-               sigtag == RPMSIGTAG_DSA || sigtag == RPMSIGTAG_GPG) {
-       unsigned int hashalgo;
-       if (headerGet(sigh, sigtag, &sigtd, HEADERGET_DEFAULT)) {
-           parsePGPSig(&sigtd, "package", fn, &sig);
-           rpmtdFreeData(&sigtd);
-       }
-       if (sig == NULL) goto exit;
-           
-       /* XXX assume same hash_algo in header-only and header+payload */
-       hashalgo = pgpDigParamsAlgo(sig, PGPVAL_HASHALGO);
-       rpmDigestBundleAdd(plbundle, hashalgo, RPMDIGEST_NONE);
-       rpmDigestBundleAdd(hdrbundle, hashalgo, RPMDIGEST_NONE);
-    }
 
-    if (headerIsEntry(sigh, RPMSIGTAG_PGP) ||
-                     headerIsEntry(sigh, RPMSIGTAG_PGP5) ||
-                     headerIsEntry(sigh, RPMSIGTAG_MD5)) {
-       rpmDigestBundleAdd(plbundle, PGPHASHALGO_MD5, RPMDIGEST_NONE);
-    }
-    if (headerIsEntry(sigh, RPMSIGTAG_GPG)) {
-       rpmDigestBundleAdd(plbundle, PGPHASHALGO_SHA1, RPMDIGEST_NONE);
-    }
+    sigset = rpmvsCreate(&sigblob, flags);
 
-    /* always do sha1 hash of header */
-    rpmDigestBundleAdd(hdrbundle, PGPHASHALGO_SHA1, RPMDIGEST_NONE);
+    /* Initialize digests ranging over the header */
+    rpmvsInitDigests(sigset, RPMSIG_HEADER, bundle);
 
-    /* Read the file, generating digest(s) on the fly. */
-    fdSetBundle(fd, plbundle);
-    if (readFile(fd, fn, plbundle, hdrbundle)) {
+    /* Read the header from the package. */
+    if (hdrblobRead(fd, 1, 1, RPMTAG_HEADERIMMUTABLE, &blob, &msg))
        goto exit;
+
+    /* Fish interesting tags from the main header. This is a bit hacky... */
+    if (!(flags & (RPMVSF_NOPAYLOAD|RPMVSF_NEEDPAYLOAD)))
+       rpmvsAppend(sigset, &blob, RPMTAG_PAYLOADDIGEST);
+
+    /* Initialize digests ranging over the payload only */
+    rpmvsInitDigests(sigset, RPMSIG_PAYLOAD, bundle);
+
+
+    /* Verify header signatures and digests */
+    failed += rpmvsVerifyItems(plugins, sigset, (RPMSIG_HEADER), bundle, keyring, cb, cbdata);
+
+    /* Unless disabled, read the file, generating digest(s) on the fly. */
+    if (!(flags & RPMVSF_NEEDPAYLOAD)) {
+       if (readFile(fd, &msg))
+           goto exit;
     }
 
-    rasprintf(&buf, "%s:%c", fn, (rpmIsVerbose() ? '\n' : ' ') );
-
-    hi = headerInitIterator(sigh);
-    for (; headerNext(hi, &sigtd) != 0; rpmtdFreeData(&sigtd)) {
-       char *result = NULL;
-       int havekey = 0;
-       DIGEST_CTX ctx = NULL;
-       if (sigtd.data == NULL) /* XXX can't happen */
-           continue;
-
-       /* Clean up parameters from previous sigtag. */
-       sig = pgpDigParamsFree(sig);
-
-       switch (sigtd.tag) {
-       case RPMSIGTAG_GPG:
-       case RPMSIGTAG_PGP5:    /* XXX legacy */
-       case RPMSIGTAG_PGP:
-           havekey = 1;
-       case RPMSIGTAG_RSA:
-       case RPMSIGTAG_DSA:
-           if (nosignatures)
-                continue;
-           if (parsePGPSig(&sigtd, "package", fn, &sig))
-               goto exit;
-           ctx = rpmDigestBundleDupCtx(havekey ? plbundle : hdrbundle,
-                                       pgpDigParamsAlgo(sig, PGPVAL_HASHALGO));
-           break;
-       case RPMSIGTAG_SHA1:
-           if (nodigests)
-                continue;
-           ctx = rpmDigestBundleDupCtx(hdrbundle, PGPHASHALGO_SHA1);
-           break;
-       case RPMSIGTAG_MD5:
-           if (nodigests)
-                continue;
-           ctx = rpmDigestBundleDupCtx(plbundle, PGPHASHALGO_MD5);
-           break;
-       default:
-           continue;
-           break;
-       }
+    /* Verify signatures and digests ranging over the payload */
+    failed += rpmvsVerifyItems(plugins, sigset, (RPMSIG_PAYLOAD), bundle,
+                       keyring, cb, cbdata);
+    failed += rpmvsVerifyItems(plugins, sigset, (RPMSIG_HEADER|RPMSIG_PAYLOAD), bundle,
+                       keyring, cb, cbdata);
 
-       rc = rpmVerifySignature(keyring, &sigtd, sig, ctx, &result);
-       rpmDigestFinal(ctx, NULL, NULL, 0);
+    if (failed == 0) {
+       /* Finally import the headers and do whatever required retrofits etc */
+       if (hdrp) {
+           if (hdrblobImport(&sigblob, 0, &sigh, &msg))
+               goto exit;
+           if (hdrblobImport(&blob, 0, &h, &msg))
+               goto exit;
 
-       formatResult(sigtd.tag, rc, result, havekey, 
-                    (rc == RPMRC_NOKEY ? &missingKeys : &untrustedKeys),
-                    &buf);
-       free(result);
+           /* Append (and remap) signature tags to the metadata. */
+           if (headerMergeLegacySigs(h, sigh, &msg))
+               goto exit;
+           applyRetrofits(h, leadtype);
 
-       if (rc != RPMRC_OK) {
-           failed = 1;
+           /* Bump reference count for return. */
+           *hdrp = headerLink(h);
        }
-
+       rc = RPMRC_OK;
     }
-    res = failed;
 
+exit:
+    if (rc && msg != NULL)
+       rpmlog(RPMLOG_ERR, "%s: %s\n", Fdescr(fd), msg);
+    free(msg);
+    free(sigblob.ei);
+    free(blob.ei);
+    headerFree(h);
+    headerFree(sigh);
+    rpmvsFree(sigset);
+    return rc;
+}
+
+static int rpmpkgVerifySigs(rpmPlugins plugins, rpmKeyring keyring, rpmVSFlags flags,
+                          FD_t fd, const char *fn)
+{
+    int rc;
     if (rpmIsVerbose()) {
-       rpmlog(RPMLOG_NOTICE, "%s", buf);
+       rpmlog(RPMLOG_NOTICE, "%s:\n", fn);
+       rc = rpmpkgRead(plugins, keyring, flags, fd, formatVerbose, NULL, NULL);
     } else {
-       const char *ok = (failed ? _("NOT OK") : _("OK"));
-       rpmlog(RPMLOG_NOTICE, "%s%s%s%s%s%s%s%s\n", buf, ok,
-              missingKeys ? _(" (MISSING KEYS:") : "",
-              missingKeys ? missingKeys : "",
-              missingKeys ? _(") ") : "",
-              untrustedKeys ? _(" (UNTRUSTED KEYS:") : "",
-              untrustedKeys ? untrustedKeys : "",
-              untrustedKeys ? _(")") : "");
+       struct vfydata_s vd = { 0, 0 };
+       rpmlog(RPMLOG_NOTICE, "%s:", fn);
+       rc = rpmpkgRead(plugins, keyring, flags, fd, formatDefault, &vd, NULL);
+       if (vd.seen & RPMSIG_DIGEST_TYPE) {
+           rpmlog(RPMLOG_NOTICE, " %s", (vd.bad & RPMSIG_DIGEST_TYPE) ?
+                                       _("DIGESTS") : _("digests"));
+       }
+       if (vd.seen & RPMSIG_SIGNATURE_TYPE) {
+           rpmlog(RPMLOG_NOTICE, " %s", (vd.bad & RPMSIG_SIGNATURE_TYPE) ?
+                                       _("SIGNATURES") : _("signatures"));
+       }
+       rpmlog(RPMLOG_NOTICE, " %s\n", rc ? _("NOT OK") : _("OK"));
     }
-    free(missingKeys);
-    free(untrustedKeys);
-
-exit:
-    free(buf);
-    rpmDigestBundleFree(hdrbundle);
-    rpmDigestBundleFree(plbundle);
-    fdSetBundle(fd, NULL); /* XXX avoid double-free from fd close */
-    sigh = rpmFreeSignature(sigh);
-    hi = headerFreeIterator(hi);
-    pgpDigParamsFree(sig);
-    return res;
+    return rc;
 }
 
 /* Wrapper around rpmkVerifySigs to preserve API */
@@ -412,7 +278,7 @@ int rpmVerifySignatures(QVA_t qva, rpmts ts, FD_t fd, const char * fn)
     int rc = 1; /* assume failure */
     if (ts && qva && fd && fn) {
        rpmKeyring keyring = rpmtsGetKeyring(ts, 1);
-       rc = rpmpkgVerifySigs(keyring, qva->qva_flags, fd, fn);
+       rc = rpmpkgVerifySigs(rpmtsPlugins(ts), keyring, qva->qva_flags, fd, fn);
        rpmKeyringFree(keyring);
     }
     return rc;
@@ -423,9 +289,12 @@ int rpmcliVerifySignatures(rpmts ts, ARGV_const_t argv)
     const char * arg;
     int res = 0;
     rpmKeyring keyring = rpmtsGetKeyring(ts, 1);
-    rpmVerifyFlags verifyFlags = (VERIFY_DIGEST|VERIFY_SIGNATURE);
-    
-    verifyFlags &= ~rpmcliQueryFlags;
+    rpmVSFlags vsflags = 0;
+
+    if (rpmcliQueryFlags & QUERY_DIGEST)
+       vsflags |= _RPMVSF_NODIGESTS;
+    if (rpmcliQueryFlags & QUERY_SIGNATURE)
+       vsflags |= _RPMVSF_NOSIGNATURES;
 
     while ((arg = *argv++) != NULL) {
        FD_t fd = Fopen(arg, "r.ufdio");
@@ -433,12 +302,12 @@ int rpmcliVerifySignatures(rpmts ts, ARGV_const_t argv)
            rpmlog(RPMLOG_ERR, _("%s: open failed: %s\n"), 
                     arg, Fstrerror(fd));
            res++;
-       } else if (rpmpkgVerifySigs(keyring, verifyFlags, fd, arg)) {
+       } else if (rpmpkgVerifySigs(rpmtsPlugins(ts), keyring, vsflags, fd, arg)) {
            res++;
        }
 
        Fclose(fd);
-       rpmdbCheckSignals();
+       rpmsqPoll();
     }
     rpmKeyringFree(keyring);
     return res;
index cdb1f8ab4026833f485ce01768e665bd2a345b01..7a88f879170bba8260a6637fa47a938af31e555d 100644 (file)
@@ -3,6 +3,8 @@
 
 /** \ingroup rpmcli rpmbuild
  * \file lib/rpmcli.h
+ *
+ * Parsing RPM command line arguments
  */
 
 #include <popt.h>
@@ -67,6 +69,8 @@ rpmcliFini(poptContext optCon);
 #define        RPMCLI_POPT_NODIGEST            -1030
 #define        RPMCLI_POPT_NOHDRCHK            -1031
 #define        RPMCLI_POPT_NOCONTEXTS          -1032
+#define        RPMCLI_POPT_NOCAPS              -1033
+#define        RPMCLI_POPT_TARGETPLATFORM      -1034
 
 /* ==================================================================== */
 /** \name RPMQV */
@@ -91,6 +95,11 @@ enum rpmQVSources_e {
     RPMQV_HDRID,       /*!< ... from header id (immutable header SHA1). */
     RPMQV_TID,         /*!< ... from install transaction id (time stamp). */
     RPMQV_SPECSRPM,    /*!< ... from spec file source (query only). */
+    RPMQV_WHATRECOMMENDS,      /*!< ... from recommends db search. */
+    RPMQV_WHATSUGGESTS,                /*!< ... from suggests db search. */
+    RPMQV_WHATSUPPLEMENTS,     /*!< ... from supplements db search. */
+    RPMQV_WHATENHANCES,                /*!< ... from enhances db search. */
+    RPMQV_SPECBUILTRPMS,       /*!< ... from pkgs which would be built from spec */
 };
 
 typedef rpmFlags rpmQVSources;
@@ -124,7 +133,8 @@ enum rpmQueryFlags_e {
     QUERY_FOR_DOCS     = (1 << 25),    /*!< query:  from --docfiles */
     QUERY_FOR_CONFIG   = (1 << 26),    /*!< query:  from --configfiles */
     QUERY_FOR_DUMPFILES        = (1 << 27),    /*!< query:  from --dump */
-    QUERY_FOR_LICENSE  = (1 << 28)     /*!< query:  from --licensefiles */
+    QUERY_FOR_LICENSE  = (1 << 28),    /*!< query:  from --licensefiles */
+    QUERY_FOR_ARTIFACT = (1 << 29),    /*!< query:  from --artifacts */
 };
 
 typedef rpmFlags rpmQueryFlags;
@@ -282,7 +292,8 @@ enum rpmInstallFlags_e {
     INSTALL_FRESHEN    = (1 << 6),     /*!< from --freshen */
     INSTALL_INSTALL    = (1 << 7),     /*!< from --install */
     INSTALL_ERASE      = (1 << 8),     /*!< from --erase */
-    INSTALL_ALLMATCHES = (1 << 9)      /*!< from --allmatches */
+    INSTALL_ALLMATCHES = (1 << 9),     /*!< from --allmatches */
+    INSTALL_REINSTALL  = (1 << 10),    /*!< from --reinstall */
 };
 
 typedef rpmFlags rpmInstallFlags;
@@ -343,7 +354,7 @@ struct rpmInstallArguments_s {
 };
 
 /** \ingroup rpmcli
- * Install/upgrade/freshen binary rpm package.
+ * Install/upgrade/freshen/reinstall binary rpm package.
  * @param ts           transaction set
  * @param ia           mode flags and parameters
  * @param fileArgv     array of package file names (NULL terminated)
index 76425b4ca773ebe6717896f57618a1256b6af564..4af21f69cb1af359bb8805a6e907b06a86fe09a0 100644 (file)
@@ -4,8 +4,6 @@
 
 #include "system.h"
 
-#define        _USE_COPY_LOAD  /* XXX don't use DB_DBT_MALLOC (yet) */
-
 #include <sys/file.h>
 #include <utime.h>
 #include <errno.h>
@@ -34,6 +32,8 @@
 #include "lib/rpmdb_internal.h"
 #include "lib/fprint.h"
 #include "lib/header_internal.h"       /* XXX for headerSetInstance() */
+#include "lib/backend/dbiset.h"
+#include "lib/misc.h"
 #include "debug.h"
 
 #undef HASHTYPE
 #undef HTKEYTYPE
 #undef HTDATATYPE
 
-static rpmDbiTag const dbiTags[] = {
-    RPMDBI_PACKAGES,
-    RPMDBI_NAME,
-    RPMDBI_BASENAMES,
-    RPMDBI_GROUP,
-    RPMDBI_REQUIRENAME,
-    RPMDBI_PROVIDENAME,
-    RPMDBI_CONFLICTNAME,
-    RPMDBI_OBSOLETENAME,
-    RPMDBI_TRIGGERNAME,
-    RPMDBI_DIRNAMES,
-    RPMDBI_INSTALLTID,
-    RPMDBI_SIGMD5,
-    RPMDBI_SHA1HEADER,
-};
-
-#define dbiTagsMax (sizeof(dbiTags) / sizeof(rpmDbiTag))
-
-/* A single item from an index database (i.e. the "data returned"). */
-struct dbiIndexItem {
-    unsigned int hdrNum;               /*!< header instance in db */
-    unsigned int tagNum;               /*!< tag index in header */
-};
+typedef rpmRC (*idxfunc)(dbiIndex dbi, dbiCursor dbc, const char *keyp, size_t keylen,
+                        dbiIndexItem rec);
 
-/* Items retrieved from the index database.*/
-typedef struct _dbiIndexSet {
-    struct dbiIndexItem * recs;        /*!< array of records */
-    unsigned int count;                        /*!< number of records */
-    size_t alloced;                    /*!< alloced size */
-} * dbiIndexSet;
+static rpmRC tag2index(dbiIndex dbi, rpmTagVal rpmtag,
+                      unsigned int hdrNum, Header h,
+                      idxfunc idxupdate);
 
-static int addToIndex(dbiIndex dbi, rpmTagVal rpmtag, unsigned int hdrNum, Header h);
-static unsigned int pkgInstance(dbiIndex dbi, int alloc);
+static rpmRC indexPut(dbiIndex dbi, rpmTagVal rpmtag, unsigned int hdrNum, Header h);
 static rpmdb rpmdbUnlink(rpmdb db);
 
 static int buildIndexes(rpmdb db)
@@ -92,7 +67,7 @@ static int buildIndexes(rpmdb db)
     rc += rpmdbOpenAll(db);
 
     /* If the main db was just created, this is expected - dont whine */
-    if (!(dbiFlags(db->_dbi[0]) & DBI_CREATED)) {
+    if (!(dbiFlags(db->db_pkgs) & DBI_CREATED)) {
        rpmlog(RPMLOG_WARNING,
               _("Generating %d missing index(es), please wait...\n"),
               db->db_buildindex);
@@ -101,21 +76,27 @@ static int buildIndexes(rpmdb db)
     /* Don't call us again */
     db->db_buildindex = 0;
 
-    dbSetFSync(db->db_dbenv, 0);
+    dbSetFSync(db, 0);
+
+    dbCtrl(db, RPMDB_CTRL_LOCK_RW);
 
     mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, NULL, 0);
     while ((h = rpmdbNextIterator(mi))) {
        unsigned int hdrNum = headerGetInstance(h);
        /* Build all secondary indexes which were created on open */
-       for (int dbix = 1; dbix < dbiTagsMax; dbix++) {
-           dbiIndex dbi = db->_dbi[dbix];
+       for (int dbix = 0; dbix < db->db_ndbi; dbix++) {
+           dbiIndex dbi = db->db_indexes[dbix];
            if (dbi && (dbiFlags(dbi) & DBI_CREATED)) {
-               rc += addToIndex(dbi, dbiTags[dbix], hdrNum, h);
+               rc += indexPut(dbi, db->db_tags[dbix], hdrNum, h);
            }
        }
     }
     rpmdbFreeIterator(mi);
-    dbSetFSync(db->db_dbenv, !db->cfg.db_no_fsync);
+
+    dbCtrl(db, DB_CTRL_INDEXSYNC);
+    dbCtrl(db, DB_CTRL_UNLOCK_RW);
+
+    dbSetFSync(db, !db->cfg.db_no_fsync);
     return rc;
 }
 
@@ -154,395 +135,135 @@ static int64_t splitEpoch(const char *s, const char **version)
     return e;
 }
 
-/** \ingroup dbi
- * Return handle for an index database.
- * @param db           rpm database
- * @param rpmtag       rpm tag
- * @param flags
- * @return             index database handle
- */
-static dbiIndex rpmdbOpenIndex(rpmdb db, rpmDbiTagVal rpmtag, int flags)
+static int pkgdbOpen(rpmdb db, int flags, dbiIndex *dbip)
 {
-    int dbix;
-    dbiIndex dbi = NULL;
     int rc = 0;
+    dbiIndex dbi = NULL;
 
     if (db == NULL)
-       return NULL;
-
-    for (dbix = 0; dbix < dbiTagsMax; dbix++) {
-       if (rpmtag == dbiTags[dbix])
-           break;
-    }
-    if (dbix >= dbiTagsMax)
-       return NULL;
-
-    /* Is this index already open ? */
-    if ((dbi = db->_dbi[dbix]) != NULL)
-       return dbi;
-
-    errno = 0;
-    dbi = NULL;
-    rc = dbiOpen(db, rpmtag, &dbi, flags);
-
-    if (rc) {
-       static int _printed[32];
-       if (!_printed[dbix & 0x1f]++)
-           rpmlog(RPMLOG_ERR, _("cannot open %s index using db%d - %s (%d)\n"),
-                  rpmTagGetName(rpmtag), db->db_ver,
-                  (rc > 0 ? strerror(rc) : ""), rc);
-    } else {
-       db->_dbi[dbix] = dbi;
-       int verifyonly = (flags & RPMDB_FLAG_VERIFYONLY);
-       int rebuild = (db->db_flags & RPMDB_FLAG_REBUILD);
-       if (dbiType(dbi) == DBI_PRIMARY) {
-           /* Allocate based on max header instance number + some reserve */
-           if (!verifyonly && (db->db_checked == NULL)) {
-               db->db_checked = dbChkCreate(1024 + pkgInstance(dbi, 0) / 4,
-                                               uintId, uintCmp, NULL, NULL);
-           }
-           /* If primary got created, we can safely run without fsync */
-           if ((!verifyonly && (dbiFlags(dbi) & DBI_CREATED)) || db->cfg.db_no_fsync) {
-               rpmlog(RPMLOG_DEBUG, "disabling fsync on database\n");
-                db->cfg.db_no_fsync = 1;
-               dbSetFSync(db->db_dbenv, 0);
-           }
-       } else { /* secondary index */
-           if (!rebuild && !verifyonly && (dbiFlags(dbi) & DBI_CREATED)) {
-               rpmlog(RPMLOG_DEBUG, "index %s needs creating\n", dbiName(dbi));
-               db->db_buildindex++;
-                if (db->db_buildindex == 1) {
-                    buildIndexes(db);
-                }
-           }
-       }
-    }
-
-    return dbi;
-}
-
-union _dbswap {
-    unsigned int ui;
-    unsigned char uc[4];
-};
-
-#define        _DBSWAP(_a) \
-\
-  { unsigned char _b, *_c = (_a).uc; \
-    _b = _c[3]; _c[3] = _c[0]; _c[0] = _b; \
-    _b = _c[2]; _c[2] = _c[1]; _c[1] = _b; \
-\
-  }
-
-/* 
- * Ensure sufficient memory for nrecs of new records in dbiIndexSet.
- * Allocate in power of two sizes to avoid memory fragmentation, so
- * realloc is not always needed.
- */
-static inline void dbiGrowSet(dbiIndexSet set, unsigned int nrecs)
-{
-    size_t need = (set->count + nrecs) * sizeof(*(set->recs));
-    size_t alloced = set->alloced ? set->alloced : 1 << 4;
-
-    while (alloced < need)
-       alloced <<= 1;
-
-    if (alloced != set->alloced) {
-       set->recs = xrealloc(set->recs, alloced);
-       set->alloced = alloced;
-    }
-}
-
-/**
- * Convert retrieved data to index set.
- * @param dbi          index database handle
- * @param data         retrieved data
- * @retval setp                (malloc'ed) index set
- * @return             0 on success
- */
-static int dbt2set(dbiIndex dbi, DBT * data, dbiIndexSet * setp)
-{
-    int _dbbyteswapped = dbiByteSwapped(dbi);
-    const char * sdbir;
-    dbiIndexSet set;
-    unsigned int i;
-    dbiIndexType itype = dbiType(dbi);
-
-    if (dbi == NULL || data == NULL || setp == NULL)
        return -1;
+    /* Is this it already open ? */
+    if ((dbi = db->db_pkgs) != NULL)
+       goto exit;
 
-    if ((sdbir = data->data) == NULL) {
-       *setp = NULL;
-       return 0;
-    }
-
-    set = xcalloc(1, sizeof(*set));
-    dbiGrowSet(set, data->size / itype);
-    set->count = data->size / itype;
-
-    switch (itype) {
-    default:
-    case DBI_SECONDARY:
-       for (i = 0; i < set->count; i++) {
-           union _dbswap hdrNum, tagNum;
-
-           memcpy(&hdrNum.ui, sdbir, sizeof(hdrNum.ui));
-           sdbir += sizeof(hdrNum.ui);
-           memcpy(&tagNum.ui, sdbir, sizeof(tagNum.ui));
-           sdbir += sizeof(tagNum.ui);
-           if (_dbbyteswapped) {
-               _DBSWAP(hdrNum);
-               _DBSWAP(tagNum);
-           }
-           /* remove tagged directory info */
-           if (tagNum.ui & 0x80000000)
-               tagNum.ui &= 0x0000ffff;
-           set->recs[i].hdrNum = hdrNum.ui;
-           set->recs[i].tagNum = tagNum.ui;
-       }
-       break;
-    case DBI_PRIMARY:
-       for (i = 0; i < set->count; i++) {
-           union _dbswap hdrNum;
-
-           memcpy(&hdrNum.ui, sdbir, sizeof(hdrNum.ui));
-           sdbir += sizeof(hdrNum.ui);
-           if (_dbbyteswapped) {
-               _DBSWAP(hdrNum);
-           }
-           set->recs[i].hdrNum = hdrNum.ui;
-           set->recs[i].tagNum = 0;
-       }
-       break;
-    }
-    *setp = set;
-    return 0;
-}
-
-/**
- * Convert index set to database representation.
- * @param dbi          index database handle
- * @param data         retrieved data
- * @param set          index set
- * @return             0 on success
- */
-static int set2dbt(dbiIndex dbi, DBT * data, dbiIndexSet set)
-{
-    int _dbbyteswapped = dbiByteSwapped(dbi);
-    char * tdbir;
-    unsigned int i;
-    dbiIndexType itype = dbiType(dbi);
-
-    if (dbi == NULL || data == NULL || set == NULL)
-       return -1;
+    rc = dbiOpen(db, RPMDBI_PACKAGES, &dbi, flags);
 
-    data->size = set->count * itype;
-    if (data->size == 0) {
-       data->data = NULL;
-       return 0;
-    }
-    tdbir = data->data = xmalloc(data->size);
+    if (rc == 0) {
+       int verifyonly = (flags & RPMDB_FLAG_VERIFYONLY);
 
-    switch (itype) {
-    default:
-    case DBI_SECONDARY:
-       for (i = 0; i < set->count; i++) {
-           union _dbswap hdrNum, tagNum;
-
-           memset(&hdrNum, 0, sizeof(hdrNum));
-           memset(&tagNum, 0, sizeof(tagNum));
-           hdrNum.ui = set->recs[i].hdrNum;
-           tagNum.ui = set->recs[i].tagNum;
-           if (_dbbyteswapped) {
-               _DBSWAP(hdrNum);
-               _DBSWAP(tagNum);
-           }
-           memcpy(tdbir, &hdrNum.ui, sizeof(hdrNum.ui));
-           tdbir += sizeof(hdrNum.ui);
-           memcpy(tdbir, &tagNum.ui, sizeof(tagNum.ui));
-           tdbir += sizeof(tagNum.ui);
+       db->db_pkgs = dbi;
+       /* Allocate header checking cache .. based on some random number */
+       if (!verifyonly && (db->db_checked == NULL)) {
+           db->db_checked = dbChkCreate(567, uintId, uintCmp, NULL, NULL);
        }
-       break;
-    case DBI_PRIMARY:
-       for (i = 0; i < set->count; i++) {
-           union _dbswap hdrNum;
-
-           memset(&hdrNum, 0, sizeof(hdrNum));
-           hdrNum.ui = set->recs[i].hdrNum;
-           if (_dbbyteswapped) {
-               _DBSWAP(hdrNum);
-           }
-           memcpy(tdbir, &hdrNum.ui, sizeof(hdrNum.ui));
-           tdbir += sizeof(hdrNum.ui);
+       /* If primary got created, we can safely run without fsync */
+       if ((!verifyonly && (dbiFlags(dbi) & DBI_CREATED)) || db->cfg.db_no_fsync) {
+           rpmlog(RPMLOG_DEBUG, "disabling fsync on database\n");
+           db->cfg.db_no_fsync = 1;
+           dbSetFSync(db, 0);
        }
-       break;
+    } else {
+       rpmlog(RPMLOG_ERR, _("cannot open %s index using %s - %s (%d)\n"),
+                  rpmTagGetName(RPMDBI_PACKAGES), db->db_descr,
+                  (rc > 0 ? strerror(rc) : ""), rc);
     }
 
-    return 0;
-}
+exit:
+    if (rc == 0 && dbip)
+       *dbip = dbi;
 
-/* XXX assumes hdrNum is first int in dbiIndexItem */
-static int hdrNumCmp(const void * one, const void * two)
-{
-    const unsigned int * a = one, * b = two;
-    return (*a - *b);
+    return rc;
 }
 
-/**
- * Append element(s) to set of index database items.
- * @param set          set of index database items
- * @param recs         array of items to append to set
- * @param nrecs                number of items
- * @param recsize      size of an array item
- * @param sortset      should resulting set be sorted?
- * @return             0 success, 1 failure (bad args)
- */
-static int dbiAppendSet(dbiIndexSet set, const void * recs,
-       int nrecs, size_t recsize, int sortset)
+static int indexOpen(rpmdb db, rpmDbiTagVal rpmtag, int flags, dbiIndex *dbip)
 {
-    const char * rptr = recs;
-    size_t rlen = (recsize < sizeof(*(set->recs)))
-               ? recsize : sizeof(*(set->recs));
-
-    if (set == NULL || recs == NULL || nrecs <= 0 || recsize == 0)
-       return 1;
+    int dbix, rc = 0;
+    dbiIndex dbi = NULL;
 
-    dbiGrowSet(set, nrecs);
-    memset(set->recs + set->count, 0, nrecs * sizeof(*(set->recs)));
+    if (db == NULL)
+       return -1;
 
-    while (nrecs-- > 0) {
-       memcpy(set->recs + set->count, rptr, rlen);
-       rptr += recsize;
-       set->count++;
+    for (dbix = 0; dbix < db->db_ndbi; dbix++) {
+       if (rpmtag == db->db_tags[dbix])
+           break;
     }
+    if (dbix >= db->db_ndbi)
+       return -1;
 
-    if (sortset && set->count > 1)
-       qsort(set->recs, set->count, sizeof(*(set->recs)), hdrNumCmp);
-
-    return 0;
-}
+    /* Is this index already open ? */
+    if ((dbi = db->db_indexes[dbix]) != NULL)
+       goto exit;
 
-/**
- * Remove element(s) from set of index database items.
- * @param set          set of index database items
- * @param recs         array of items to remove from set
- * @param nrecs                number of items
- * @param recsize      size of an array item
- * @param sorted       array is already sorted?
- * @return             0 success, 1 failure (no items found)
- */
-static int dbiPruneSet(dbiIndexSet set, void * recs, int nrecs,
-               size_t recsize, int sorted)
-{
-    unsigned int from;
-    unsigned int to = 0;
-    unsigned int num = set->count;
-    unsigned int numCopied = 0;
+    rc = dbiOpen(db, rpmtag, &dbi, flags);
 
-    assert(set->count > 0);
-    if (nrecs > 1 && !sorted)
-       qsort(recs, nrecs, recsize, hdrNumCmp);
+    if (rc == 0) {
+       int verifyonly = (flags & RPMDB_FLAG_VERIFYONLY);
+       int rebuild = (db->db_flags & RPMDB_FLAG_REBUILD);
 
-    for (from = 0; from < num; from++) {
-       if (bsearch(&set->recs[from], recs, nrecs, recsize, hdrNumCmp)) {
-           set->count--;
-           continue;
+       db->db_indexes[dbix] = dbi;
+       if (!rebuild && !verifyonly && (dbiFlags(dbi) & DBI_CREATED)) {
+           rpmlog(RPMLOG_DEBUG, "index %s needs creating\n", dbiName(dbi));
+           db->db_buildindex++;
+           if (db->db_buildindex == 1) {
+               buildIndexes(db);
+           }
        }
-       if (from != to)
-           set->recs[to] = set->recs[from]; /* structure assignment */
-       to++;
-       numCopied++;
+    } else {
+       rpmlog(RPMLOG_ERR, _("cannot open %s index using %s - %s (%d)\n"),
+                  rpmTagGetName(rpmtag), db->db_descr,
+                  (rc > 0 ? strerror(rc) : ""), rc);
     }
-    return (numCopied == num);
-}
-
-/* Count items in index database set. */
-static unsigned int dbiIndexSetCount(dbiIndexSet set)
-{
-    return set->count;
-}
-
-/* Return record offset of header from element in index database set. */
-static unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
-{
-    return set->recs[recno].hdrNum;
-}
-
-/* Return file index from element in index database set. */
-static unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
-{
-    return set->recs[recno].tagNum;
-}
 
-/* Destroy set of index database items */
-static dbiIndexSet dbiIndexSetFree(dbiIndexSet set)
-{
-    if (set) {
-       free(set->recs);
-       memset(set, 0, sizeof(*set)); /* trash and burn */
-       free(set);
-    }
-    return NULL;
+exit:
+    if (rc == 0 && dbip)
+       *dbip = dbi;
+    return rc;
 }
 
-static int dbiCursorGetToSet(dbiCursor dbc, const char *keyp, size_t keylen,
-                            dbiIndexSet *set)
+static rpmRC indexGet(dbiIndex dbi, const char *keyp, size_t keylen,
+                      dbiIndexSet *set)
 {
-    int rc = EINVAL;
-    if (dbc != NULL && set != NULL) {
-       dbiIndex dbi = dbiCursorIndex(dbc);
-       int cflags = DB_NEXT;
-       DBT data, key;
-       memset(&data, 0, sizeof(data));
-       memset(&key, 0, sizeof(key));
+    rpmRC rc = RPMRC_FAIL; /* assume failure */
+    if (dbi != NULL) {
+       dbiCursor dbc = dbiCursorInit(dbi, DBC_READ);
 
        if (keyp) {
-           key.data = (void *) keyp; /* discards const */
-           key.size = keylen;
-           cflags = DB_SET;
-       }
-
-       rc = dbiCursorGet(dbc, &key, &data, cflags);
+           if (keylen == 0)
+               keylen = strlen(keyp);
+           rc = idxdbGet(dbi, dbc, keyp, keylen, set, DBC_NORMAL_SEARCH);
+       } else {
+           do {
+               rc = idxdbGet(dbi, dbc, NULL, 0, set, DBC_NORMAL_SEARCH);
+           } while (rc == RPMRC_OK);
 
-       if (rc == 0) {
-           dbiIndexSet newset = NULL;
-           dbt2set(dbi, &data, &newset);
-           if (*set == NULL) {
-               *set = newset;
-           } else {
-               dbiAppendSet(*set, newset->recs, newset->count,
-                            sizeof(*(newset->recs)), 0);
-               dbiIndexSetFree(newset);
-           }
-       } else if (rc != DB_NOTFOUND) {
-           rpmlog(RPMLOG_ERR,
-                  _("error(%d) getting \"%s\" records from %s index: %s\n"),
-                  rc, keyp ? keyp : "???", dbiName(dbi), db_strerror(rc));
+           /* If we got some results, not found is not an error */
+           if (rc == RPMRC_NOTFOUND && set != NULL)
+               rc = RPMRC_OK;
        }
+
+       dbiCursorFree(dbi, dbc);
     }
     return rc;
 }
 
-static int dbiGetToSet(dbiIndex dbi, const char *keyp, size_t keylen,
-                      dbiIndexSet *set)
+static rpmRC indexPrefixGet(dbiIndex dbi, const char *pfx, size_t plen,
+                           dbiIndexSet *set)
 {
-    int rc = EINVAL;
-    if (dbi != NULL && keyp != NULL) {
-       dbiCursor dbc = dbiCursorInit(dbi, 0);
+    rpmRC rc = RPMRC_FAIL; /* assume failure */
 
-       if (keylen == 0) {
-           keylen = strlen(keyp);
-           if (keylen == 0)
-               keylen++; /* XXX "/" fixup */
-       }
+    if (dbi != NULL && pfx) {
+       dbiCursor dbc = dbiCursorInit(dbi, DBC_READ);
 
-       rc = dbiCursorGetToSet(dbc, keyp, keylen, set);
+       if (plen == 0)
+           plen = strlen(pfx);
+       rc = idxdbGet(dbi, dbc, pfx, plen, set, DBC_PREFIX_SEARCH);
 
-       dbiCursorFree(dbc);
+       dbiCursorFree(dbi, dbc);
     }
     return rc;
 }
 
+
 typedef struct miRE_s {
     rpmTagVal          tag;            /*!< header tag */
     rpmMireMode                mode;           /*!< pattern match mode */
@@ -556,8 +277,6 @@ typedef struct miRE_s {
 
 struct rpmdbMatchIterator_s {
     rpmdbMatchIterator mi_next;
-    void *             mi_keyp;
-    size_t             mi_keylen;
     rpmdb              mi_db;
     rpmDbiTagVal       mi_rpmtag;
     dbiIndexSet                mi_set;
@@ -583,92 +302,28 @@ struct rpmdbIndexIterator_s {
     dbiIndex           ii_dbi;
     rpmDbiTag          ii_rpmtag;
     dbiCursor          ii_dbc;
-    DBT                        ii_key;
     dbiIndexSet                ii_set;
+    unsigned int       *ii_hdrNums;
 };
 
 static rpmdb rpmdbRock;
 static rpmdbMatchIterator rpmmiRock;
 static rpmdbIndexIterator rpmiiRock;
 
-int rpmdbCheckTerminate(int terminate)
-{
-    sigset_t newMask, oldMask;
-    static int terminating = 0;
-
-    if (terminating) return 0;
-
-    (void) sigfillset(&newMask);               /* block all signals */
-    (void) sigprocmask(SIG_BLOCK, &newMask, &oldMask);
-
-    if (rpmsqIsCaught(SIGINT) > 0
-     || rpmsqIsCaught(SIGQUIT) > 0
-     || rpmsqIsCaught(SIGHUP) > 0
-     || rpmsqIsCaught(SIGTERM) > 0
-     || rpmsqIsCaught(SIGPIPE) > 0
-     || terminate)
-       terminating = 1;
-
-    if (terminating) {
-       rpmdb db;
-       rpmdbMatchIterator mi;
-       rpmdbIndexIterator ii;
-
-       while ((mi = rpmmiRock) != NULL) {
-           rpmmiRock = mi->mi_next;
-           mi->mi_next = NULL;
-           rpmdbFreeIterator(mi);
-       }
-
-       while ((ii = rpmiiRock) != NULL) {
-           rpmiiRock = ii->ii_next;
-           ii->ii_next = NULL;
-           rpmdbIndexIteratorFree(ii);
-       }
-
-       while ((db = rpmdbRock) != NULL) {
-           rpmdbRock = db->db_next;
-           db->db_next = NULL;
-           (void) rpmdbClose(db);
-       }
-    }
-    sigprocmask(SIG_SETMASK, &oldMask, NULL);
-    return terminating;
-}
-
-int rpmdbCheckSignals(void)
+void rpmAtExit(void)
 {
-    if (rpmdbCheckTerminate(0)) {
-       rpmlog(RPMLOG_DEBUG, "Exiting on signal...\n");
-       exit(EXIT_FAILURE);
-    }
-    return 0;
-}
+    rpmdb db;
+    rpmdbMatchIterator mi;
+    rpmdbIndexIterator ii;
 
-/**
- * Block all signals, returning previous signal mask.
- */
-static int blockSignals(sigset_t * oldMask)
-{
-    sigset_t newMask;
+    while ((mi = rpmmiRock) != NULL)
+       rpmdbFreeIterator(mi);
 
-    (void) sigfillset(&newMask);               /* block all signals */
-    (void) sigprocmask(SIG_BLOCK, &newMask, oldMask);
-    (void) sigdelset(&newMask, SIGINT);
-    (void) sigdelset(&newMask, SIGQUIT);
-    (void) sigdelset(&newMask, SIGHUP);
-    (void) sigdelset(&newMask, SIGTERM);
-    (void) sigdelset(&newMask, SIGPIPE);
-    return sigprocmask(SIG_BLOCK, &newMask, NULL);
-}
+    while ((ii = rpmiiRock) != NULL)
+       rpmdbIndexIteratorFree(ii);
 
-/**
- * Restore signal mask.
- */
-static int unblockSignals(sigset_t * oldMask)
-{
-    (void) rpmdbCheckSignals();
-    return sigprocmask(SIG_SETMASK, oldMask, NULL);
+    while ((db = rpmdbRock) != NULL)
+       (void) rpmdbClose(db);
 }
 
 rpmop rpmdbOp(rpmdb rpmdb, rpmdbOpX opx)
@@ -705,20 +360,18 @@ int rpmdbOpenAll(rpmdb db)
 
     if (db == NULL) return -2;
 
-    for (int dbix = 0; dbix < dbiTagsMax; dbix++) {
-       dbiIndex dbi = db->_dbi[dbix];
-       if (dbi == NULL) {
-           rc += (rpmdbOpenIndex(db, dbiTags[dbix], db->db_flags) == NULL);
-       }
+    rc = pkgdbOpen(db, db->db_flags, NULL);
+    for (int dbix = 0; dbix < db->db_ndbi; dbix++) {
+       rc += indexOpen(db, db->db_tags[dbix], db->db_flags, NULL);
     }
     return rc;
 }
 
-static int dbiForeach(dbiIndex *dbis,
+static int dbiForeach(dbiIndex *dbis, int ndbi,
                  int (*func) (dbiIndex, unsigned int), int del)
 {
     int xx, rc = 0;
-    for (int dbix = dbiTagsMax; --dbix >= 0; ) {
+    for (int dbix = ndbi; --dbix >= 0; ) {
        if (dbis[dbix] == NULL)
            continue;
        xx = func(dbis[dbix], 0);
@@ -733,12 +386,16 @@ int rpmdbClose(rpmdb db)
 {
     rpmdb * prev, next;
     int rc = 0;
-    int dbmode;
 
     if (db == NULL)
        goto exit;
 
-    dbmode = db->db_mode;
+    prev = &rpmdbRock;
+    while ((next = *prev) != NULL && next != db)
+       prev = &next->db_next;
+    if (!next)
+       goto exit;
+
     (void) rpmdbUnlink(db);
 
     if (db->nrefs > 0)
@@ -746,19 +403,19 @@ int rpmdbClose(rpmdb db)
 
     /* Always re-enable fsync on close of rw-database */
     if ((db->db_mode & O_ACCMODE) != O_RDONLY)
-       dbSetFSync(db->db_dbenv, 1);
+       dbSetFSync(db, 1);
 
-    rc = dbiForeach(db->_dbi, dbiClose, 1);
+    if (db->db_pkgs)
+       rc = dbiClose(db->db_pkgs, 0);
+    rc += dbiForeach(db->db_indexes, db->db_ndbi, dbiClose, 1);
 
     db->db_root = _free(db->db_root);
     db->db_home = _free(db->db_home);
     db->db_fullpath = _free(db->db_fullpath);
     db->db_checked = dbChkFree(db->db_checked);
-    db->_dbi = _free(db->_dbi);
+    db->db_indexes = _free(db->db_indexes);
+    db->db_descr = _free(db->db_descr);
 
-    prev = &rpmdbRock;
-    while ((next = *prev) != NULL && next != db)
-       prev = &next->db_next;
     if (next) {
         *prev = next->db_next;
        next->db_next = NULL;
@@ -766,36 +423,39 @@ int rpmdbClose(rpmdb db)
 
     db = _free(db);
 
-    if (rpmdbRock == NULL && (dbmode & (O_RDWR|O_WRONLY)) != 0) {
-       (void) rpmsqEnable(-SIGHUP, NULL);
-       (void) rpmsqEnable(-SIGINT, NULL);
-       (void) rpmsqEnable(-SIGTERM, NULL);
-       (void) rpmsqEnable(-SIGQUIT, NULL);
-       (void) rpmsqEnable(-SIGPIPE, NULL);
+    if (rpmdbRock == NULL) {
+       rpmsqActivate(0);
     }
 exit:
     return rc;
 }
-
-int rpmdbSync(rpmdb db)
-{
-    if (db == NULL) return 0;
-
-    return dbiForeach(db->_dbi, dbiSync, 0);
-}
-
-int rpmdbSuspendResumeDBLock(rpmdb db, int mode)
-{
-    if (db == NULL) return 0;
-    return dbiForeach(db->_dbi, mode ? dbiResumeDBLock : dbiSuspendDBLock, 0);
-}
-
 static rpmdb newRpmdb(const char * root, const char * home,
                      int mode, int perms, int flags)
 {
     rpmdb db = NULL;
     char * db_home = rpmGetPath((home && *home) ? home : "%{_dbpath}", NULL);
 
+    static rpmDbiTag const dbiTags[] = {
+       RPMDBI_NAME,
+       RPMDBI_BASENAMES,
+       RPMDBI_GROUP,
+       RPMDBI_REQUIRENAME,
+       RPMDBI_PROVIDENAME,
+       RPMDBI_CONFLICTNAME,
+       RPMDBI_OBSOLETENAME,
+       RPMDBI_TRIGGERNAME,
+       RPMDBI_DIRNAMES,
+       RPMDBI_INSTALLTID,
+       RPMDBI_SIGMD5,
+       RPMDBI_SHA1HEADER,
+       RPMDBI_FILETRIGGERNAME,
+       RPMDBI_TRANSFILETRIGGERNAME,
+       RPMDBI_RECOMMENDNAME,
+       RPMDBI_SUGGESTNAME,
+       RPMDBI_SUPPLEMENTNAME,
+       RPMDBI_ENHANCENAME,
+    };
+
     if (!(db_home && db_home[0] != '%')) {
        rpmlog(RPMLOG_ERR, _("no dbpath has been set\n"));
        free(db_home);
@@ -815,8 +475,10 @@ static rpmdb newRpmdb(const char * root, const char * home,
     db->db_fullpath = rpmGenPath(db->db_root, db->db_home, NULL);
     /* XXX remove environment after chrooted operations, for now... */
     db->db_remove_env = (!rstreq(db->db_root, "/") ? 1 : 0);
-    db->_dbi = xcalloc(dbiTagsMax, sizeof(*db->_dbi));
-    db->db_ver = DB_VERSION_MAJOR; /* XXX just to put something in messages */
+    db->db_tags = dbiTags;
+    db->db_ndbi = sizeof(dbiTags) / sizeof(rpmDbiTag);
+    db->db_indexes = xcalloc(db->db_ndbi, sizeof(*db->db_indexes));
+    db->db_descr = xstrdup("unknown db");
     db->nrefs = 0;
     return rpmdbLink(db);
 }
@@ -838,19 +500,15 @@ static int openDatabase(const char * prefix,
     if (db == NULL)
        return 1;
 
-    /* Try to ensure db home exists, error out if we cant even create */
+    /* Try to ensure db home exists, error out if we can't even create */
     rc = rpmioMkpath(rpmdbHome(db), 0755, getuid(), getgid());
     if (rc == 0) {
-       if (rpmdbRock == NULL && (db->db_mode & (O_RDWR|O_WRONLY)) != 0) {
-           (void) rpmsqEnable(SIGHUP, NULL);
-           (void) rpmsqEnable(SIGINT, NULL);
-           (void) rpmsqEnable(SIGTERM, NULL);
-           (void) rpmsqEnable(SIGQUIT, NULL);
-           (void) rpmsqEnable(SIGPIPE, NULL);
+       if (rpmdbRock == NULL) {
+           rpmsqActivate(1);
        }
 
        /* Just the primary Packages database opened here */
-       rc = (rpmdbOpenIndex(db, RPMDBI_PACKAGES, db->db_flags) != NULL) ? 0 : -2;
+       rc = pkgdbOpen(db, db->db_flags, NULL);
     }
 
     if (rc || justCheck || dbp == NULL)
@@ -911,7 +569,10 @@ int rpmdbVerify(const char * prefix)
        int xx;
        rc = rpmdbOpenAll(db);
 
-       rc = dbiForeach(db->_dbi, dbiVerify, 0);
+       
+       if (db->db_pkgs)
+           rc += dbiVerify(db->db_pkgs, 0);
+       rc += dbiForeach(db->db_indexes, db->db_ndbi, dbiVerify, 0);
 
        xx = rpmdbClose(db);
        if (xx && rc == 0) rc = xx;
@@ -920,7 +581,7 @@ int rpmdbVerify(const char * prefix)
     return rc;
 }
 
-static Header rpmdbGetHeaderAt(rpmdb db, unsigned int offset)
+Header rpmdbGetHeaderAt(rpmdb db, unsigned int offset)
 {   
     rpmdbMatchIterator mi = rpmdbInitIterator(db, RPMDBI_PACKAGES,
                                              &offset, sizeof(offset));
@@ -936,9 +597,9 @@ static Header rpmdbGetHeaderAt(rpmdb db, unsigned int offset)
  * @param filespec
  * @param usestate     take file state into account?
  * @retval matches
- * @return             0 on success, 1 on not found, -2 on error
+ * @return             RPMRC_OK on match, RPMRC_NOMATCH or RPMRC_FAIL
  */
-static int rpmdbFindByFile(rpmdb db, dbiIndex dbi, const char *filespec,
+static rpmRC rpmdbFindByFile(rpmdb db, dbiIndex dbi, const char *filespec,
                           int usestate, dbiIndexSet * matches)
 {
     char * dirName = NULL;
@@ -947,7 +608,7 @@ static int rpmdbFindByFile(rpmdb db, dbiIndex dbi, const char *filespec,
     fingerPrint * fp1 = NULL;
     dbiIndexSet allMatches = NULL;
     unsigned int i;
-    int rc = -2; /* assume error */
+    rpmRC rc = RPMRC_FAIL; /* assume error */
 
     *matches = NULL;
     if (filespec == NULL) return rc; /* nothing alloced yet */
@@ -964,11 +625,11 @@ static int rpmdbFindByFile(rpmdb db, dbiIndex dbi, const char *filespec,
     if (baseName == NULL)
        goto exit;
 
-    rc = dbiGetToSet(dbi, baseName, 0, &allMatches);
+    rc = indexGet(dbi, baseName, 0, &allMatches);
 
     if (rc || allMatches == NULL) goto exit;
 
-    *matches = xcalloc(1, sizeof(**matches));
+    *matches = dbiIndexSetNew(0);
     fpc = fpCacheCreate(allMatches->count, NULL);
     fpLookup(fpc, dirName, baseName, &fp1);
 
@@ -996,7 +657,7 @@ static int rpmdbFindByFile(rpmdb db, dbiIndex dbi, const char *filespec,
            headerGet(h, RPMTAG_FILESTATES, &fs, HEADERGET_MINMEM);
 
        do {
-           int num = dbiIndexRecordFileNumber(allMatches, i);
+           unsigned int num = dbiIndexRecordFileNumber(allMatches, i);
            int skip = 0;
 
            if (usestate) {
@@ -1009,11 +670,8 @@ static int rpmdbFindByFile(rpmdb db, dbiIndex dbi, const char *filespec,
            if (!skip) {
                const char *dirName = dirNames[dirIndexes[num]];
                if (fpLookupEquals(fpc, fp1, dirName, baseNames[num])) {
-                   struct dbiIndexItem rec = { 
-                       .hdrNum = dbiIndexRecordOffset(allMatches, i),
-                       .tagNum = dbiIndexRecordFileNumber(allMatches, i),
-                   };
-                   dbiAppendSet(*matches, &rec, 1, sizeof(rec), 0);
+                   dbiIndexSetAppendOne(*matches, dbiIndexRecordOffset(allMatches, i),
+                                        dbiIndexRecordFileNumber(allMatches, i), 0);
                }
            }
 
@@ -1036,9 +694,9 @@ static int rpmdbFindByFile(rpmdb db, dbiIndex dbi, const char *filespec,
 
     if ((*matches)->count == 0) {
        *matches = dbiIndexSetFree(*matches);
-       rc = 1;
+       rc = RPMRC_NOTFOUND;
     } else {
-       rc = 0;
+       rc = RPMRC_OK;
     }
 
 exit:
@@ -1049,29 +707,29 @@ exit:
 
 int rpmdbCountPackages(rpmdb db, const char * name)
 {
-    int rc = -1;
-    dbiIndex dbi = rpmdbOpenIndex(db, RPMDBI_NAME, 0);
+    int count = -1;
+    dbiIndex dbi = NULL;
 
-    if (dbi != NULL && name != NULL) {
+    if (name != NULL && indexOpen(db, RPMDBI_NAME, 0, &dbi) == 0) {
        dbiIndexSet matches = NULL;
 
-       rc = dbiGetToSet(dbi, name, strlen(name), &matches);
+       rpmRC rc = indexGet(dbi, name, strlen(name), &matches);
 
-       if (rc == 0) {
-           rc = dbiIndexSetCount(matches);
+       if (rc == RPMRC_OK) {
+           count = dbiIndexSetCount(matches);
        } else {
-           rc = (rc == DB_NOTFOUND) ? 0 : -1;
+           count = (rc == RPMRC_NOTFOUND) ? 0 : -1;
        }
        dbiIndexSetFree(matches);
     }
 
-    return rc;
+    return count;
 }
 
 /**
  * Attempt partial matches on name[-version[-release]][.arch] strings.
  * @param db           rpmdb handle
- * @param dbc          index database cursor
+ * @param dbi          index database
  * @param name         package name
  * @param epoch        package epoch (-1 for any epoch)
  * @param version      package version (can be a pattern)
@@ -1080,7 +738,7 @@ int rpmdbCountPackages(rpmdb db, const char * name)
  * @retval matches     set of header instances that match
  * @return             RPMRC_OK on match, RPMRC_NOMATCH or RPMRC_FAIL
  */
-static rpmRC dbiFindMatches(rpmdb db, dbiCursor dbc,
+static rpmRC dbiFindMatches(rpmdb db, dbiIndex dbi,
                const char * name,
                int64_t epoch,
                const char * version,
@@ -1089,16 +747,18 @@ static rpmRC dbiFindMatches(rpmdb db, dbiCursor dbc,
                dbiIndexSet * matches)
 {
     unsigned int gotMatches = 0;
-    int rc;
+    rpmRC rc;
     unsigned int i;
 
-    rc = dbiCursorGetToSet(dbc, name, strlen(name), matches);
+    rc = indexGet(dbi, name, strlen(name), matches);
 
-    if (rc != 0) {
-       return (rc == DB_NOTFOUND) ? RPMRC_NOTFOUND : RPMRC_FAIL;
-    } else if (epoch < 0 && version == NULL && release == NULL && arch == NULL) {
-       return RPMRC_OK;
-    }
+    /* No matches on the name, anything else wont match either */
+    if (rc != RPMRC_OK)
+       goto exit;
+    
+    /* If we got matches on name and nothing else was specified, we're done */
+    if (epoch < 0 && version == NULL && release == NULL && arch == NULL)
+       goto exit;
 
     /* Make sure the version and release match. */
     for (i = 0; i < dbiIndexSetCount(*matches); i++) {
@@ -1184,16 +844,14 @@ static rpmRC dbiFindByLabelArch(rpmdb db, dbiIndex dbi,
     char c;
     int brackets;
     rpmRC rc;
-    dbiCursor dbc;
 
     if (arglen == 0) return RPMRC_NOTFOUND;
 
     strncpy(localarg, arg, arglen);
     localarg[arglen] = '\0';
 
-    dbc = dbiCursorInit(dbi, 0);
     /* did they give us just a name? */
-    rc = dbiFindMatches(db, dbc, localarg, -1, NULL, NULL, arch, matches);
+    rc = dbiFindMatches(db, dbi, localarg, -1, NULL, NULL, arch, matches);
     if (rc != RPMRC_NOTFOUND)
        goto exit;
 
@@ -1228,7 +886,7 @@ static rpmRC dbiFindByLabelArch(rpmdb db, dbiIndex dbi,
     *s = '\0';
 
     epoch = splitEpoch(s + 1, &version);
-    rc = dbiFindMatches(db, dbc, localarg, epoch, version, NULL, arch, matches);
+    rc = dbiFindMatches(db, dbi, localarg, epoch, version, NULL, arch, matches);
     if (rc != RPMRC_NOTFOUND) goto exit;
 
     /* FIX: double indirection */
@@ -1262,9 +920,8 @@ static rpmRC dbiFindByLabelArch(rpmdb db, dbiIndex dbi,
     *s = '\0';
        /* FIX: *matches may be NULL. */
     epoch = splitEpoch(s + 1, &version);
-    rc = dbiFindMatches(db, dbc, localarg, epoch, version, release, arch, matches);
+    rc = dbiFindMatches(db, dbi, localarg, epoch, version, release, arch, matches);
 exit:
-    dbiCursorFree(dbc);
     return rc;
 }
 
@@ -1298,22 +955,16 @@ static int miFreeHeader(rpmdbMatchIterator mi, dbiIndex dbi)
        return 0;
 
     if (dbi && mi->mi_dbc && mi->mi_modified && mi->mi_prevoffset) {
-       DBT key, data;
-       sigset_t signalMask;
        rpmRC rpmrc = RPMRC_NOTFOUND;
-
-       memset(&key, 0, sizeof(key));
-       memset(&data, 0, sizeof(data));
-       key.data = (void *) &mi->mi_prevoffset;
-       key.size = sizeof(mi->mi_prevoffset);
-       data.data = headerExport(mi->mi_h, &data.size);
+       unsigned int hdrLen = 0;
+       unsigned char *hdrBlob = headerExport(mi->mi_h, &hdrLen);
 
        /* Check header digest/signature on blob export (if requested). */
        if (mi->mi_hdrchk && mi->mi_ts) {
            char * msg = NULL;
            int lvl;
 
-           rpmrc = (*mi->mi_hdrchk) (mi->mi_ts, data.data, data.size, &msg);
+           rpmrc = (*mi->mi_hdrchk) (mi->mi_ts, hdrBlob, hdrLen, &msg);
            lvl = (rpmrc == RPMRC_FAIL ? RPMLOG_ERR : RPMLOG_DEBUG);
            rpmlog(lvl, "%s h#%8u %s",
                (rpmrc == RPMRC_FAIL ? _("miFreeHeader: skipping") : "write"),
@@ -1321,19 +972,22 @@ static int miFreeHeader(rpmdbMatchIterator mi, dbiIndex dbi)
            msg = _free(msg);
        }
 
-       if (data.data != NULL && rpmrc != RPMRC_FAIL) {
-           (void) blockSignals(&signalMask);
-           rc = dbiCursorPut(mi->mi_dbc, &key, &data, DB_KEYLAST);
+       if (hdrBlob != NULL && rpmrc != RPMRC_FAIL) {
+           rpmsqBlock(SIG_BLOCK);
+           dbCtrl(mi->mi_db, DB_CTRL_LOCK_RW);
+           rc = pkgdbPut(dbi, mi->mi_dbc, mi->mi_prevoffset,
+                         hdrBlob, hdrLen);
+           dbCtrl(mi->mi_db, DB_CTRL_INDEXSYNC);
+           dbCtrl(mi->mi_db, DB_CTRL_UNLOCK_RW);
+           rpmsqBlock(SIG_UNBLOCK);
+
            if (rc) {
                rpmlog(RPMLOG_ERR,
                        _("error(%d) storing record #%d into %s\n"),
                        rc, mi->mi_prevoffset, dbiName(dbi));
            }
-           dbiSync(dbi, 0);
-           (void) unblockSignals(&signalMask);
        }
-       data.data = _free(data.data);
-       data.size = 0;
+       free(hdrBlob);
     }
 
     mi->mi_h = headerFree(mi->mi_h);
@@ -1344,7 +998,7 @@ static int miFreeHeader(rpmdbMatchIterator mi, dbiIndex dbi)
 rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi)
 {
     rpmdbMatchIterator * prev, next;
-    dbiIndex dbi;
+    dbiIndex dbi = NULL;
     int i;
 
     if (mi == NULL)
@@ -1356,13 +1010,14 @@ rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi)
     if (next) {
        *prev = next->mi_next;
        next->mi_next = NULL;
-    }
+    } else
+       return NULL;
 
-    dbi = rpmdbOpenIndex(mi->mi_db, RPMDBI_PACKAGES, 0);
+    pkgdbOpen(mi->mi_db, 0, &dbi);
 
     miFreeHeader(mi, dbi);
 
-    mi->mi_dbc = dbiCursorFree(mi->mi_dbc);
+    mi->mi_dbc = dbiCursorFree(dbi, mi->mi_dbc);
 
     if (mi->mi_re != NULL)
     for (i = 0; i < mi->mi_nre; i++) {
@@ -1376,13 +1031,12 @@ rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi)
     mi->mi_re = _free(mi->mi_re);
 
     mi->mi_set = dbiIndexSetFree(mi->mi_set);
-    mi->mi_keyp = _free(mi->mi_keyp);
     rpmdbClose(mi->mi_db);
     mi->mi_ts = rpmtsFree(mi->mi_ts);
 
     mi = _free(mi);
 
-    (void) rpmdbCheckSignals();
+    (void) rpmsqPoll();
 
     return NULL;
 }
@@ -1402,6 +1056,24 @@ int rpmdbGetIteratorCount(rpmdbMatchIterator mi)
     return (mi && mi->mi_set ?  mi->mi_set->count : 0);
 }
 
+int rpmdbGetIteratorIndex(rpmdbMatchIterator mi)
+{
+    return (mi ? mi->mi_setx : 0);
+}
+
+void rpmdbSetIteratorIndex(rpmdbMatchIterator mi, unsigned int ix)
+{
+    if (mi)
+       mi->mi_setx = ix;
+}
+
+unsigned int rpmdbGetIteratorOffsetFor(rpmdbMatchIterator mi, unsigned int ix)
+{
+    if (mi && mi->mi_set && ix < mi->mi_set->count)
+       return mi->mi_set->recs[ix].hdrNum;
+    return 0;
+}
+
 /**
  * Return pattern match.
  * @param mire         match iterator regex
@@ -1714,11 +1386,11 @@ int rpmdbSetIteratorRewrite(rpmdbMatchIterator mi, int rewrite)
     int rc;
     if (mi == NULL)
        return 0;
-    rc = (mi->mi_cflags & DB_WRITECURSOR) ? 1 : 0;
+    rc = (mi->mi_cflags & DBC_WRITE) ? 1 : 0;
     if (rewrite)
-       mi->mi_cflags |= DB_WRITECURSOR;
+       mi->mi_cflags |= DBC_WRITE;
     else
-       mi->mi_cflags &= ~DB_WRITECURSOR;
+       mi->mi_cflags &= ~DBC_WRITE;
     return rc;
 }
 
@@ -1766,9 +1438,9 @@ static rpmRC miVerifyHeader(rpmdbMatchIterator mi, const void *uh, size_t uhlen)
 
        rpmrc = (*mi->mi_hdrchk) (mi->mi_ts, uh, uhlen, &msg);
        lvl = (rpmrc == RPMRC_FAIL ? RPMLOG_ERR : RPMLOG_DEBUG);
-       rpmlog(lvl, "%s h#%8u %s",
+       rpmlog(lvl, "%s h#%8u %s\n",
            (rpmrc == RPMRC_FAIL ? _("rpmdbNextIterator: skipping") : " read"),
-                   mi->mi_offset, (msg ? msg : "\n"));
+                   mi->mi_offset, (msg ? msg : ""));
        msg = _free(msg);
 
        /* Mark header checked. */
@@ -1782,20 +1454,16 @@ static rpmRC miVerifyHeader(rpmdbMatchIterator mi, const void *uh, size_t uhlen)
 /* FIX: mi->mi_key.data may be NULL */
 Header rpmdbNextIterator(rpmdbMatchIterator mi)
 {
-    dbiIndex dbi;
-    void * uh;
+    dbiIndex dbi = NULL;
+    unsigned char * uh;
     unsigned int uhlen;
-    DBT key, data;
-    void * keyp;
-    size_t keylen;
     int rc;
     headerImportFlags importFlags = HEADERIMPORT_FAST;
 
     if (mi == NULL)
        return NULL;
 
-    dbi = rpmdbOpenIndex(mi->mi_db, RPMDBI_PACKAGES, 0);
-    if (dbi == NULL)
+    if (pkgdbOpen(mi->mi_db, 0, &dbi))
        return NULL;
 
 #if defined(_USE_COPY_LOAD)
@@ -1803,63 +1471,26 @@ Header rpmdbNextIterator(rpmdbMatchIterator mi)
 #endif
     /*
      * Cursors are per-iterator, not per-dbi, so get a cursor for the
-     * iterator on 1st call. If the iteration is to rewrite headers, and the
-     * CDB model is used for the database, then the cursor needs to
-     * marked with DB_WRITECURSOR as well.
+     * iterator on 1st call. If the iteration is to rewrite headers,
+     * then the cursor needs to marked with DBC_WRITE as well.
      */
     if (mi->mi_dbc == NULL)
        mi->mi_dbc = dbiCursorInit(dbi, mi->mi_cflags);
 
-    memset(&key, 0, sizeof(key));
-    memset(&data, 0, sizeof(data));
-
 top:
     uh = NULL;
     uhlen = 0;
 
     do {
-       union _dbswap mi_offset;
-
        if (mi->mi_set) {
            if (!(mi->mi_setx < mi->mi_set->count))
                return NULL;
            mi->mi_offset = dbiIndexRecordOffset(mi->mi_set, mi->mi_setx);
            mi->mi_filenum = dbiIndexRecordFileNumber(mi->mi_set, mi->mi_setx);
-           mi_offset.ui = mi->mi_offset;
-           if (dbiByteSwapped(dbi) == 1)
-               _DBSWAP(mi_offset);
-           keyp = &mi_offset;
-           keylen = sizeof(mi_offset.ui);
        } else {
-
-           key.data = keyp = (void *)mi->mi_keyp;
-           key.size = keylen = mi->mi_keylen;
-           data.data = uh;
-           data.size = uhlen;
-#if !defined(_USE_COPY_LOAD)
-           data.flags |= DB_DBT_MALLOC;
-#endif
-           rc = dbiCursorGet(mi->mi_dbc, &key, &data,
-                             (key.data == NULL ? DB_NEXT : DB_SET));
-           data.flags = 0;
-           keyp = key.data;
-           keylen = key.size;
-           uh = data.data;
-           uhlen = data.size;
-
-           /*
-            * If we got the next key, save the header instance number.
-            *
-            * Instance 0 (i.e. mi->mi_setx == 0) is the
-            * largest header instance in the database, and should be
-            * skipped.
-            */
-           if (keyp && mi->mi_setx && rc == 0) {
-               memcpy(&mi_offset, keyp, sizeof(mi_offset.ui));
-               if (dbiByteSwapped(dbi) == 1)
-                   _DBSWAP(mi_offset);
-               mi->mi_offset = mi_offset.ui;
-           }
+           rc = pkgdbGet(dbi, mi->mi_dbc, 0, &uh, &uhlen);
+           if (rc == 0)
+               mi->mi_offset = pkgdbKey(dbi, mi->mi_dbc);
 
            /* Terminate on error or end of keys */
            if (rc || (mi->mi_setx && mi->mi_offset == 0))
@@ -1869,22 +1500,12 @@ top:
     } while (mi->mi_offset == 0);
 
     /* If next header is identical, return it now. */
-    if (mi->mi_prevoffset && mi->mi_offset == mi->mi_prevoffset) {
-       /* ...but rpmdb record numbers are unique, avoid endless loop */
-       return (mi->mi_rpmtag == RPMDBI_PACKAGES) ? NULL : mi->mi_h;
-    }
+    if (mi->mi_prevoffset && mi->mi_offset == mi->mi_prevoffset)
+       return mi->mi_h;
 
     /* Retrieve next header blob for index iterator. */
     if (uh == NULL) {
-       key.data = keyp;
-       key.size = keylen;
-#if !defined(_USE_COPY_LOAD)
-       data.flags |= DB_DBT_MALLOC;
-#endif
-       rc = dbiCursorGet(mi->mi_dbc, &key, &data, DB_SET);
-       data.flags = 0;
-       uh = data.data;
-       uhlen = data.size;
+       rc = pkgdbGet(dbi, mi->mi_dbc, mi->mi_offset, &uh, &uhlen);
        if (rc)
            return NULL;
     }
@@ -1914,10 +1535,7 @@ top:
      * Skip this header if iterator selector (if any) doesn't match.
      */
     if (mireSkip(mi)) {
-       /* XXX hack, can't restart with Packages locked on single instance. */
-       if (mi->mi_set || mi->mi_keyp == NULL)
-           goto top;
-       return NULL;
+       goto top;
     }
     headerSetInstance(mi->mi_h, mi->mi_offset);
 
@@ -1934,22 +1552,19 @@ top:
  */
 void rpmdbSortIterator(rpmdbMatchIterator mi)
 {
-    if (mi && mi->mi_set && mi->mi_set->recs && mi->mi_set->count > 0) {
-    /*
-     * mergesort is much (~10x with lots of identical basenames) faster
-     * than pure quicksort, but glibc uses msort_with_tmp() on stack.
-     */
-#if defined(__GLIBC__)
-       qsort(mi->mi_set->recs, mi->mi_set->count,
-               sizeof(*mi->mi_set->recs), hdrNumCmp);
-#else
-       mergesort(mi->mi_set->recs, mi->mi_set->count,
-               sizeof(*mi->mi_set->recs), hdrNumCmp);
-#endif
+    if (mi && mi->mi_set) {
+       dbiIndexSetSort(mi->mi_set);
        mi->mi_sorted = 1;
     }
 }
 
+void rpmdbUniqIterator(rpmdbMatchIterator mi)
+{
+    if (mi && mi->mi_set) {
+       dbiIndexSetUniq(mi->mi_set, mi->mi_sorted);
+    }
+}
+
 int rpmdbExtendIterator(rpmdbMatchIterator mi,
                        const void * keyp, size_t keylen)
 {
@@ -1960,16 +1575,13 @@ int rpmdbExtendIterator(rpmdbMatchIterator mi,
     if (mi == NULL || keyp == NULL)
        return rc;
 
-    dbi = rpmdbOpenIndex(mi->mi_db, mi->mi_rpmtag, 0);
+    rc = indexOpen(mi->mi_db, mi->mi_rpmtag, 0, &dbi);
 
-    if (dbiGetToSet(dbi, keyp, keylen, &set) == 0) {
+    if (rc == 0 && indexGet(dbi, keyp, keylen, &set) == RPMRC_OK) {
        if (mi->mi_set == NULL) {
            mi->mi_set = set;
        } else {
-           dbiGrowSet(mi->mi_set, set->count);
-           memcpy(mi->mi_set->recs + mi->mi_set->count, set->recs,
-                   set->count * sizeof(*(mi->mi_set->recs)));
-           mi->mi_set->count += set->count;
+           dbiIndexSetAppendSet(mi->mi_set, set, 0);
            dbiIndexSetFree(set);
        }
        rc = 0;
@@ -1978,22 +1590,31 @@ int rpmdbExtendIterator(rpmdbMatchIterator mi,
     return rc;
 }
 
-int rpmdbPruneIterator(rpmdbMatchIterator mi, removedHash hdrNums)
+int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash hdrNums, int neg)
 {
-    if (mi == NULL || hdrNums == NULL || removedHashNumKeys(hdrNums) <= 0)
+    if (mi == NULL || hdrNums == NULL)
        return 1;
 
     if (!mi->mi_set)
-        return 0;
+       return 0;
+
+    if (packageHashNumKeys(hdrNums) == 0) {
+       if (!neg)
+           mi->mi_set->count = 0;
+       return 0;
+    }
 
     unsigned int from;
     unsigned int to = 0;
     unsigned int num = mi->mi_set->count;
+    int cond;
 
     assert(mi->mi_set->count > 0);
 
     for (from = 0; from < num; from++) {
-       if (removedHashHasEntry(hdrNums, mi->mi_set->recs[from].hdrNum)) {
+       cond = !packageHashHasEntry(hdrNums, mi->mi_set->recs[from].hdrNum);
+       cond = neg ? !cond : cond;
+       if (cond) {
            mi->mi_set->count--;
            continue;
        }
@@ -2004,27 +1625,42 @@ int rpmdbPruneIterator(rpmdbMatchIterator mi, removedHash hdrNums)
     return 0;
 }
 
-int rpmdbAppendIterator(rpmdbMatchIterator mi, const int * hdrNums, int nHdrNums)
+int rpmdbPruneIterator(rpmdbMatchIterator mi, packageHash hdrNums)
 {
-    if (mi == NULL || hdrNums == NULL || nHdrNums <= 0)
+    if (packageHashNumKeys(hdrNums) <= 0)
        return 1;
 
-    if (mi->mi_set == NULL)
-       mi->mi_set = xcalloc(1, sizeof(*mi->mi_set));
-    (void) dbiAppendSet(mi->mi_set, hdrNums, nHdrNums, sizeof(*hdrNums), 0);
-    return 0;
+    return rpmdbFilterIterator(mi, hdrNums, 1);
 }
 
-rpmdbMatchIterator rpmdbNewIterator(rpmdb db, rpmDbiTagVal dbitag)
+
+int rpmdbAppendIterator(rpmdbMatchIterator mi,
+                       const unsigned int * hdrNums, unsigned int nHdrNums)
+{
+    if (mi == NULL || hdrNums == NULL || nHdrNums == 0)
+       return 1;
+
+    if (mi->mi_set == NULL)
+       mi->mi_set = dbiIndexSetNew(nHdrNums);
+
+    for (unsigned int i = 0; i < nHdrNums; i++)
+       dbiIndexSetAppendOne(mi->mi_set, hdrNums[i], 0, 0);
+    return 0;
+}
+
+rpmdbMatchIterator rpmdbNewIterator(rpmdb db, rpmDbiTagVal dbitag)
 {
     rpmdbMatchIterator mi = NULL;
 
-    if (rpmdbOpenIndex(db, dbitag, 0) == NULL)
-       return NULL;
+    if (dbitag == RPMDBI_PACKAGES) {
+       if (pkgdbOpen(db, 0, NULL))
+           return NULL;
+    } else {
+       if (indexOpen(db, dbitag, 0, NULL))
+           return NULL;
+    }
 
     mi = xcalloc(1, sizeof(*mi));
-    mi->mi_keyp = NULL;
-    mi->mi_keylen = 0;
     mi->mi_set = NULL;
     mi->mi_db = rpmdbLink(db);
     mi->mi_rpmtag = dbitag;
@@ -2051,19 +1687,32 @@ rpmdbMatchIterator rpmdbNewIterator(rpmdb db, rpmDbiTagVal dbitag)
     return mi;
 };
 
-rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmDbiTagVal rpmtag,
-               const void * keyp, size_t keylen)
+static rpmdbMatchIterator pkgdbIterInit(rpmdb db,
+                                   const unsigned int * keyp, size_t keylen)
 {
     rpmdbMatchIterator mi = NULL;
-    dbiIndexSet set = NULL;
-    dbiIndex dbi;
-    void * mi_keyp = NULL;
-    rpmDbiTagVal dbtag = rpmtag;
+    rpmDbiTagVal dbtag = RPMDBI_PACKAGES;
+    dbiIndex pkgs = NULL;
 
-    if (db == NULL)
+    /* Require a sane keylen if one is specified */
+    if (keyp && keylen != sizeof(*keyp))
        return NULL;
 
-    (void) rpmdbCheckSignals();
+    if (pkgdbOpen(db, 0, &pkgs) == 0) {
+       mi = rpmdbNewIterator(db, dbtag);
+       if (keyp)
+           rpmdbAppendIterator(mi, keyp, 1);
+    }
+    return mi;
+}
+
+static rpmdbMatchIterator indexIterInit(rpmdb db, rpmDbiTagVal rpmtag,
+                                       const void * keyp, size_t keylen)
+{
+    rpmdbMatchIterator mi = NULL;
+    rpmDbiTagVal dbtag = rpmtag;
+    dbiIndex dbi = NULL;
+    dbiIndexSet set = NULL;
 
     /* Fixup the physical index for our pseudo indexes */
     if (rpmtag == RPMDBI_LABEL) {
@@ -2072,19 +1721,10 @@ rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmDbiTagVal rpmtag,
        dbtag = RPMDBI_BASENAMES;
     }
 
-    dbi = rpmdbOpenIndex(db, dbtag, 0);
-    if (dbi == NULL)
-       return NULL;
-
-    /*
-     * Handle label and file name special cases.
-     * Otherwise, retrieve join keys for secondary lookup.
-     */
-    if (rpmtag != RPMDBI_PACKAGES) {
+    if (indexOpen(db, dbtag, 0, &dbi) == 0) {
        int rc = 0;
 
         if (keyp) {
-
             if (rpmtag == RPMDBI_LABEL) {
                 rc = dbiFindByLabel(db, dbi, keyp, &set);
             } else if (rpmtag == RPMDBI_BASENAMES) {
@@ -2092,117 +1732,130 @@ rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmDbiTagVal rpmtag,
             } else if (rpmtag == RPMDBI_INSTFILENAMES) {
                 rc = rpmdbFindByFile(db, dbi, keyp, 1, &set);
             } else {
-               rc = dbiGetToSet(dbi, keyp, keylen, &set);
+               rc = indexGet(dbi, keyp, keylen, &set);
            }
        } else {
             /* get all entries from index */
-           dbiCursor dbc = dbiCursorInit(dbi, 0);
-
-           do {
-               rc = dbiCursorGetToSet(dbc, NULL, 0, &set);
-           } while (rc == 0);
-
-           /* If we got some results, not found is not an error */
-           if (rc == DB_NOTFOUND && set != NULL)
-               rc = 0;
-
-           dbiCursorFree(dbc);
+           rc = indexGet(dbi, NULL, 0, &set);
         }
 
        if (rc) {       /* error/not found */
            set = dbiIndexSetFree(set);
-           goto exit;
+       } else {
+           mi = rpmdbNewIterator(db, dbtag);
+           mi->mi_set = set;
+
+           if (keyp) {
+               rpmdbSortIterator(mi);
+           }
        }
     }
+    
+    return mi;
+}
 
-    /* Copy the retrieval key, byte swapping header instance if necessary. */
-    if (keyp) {
-       switch (dbtag) {
-       case RPMDBI_PACKAGES:
-         { union _dbswap *k;
+rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmDbiTagVal rpmtag,
+               const void * keyp, size_t keylen)
+{
+    rpmdbMatchIterator mi = NULL;
 
-           assert(keylen == sizeof(k->ui));    /* xxx programmer error */
-           k = xmalloc(sizeof(*k));
-           memcpy(k, keyp, keylen);
-           if (dbiByteSwapped(dbi) == 1)
-               _DBSWAP(*k);
-           mi_keyp = k;
-         } break;
-       default:
-         { char * k;
-           if (keylen == 0)
-               keylen = strlen(keyp);
-           k = xmalloc(keylen + 1);
-           memcpy(k, keyp, keylen);
-           k[keylen] = '\0';   /* XXX assumes strings */
-           mi_keyp = k;
-         } break;
-       }
+    if (db != NULL) {
+       (void) rpmsqPoll();
+
+       if (rpmtag == RPMDBI_PACKAGES)
+           mi = pkgdbIterInit(db, keyp, keylen);
+       else
+           mi = indexIterInit(db, rpmtag, keyp, keylen);
     }
 
-    mi = rpmdbNewIterator(db, dbtag);
-    mi->mi_keyp = mi_keyp;
-    mi->mi_keylen = keylen;
-    mi->mi_set = set;
+    return mi;
+}
+
+rpmdbMatchIterator rpmdbInitPrefixIterator(rpmdb db, rpmDbiTagVal rpmtag,
+                                           const void * pfx, size_t plen)
+{
+    rpmdbMatchIterator mi = NULL;
+    dbiIndexSet set = NULL;
+    dbiIndex dbi = NULL;
+    rpmDbiTagVal dbtag = rpmtag;
+
+    if (!pfx)
+       return NULL;
+
+    if (db != NULL && rpmtag != RPMDBI_PACKAGES) {
+       (void) rpmsqPoll();
+
+
+       if (indexOpen(db, dbtag, 0, &dbi) == 0) {
+           int rc = 0;
+
+           rc = indexPrefixGet(dbi, pfx, plen, &set);
+
+           if (rc)     {
+               set = dbiIndexSetFree(set);
+           } else {
+               mi = rpmdbNewIterator(db, dbtag);
+               mi->mi_set = set;
+               rpmdbSortIterator(mi);
+           }
+       }
 
-    if (dbtag != RPMDBI_PACKAGES && keyp == NULL) {
-        rpmdbSortIterator(mi);
     }
 
-exit:
     return mi;
 }
 
 /*
  * Convert current tag data to db key
  * @param tagdata      Tag data container
- * @retval key         DB key struct
- * @retval freedata    Should key.data be freed afterwards
- * Return 0 to signal this item should be discarded (ie continue)
+ * @retval keylen      Length of key
+ * @return             Pointer to key value or NULL to signal skip 
  */
-static int td2key(rpmtd tagdata, DBT *key, int *freedata
+static const void * td2key(rpmtd tagdata, unsigned int *keylen
 {
+    const void * data = NULL;
+    unsigned int size = 0;
     const char *str = NULL;
 
-    *freedata = 0; 
     switch (rpmtdType(tagdata)) {
     case RPM_CHAR_TYPE:
     case RPM_INT8_TYPE:
-       key->size = sizeof(uint8_t);
-       key->data = rpmtdGetChar(tagdata);
+       size = sizeof(uint8_t);
+       data = rpmtdGetChar(tagdata);
        break;
     case RPM_INT16_TYPE:
-       key->size = sizeof(uint16_t);
-       key->data = rpmtdGetUint16(tagdata);
+       size = sizeof(uint16_t);
+       data = rpmtdGetUint16(tagdata);
        break;
     case RPM_INT32_TYPE:
-       key->size = sizeof(uint32_t);
-       key->data = rpmtdGetUint32(tagdata);
+       size = sizeof(uint32_t);
+       data = rpmtdGetUint32(tagdata);
        break;
     case RPM_INT64_TYPE:
-       key->size = sizeof(uint64_t);
-       key->data = rpmtdGetUint64(tagdata);
+       size = sizeof(uint64_t);
+       data = rpmtdGetUint64(tagdata);
        break;
     case RPM_BIN_TYPE:
-       key->size = tagdata->count;
-       key->data = tagdata->data;
+       size = tagdata->count;
+       data = tagdata->data;
        break;
     case RPM_STRING_TYPE:
     case RPM_I18NSTRING_TYPE:
     case RPM_STRING_ARRAY_TYPE:
-    default:
        str = rpmtdGetString(tagdata);
-       key->data = (char *) str; /* XXX discards const */
-       key->size = strlen(str);
+       if (str) {
+           size = strlen(str);
+           data = str;
+       }
+       break;
+    default:
        break;
     }
 
-    if (key->size == 0) 
-       key->size = strlen((char *)key->data);
-    if (key->size == 0) 
-       key->size++;    /* XXX "/" fixup. */
+    if (data && keylen)
+       *keylen = size;
 
-    return 1;
+    return data;
 }
 /*
  * rpmdbIndexIterator
@@ -2216,10 +1869,9 @@ rpmdbIndexIterator rpmdbIndexIteratorInit(rpmdb db, rpmDbiTag rpmtag)
     if (db == NULL)
        return NULL;
 
-    (void) rpmdbCheckSignals();
+    (void) rpmsqPoll();
 
-    dbi = rpmdbOpenIndex(db, rpmtag, 0);
-    if (dbi == NULL)
+    if (indexOpen(db, rpmtag, 0, &dbi))
        return NULL;
 
     /* Chain cursors for teardown on abnormal exit. */
@@ -2238,37 +1890,69 @@ rpmdbIndexIterator rpmdbIndexIteratorInit(rpmdb db, rpmDbiTag rpmtag)
 int rpmdbIndexIteratorNext(rpmdbIndexIterator ii, const void ** key, size_t * keylen)
 {
     int rc;
-    DBT data;
+    unsigned int iikeylen = 0; /* argh, size_t vs uint pointer... */
 
     if (ii == NULL)
        return -1;
 
     if (ii->ii_dbc == NULL)
-       ii->ii_dbc = dbiCursorInit(ii->ii_dbi, 0);
+       ii->ii_dbc = dbiCursorInit(ii->ii_dbi, DBC_READ);
 
     /* free old data */
     ii->ii_set = dbiIndexSetFree(ii->ii_set);
 
-    memset(&data, 0, sizeof(data));
-    rc = dbiCursorGet(ii->ii_dbc, &ii->ii_key, &data, DB_NEXT);
+    rc = idxdbGet(ii->ii_dbi, ii->ii_dbc, NULL, 0, &ii->ii_set, DBC_NORMAL_SEARCH);
 
-    if (rc != 0) { 
-        *key = NULL;
-        *keylen = 0;
+    *key = idxdbKey(ii->ii_dbi, ii->ii_dbc, &iikeylen);
+    *keylen = iikeylen;
 
-        if (rc != DB_NOTFOUND) {
-            rpmlog(RPMLOG_ERR,
-                   _("error(%d:%s) getting next key from %s index\n"),
-                   rc, db_strerror(rc), rpmTagGetName(ii->ii_rpmtag));
-        }
-        return -1;
-    }
+    return (rc == RPMRC_OK) ? 0 : -1;
+}
+
+int rpmdbIndexIteratorNextTd(rpmdbIndexIterator ii, rpmtd keytd)
+{
+    size_t keylen = 0;
+    const void * keyp = NULL;
 
-    (void) dbt2set(ii->ii_dbi, &data, &ii->ii_set);
-    *key = ii->ii_key.data;
-    *keylen = ii->ii_key.size;
+    int rc = rpmdbIndexIteratorNext(ii, &keyp, &keylen);
 
-    return 0;
+    if (rc == 0) {
+       rpmTagVal tag = ii->ii_rpmtag;
+       rpmTagClass tagclass = rpmTagGetClass(tag);
+
+       /* Set the common values, overridden below as necessary */
+       keytd->type = rpmTagGetTagType(tag);
+       keytd->tag = tag;
+       keytd->flags = RPMTD_ALLOCED;
+       keytd->count = 1;
+
+       switch (tagclass) {
+       case RPM_STRING_CLASS: {
+           /*
+            * XXX: We never return arrays here, so everything is a
+            * "simple" string. However this can disagree with the
+            * type of the index tag, eg requires are string arrays.
+            */
+           char *key = memcpy(xmalloc(keylen + 1), keyp, keylen);
+           key[keylen] = '\0';
+           keytd->data = key;
+           keytd->type = RPM_STRING_TYPE;
+           } break;
+       case RPM_BINARY_CLASS:
+           /* Binary types abuse count for data length */
+           keytd->count = keylen;
+           /* fallthrough */
+       case RPM_NUMERIC_CLASS:
+           keytd->data = memcpy(xmalloc(keylen), keyp, keylen);
+           break;
+       default:
+           rpmtdReset(keytd);
+           rc = -1;
+           break;
+       }
+    }
+    
+    return rc;
 }
 
 unsigned int rpmdbIndexIteratorNumPkgs(rpmdbIndexIterator ii)
@@ -2285,6 +1969,24 @@ unsigned int rpmdbIndexIteratorPkgOffset(rpmdbIndexIterator ii, unsigned int nr)
     return dbiIndexRecordOffset(ii->ii_set, nr);
 }
 
+unsigned int *rpmdbIndexIteratorPkgOffsets(rpmdbIndexIterator ii)
+{
+    int i;
+
+    if (!ii || !ii->ii_set)
+       return NULL;
+
+    if (ii->ii_hdrNums)
+       ii->ii_hdrNums = _free(ii->ii_hdrNums);
+
+    ii->ii_hdrNums = xmalloc(sizeof(*ii->ii_hdrNums) * ii->ii_set->count);
+    for (i = 0; i < ii->ii_set->count; i++) {
+       ii->ii_hdrNums[i] = ii->ii_set->recs[i].hdrNum;
+    }
+
+    return ii->ii_hdrNums;
+}
+
 unsigned int rpmdbIndexIteratorTagNum(rpmdbIndexIterator ii, unsigned int nr)
 {
     if (!ii || !ii->ii_set)
@@ -2307,13 +2009,17 @@ rpmdbIndexIterator rpmdbIndexIteratorFree(rpmdbIndexIterator ii)
     if (next) {
         *prev = next->ii_next;
         next->ii_next = NULL;
-    }
+    } else
+       return NULL;
 
-    ii->ii_dbc = dbiCursorFree(ii->ii_dbc);
+    ii->ii_dbc = dbiCursorFree(ii->ii_dbi, ii->ii_dbc);
     ii->ii_dbi = NULL;
     rpmdbClose(ii->ii_db);
     ii->ii_set = dbiIndexSetFree(ii->ii_set);
 
+    if (ii->ii_hdrNums)
+       ii->ii_hdrNums = _free(ii->ii_hdrNums);
+
     ii = _free(ii);
     return NULL;
 }
@@ -2332,56 +2038,16 @@ static void logAddRemove(const char *dbiname, int removing, rpmtd tagdata)
     }
 }
 
-/* Update primary Packages index. NULL hdr means remove */
-static int updatePackages(dbiIndex dbi, unsigned int hdrNum, DBT *hdr)
+static rpmRC indexDel(dbiIndex dbi, rpmTagVal rpmtag, unsigned int hdrNum, Header h)
 {
-    union _dbswap mi_offset;
-    int rc = 0;
-    dbiCursor dbc;
-    DBT key;
-
-    if (dbi == NULL || hdrNum == 0)
-       return 1;
-
-    memset(&key, 0, sizeof(key));
-
-    dbc = dbiCursorInit(dbi, DB_WRITECURSOR);
-
-    mi_offset.ui = hdrNum;
-    if (dbiByteSwapped(dbi) == 1)
-       _DBSWAP(mi_offset);
-    key.data = (void *) &mi_offset;
-    key.size = sizeof(mi_offset.ui);
-
-    if (hdr) {
-       rc = dbiCursorPut(dbc, &key, hdr, DB_KEYLAST);
-       if (rc) {
-           rpmlog(RPMLOG_ERR,
-                  _("error(%d) adding header #%d record\n"), rc, hdrNum);
-       }
-    } else {
-       DBT data;
-
-       memset(&data, 0, sizeof(data));
-       rc = dbiCursorGet(dbc, &key, &data, DB_SET);
-       if (rc) {
-           rpmlog(RPMLOG_ERR,
-                  _("error(%d) removing header #%d record\n"), rc, hdrNum);
-       } else
-           rc = dbiCursorDel(dbc, &key, &data, 0);
-    }
-
-    dbiCursorFree(dbc);
-    dbiSync(dbi, 0);
-
-    return rc;
+    return tag2index(dbi, rpmtag, hdrNum, h, idxdbDel);
 }
 
 int rpmdbRemove(rpmdb db, unsigned int hdrNum)
 {
-    dbiIndex dbi;
+    dbiIndex dbi = NULL;
+    dbiCursor dbc = NULL;
     Header h;
-    sigset_t signalMask;
     int ret = 0;
 
     if (db == NULL)
@@ -2399,112 +2065,32 @@ int rpmdbRemove(rpmdb db, unsigned int hdrNum)
        free(nevra);
     }
 
-    (void) blockSignals(&signalMask);
+    if (pkgdbOpen(db, 0, &dbi))
+       return 1;
+
+    rpmsqBlock(SIG_BLOCK);
+    dbCtrl(db, DB_CTRL_LOCK_RW);
 
-    dbi = rpmdbOpenIndex(db, RPMDBI_PACKAGES, 0);
     /* Remove header from primary index */
-    ret = updatePackages(dbi, hdrNum, NULL);
+    dbc = dbiCursorInit(dbi, DBC_WRITE);
+    ret = pkgdbDel(dbi, dbc, hdrNum);
+    dbiCursorFree(dbi, dbc);
 
     /* Remove associated data from secondary indexes */
     if (ret == 0) {
-       struct dbiIndexItem rec = { .hdrNum = hdrNum, .tagNum = 0 };
-       int rc = 0;
-       dbiCursor dbc = NULL;
-       DBT key, data;
+       for (int dbix = 0; dbix < db->db_ndbi; dbix++) {
+           rpmDbiTag rpmtag = db->db_tags[dbix];
 
-       memset(&key, 0, sizeof(key));
-       memset(&data, 0, sizeof(data));
-
-       for (int dbix = 1; dbix < dbiTagsMax; dbix++) {
-           rpmDbiTag rpmtag = dbiTags[dbix];
-           struct rpmtd_s tagdata;
-
-           if (!(dbi = rpmdbOpenIndex(db, rpmtag, 0)))
+           if (indexOpen(db, rpmtag, 0, &dbi))
                continue;
 
-           if (!headerGet(h, rpmtag, &tagdata, HEADERGET_MINMEM))
-               continue;
-
-           dbc = dbiCursorInit(dbi, DB_WRITECURSOR);
-
-           logAddRemove(dbiName(dbi), 1, &tagdata);
-           while (rpmtdNext(&tagdata) >= 0) {
-               dbiIndexSet set;
-               int freedata = 0;
-
-               if (!td2key(&tagdata, &key, &freedata)) {
-                   continue;
-               }
-
-               /* XXX
-                * This is almost right, but, if there are duplicate tag
-                * values, there will be duplicate attempts to remove
-                * the header instance. It's faster to just ignore errors
-                * than to do things correctly.
-                */
-
-               /* 
-                * XXX with duplicates, an accurate data value and 
-                * DB_GET_BOTH is needed. 
-                * */
-               set = NULL;
-
-               rc = dbiCursorGet(dbc, &key, &data, DB_SET);
-               if (rc == 0) {                  /* success */
-                   (void) dbt2set(dbi, &data, &set);
-               } else if (rc == DB_NOTFOUND) { /* not found */
-                   goto cont;
-               } else {                        /* error */
-                   rpmlog(RPMLOG_ERR,
-                       _("error(%d) setting \"%s\" records from %s index\n"),
-                       rc, (char*)key.data, dbiName(dbi));
-                   ret += 1;
-                   goto cont;
-               }
-
-               rc = dbiPruneSet(set, &rec, 1, sizeof(rec), 1);
-
-               /* If nothing was pruned, then don't bother updating. */
-               if (rc) {
-                   set = dbiIndexSetFree(set);
-                   goto cont;
-               }
-
-               if (set->count > 0) {
-                   (void) set2dbt(dbi, &data, set);
-                   rc = dbiCursorPut(dbc, &key, &data, DB_KEYLAST);
-                   if (rc) {
-                       rpmlog(RPMLOG_ERR,
-                               _("error(%d) storing record \"%s\" into %s\n"),
-                               rc, (char*)key.data, dbiName(dbi));
-                       ret += 1;
-                   }
-                   data.data = _free(data.data);
-                   data.size = 0;
-               } else {
-                   rc = dbiCursorDel(dbc, &key, &data, 0);
-                   if (rc) {
-                       rpmlog(RPMLOG_ERR,
-                               _("error(%d) removing record \"%s\" from %s\n"),
-                               rc, (char*)key.data, dbiName(dbi));
-                       ret += 1;
-                   }
-               }
-               set = dbiIndexSetFree(set);
-cont:
-               if (freedata) {
-                  free(key.data); 
-               }
-           }
-
-           dbc = dbiCursorFree(dbc);
-           dbiSync(dbi, 0);
-
-           rpmtdFreeData(&tagdata);
+           ret += indexDel(dbi, rpmtag, hdrNum, h);
        }
     }
 
-    (void) unblockSignals(&signalMask);
+    dbCtrl(db, DB_CTRL_INDEXSYNC);
+    dbCtrl(db, DB_CTRL_UNLOCK_RW);
+    rpmsqBlock(SIG_UNBLOCK);
 
     headerFree(h);
 
@@ -2512,79 +2098,109 @@ cont:
     return 0;
 }
 
-/* Get current header instance number or try to allocate a new one */
-static unsigned int pkgInstance(dbiIndex dbi, int alloc)
-{
-    unsigned int hdrNum = 0;
-
-    if (dbi != NULL && dbiType(dbi) == DBI_PRIMARY) {
-       dbiCursor dbc;
-       DBT key, data;
-       unsigned int firstkey = 0;
-       union _dbswap mi_offset;
-       int ret;
-
-       memset(&key, 0, sizeof(key));
-       memset(&data, 0, sizeof(data));
-
-       dbc = dbiCursorInit(dbi, alloc ? DB_WRITECURSOR : 0);
-
-       /* Key 0 holds the current largest instance, fetch it */
-       key.data = &firstkey;
-       key.size = sizeof(firstkey);
-       ret = dbiCursorGet(dbc, &key, &data, DB_SET);
+struct updateRichDepData {
+    ARGV_t argv;
+    int nargv;
+    int neg;
+    int level;
+    int *nargv_level;
+};
 
-       if (ret == 0 && data.data) {
-           memcpy(&mi_offset, data.data, sizeof(mi_offset.ui));
-           if (dbiByteSwapped(dbi) == 1)
-               _DBSWAP(mi_offset);
-           hdrNum = mi_offset.ui;
+static rpmRC updateRichDepCB(void *cbdata, rpmrichParseType type,
+               const char *n, int nl, const char *e, int el, rpmsenseFlags sense,
+               rpmrichOp op, char **emsg) {
+    struct updateRichDepData *data = cbdata;
+    if (type == RPMRICH_PARSE_ENTER) {
+       data->level++;
+       data->nargv_level = xrealloc(data->nargv_level, data->level * (sizeof(int)));
+       data->nargv_level[data->level - 1] = data->nargv;
+    }
+    if (type == RPMRICH_PARSE_LEAVE) {
+       data->level--;
+    }
+    if (type == RPMRICH_PARSE_SIMPLE && nl && !(nl > 7 && !strncmp(n, "rpmlib(", 7))) {
+       char *name = xmalloc(nl + 2);
+       *name = data->neg ? '!' : ' ';
+       strncpy(name + 1, n, nl);
+       name[1 + nl] = 0;
+       argvAdd(&data->argv, name);
+       data->nargv++;
+       _free(name);
+    }
+    if (type == RPMRICH_PARSE_OP && (op == RPMRICHOP_IF || op == RPMRICHOP_UNLESS)) {
+       /* save nargv in case of ELSE */
+       data->nargv_level[data->level - 1] = data->nargv;
+       data->neg ^= 1;
+    }
+    if (type == RPMRICH_PARSE_OP && op == RPMRICHOP_ELSE) {
+       int i, nargv = data->nargv;
+       /* copy and invert condition block */
+       for (i = data->nargv_level[data->level - 1]; i < nargv; i++) {
+           char *name = data->argv[i];
+           *name ^= ' ' ^ '!';
+           argvAdd(&data->argv, name);
+           *name ^= ' ' ^ '!';
+           data->nargv++;
        }
-
-       if (alloc) {
-           /* Rather complicated "increment by one", bswapping as needed */
-           ++hdrNum;
-           mi_offset.ui = hdrNum;
-           if (dbiByteSwapped(dbi) == 1)
-               _DBSWAP(mi_offset);
-           if (ret == 0 && data.data) {
-               memcpy(data.data, &mi_offset, sizeof(mi_offset.ui));
-           } else {
-               data.data = &mi_offset;
-               data.size = sizeof(mi_offset.ui);
-           }
-
-           /* Unless we manage to insert the new instance number, we failed */
-           ret = dbiCursorPut(dbc, &key, &data, DB_KEYLAST);
-           if (ret) {
-               hdrNum = 0;
-               rpmlog(RPMLOG_ERR,
-                   _("error(%d) allocating new package instance\n"), ret);
+       data->neg ^= 1;
+    }
+    if (type == RPMRICH_PARSE_LEAVE && (op == RPMRICHOP_IF || op == RPMRICHOP_UNLESS)) {
+       data->neg ^= 1;
+    }
+    return RPMRC_OK;
+}
+
+static rpmRC updateRichDep(dbiIndex dbi, dbiCursor dbc, const char *str,
+                           struct dbiIndexItem_s *rec,
+                           idxfunc idxupdate)
+{
+    int n, i, rc = 0;
+    struct updateRichDepData data;
+
+    data.argv = argvNew();
+    data.neg = 0;
+    data.nargv = 0;
+    data.level = 0;
+    data.nargv_level = xcalloc(1, sizeof(int));
+    if (rpmrichParse(&str, NULL, updateRichDepCB, &data) == RPMRC_OK) {
+       n = argvCount(data.argv);
+       if (n) {
+           argvSort(data.argv, NULL);
+           for (i = 0; i < n; i++) {
+               char *name = data.argv[i];
+               if (i && !strcmp(data.argv[i - 1], name))
+                   continue;       /* ignore dups */
+               if (*name == ' ')
+                   name++;
+               rc += idxupdate(dbi, dbc, name, strlen(name), rec);
            }
-
-           dbiSync(dbi, 0);
        }
-       dbiCursorFree(dbc);
     }
-    
-    return hdrNum;
+    _free(data.nargv_level);
+    argvFree(data.argv);
+    return rc;
 }
 
-/* Add data to secondary index */
-static int addToIndex(dbiIndex dbi, rpmTagVal rpmtag, unsigned int hdrNum, Header h)
+static rpmRC tag2index(dbiIndex dbi, rpmTagVal rpmtag,
+                      unsigned int hdrNum, Header h,
+                      idxfunc idxupdate)
 {
     int i, rc = 0;
-    struct rpmtd_s tagdata, reqflags;
+    struct rpmtd_s tagdata, reqflags, trig_index;
     dbiCursor dbc = NULL;
 
     switch (rpmtag) {
     case RPMTAG_REQUIRENAME:
        headerGet(h, RPMTAG_REQUIREFLAGS, &reqflags, HEADERGET_MINMEM);
-       /* fallthrough */
-    default:
-       headerGet(h, rpmtag, &tagdata, HEADERGET_MINMEM);
+       break;
+    case RPMTAG_FILETRIGGERNAME:
+       headerGet(h, RPMTAG_FILETRIGGERINDEX, &trig_index, HEADERGET_MINMEM);
+       break;
+    case RPMTAG_TRANSFILETRIGGERNAME:
+       headerGet(h, RPMTAG_TRANSFILETRIGGERINDEX, &trig_index, HEADERGET_MINMEM);
        break;
     }
+    headerGet(h, rpmtag, &tagdata, HEADERGET_MINMEM);
 
     if (rpmtdCount(&tagdata) == 0) {
        if (rpmtag != RPMTAG_GROUP)
@@ -2596,15 +2212,29 @@ static int addToIndex(dbiIndex dbi, rpmTagVal rpmtag, unsigned int hdrNum, Heade
        tagdata.count = 1;
     }
 
-    dbc = dbiCursorInit(dbi, DB_WRITECURSOR);
+    dbc = dbiCursorInit(dbi, DBC_WRITE);
 
     logAddRemove(dbiName(dbi), 0, &tagdata);
     while ((i = rpmtdNext(&tagdata)) >= 0) {
-       dbiIndexSet set;
-       int freedata = 0, j;
-       DBT key, data;
-       /* Include the tagNum in all indices (only files use though) */
-       struct dbiIndexItem rec = { .hdrNum = hdrNum, .tagNum = i };
+       const void * key = NULL;
+       unsigned int keylen = 0;
+       int j;
+       struct dbiIndexItem_s rec;
+
+       switch (rpmtag) {
+       /* Include trigger index in db index for triggers */
+       case RPMTAG_FILETRIGGERNAME:
+       case RPMTAG_TRANSFILETRIGGERNAME:
+           rec.hdrNum = hdrNum;
+           rec.tagNum = *rpmtdNextUint32(&trig_index);
+           break;
+
+       /* Include the tagNum in the others indices (only files use though) */
+       default:
+           rec.hdrNum = hdrNum;
+           rec.tagNum = i;
+           break;
+       }
 
        switch (rpmtag) {
        case RPMTAG_REQUIRENAME: {
@@ -2631,107 +2261,90 @@ static int addToIndex(dbiIndex dbi, rpmTagVal rpmtag, unsigned int hdrNum, Heade
            break;
        }
 
-       memset(&key, 0, sizeof(key));
-       memset(&data, 0, sizeof(data));
-
-       if (!td2key(&tagdata, &key, &freedata)) {
+       if ((key = td2key(&tagdata, &keylen)) == NULL)
            continue;
-       }
-
-       /*
-        * XXX with duplicates, an accurate data value and
-        * DB_GET_BOTH is needed.
-        */
-
-       set = NULL;
-
-       rc = dbiCursorGet(dbc, &key, &data, DB_SET);
-       if (rc == 0) {                  /* success */
-       /* With duplicates, cursor is positioned, discard the record. */
-           if (!dbi->dbi_permit_dups)
-               (void) dbt2set(dbi, &data, &set);
-       } else if (rc != DB_NOTFOUND) { /* error */
-           rpmlog(RPMLOG_ERR,
-               _("error(%d) getting \"%s\" records from %s index\n"),
-               rc, (char*)key.data, dbiName(dbi));
-           rc += 1;
-           goto cont;
-       }
-
-       if (set == NULL)                /* not found or duplicate */
-           set = xcalloc(1, sizeof(*set));
-
-       (void) dbiAppendSet(set, &rec, 1, sizeof(rec), 0);
 
-       (void) set2dbt(dbi, &data, set);
-       rc = dbiCursorPut(dbc, &key, &data, DB_KEYLAST);
-
-       if (rc) {
-           rpmlog(RPMLOG_ERR,
-                       _("error(%d) storing record %s into %s\n"),
-                       rc, (char*)key.data, dbiName(dbi));
-           rc += 1;
-       }
-       data.data = _free(data.data);
-       data.size = 0;
-       set = dbiIndexSetFree(set);
-cont:
-       if (freedata) {
-           free(key.data);
+       rc += idxupdate(dbi, dbc, key, keylen, &rec);
+
+       if (*(char *)key == '(') {
+           switch (rpmtag) {
+           case RPMTAG_REQUIRENAME:
+           case RPMTAG_CONFLICTNAME:
+           case RPMTAG_SUGGESTNAME:
+           case RPMTAG_SUPPLEMENTNAME:
+           case RPMTAG_RECOMMENDNAME:
+           case RPMTAG_ENHANCENAME:
+               if (rpmtdType(&tagdata) == RPM_STRING_ARRAY_TYPE) {
+                   rc += updateRichDep(dbi, dbc, rpmtdGetString(&tagdata),
+                       &rec, idxupdate);
+               }
+           default:
+               break;
+           }
        }
     }
 
-    dbiCursorFree(dbc);
-    dbiSync(dbi, 0);
+    dbiCursorFree(dbi, dbc);
 
 exit:
     rpmtdFreeData(&tagdata);
-    return rc;
+    return (rc == 0) ? RPMRC_OK : RPMRC_FAIL;
+}
+
+static rpmRC indexPut(dbiIndex dbi, rpmTagVal rpmtag, unsigned int hdrNum, Header h)
+{
+    return tag2index(dbi, rpmtag, hdrNum, h, idxdbPut);
 }
 
 int rpmdbAdd(rpmdb db, Header h)
 {
-    DBT hdr;
-    sigset_t signalMask;
-    dbiIndex dbi;
+    dbiIndex dbi = NULL;
+    dbiCursor dbc = NULL;
     unsigned int hdrNum = 0;
+    unsigned int hdrLen = 0;
+    unsigned char *hdrBlob = NULL;
     int ret = 0;
-    int hdrOk;
 
     if (db == NULL)
        return 0;
 
-    memset(&hdr, 0, sizeof(hdr));
-
-    hdr.data = headerExport(h, &hdr.size);
-    hdrOk = (hdr.data != NULL && hdr.size > 0);
-    
-    if (!hdrOk) {
+    hdrBlob = headerExport(h, &hdrLen);
+    if (hdrBlob == NULL || hdrLen == 0) {
        ret = -1;
        goto exit;
     }
 
-    (void) blockSignals(&signalMask);
-
-    dbi = rpmdbOpenIndex(db, RPMDBI_PACKAGES, 0);
-    hdrNum = pkgInstance(dbi, 1);
+    ret = pkgdbOpen(db, 0, &dbi);
+    if (ret)
+       goto exit;
+       
+    rpmsqBlock(SIG_BLOCK);
+    dbCtrl(db, DB_CTRL_LOCK_RW);
 
     /* Add header to primary index */
-    ret = updatePackages(dbi, hdrNum, &hdr);
+    dbc = dbiCursorInit(dbi, DBC_WRITE);
+    ret = pkgdbNew(dbi, dbc, &hdrNum);
+    if (ret == 0)
+       ret = pkgdbPut(dbi, dbc, hdrNum, hdrBlob, hdrLen);
+    dbiCursorFree(dbi, dbc);
 
     /* Add associated data to secondary indexes */
     if (ret == 0) {    
-       for (int dbix = 1; dbix < dbiTagsMax; dbix++) {
-           rpmDbiTag rpmtag = dbiTags[dbix];
+       for (int dbix = 0; dbix < db->db_ndbi; dbix++) {
+           rpmDbiTag rpmtag = db->db_tags[dbix];
 
-           if (!(dbi = rpmdbOpenIndex(db, rpmtag, 0)))
+           if (indexOpen(db, rpmtag, 0, &dbi))
                continue;
 
-           ret += addToIndex(dbi, rpmtag, hdrNum, h);
+           ret += indexPut(dbi, rpmtag, hdrNum, h);
        }
     }
 
-    /* If everthing ok, mark header as installed now */
+    dbCtrl(db, DB_CTRL_INDEXSYNC);
+    dbCtrl(db, DB_CTRL_UNLOCK_RW);
+    rpmsqBlock(SIG_UNBLOCK);
+
+    /* If everything ok, mark header as installed now */
     if (ret == 0) {
        headerSetInstance(h, hdrNum);
        /* Purge our verification cache on added public keys */
@@ -2741,24 +2354,15 @@ int rpmdbAdd(rpmdb db, Header h)
     }
 
 exit:
-    free(hdr.data);
-    (void) unblockSignals(&signalMask);
+    free(hdrBlob);
 
     return ret;
 }
 
-/*
- * Remove DB4 environment (and lock), ie the equivalent of 
- * rm -f <prefix>/<dbpath>/__db.???
- * Environment files not existing is not an error, failure to unlink is,
- * return zero on success.
- * TODO/FIX: push this down to db3.c where it belongs
- */
-static int cleanDbenv(const char *prefix, const char *dbpath)
+static int rpmdbRemoveFiles(char * pattern)
 {
+    int rc = 0;
     ARGV_t paths = NULL, p;
-    int rc = 0; 
-    char *pattern = rpmGetPath(prefix, "/", dbpath, "/__db.???", NULL);
 
     if (rpmGlob(pattern, NULL, &paths) == 0) {
        for (p = paths; *p; p++) {
@@ -2766,86 +2370,114 @@ static int cleanDbenv(const char *prefix, const char *dbpath)
        }
        argvFree(paths);
     }
+    return rc;
+}
+
+static int rpmdbRemoveDatabase(const char *dbpath)
+{
+    int rc = 0; 
+    char *pattern;
+
+    pattern = rpmGetPath(dbpath, "/*", NULL);
+    rc += rpmdbRemoveFiles(pattern);
+    free(pattern);
+    pattern = rpmGetPath(dbpath, "/.??*", NULL);
+    rc += rpmdbRemoveFiles(pattern);
     free(pattern);
+    
+    rc += rmdir(dbpath);
     return rc;
 }
 
-static int rpmdbRemoveDatabase(const char * prefix, const char * dbpath)
-{ 
-    char *path;
-    int xx = 0;
+static int rpmdbMoveDatabase(const char * prefix, const char * srcdbpath,
+                            const char * dbpath, const char * tmppath)
+{
+    int rc = -1;
+    int xx;
+    char *src = rpmGetPath(prefix, "/", srcdbpath, NULL);
+    char *old = rpmGetPath(prefix, "/", tmppath, NULL);
+    char *dest = rpmGetPath(prefix, "/", dbpath, NULL);
+
+    char * oldkeys = rpmGetPath(old, "/", "pubkeys", NULL);
+    char * destkeys = rpmGetPath(dest, "/", "pubkeys", NULL);
+
+    xx = rename(dest, old);
+    if (xx) {
+       goto exit;
+    }
+    xx = rename(src, dest);
+    if (xx) {
+       rpmlog(RPMLOG_ERR, _("could not move new database in place\n"));
+       xx = rename(old, dest);
+       if (xx) {
+           rpmlog(RPMLOG_ERR, _("could also not restore old database from %s\n"),
+                  old);
+           rpmlog(RPMLOG_ERR, _("replace files in %s with files from %s "
+                                "to recover\n"), dest, old);
+       }
+       goto exit;
+    }
 
-    for (int i = 0; i < dbiTagsMax; i++) {
-       const char * base = rpmTagGetName(dbiTags[i]);
-       path = rpmGetPath(prefix, "/", dbpath, "/", base, NULL);
-       if (access(path, F_OK) == 0)
-           xx += unlink(path);
-       free(path);
+    if (access(oldkeys, F_OK ) != -1) {
+       xx = rename(oldkeys, destkeys);
+       if (xx) {
+           rpmlog(RPMLOG_ERR, _("Could not get public keys from %s\n"), oldkeys);
+           goto exit;
+       }
     }
-    cleanDbenv(prefix, dbpath);
 
-    path = rpmGetPath(prefix, "/", dbpath, NULL);
-    xx += rmdir(path);
-    free(path);
+    xx = rpmdbRemoveDatabase(old);
+    if (xx) {
+       rpmlog(RPMLOG_ERR, _("could not delete old database at %s\n"), old);
+    }
 
-    return (xx != 0);
+    rc = 0;
+
+ exit:
+    _free(src);
+    _free(old);
+    _free(dest);
+    _free(oldkeys);
+    _free(destkeys);
+    return rc;
 }
 
-static int rpmdbMoveDatabase(const char * prefix,
-                            const char * olddbpath, const char * newdbpath)
+static int rpmdbSetPermissions(char * src, char * dest)
 {
-    int i;
+    struct dirent *dp;
+    DIR *dfd;
+
     struct stat st;
-    int rc = 0;
-    int xx;
-    int selinux = is_selinux_enabled() && (matchpathcon_init(NULL) != -1);
-    sigset_t sigMask;
-
-    blockSignals(&sigMask);
-    for (i = 0; i < dbiTagsMax; i++) {
-       rpmDbiTag rpmtag = dbiTags[i];
-       const char *base = rpmTagGetName(rpmtag);
-       char *src = rpmGetPath(prefix, "/", olddbpath, "/", base, NULL);
-       char *dest = rpmGetPath(prefix, "/", newdbpath, "/", base, NULL);
-
-       if (access(src, F_OK) != 0)
-           goto cont;
-
-       /*
-        * Restore uid/gid/mode/security context if possible.
-        */
-       if (stat(dest, &st) < 0)
-           if (stat(src, &st) < 0)
-               goto cont;
-
-       if ((xx = rename(src, dest)) != 0) {
-           rc = 1;
-           goto cont;
+    int xx, rc = -1;
+    char * filepath;
+    
+    if (stat(dest, &st) < 0)
+           goto exit;
+    if (stat(src, &st) < 0)
+           goto exit;
+
+    if ((dfd = opendir(dest)) == NULL) {
+       goto exit;
+    }
+
+    rc = 0;
+    while ((dp = readdir(dfd)) != NULL) {
+       if (!strcmp(dp->d_name, "..")) {
+           continue;
        }
-       xx = chown(dest, st.st_uid, st.st_gid);
-       xx = chmod(dest, (st.st_mode & 07777));
-
-       if (selinux) {
-           security_context_t scon = NULL;
-           if (matchpathcon(dest, st.st_mode, &scon) != -1) {
-               (void) setfilecon(dest, scon);
-               freecon(scon);
-           }
+       filepath = rpmGetPath(dest, "/", dp->d_name, NULL);
+       xx = chown(filepath, st.st_uid, st.st_gid);
+       rc += xx;
+       if (!strcmp(dp->d_name, ".")) {
+           xx = chmod(filepath, (st.st_mode & 07777));
+       } else {
+           xx = chmod(filepath, (st.st_mode & 07666));
        }
-           
-cont:
-       free(src);
-       free(dest);
+       rc += xx;
+       _free(filepath);
     }
 
-    cleanDbenv(prefix, olddbpath);
-    cleanDbenv(prefix, newdbpath);
-
-    unblockSignals(&sigMask);
-
-    if (selinux) {
-       (void) matchpathcon_fini();
-    }
+ exit:
     return rc;
 }
 
@@ -2855,12 +2487,12 @@ int rpmdbRebuild(const char * prefix, rpmts ts,
     rpmdb olddb;
     char * dbpath = NULL;
     char * rootdbpath = NULL;
+    char * tmppath = NULL;
     rpmdb newdb;
     char * newdbpath = NULL;
     char * newrootdbpath = NULL;
     int nocleanup = 1;
     int failed = 0;
-    int removedir = 0;
     int rc = 0;
 
     dbpath = rpmGetPath("%{?_dbpath}", NULL);
@@ -2888,7 +2520,6 @@ int rpmdbRebuild(const char * prefix, rpmts ts,
        rc = 1;
        goto exit;
     }
-    removedir = 1;
 
     if (openDatabase(prefix, dbpath, &olddb,
                     O_RDONLY, 0644, RPMDB_FLAG_REBUILD)) {
@@ -2900,10 +2531,13 @@ int rpmdbRebuild(const char * prefix, rpmts ts,
        rc = 1;
        goto exit;
     }
+    if (rpmdbOpenAll(newdb)) {
+       rc = 1;
+       goto exit;
+    }
 
     {  Header h = NULL;
        rpmdbMatchIterator mi;
-#define        _RECNUM rpmdbGetIteratorOffset(mi)
 
        mi = rpmdbInitIterator(olddb, RPMDBI_PACKAGES, NULL, 0);
        if (ts && hdrchk)
@@ -2919,20 +2553,22 @@ int rpmdbRebuild(const char * prefix, rpmts ts,
            {
                rpmlog(RPMLOG_ERR,
                        _("header #%u in the database is bad -- skipping.\n"),
-                       _RECNUM);
+                       rpmdbGetIteratorOffset(mi));
                continue;
            }
 
            /* Deleted entries are eliminated in legacy headers by copy. */
-           {   Header nh = (headerIsEntry(h, RPMTAG_HEADERIMAGE)
-                               ? headerCopy(h) : NULL);
-               rc = rpmdbAdd(newdb, (nh ? nh : h));
+           if (headerIsEntry(h, RPMTAG_HEADERIMAGE)) {
+               Header nh = headerReload(headerCopy(h), RPMTAG_HEADERIMAGE);
+               rc = rpmdbAdd(newdb, h);
                headerFree(nh);
+           } else {
+               rc = rpmdbAdd(newdb, h);
            }
 
            if (rc) {
-               rpmlog(RPMLOG_ERR,
-                       _("cannot add record originally at %u\n"), _RECNUM);
+               rpmlog(RPMLOG_ERR, _("cannot add record originally at %u\n"),
+                      rpmdbGetIteratorOffset(mi));
                failed = 1;
                break;
            }
@@ -2950,15 +2586,20 @@ int rpmdbRebuild(const char * prefix, rpmts ts,
                _("failed to rebuild database: original database "
                "remains in place\n"));
 
-       rpmdbRemoveDatabase(prefix, newdbpath);
+       rpmdbRemoveDatabase(newrootdbpath);
        rc = 1;
        goto exit;
-    } else if (!nocleanup) {
-       if (rpmdbMoveDatabase(prefix, newdbpath, dbpath)) {
+    } else {
+       rpmdbSetPermissions(dbpath, newdbpath);
+    }
+
+    if (!nocleanup) {
+       rasprintf(&tmppath, "%sold.%d", dbpath, (int) getpid());
+       if (rpmdbMoveDatabase(prefix, newdbpath, dbpath, tmppath)) {
            rpmlog(RPMLOG_ERR, _("failed to replace old database with new "
                        "database!\n"));
            rpmlog(RPMLOG_ERR, _("replace files in %s with files from %s "
-                       "to recover"), dbpath, newdbpath);
+                       "to recover\n"), dbpath, newdbpath);
            rc = 1;
            goto exit;
        }
@@ -2966,15 +2607,35 @@ int rpmdbRebuild(const char * prefix, rpmts ts,
     rc = 0;
 
 exit:
-    if (removedir && !(rc == 0 && nocleanup)) {
-       if (rmdir(newrootdbpath))
-           rpmlog(RPMLOG_ERR, _("failed to remove directory %s: %s\n"),
-                       newrootdbpath, strerror(errno));
-    }
     free(newdbpath);
     free(dbpath);
+    free(tmppath);
     free(newrootdbpath);
     free(rootdbpath);
 
     return rc;
 }
+
+int rpmdbCtrl(rpmdb db, rpmdbCtrlOp ctrl)
+{
+    dbCtrlOp dbctrl = 0;
+    switch (ctrl) {
+    case RPMDB_CTRL_LOCK_RO:
+       dbctrl = DB_CTRL_LOCK_RO;
+       break;
+    case RPMDB_CTRL_UNLOCK_RO:
+       dbctrl = DB_CTRL_UNLOCK_RO;
+       break;
+    case RPMDB_CTRL_LOCK_RW:
+       dbctrl = DB_CTRL_LOCK_RW;
+       break;
+    case RPMDB_CTRL_UNLOCK_RW:
+       dbctrl = DB_CTRL_UNLOCK_RW;
+       break;
+    case RPMDB_CTRL_INDEXSYNC:
+       dbctrl = DB_CTRL_INDEXSYNC;
+       break;
+    }
+    return dbctrl ? dbCtrl(db, dbctrl) : 1;
+}
+
index 3c7aac2c8d9d33a7d4726491109716ebf7d7da8d..78765bb15fd681df8411f6bf042b9795416f2a7d 100644 (file)
@@ -3,7 +3,7 @@
 
 /** \ingroup rpmdb dbi
  * \file lib/rpmdb.h
- * Access RPM indices using Berkeley DB interface(s).
+ * RPM database API.
  */
 
 #include <rpm/rpmtypes.h>
@@ -30,6 +30,14 @@ typedef enum rpmdbOpX_e {
     RPMDB_OP_MAX               = 4
 } rpmdbOpX;
 
+typedef enum rpmdbCtrlOp_e {
+    RPMDB_CTRL_LOCK_RO         = 1,
+    RPMDB_CTRL_UNLOCK_RO       = 2,
+    RPMDB_CTRL_LOCK_RW         = 3,
+    RPMDB_CTRL_UNLOCK_RW       = 4,
+    RPMDB_CTRL_INDEXSYNC       = 5
+} rpmdbCtrlOp;
+
 /** \ingroup rpmdb
  * Retrieve operation timestamp from rpm database.
  * @param db            rpm database
@@ -79,7 +87,7 @@ unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi);
  * @return             0 on success, 1 on failure (bad args)
  */
 int rpmdbAppendIterator(rpmdbMatchIterator mi,
-               const int * hdrNums, int nHdrNums);
+                       const unsigned int * hdrNums, unsigned int nHdrNums);
 
 /** \ingroup rpmdb
  * Add pattern to iterator selector.
@@ -137,21 +145,6 @@ rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmDbiTagVal rpmtag,
  */
 Header rpmdbNextIterator(rpmdbMatchIterator mi);
 
-/** \ingroup rpmdb
- * Check for and exit on termination signals.
- */
-int rpmdbCheckSignals(void);
-
-/** \ingroup rpmdb
- * Check rpmdb signal handler for trapped signal and/or requested exit,
- * clean up any open iterators and databases on termination condition.
- * On non-zero exit any open references to rpmdb are invalid and cannot
- * be accessed anymore, calling process should terminate immediately.
- * @param terminate    0 to only check for signals, 1 to terminate anyway
- * @return             0 to continue, 1 if termination cleanup was done.
- */
-int rpmdbCheckTerminate(int terminate);
-
 /** \ingroup rpmdb
  * Destroy rpm database iterator.
  * @param mi           rpm database iterator
@@ -171,12 +164,22 @@ rpmdbIndexIterator rpmdbIndexIteratorInit(rpmdb db, rpmDbiTag rpmtag);
  * Get the next key - Warning! Keys are not zero terminated!
  * Binary tags may even contain zero bytes
  * @param ii           index iterator
- * @param key          adress to save the pointer to the key
- * @param keylen       adress to save the length of the key to
+ * @param key          address to save the pointer to the key
+ * @param keylen       address to save the length of the key to
  * @return             0 on success; != 0 on error or end of index
  */
 int rpmdbIndexIteratorNext(rpmdbIndexIterator ii, const void ** key, size_t * keylen);
 
+/** \ingroup rpmdb
+ * Get the next key into a tag data container.
+ * Caller is responsible for calling rpmtdFreeData() to freeing the
+ * data returned in keytd once done with it.
+ * @param ii           index iterator
+ * @param keytd                tag container to store the key in
+ * @return             0 on success; != 0 on error or end of index
+ */
+int rpmdbIndexIteratorNextTd(rpmdbIndexIterator ii, rpmtd keytd);
+
 /** \ingroup rpmdb
  * Get number of entries for current key
  * @param ii            index iterator
@@ -207,6 +210,13 @@ unsigned int rpmdbIndexIteratorTagNum(rpmdbIndexIterator ii, unsigned int nr);
  */
 rpmdbIndexIterator rpmdbIndexIteratorFree(rpmdbIndexIterator ii);
 
+/** \ingroup rpmdb
+ * manipulate the rpm database
+ * @param db           rpm database
+ * @param ctrl         operation
+ * @return             0 on success; != 0 on error
+ */
+int rpmdbCtrl(rpmdb db, rpmdbCtrlOp ctrl);
 
 #ifdef __cplusplus
 }
index ce95ce1b421d1402e058920ac2173e0faa90800c..92848ab376af31b6366df4e48aa739bd4665612e 100644 (file)
@@ -2,7 +2,6 @@
 #define H_RPMDB_INTERNAL
 
 #include <assert.h>
-#include <db.h>
 
 #include <rpm/rpmsw.h>
 #include <rpm/rpmtypes.h>
@@ -16,7 +15,7 @@ extern "C" {
 #undef HASHTYPE
 #undef HTKEYTYPE
 #undef HTDATATYPE
-#define HASHTYPE removedHash
+#define HASHTYPE packageHash
 #define HTKEYTYPE unsigned int
 #define HTDATATYPE struct rpmte_s *
 #include "rpmhash.H"
@@ -59,14 +58,6 @@ int rpmdbInit(const char * prefix, int perms);
 RPM_GNUC_INTERNAL
 int rpmdbClose (rpmdb db);
 
-/** \ingroup rpmdb
- * Sync all database indices.
- * @param db           rpm database
- * @return             0 on success
- */
-RPM_GNUC_INTERNAL
-int rpmdbSync (rpmdb db);
-
 /** \ingroup rpmdb
  * Rebuild database indices from package headers.
  * @param prefix       path to top of install tree
@@ -129,6 +120,24 @@ int rpmdbExtendIterator(rpmdbMatchIterator mi,
  */
 void rpmdbSortIterator(rpmdbMatchIterator mi);
 
+/** \ingroup rpmdb
+ * uniq the iterator by recnum
+ * Return database iterator.
+ * @param mi           rpm database iterator
+ */
+void rpmdbUniqIterator(rpmdbMatchIterator mi);
+
+/** \ingroup rpmdb
+ * If neg equals to zero then it leaves in iterator only packages that
+ * header numbers are in hdrNums. If neg is not zero then removes from iterator
+ * all packages that header numbers are in hdrNums.
+ * @param mi           rpm database iterator
+ * @param hdrNums      hash of package numbers
+ * @param neg          mode
+ * return              0 on success, 1 on failure (bad args)
+ */
+int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash hdrNums, int neg);
+
 /** \ingroup rpmdb
  * Remove items from set of package instances to iterate.
  * @note Sorted hdrNums are always passed in rpmlib.
@@ -136,7 +145,7 @@ void rpmdbSortIterator(rpmdbMatchIterator mi);
  * @param hdrNums      hash of package instances
  * @return             0 on success, 1 on failure (bad args)
  */
-int rpmdbPruneIterator(rpmdbMatchIterator mi, removedHash hdrNums);
+int rpmdbPruneIterator(rpmdbMatchIterator mi, packageHash hdrNums);
 
 /** \ingroup rpmdb
  * Create a new, empty match iterator (for purposes of extending it
@@ -148,16 +157,59 @@ int rpmdbPruneIterator(rpmdbMatchIterator mi, removedHash hdrNums);
 RPM_GNUC_INTERNAL
 rpmdbMatchIterator rpmdbNewIterator(rpmdb db, rpmDbiTagVal dbitag);
 
-#ifndef __APPLE__
-/**
- *  * Mergesort, same arguments as qsort(2).
- *   */
+/** \ingroup rpmdb
+ * Return database iterator that iterates over database items
+ * starting with pfx.
+ * @param db           rpm database
+ * @param rpmtag       database index tag
+ * @param pfx          prefix data
+ * @param plen         prefix data length (0 will use strlen(keyp))
+ * @return             NULL on failure
+ */
+RPM_GNUC_INTERNAL
+rpmdbMatchIterator rpmdbInitPrefixIterator(rpmdb db, rpmDbiTagVal rpmtag,
+                                       const void * pfx, size_t plen);
+/** \ingroup rpmdb
+ * Get package offsets of entries
+ * @param ii           index iterator
+ * @return             db offsets of pkgs
+ */
+RPM_GNUC_INTERNAL
+unsigned int *rpmdbIndexIteratorPkgOffsets(rpmdbIndexIterator ii);
+
+/** \ingroup rpmdb
+ * Return current index (position) in iterator.
+ * @param mi           rpm database iterator
+ * @return             current index
+ */
+RPM_GNUC_INTERNAL
+int rpmdbGetIteratorIndex(rpmdbMatchIterator mi);
+
+/** \ingroup rpmdb
+ * Set iterator index.
+ * @param mi           rpm database iterator
+ * @param ix           index
+ */
+RPM_GNUC_INTERNAL
+void rpmdbSetIteratorIndex(rpmdbMatchIterator mi, unsigned int ix);
+
+/** \ingroup rpmdb
+ * Return offset of package with given index.
+ * @param mi           rpm database iterator
+ * @param ix           index
+ * @return             package offset
+ */
+RPM_GNUC_INTERNAL
+unsigned int rpmdbGetIteratorOffsetFor(rpmdbMatchIterator mi, unsigned int ix);
+
+/** \ingroup rpmdb
+ * Return header located in rpmdb at given offset.
+ * @param db           rpm database
+ * @param offset       database offset
+ * @return             header at given offset
+ */
 RPM_GNUC_INTERNAL
-int mergesort(void *base, size_t nmemb, size_t size,
-                int (*cmp) (const void *, const void *));
-#else
-/* mergesort is defined in stdlib.h on Mac OS X */
-#endif /* __APPLE__ */
+Header rpmdbGetHeaderAt(rpmdb db, unsigned int offset);
 
 #ifdef __cplusplus
 }
index 1e67986480da0e1848e6dc071de6e7b8543a50a0..823c722e8bc083e452a1fdeb4c20e4ecb2363830 100644 (file)
@@ -32,19 +32,20 @@ struct rpmds_s {
     int32_t Count;             /*!< No. of elements */
     unsigned int instance;     /*!< From rpmdb instance? */
     int i;                     /*!< Element index. */
-    unsigned l;                        /*!< Low element (bsearch). */
-    unsigned u;                        /*!< High element (bsearch). */
     int nopromote;             /*!< Don't promote Epoch: in rpmdsCompare()? */
     int nrefs;                 /*!< Reference count. */
+    int *ti;                   /*!< Trigger index. */
 };
 
 static int dsType(rpmTagVal tag, 
-                 const char ** Type, rpmTagVal * tagEVR, rpmTagVal * tagF)
+                 const char ** Type, rpmTagVal * tagEVR, rpmTagVal * tagF,
+                 rpmTagVal * tagTi)
 {
     int rc = 0;
     const char *t = NULL;
     rpmTagVal evr = RPMTAG_NOT_FOUND;
     rpmTagVal f = RPMTAG_NOT_FOUND;
+    rpmTagVal ti = RPMTAG_NOT_FOUND;
 
     if (tag == RPMTAG_PROVIDENAME) {
        t = "Provides";
@@ -54,6 +55,22 @@ static int dsType(rpmTagVal tag,
        t = "Requires";
        evr = RPMTAG_REQUIREVERSION;
        f = RPMTAG_REQUIREFLAGS;
+    } else if (tag == RPMTAG_SUPPLEMENTNAME) {
+       t = "Supplements";
+       evr = RPMTAG_SUPPLEMENTVERSION;
+       f = RPMTAG_SUPPLEMENTFLAGS;
+    } else if (tag == RPMTAG_ENHANCENAME) {
+       t = "Enhances";
+       evr = RPMTAG_ENHANCEVERSION;
+       f = RPMTAG_ENHANCEFLAGS;
+    } else if (tag == RPMTAG_RECOMMENDNAME) {
+       t = "Recommends";
+       evr = RPMTAG_RECOMMENDVERSION;
+       f = RPMTAG_RECOMMENDFLAGS;
+    } else if (tag == RPMTAG_SUGGESTNAME) {
+       t = "Suggests";
+       evr = RPMTAG_SUGGESTVERSION;
+       f = RPMTAG_SUGGESTFLAGS;
     } else if (tag == RPMTAG_CONFLICTNAME) {
        t = "Conflicts";
        evr = RPMTAG_CONFLICTVERSION;
@@ -70,19 +87,103 @@ static int dsType(rpmTagVal tag,
        t = "Trigger";
        evr = RPMTAG_TRIGGERVERSION;
        f = RPMTAG_TRIGGERFLAGS;
-    } else if (tag == RPMTAG_ENHANCESNAME) {
-       t = "Enhances";
-       evr = RPMTAG_ENHANCESVERSION;
-       f = RPMTAG_ENHANCESFLAGS;
+       ti = RPMTAG_TRIGGERINDEX;
+    } else if (tag == RPMTAG_OLDSUGGESTSNAME) {
+       t = "Oldsuggests";
+       evr = RPMTAG_OLDSUGGESTSVERSION;
+       f = RPMTAG_OLDSUGGESTSFLAGS;
+    } else if (tag == RPMTAG_OLDENHANCESNAME) {
+       t = "Oldenhances";
+       evr = RPMTAG_OLDENHANCESVERSION;
+       f = RPMTAG_OLDENHANCESFLAGS;
+    } else if (tag == RPMTAG_FILETRIGGERNAME) {
+       t = "FileTrigger";
+       evr = RPMTAG_FILETRIGGERVERSION;
+       f = RPMTAG_FILETRIGGERFLAGS;
+       ti = RPMTAG_FILETRIGGERINDEX;
+    } else if (tag == RPMTAG_TRANSFILETRIGGERNAME) {
+       t = "TransFileTrigger";
+       evr = RPMTAG_TRANSFILETRIGGERVERSION;
+       f = RPMTAG_TRANSFILETRIGGERFLAGS;
+       ti = RPMTAG_TRANSFILETRIGGERINDEX;
     } else {
        rc = 1;
     } 
     if (Type) *Type = t;
     if (tagEVR) *tagEVR = evr;
     if (tagF) *tagF = f;
+    if (tagTi) *tagTi = ti;
     return rc;
 }    
 
+static char tagNToChar(rpmTagVal tagN)
+{
+    switch (tagN) {
+    default:
+       return 'R';
+       break;
+    case RPMTAG_REQUIRENAME:
+       return 'R';
+       break;
+    case RPMTAG_PROVIDENAME:
+       return 'P';
+       break;
+    case RPMTAG_RECOMMENDNAME:
+       return 'r';
+       break;
+    case RPMTAG_SUGGESTNAME:
+       return 's';
+       break;
+    case RPMTAG_SUPPLEMENTNAME:
+       return 'S';
+       break;
+    case RPMTAG_ENHANCENAME:
+       return 'e';
+       break;
+    case RPMTAG_CONFLICTNAME:
+       return 'C';
+       break;
+    case RPMTAG_OBSOLETENAME:
+       return 'O';
+       break;
+    }
+}
+
+rpmTagVal rpmdsDToTagN(char deptype)
+{
+    rpmTagVal tagN = RPMTAG_REQUIRENAME;
+    switch (deptype) {
+    default:
+       tagN = RPMTAG_NOT_FOUND;
+       break;
+    case 'P':
+       tagN = RPMTAG_PROVIDENAME;
+       break;
+    case 'R':
+       tagN = RPMTAG_REQUIRENAME;
+       break;
+    case 'r':
+       tagN = RPMTAG_RECOMMENDNAME;
+       break;
+    case 's':
+       tagN = RPMTAG_SUGGESTNAME;
+       break;
+    case 'S':
+       tagN = RPMTAG_SUPPLEMENTNAME;
+       break;
+    case 'e':
+       tagN = RPMTAG_ENHANCENAME;
+       break;
+    case 'C':
+       tagN = RPMTAG_CONFLICTNAME;
+       break;
+    case 'O':
+       tagN = RPMTAG_OBSOLETENAME;
+       break;
+    }
+    return tagN;
+}
+
 rpmsid rpmdsNIdIndex(rpmds ds, int i)
 {
     rpmsid id = 0;
@@ -122,6 +223,14 @@ rpmsenseFlags rpmdsFlagsIndex(rpmds ds, int i)
     return Flags;
 }
 
+int rpmdsTiIndex(rpmds ds, int i)
+{
+    int ti = -1;
+    if (ds != NULL && i >= 0 && i < ds->Count && ds->ti != NULL)
+       ti = ds->ti[i];
+    return ti;
+}
+
 rpm_color_t rpmdsColorIndex(rpmds ds, int i)
 {
     rpm_color_t Color = 0;
@@ -145,7 +254,7 @@ rpmds rpmdsLink(rpmds ds)
 
 rpmds rpmdsFree(rpmds ds)
 {
-    rpmTagVal tagEVR, tagF;
+    rpmTagVal tagEVR, tagF, tagTi;
 
     if (ds == NULL)
        return NULL;
@@ -153,13 +262,14 @@ rpmds rpmdsFree(rpmds ds)
     if (ds->nrefs > 1)
        return rpmdsUnlink(ds);
 
-    if (dsType(ds->tagN, NULL, &tagEVR, &tagF))
+    if (dsType(ds->tagN, NULL, &tagEVR, &tagF, &tagTi))
        return NULL;
 
     if (ds->Count > 0) {
        ds->N = _free(ds->N);
        ds->EVR = _free(ds->EVR);
        ds->Flags = _free(ds->Flags);
+       ds->ti = _free(ds->ti);
     }
 
     ds->pool = rpmstrPoolFree(ds->pool);
@@ -191,24 +301,46 @@ static rpmds rpmdsCreate(rpmstrPool pool,
 
 rpmds rpmdsNewPool(rpmstrPool pool, Header h, rpmTagVal tagN, int flags)
 {
-    rpmTagVal tagEVR, tagF;
+    rpmTagVal tagEVR, tagF, tagTi;
     rpmds ds = NULL;
     const char * Type;
     struct rpmtd_s names;
-    if (dsType(tagN, &Type, &tagEVR, &tagF))
+    if (dsType(tagN, &Type, &tagEVR, &tagF, &tagTi))
        goto exit;
 
     if (headerGet(h, tagN, &names, HEADERGET_MINMEM)) {
-       struct rpmtd_s evr, flags; 
+       struct rpmtd_s evr, flags, tindices;
+       rpm_count_t count = rpmtdCount(&names);
 
-       ds = rpmdsCreate(pool, tagN, Type,
-                        rpmtdCount(&names), headerGetInstance(h));
-
-       ds->N = rpmtdToPool(&names, ds->pool);
        headerGet(h, tagEVR, &evr, HEADERGET_MINMEM);
-       ds->EVR = rpmtdToPool(&evr, ds->pool);
+       if (evr.count && evr.count != count) {
+           rpmtdFreeData(&evr);
+           return NULL;
+       }
+
        headerGet(h, tagF, &flags, HEADERGET_ALLOC);
+       if (flags.count && flags.count != count) {
+           rpmtdFreeData(&flags);
+           return NULL;
+       }
+
+       if (tagTi != RPMTAG_NOT_FOUND) {
+           headerGet(h, tagTi, &tindices, HEADERGET_ALLOC);
+           if (tindices.count && tindices.count != count) {
+               rpmtdFreeData(&tindices);
+               return NULL;
+           }
+       }
+
+       ds = rpmdsCreate(pool, tagN, Type, count, headerGetInstance(h));
+
+       ds->N = names.count ? rpmtdToPool(&names, ds->pool) : NULL;
+       ds->EVR = evr.count ? rpmtdToPool(&evr, ds->pool): NULL;
        ds->Flags = flags.data;
+       if (tagTi != RPMTAG_NOT_FOUND) {
+           ds->ti = tindices.data;
+       }
+
        /* ensure rpmlib() requires always have RPMSENSE_RPMLIB flag set */
        if (tagN == RPMTAG_REQUIRENAME && ds->Flags) {
            for (int i = 0; i < ds->Count; i++) {
@@ -285,12 +417,14 @@ char * rpmdsNewDNEVR(const char * dspfx, const rpmds ds)
 
 static rpmds singleDSPool(rpmstrPool pool, rpmTagVal tagN,
                          rpmsid N, rpmsid EVR, rpmsenseFlags Flags,
-                         unsigned int instance, rpm_color_t Color)
+                         unsigned int instance, rpm_color_t Color,
+                         int triggerIndex)
 {
     rpmds ds = NULL;
     const char * Type;
+    rpmTagVal tagTi;
 
-    if (dsType(tagN, &Type, NULL, NULL))
+    if (dsType(tagN, &Type, NULL, NULL, &tagTi))
        goto exit;
 
     ds = rpmdsCreate(pool, tagN, Type, 1, instance);
@@ -301,6 +435,10 @@ static rpmds singleDSPool(rpmstrPool pool, rpmTagVal tagN,
     ds->EVR[0] = EVR;
     ds->Flags = xmalloc(sizeof(*ds->Flags));
     ds->Flags[0] = Flags;
+    if (tagTi != RPMTAG_NOT_FOUND) {
+       ds->ti = xmalloc(sizeof(*ds->ti));
+       ds->ti[0] = triggerIndex;
+    }
     ds->i = 0;
     if (Color)
        rpmdsSetColor(ds, Color);
@@ -312,9 +450,10 @@ exit:
 static rpmds singleDS(rpmstrPool pool, rpmTagVal tagN,
                      const char * N, const char * EVR,
                      rpmsenseFlags Flags, unsigned int instance,
-                     rpm_color_t Color)
+                     rpm_color_t Color, int triggerIndex)
 {
-    rpmds ds = singleDSPool(pool, tagN, 0, 0, Flags, instance, Color);
+    rpmds ds = singleDSPool(pool, tagN, 0, 0, Flags, instance, Color,
+                           triggerIndex);
     if (ds) {
        /* now that we have a pool, we can insert our N & EVR strings */
        ds->N[0] = rpmstrPoolId(ds->pool, N ? N : "", 1);
@@ -331,7 +470,7 @@ rpmds rpmdsThisPool(rpmstrPool pool,
 {
     char *evr = headerGetAsString(h, RPMTAG_EVR);
     rpmds ds = singleDS(pool, tagN, headerGetString(h, RPMTAG_NAME),
-                       evr, Flags, headerGetInstance(h), 0);
+                       evr, Flags, headerGetInstance(h), 0, 0);
     free(evr);
     return ds;
 }
@@ -344,7 +483,14 @@ rpmds rpmdsThis(Header h, rpmTagVal tagN, rpmsenseFlags Flags)
 rpmds rpmdsSinglePool(rpmstrPool pool,rpmTagVal tagN,
                      const char * N, const char * EVR, rpmsenseFlags Flags)
 {
-    return singleDS(pool, tagN, N, EVR, Flags, 0, 0);
+    return singleDS(pool, tagN, N, EVR, Flags, 0, 0, 0);
+}
+
+rpmds rpmdsSinglePoolTix(rpmstrPool pool,rpmTagVal tagN,
+                           const char * N, const char * EVR,
+                           rpmsenseFlags Flags, int triggerIndex)
+{
+    return singleDS(pool, tagN, N, EVR, Flags, 0, 0, triggerIndex);
 }
 
 rpmds rpmdsSingle(rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlags Flags)
@@ -355,14 +501,78 @@ rpmds rpmdsSingle(rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlag
 rpmds rpmdsCurrent(rpmds ds)
 {
     rpmds cds = NULL;
+    int ti = -1;
     if (ds != NULL && ds->i >= 0 && ds->i < ds->Count) {
+       if (ds->ti)
+           ti = ds->ti[ds->i];
        /* Using parent's pool so we can just use the same id's */
        cds = singleDSPool(ds->pool, ds->tagN, ds->N[ds->i], ds->EVR[ds->i],
-                          rpmdsFlags(ds), ds->instance, rpmdsColor(ds));
+                          rpmdsFlags(ds), ds->instance, rpmdsColor(ds), ti);
     }
     return cds;
 }
 
+rpmds rpmdsFilterTi(rpmds ds, int ti)
+{
+    int i, i2, tiCount = 0;
+    rpmds fds;
+
+    if (ds == NULL || !ds->ti || !ds->Count)
+       return NULL;
+
+    for (i = 0; i < ds->Count; i++) {
+       if (ds->ti[i] == ti)
+           tiCount++;
+    }
+
+    if (!tiCount)
+       return NULL;
+
+    fds = rpmdsCreate(ds->pool, ds->tagN, ds->Type, tiCount, ds->instance);
+
+    fds->N = xmalloc(tiCount * sizeof(*fds->N));
+    fds->EVR = xmalloc(tiCount * sizeof(*fds->EVR));
+    fds->Flags = xmalloc(tiCount * sizeof(*fds->Flags));
+    fds->ti = xmalloc(tiCount * sizeof(*fds->ti));
+    fds->i = -1;
+
+    i2 = 0;
+    for (i = 0; i < ds->Count; i++) {
+       if (ds->ti[i] == ti) {
+           fds->N[i2] = ds->N[i];
+           fds->EVR[i2] = ds->EVR[i];
+           fds->Flags[i2] = ds->Flags[i];
+           fds->ti[i2] = ds->ti[i];
+           i2++;
+       }
+    }
+
+    return fds;
+}
+
+int rpmdsPutToHeader(rpmds ds, Header h)
+{
+    rpmTagVal tagN = rpmdsTagN(ds);
+    rpmTagVal tagEVR = rpmdsTagEVR(ds);
+    rpmTagVal tagF = rpmdsTagF(ds);
+    rpmTagVal tagTi = rpmdsTagTi(ds);
+    if (!tagN)
+       return -1;
+
+    rpmds pi = rpmdsInit(ds);
+    while (rpmdsNext(pi) >= 0) {
+       rpmsenseFlags flags = rpmdsFlags(pi);
+       uint32_t index = rpmdsTi(pi);
+       headerPutString(h, tagN, rpmdsN(pi));
+       headerPutString(h, tagEVR, rpmdsEVR(pi));
+       headerPutUint32(h, tagF, &flags, 1);
+       if (tagTi != RPMTAG_NOT_FOUND) {
+           headerPutUint32(h, tagTi, &index, 1);
+       }
+    }
+    return 0;
+}
+
 int rpmdsCount(const rpmds ds)
 {
     return (ds != NULL ? ds->Count : 0);
@@ -385,13 +595,22 @@ int rpmdsSetIx(rpmds ds, int ix)
     return i;
 }
 
+char rpmdsD(const rpmds ds)
+{
+    if (ds != NULL) {
+       return tagNToChar(ds->tagN);
+    } else {
+       return '\0';
+    }
+}
+
 const char * rpmdsDNEVR(const rpmds ds)
 {
     const char * DNEVR = NULL;
 
     if (ds != NULL && ds->i >= 0 && ds->i < ds->Count) {
        if (ds->DNEVR == NULL) {
-           char t[2] = { ds->Type[0], '\0' };
+           char t[2] = { tagNToChar(ds->tagN), '\0' };
            ds->DNEVR = rpmdsNewDNEVR(t, ds);
        }
        DNEVR = ds->DNEVR;
@@ -424,6 +643,11 @@ rpmsenseFlags rpmdsFlags(const rpmds ds)
     return (ds != NULL) ? rpmdsFlagsIndex(ds, ds->i) : 0;
 }
 
+int rpmdsTi(const rpmds ds)
+{
+    return (ds != NULL) ? rpmdsTiIndex(ds, ds->i) : 0;
+}
+
 rpmTagVal rpmdsTagN(const rpmds ds)
 {
     rpmTagVal tagN = RPMTAG_NOT_FOUND;
@@ -433,6 +657,33 @@ rpmTagVal rpmdsTagN(const rpmds ds)
     return tagN;
 }
 
+rpmTagVal rpmdsTagEVR(const rpmds ds)
+{
+    rpmTagVal tagEVR = RPMTAG_NOT_FOUND;
+
+    if (ds != NULL)
+       dsType(ds->tagN, NULL, &tagEVR, NULL, NULL);
+    return tagEVR;
+}
+
+rpmTagVal rpmdsTagF(const rpmds ds)
+{
+    rpmTagVal tagF = RPMTAG_NOT_FOUND;
+
+    if (ds != NULL)
+       dsType(ds->tagN, NULL, NULL, &tagF, NULL);
+    return tagF;
+}
+
+rpmTagVal rpmdsTagTi(const rpmds ds)
+{
+    rpmTagVal tagTi = RPMTAG_NOT_FOUND;
+
+    if (ds != NULL)
+       dsType(ds->tagN, NULL, NULL, NULL, &tagTi);
+    return tagTi;
+}
+
 unsigned int rpmdsInstance(rpmds ds)
 {
     return (ds != NULL) ? ds->instance : 0;
@@ -529,8 +780,6 @@ static rpmds rpmdsDup(const rpmds ods)
     size_t nb;
     
     ds->i = ods->i;
-    ds->l = ods->l;
-    ds->u = ods->u;
     ds->nopromote = ods->nopromote;
 
     nb = ds->Count * sizeof(*ds->N);
@@ -547,58 +796,77 @@ static rpmds rpmdsDup(const rpmds ods)
        ds->Flags = memcpy(xmalloc(nb), ods->Flags, nb);
     }
 
+    if (ods->ti) {
+       nb = ds->Count * sizeof(*ds->ti);
+       ds->ti = memcpy(xmalloc(nb), ods->ti, nb);
+    }
+
     return ds;
 
 }
 
-int rpmdsFind(rpmds ds, const rpmds ods)
+static int doFind(rpmds ds, const rpmds ods, unsigned int *he)
 {
     int comparison;
     const char *N, *ON = rpmdsN(ods);
     const char *EVR, *OEVR = rpmdsEVR(ods);
     rpmsenseFlags Flags, OFlags = rpmdsFlags(ods);
+    int index, Oindex = rpmdsTi(ods);
     int rc = -1; /* assume not found */
 
     if (ds == NULL || ods == NULL)
        return -1;
 
-    ds->l = 0;
-    ds->u = ds->Count;
-    while (ds->l < ds->u) {
-       ds->i = (ds->l + ds->u) / 2;
+    unsigned int l = 0;
+    unsigned int u = ds->Count;
+    while (l < u) {
+       ds->i = (l + u) / 2;
 
        N = rpmdsN(ds);
        EVR = rpmdsEVR(ds);
        Flags = rpmdsFlags(ds);
+       index = rpmdsTi(ds);
 
        comparison = strcmp(ON, N);
 
        /* XXX rpm prior to 3.0.2 did not always supply EVR and Flags. */
        if (comparison == 0 && OEVR && EVR)
            comparison = strcmp(OEVR, EVR);
-       if (comparison == 0 && OFlags && Flags)
+       if (comparison == 0)
            comparison = OFlags - Flags;
+       if (comparison == 0)
+           comparison = Oindex - index;
 
        if (comparison < 0)
-           ds->u = ds->i;
+           u = ds->i;
        else if (comparison > 0)
-           ds->l = ds->i + 1;
+           l = ds->i + 1;
        else {
            rc = ds->i;
            break;
        }
     }
+    if (he)
+       *he = u;
     return rc;
 }
 
+int rpmdsFind(rpmds ds, const rpmds ods)
+{
+    return doFind(ds, ods, NULL);
+}
+
 int rpmdsMerge(rpmds * dsp, rpmds ods)
 {
     rpmds ds;
     int save;
+    int ocount;
 
     if (dsp == NULL || ods == NULL)
        return -1;
 
+    ocount = rpmdsCount(*dsp);
+
     /* If not initialized yet, dup the 1st entry. */
     if (*dsp == NULL) {
        save = ods->Count;
@@ -615,6 +883,12 @@ int rpmdsMerge(rpmds * dsp, rpmds ods)
        ds->EVR = xcalloc(ds->Count, sizeof(*ds->EVR));
     if (ds->Flags == NULL)
        ds->Flags = xcalloc(ds->Count, sizeof(*ds->Flags));
+    if (ds->ti == NULL && ods->ti) {
+       int i;
+       ds->ti = xcalloc(ds->Count, sizeof(*ds->ti));
+       for (i = 0; i < ds->Count; i++)
+           ds->ti[i] = -1;
+    }
 
     /*
      * Add new entries.
@@ -623,10 +897,11 @@ int rpmdsMerge(rpmds * dsp, rpmds ods)
     ods = rpmdsInit(ods);
     while (rpmdsNext(ods) >= 0) {
        const char *OEVR;
+       unsigned int u;
        /*
         * If this entry is already present, don't bother.
         */
-       if (rpmdsFind(ds, ods) >= 0)
+       if (doFind(ds, ods, &u) >= 0)
            continue;
 
        /*
@@ -634,33 +909,42 @@ int rpmdsMerge(rpmds * dsp, rpmds ods)
         */
        rpmstrPoolUnfreeze(ds->pool);
        ds->N = xrealloc(ds->N, (ds->Count+1) * sizeof(*ds->N));
-       if (ds->u < ds->Count) {
-           memmove(ds->N + ds->u + 1, ds->N + ds->u,
-                   (ds->Count - ds->u) * sizeof(*ds->N));
+       if (u < ds->Count) {
+           memmove(ds->N + u + 1, ds->N + u,
+                   (ds->Count - u) * sizeof(*ds->N));
        }
-       ds->N[ds->u] = rpmstrPoolId(ds->pool, rpmdsN(ods), 1);
+       ds->N[u] = rpmstrPoolId(ds->pool, rpmdsN(ods), 1);
 
        ds->EVR = xrealloc(ds->EVR, (ds->Count+1) * sizeof(*ds->EVR));
-       if (ds->u < ds->Count) {
-           memmove(ds->EVR + ds->u + 1, ds->EVR + ds->u,
-                   (ds->Count - ds->u) * sizeof(*ds->EVR));
+       if (u < ds->Count) {
+           memmove(ds->EVR + u + 1, ds->EVR + u,
+                   (ds->Count - u) * sizeof(*ds->EVR));
        }
        OEVR = rpmdsEVR(ods);
-       ds->EVR[ds->u] = rpmstrPoolId(ds->pool, OEVR ? OEVR : "", 1);
+       ds->EVR[u] = rpmstrPoolId(ds->pool, OEVR ? OEVR : "", 1);
 
        ds->Flags = xrealloc(ds->Flags, (ds->Count+1) * sizeof(*ds->Flags));
-       if (ds->u < ds->Count) {
-           memmove(ds->Flags + ds->u + 1, ds->Flags + ds->u,
-                   (ds->Count - ds->u) * sizeof(*ds->Flags));
+       if (u < ds->Count) {
+           memmove(ds->Flags + u + 1, ds->Flags + u,
+                   (ds->Count - u) * sizeof(*ds->Flags));
+       }
+       ds->Flags[u] = rpmdsFlags(ods);
+
+       if (ds->ti || ods->ti) {
+           ds->ti = xrealloc(ds->ti, (ds->Count+1) * sizeof(*ds->ti));
+           if (u < ds->Count) {
+               memmove(ds->ti + u + 1, ds->ti + u,
+                       (ds->Count - u) * sizeof(*ds->ti));
+           }
+           ds->ti[u] = rpmdsTi(ods);
        }
-       ds->Flags[ds->u] = rpmdsFlags(ods);
 
        ds->i = ds->Count;
        ds->Count++;
 
     }
     ods->i = save;
-    return 0;
+    return (ds->Count - ocount);
 }
 
 
@@ -988,6 +1272,17 @@ static const struct rpmlibProvides_s rpmlibProvides[] = {
     { "rpmlib(TildeInVersions)",    "4.10.0-1",
        (               RPMSENSE_EQUAL),
     N_("dependency comparison supports versions with tilde.") },
+    { "rpmlib(LargeFiles)",    "4.12.0-1",
+       (               RPMSENSE_EQUAL),
+    N_("support files larger than 4GB") },
+    { "rpmlib(RichDependencies)",    "4.12.0-1",
+       (               RPMSENSE_EQUAL),
+    N_("support for rich dependencies.") },
+#ifdef HAVE_ZSTD
+    { "rpmlib(PayloadIsZstd)",         "5.4.18-1",
+       (RPMSENSE_RPMLIB|RPMSENSE_EQUAL),
+    N_("package payload can be compressed using zstd.") },
+#endif
     { NULL,                            NULL, 0,        NULL }
 };
 
@@ -1001,7 +1296,7 @@ int rpmdsRpmlibPool(rpmstrPool pool, rpmds * dsp, const void * tblp)
     if (rltblp == NULL)
        rltblp = rpmlibProvides;
 
-    for (rlp = rltblp; rlp->featureName != NULL && rc == 0; rlp++) {
+    for (rlp = rltblp; rlp->featureName != NULL && rc >= 0; rlp++) {
        rpmds ds = rpmdsSinglePool(pool, RPMTAG_PROVIDENAME, rlp->featureName,
                        rlp->featureEVR, rlp->featureFlags);
        rc = rpmdsMerge(dsp, ds);
@@ -1010,7 +1305,7 @@ int rpmdsRpmlibPool(rpmstrPool pool, rpmds * dsp, const void * tblp)
     /* freeze the pool to save memory, but only if private pool */
     if (*dsp && (*dsp)->pool != pool)
        rpmstrPoolFreeze((*dsp)->pool, 0);
-    return rc;
+    return (rc < 0) ? -1 : 0;
 }
 
 int rpmdsRpmlib(rpmds * dsp, const void * tblp)
@@ -1022,3 +1317,392 @@ rpmstrPool rpmdsPool(rpmds ds)
 {
     return (ds != NULL) ? ds->pool : NULL;
 }
+
+rpmsenseFlags rpmSanitizeDSFlags(rpmTagVal tagN, rpmsenseFlags Flags)
+{
+    rpmsenseFlags extra = RPMSENSE_ANY;
+    switch (tagN) {
+    case RPMTAG_PROVIDENAME:
+       extra = Flags & RPMSENSE_FIND_PROVIDES;
+       break;
+    case RPMTAG_TRIGGERNAME:
+    case RPMTAG_FILETRIGGERNAME:
+    case RPMTAG_TRANSFILETRIGGERNAME:
+       extra = Flags & RPMSENSE_TRIGGER;
+       break;
+    case RPMTAG_RECOMMENDNAME:
+    case RPMTAG_SUGGESTNAME:
+    case RPMTAG_SUPPLEMENTNAME:
+    case RPMTAG_ENHANCENAME:
+    case RPMTAG_REQUIRENAME:
+       extra = Flags & (_ALL_REQUIRES_MASK);
+       break;
+    case RPMTAG_CONFLICTNAME:
+       extra = Flags;
+       break;
+    default:
+       break;
+    }
+    return (Flags & RPMSENSE_SENSEMASK) | extra;
+}
+
+static struct ReqComp {
+const char * token;
+    rpmsenseFlags sense;
+} const ReqComparisons[] = { 
+    { "<=", RPMSENSE_LESS | RPMSENSE_EQUAL},
+    { "=<", RPMSENSE_LESS | RPMSENSE_EQUAL},
+    { "<",  RPMSENSE_LESS},
+
+    { "==", RPMSENSE_EQUAL},
+    { "=",  RPMSENSE_EQUAL},
+    
+    { ">=", RPMSENSE_GREATER | RPMSENSE_EQUAL},
+    { "=>", RPMSENSE_GREATER | RPMSENSE_EQUAL},
+    { ">",  RPMSENSE_GREATER},
+
+    { NULL, 0 },
+};
+
+rpmsenseFlags rpmParseDSFlags(const char *str, size_t len)
+{
+    const struct ReqComp *rc;
+    for (rc = ReqComparisons; rc->token != NULL; rc++)
+       if (len == strlen(rc->token) && rstreqn(str, rc->token, len))
+           return rc->sense;
+    return 0;
+}
+
+static struct RichOpComp {
+    const char * token;
+    rpmrichOp op;
+} const RichOps[] = { 
+    { "and",    RPMRICHOP_AND},
+    { "or",     RPMRICHOP_OR},
+    { "if",     RPMRICHOP_IF},
+    { "unless",         RPMRICHOP_UNLESS},
+    { "else",   RPMRICHOP_ELSE},
+    { "with",   RPMRICHOP_WITH},
+    { "without", RPMRICHOP_WITHOUT},
+    { NULL, 0 },
+};
+
+int rpmdsIsRich(rpmds dep)
+{
+    const char * n = rpmdsN(dep);
+    return (n && n[0] == '(');
+}
+
+static rpmRC parseRichDepOp(const char **dstrp, rpmrichOp *opp, char **emsg)
+{
+    const char *p = *dstrp, *pe = p;
+    const struct RichOpComp *ro;
+
+    while (*pe && !risspace(*pe) && *pe != ')')
+       pe++;
+    for (ro = RichOps; ro->token != NULL; ro++)
+       if (pe - p == strlen(ro->token) && rstreqn(p, ro->token, pe - p)) {
+           *opp = ro->op;
+           *dstrp = pe; 
+           return RPMRC_OK;
+       }
+    if (emsg)
+       rasprintf(emsg, _("Unknown rich dependency op '%.*s'"), (int)(pe - p), p); 
+    return RPMRC_FAIL;
+}
+
+const char *rpmrichOpStr(rpmrichOp op)
+{
+    if (op == RPMRICHOP_SINGLE)
+       return "SINGLE";
+    if (op == RPMRICHOP_AND)
+       return "and";
+    if (op == RPMRICHOP_OR)
+       return "or";
+    if (op == RPMRICHOP_IF)
+       return "if";
+    if (op == RPMRICHOP_UNLESS)
+       return "unless";
+    if (op == RPMRICHOP_ELSE)
+       return "else";
+    if (op == RPMRICHOP_WITH)
+       return "with";
+    if (op == RPMRICHOP_WITHOUT)
+       return "without";
+    return NULL;
+}
+
+
+#define SKIPWHITE(_x)   {while (*(_x) && (risspace(*_x) || *(_x) == ',')) (_x)++;}
+#define SKIPNONWHITEX(_x){int bl = 0; while (*(_x) &&!(risspace(*_x) || *(_x) == ',' || (*(_x) == ')' && bl-- <= 0))) if (*(_x)++ == '(') bl++;}
+
+static rpmRC parseSimpleDep(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata)
+{
+    const char *p = *dstrp;
+    const char *n, *e = 0;
+    int nl, el = 0;
+    rpmsenseFlags sense = 0;
+
+    n = p;
+    SKIPNONWHITEX(p);
+    nl = p - n;
+    if (nl == 0) {
+        if (emsg)
+          rasprintf(emsg, _("Name required"));
+        return RPMRC_FAIL;
+    }   
+    SKIPWHITE(p);
+    if (*p) {
+        const char *pe = p;
+
+        SKIPNONWHITEX(pe);
+       sense = rpmParseDSFlags(p, pe - p);
+        if (sense) {
+            p = pe; 
+            SKIPWHITE(p);
+            e = p;
+            SKIPNONWHITEX(p);
+            el = p - e;
+        }
+    }   
+    if (e && el == 0) {
+        if (emsg)
+          rasprintf(emsg, _("Version required"));
+        return RPMRC_FAIL;
+    }
+    if (cb && cb(cbdata, RPMRICH_PARSE_SIMPLE, n, nl, e, el, sense, RPMRICHOP_SINGLE, emsg) != RPMRC_OK)
+       return RPMRC_FAIL;
+    *dstrp = p;
+    return RPMRC_OK;
+}
+
+#define RICHPARSE_CHECK                (1 << 0)
+#define RICHPARSE_NO_WITH      (1 << 1)
+#define RICHPARSE_NO_AND       (1 << 2)
+#define RICHPARSE_NO_OR                (1 << 3)
+
+static rpmRC rpmrichParseCheck(rpmrichOp op, int check, char **emsg)
+{
+    if ((op == RPMRICHOP_WITH || op == RPMRICHOP_WITHOUT) && (check & RICHPARSE_NO_WITH) != 0) {
+       if (emsg)
+           rasprintf(emsg, _("Illegal ops in with/without"));
+       return RPMRC_FAIL;
+    }
+    if ((check & RICHPARSE_CHECK) == 0)
+       return RPMRC_OK;
+    if ((op == RPMRICHOP_AND || op == RPMRICHOP_IF) && (check & RICHPARSE_NO_AND) != 0) {
+       if (emsg)
+           rasprintf(emsg, _("Illegal context for 'unless', please use 'or' instead"));
+       return RPMRC_FAIL;
+    }
+    if ((op == RPMRICHOP_OR || op == RPMRICHOP_UNLESS) && (check & RICHPARSE_NO_OR) != 0) {
+       if (emsg)
+           rasprintf(emsg, _("Illegal context for 'if', please use 'and' instead"));
+       return RPMRC_FAIL;
+    }
+    return RPMRC_OK;
+}
+
+static rpmRC rpmrichParseInternal(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata, int *checkp)
+{
+    const char *p = *dstrp, *pe;
+    rpmrichOp op = RPMRICHOP_SINGLE, firstop = RPMRICHOP_SINGLE, chainop = 0;
+    int check = checkp ? *checkp : 0;
+
+    if (cb && cb(cbdata, RPMRICH_PARSE_ENTER, p, 0, 0, 0, 0, op, emsg) != RPMRC_OK)
+        return RPMRC_FAIL;
+    if (*p++ != '(') {
+        if (emsg)
+          rasprintf(emsg, _("Rich dependency does not start with '('"));
+        return RPMRC_FAIL;
+    }
+    for (;;) {
+        SKIPWHITE(p);
+        if (*p == ')') {
+            if (emsg) {
+                if (chainop)
+                    rasprintf(emsg, _("Missing argument to rich dependency op"));
+                else
+                    rasprintf(emsg, _("Empty rich dependency"));
+            }
+            return RPMRC_FAIL;
+        }
+       if (*p == '(') {
+           int subcheck = check & RICHPARSE_CHECK;
+           if (rpmrichParseInternal(&p, emsg, cb, cbdata, &subcheck) != RPMRC_OK)
+               return RPMRC_FAIL;
+           if (op == RPMRICHOP_IF || op == RPMRICHOP_UNLESS)
+               subcheck &= ~(RICHPARSE_NO_AND | RICHPARSE_NO_OR);
+           check |= subcheck;
+       } else {
+            if (parseSimpleDep(&p, emsg, cb, cbdata) != RPMRC_OK)
+                return RPMRC_FAIL;
+        }
+        SKIPWHITE(p);
+        if (!*p) {
+            if (emsg)
+                rasprintf(emsg, _("Unterminated rich dependency: %s"), *dstrp);
+            return RPMRC_FAIL;
+        }
+        if (*p == ')')
+            break;
+        pe = p;
+        if (parseRichDepOp(&pe, &op, emsg) != RPMRC_OK)
+            return RPMRC_FAIL;
+       if (firstop == RPMRICHOP_SINGLE)
+           firstop = op;
+
+       if (op == RPMRICHOP_ELSE && (chainop == RPMRICHOP_IF || chainop == RPMRICHOP_UNLESS))
+           chainop = 0;
+        if (chainop && op != chainop) {
+            if (emsg)
+                rasprintf(emsg, _("Cannot chain different ops"));
+            return RPMRC_FAIL;
+        }
+        if (chainop && op != RPMRICHOP_AND && op != RPMRICHOP_OR && op != RPMRICHOP_WITH) {
+            if (emsg)
+                rasprintf(emsg, _("Can only chain and/or/with ops"));
+            return RPMRC_FAIL;
+       }
+        if (cb && cb(cbdata, RPMRICH_PARSE_OP, p, pe - p, 0, 0, 0, op, emsg) != RPMRC_OK)
+            return RPMRC_FAIL;
+        chainop = op;
+        p = pe;
+    }
+
+    /* check for illegal combinations */
+    if (rpmrichParseCheck(firstop, check, emsg) != RPMRC_OK)
+       return RPMRC_FAIL;
+
+    /* update check data */
+    if (firstop == RPMRICHOP_IF)
+       check |= RICHPARSE_NO_OR;
+    if (firstop == RPMRICHOP_UNLESS)
+       check |= RICHPARSE_NO_AND;
+    if (op == RPMRICHOP_AND || op == RPMRICHOP_OR)
+       check &= ~(RICHPARSE_NO_AND | RICHPARSE_NO_OR);
+    if (op != RPMRICHOP_SINGLE && op != RPMRICHOP_WITH && op != RPMRICHOP_WITHOUT && op != RPMRICHOP_OR)
+       check |= RICHPARSE_NO_WITH;
+
+    p++;
+    if (cb && cb(cbdata, RPMRICH_PARSE_LEAVE, *dstrp, p - *dstrp , 0, 0, 0, op, emsg) != RPMRC_OK)
+        return RPMRC_FAIL;
+    *dstrp = p;
+    if (checkp)
+       *checkp |= check;
+    return RPMRC_OK;
+}
+
+rpmRC rpmrichParse(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata)
+{
+    return rpmrichParseInternal(dstrp, emsg, cb, cbdata, NULL);
+}
+
+rpmRC rpmrichParseForTag(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata, rpmTagVal tagN)
+{
+    int check = RICHPARSE_CHECK;
+    if (rpmrichParseInternal(dstrp, emsg, cb, cbdata, &check) != RPMRC_OK)
+       return RPMRC_FAIL;
+    switch (tagN) {
+    case RPMTAG_CONFLICTNAME:
+    case RPMTAG_SUPPLEMENTNAME:
+    case RPMTAG_ENHANCENAME:
+       if (rpmrichParseCheck(RPMRICHOP_OR, check, emsg) != RPMRC_OK)
+           return RPMRC_FAIL;
+       break;
+    default:
+       if (rpmrichParseCheck(RPMRICHOP_AND, check, emsg) != RPMRC_OK)
+           return RPMRC_FAIL;
+       break;
+    }
+    return RPMRC_OK;
+}
+
+struct rpmdsParseRichDepData {
+    rpmds dep;
+    rpmsenseFlags depflags;
+
+    rpmds leftds;
+    rpmds rightds;
+    rpmrichOp op;
+
+    int depth;
+    const char *rightstart;
+    int dochain;
+};
+
+static rpmRC rpmdsParseRichDepCB(void *cbdata, rpmrichParseType type,
+               const char *n, int nl, const char *e, int el, rpmsenseFlags sense,
+               rpmrichOp op, char **emsg) {
+    struct rpmdsParseRichDepData *data = cbdata;
+    rpmds ds = 0;
+
+    if (type == RPMRICH_PARSE_ENTER)
+       data->depth++;
+    else if (type == RPMRICH_PARSE_LEAVE) {
+       if (--data->depth == 0 && data->dochain && data->rightstart) {
+           /* chain op hack, construct a sub-ds from the right side of the chain */
+           char *right = xmalloc(n + nl - data->rightstart + 2);
+           right[0] = '(';
+           strncpy(right + 1, data->rightstart, n + nl - data->rightstart);
+           right[n + nl - data->rightstart + 1] = 0;
+           data->rightds = rpmdsFree(data->rightds);
+           ds = singleDS(data->dep->pool, data->dep->tagN, 0, 0, data->depflags, 0, 0, 0);
+           ds->N[0] = rpmstrPoolId(ds->pool, right, 1);
+           ds->EVR[0] = rpmstrPoolId(ds->pool, "", 1);
+           data->rightds = ds;
+           free(right);
+       }
+    }
+    if (data->depth != 1)
+       return RPMRC_OK;        /* we're only interested in top-level parsing */
+    if ((type == RPMRICH_PARSE_SIMPLE || type == RPMRICH_PARSE_LEAVE) && !data->dochain) {
+       if (type == RPMRICH_PARSE_SIMPLE && data->dep->tagN == RPMTAG_REQUIRENAME && nl > 7 &&
+                        rstreqn(n, "rpmlib(", sizeof("rpmlib(")-1))
+           sense |= RPMSENSE_RPMLIB;
+       ds = singleDS(data->dep->pool, data->dep->tagN, 0, 0, sense | data->depflags, 0, 0, 0);
+       ds->N[0] = rpmstrPoolIdn(ds->pool, n, nl, 1);
+       ds->EVR[0] = rpmstrPoolIdn(ds->pool, e ? e : "", el, 1);
+       if (!data->leftds)
+           data->leftds = ds;
+       else {
+           data->rightds = ds;
+           data->rightstart = n;
+       }
+    }
+    if (type == RPMRICH_PARSE_OP) {
+       if (data->op != RPMRICHOP_SINGLE)
+           data->dochain = 1;  /* this is a chained op */
+       else
+           data->op = op;
+    }
+    return RPMRC_OK;
+}
+
+
+rpmRC rpmdsParseRichDep(rpmds dep, rpmds *leftds, rpmds *rightds, rpmrichOp *op, char **emsg)
+{
+    rpmRC rc;
+    struct rpmdsParseRichDepData data;
+    const char *depstr = rpmdsN(dep);
+    memset(&data, 0, sizeof(data));
+    data.dep = dep;
+    data.op = RPMRICHOP_SINGLE;
+    data.depflags = rpmdsFlags(dep) & ~(RPMSENSE_SENSEMASK | RPMSENSE_MISSINGOK);
+    rc = rpmrichParse(&depstr, emsg, rpmdsParseRichDepCB, &data);
+    if (rc == RPMRC_OK && *depstr) {
+       if (emsg)
+           rasprintf(emsg, _("Junk after rich dependency"));
+       rc = RPMRC_FAIL;
+    }
+    if (rc != RPMRC_OK) {
+       rpmdsFree(data.leftds);
+       rpmdsFree(data.rightds);
+    } else {
+       *leftds = data.leftds;
+       *rightds = data.rightds;
+       *op = data.op;
+    }
+    return rc;
+}
+
index bceed0081baa22b811f9195042716fe5e0cf31bc..463a82a96e192edb139275c7155a2ce65750872f 100644 (file)
@@ -86,6 +86,24 @@ typedef rpmFlags rpmsenseFlags;
 #define        isInstallPreReq(_x)     ((_x) & _INSTALL_ONLY_MASK)
 #define        isErasePreReq(_x)       ((_x) & _ERASE_ONLY_MASK)
 
+
+
+/** \ingroup rpmds
+ * Return only those flags allowed for given type of dependencies
+ * @param tagN         type of dependency
+ * @param Flags                flags
+ * @return             flags filtered to allowed bits
+ */
+rpmsenseFlags rpmSanitizeDSFlags(rpmTagVal tagN, rpmsenseFlags Flags);
+
+/** \ingroup rpmds
+ * Convert a string to the sense flags
+ * @param str          the string
+ * @param len          length of the string
+ * @return             flags, zero for unknown relations
+ */
+rpmsenseFlags rpmParseDSFlags(const char *str, size_t len);
+
 /** \ingroup rpmds
  * Reference a dependency set instance.
  * @param ds           dependency set
@@ -143,6 +161,14 @@ rpmds rpmdsSingle(rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlag
  */
 rpmds rpmdsCurrent(rpmds ds);
 
+/** \ingroup rpmds
+ * Write content of the dependency set to the header
+ * @param ds           dependency set
+ * @param h             header
+ * @return             0 on success
+ */
+int rpmdsPutToHeader(rpmds ds, Header h);
+
 /** \ingroup rpmds
  * Return dependency set count.
  * @param ds           dependency set
@@ -172,6 +198,20 @@ int rpmdsSetIx(rpmds ds, int ix);
  */
 const char * rpmdsDNEVR(const rpmds ds);
 
+/** \ingroup rpmds
+ * Return one char indicating the type of the dependency.
+ * @param ds           dependency set
+ * @return             character
+ */
+char rpmdsD(const rpmds ds);
+
+/** \ingroup rpmds
+ * Return matching tagN for one char dependency type description.
+ * @param deptype      character
+ * @return             type of dependency
+ */
+rpmTagVal rpmdsDToTagN(char deptype);
+
 /** \ingroup rpmds
  * Return current dependency name.
  * @param ds           dependency set
@@ -186,6 +226,13 @@ const char * rpmdsN(const rpmds ds);
  */
 const char * rpmdsEVR(const rpmds ds);
 
+/** \ingroup rpmds
+ * Return current dependency triggerindex.
+ * @param ds           dependency set
+ * @return             current dependency trigger index, 0 on invalid
+ */
+int rpmdsTi(const rpmds ds);
+
 /** \ingroup rpmds
  * Return current dependency flags.
  * @param ds           dependency set
@@ -200,6 +247,27 @@ rpmsenseFlags rpmdsFlags(const rpmds ds);
  */
 rpmTagVal rpmdsTagN(const rpmds ds);
 
+/** \ingroup rpmds
+ * Return current dependency type.
+ * @param ds           dependency set
+ * @return             current dependency type version tag, 0 on invalid
+ */
+rpmTagVal rpmdsTagEVR(const rpmds ds);
+
+/** \ingroup rpmds
+ * Return current dependency type.
+ * @param ds           dependency set
+ * @return             current dependency type flags tag, 0 on invalid
+ */
+rpmTagVal rpmdsTagF(const rpmds ds);
+
+/** \ingroup rpmds
+ * Return current dependency type.
+ * @param ds           dependency set
+ * @return             current dependency type trigger index tag, 0 on invalid
+ */
+rpmTagVal rpmdsTagTi(const rpmds ds);
+
 /** \ingroup rpmds
  * Return dependency header instance, ie whether the dependency comes from 
  * an installed header or not.
@@ -246,15 +314,6 @@ rpm_color_t rpmdsColor(const rpmds ds);
  */
 rpm_color_t rpmdsSetColor(const rpmds ds, rpm_color_t color);
 
-/** \ingroup rpmds
- * Notify of results of dependency match.
- * @param ds           dependency set
- * @param where                where dependency was resolved (or NULL)
- * @param rc           0 == YES, otherwise NO
- */
-/* FIX: rpmMessage annotation is a lie */
-void rpmdsNotify(rpmds ds, const char * where, int rc);
-
 /** \ingroup rpmds
  * Return next dependency set iterator index.
  * @param ds           dependency set
@@ -281,7 +340,7 @@ int rpmdsFind(rpmds ds, const rpmds ods);
  * Merge a dependency set maintaining (N,EVR,Flags) sorted order.
  * @retval *dsp                (merged) dependency set
  * @param ods          dependency set to merge
- * @return             (merged) dependency index
+ * @return             number of merged dependencies, -1 on error
  */
 int rpmdsMerge(rpmds * dsp, rpmds ods);
 
@@ -333,12 +392,138 @@ int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote);
 
 /**
  * Load rpmlib provides into a dependency set.
- * @retval *dsp                (loaded) depedency set
+ * @retval *dsp                (loaded) dependency set
  * @param tblp         rpmlib provides table (NULL uses internal table)
  * @return             0 on success
  */
 int rpmdsRpmlib(rpmds * dsp, const void * tblp);
 
+/** \ingroup rpmds
+ * Create and load a dependency set.
+ * @param pool         shared string pool (or NULL for private pool)
+ * @param h            header
+ * @param tagN         type of dependency
+ * @param flags                unused
+ * @return             new dependency set
+ */
+rpmds rpmdsNewPool(rpmstrPool pool, Header h, rpmTagVal tagN, int flags);
+
+/** \ingroup rpmds
+ * Create, load and initialize a dependency for this header. 
+ * @param pool         string pool (or NULL for private pool)
+ * @param h            header
+ * @param tagN         type of dependency
+ * @param Flags                comparison flags
+ * @return             new dependency set
+ */
+rpmds rpmdsThisPool(rpmstrPool pool,
+                   Header h, rpmTagVal tagN, rpmsenseFlags Flags);
+
+/** \ingroup rpmds
+ * Create, load and initialize a dependency set of size 1.
+ * @param pool         string pool (or NULL for private pool)
+ * @param tagN         type of dependency
+ * @param N            name
+ * @param EVR          epoch:version-release
+ * @param Flags                comparison flags
+ * @return             new dependency set
+ */
+rpmds rpmdsSinglePool(rpmstrPool pool, rpmTagVal tagN,
+                     const char * N, const char * EVR, rpmsenseFlags Flags);
+
+/** \ingroup rpmds
+ * Create, load and initialize a trigger dependency set of size 1.
+ * @param pool         string pool (or NULL for private pool)
+ * @param tagN         type of dependency
+ * @param N            name
+ * @param EVR          epoch:version-release
+ * @param Flags                comparison flags
+ * @param triggerIndex trigger index
+ * @return             new dependency set
+ */
+rpmds rpmdsSinglePoolTix(rpmstrPool pool, rpmTagVal tagN,
+                           const char * N, const char * EVR, 
+                           rpmsenseFlags Flags, int triggerIndex);
+
+/**
+ * Load rpmlib provides into a dependency set.
+ * @param pool         shared string pool (or NULL for private pool)
+ * @retval *dsp                (loaded) dependency set
+ * @param tblp         rpmlib provides table (NULL uses internal table)
+ * @return             0 on success
+ */
+int rpmdsRpmlibPool(rpmstrPool pool, rpmds * dsp, const void * tblp);
+
+
+typedef enum rpmrichOp_e {
+    RPMRICHOP_SINGLE  = 1,
+    RPMRICHOP_AND     = 2,
+    RPMRICHOP_OR      = 3,
+    RPMRICHOP_IF      = 4,
+    RPMRICHOP_ELSE    = 5,
+    RPMRICHOP_WITH    = 6,
+    RPMRICHOP_WITHOUT = 7,
+    RPMRICHOP_UNLESS  = 8
+} rpmrichOp;
+
+typedef enum rpmrichParseType_e {
+    RPMRICH_PARSE_SIMPLE = 1,  /* standard N <=> EVR dep */
+    RPMRICH_PARSE_ENTER  = 2,  /* entering sub-dependency */
+    RPMRICH_PARSE_LEAVE  = 3,  /* leaving sub-dependency */
+    RPMRICH_PARSE_OP     = 4   /* parsed a rich dependency op */
+} rpmrichParseType;
+
+typedef rpmRC (*rpmrichParseFunction) (void *cbdata, rpmrichParseType type,
+                        const char *n, int nl, const char *e, int el, rpmsenseFlags sense,
+                        rpmrichOp op, char **emsg);
+
+/**
+ * Parse a rich dependency string
+ * @param dstrp                pointer to sting, will be updated
+ * @param emsg         returns the error string, can be NULL
+ * @param cb           callback function
+ * @param cbdata       callback function data
+ * @return             RPMRC_OK on success
+ */
+rpmRC rpmrichParse(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata);
+
+/**
+ * Parse a rich dependency string for a specific tag
+ * @param dstrp                pointer to sting, will be updated
+ * @param emsg         returns the error string, can be NULL
+ * @param cb           callback function
+ * @param cbdata       callback function data
+ * @param tagN         type of dependency
+ * @return             RPMRC_OK on success
+ */
+rpmRC rpmrichParseForTag(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata, rpmTagVal tagN);
+
+
+/**
+ * Return if current depenency is rich
+ * @param dep          the dependency
+ * @return             1 is dependency is a rich 0 otherwise
+ */
+int rpmdsIsRich(rpmds dep);
+
+/**
+ * Return a string representation of the rich dependency op
+ * @param op           the dependency op
+ * @return             constant string, do not free
+ */
+const char *rpmrichOpStr(rpmrichOp op);
+
+/**
+ * Parse a rich dependency string
+ * @param dep          the dependency
+ * @param leftds       returns the left dependency
+ * @param rightds      returns the right dependency
+ * @param op           returns the rich dep op
+ * @param emsg         returns the error string
+ * @return             RPMRC_OK on success
+ */
+rpmRC rpmdsParseRichDep(rpmds dep, rpmds *leftds, rpmds *rightds, rpmrichOp *op, char **emsg);
+
 #ifdef __cplusplus
 }
 #endif
index edd5a0268db73b7f304a405c46c82fcbf5d5a9bd..6861fba0fde997d79312c804009757bc42d8ffb6 100644 (file)
@@ -7,52 +7,6 @@
 extern "C" {
 #endif
 
-/** \ingroup rpmds
- * Create and load a dependency set.
- * @param pool         shared string pool (or NULL for private pool)
- * @param h            header
- * @param tagN         type of dependency
- * @param flags                unused
- * @return             new dependency set
- */
-RPM_GNUC_INTERNAL
-rpmds rpmdsNewPool(rpmstrPool pool, Header h, rpmTagVal tagN, int flags);
-
-/** \ingroup rpmds
- * Create, load and initialize a dependency for this header. 
- * @param pool         string pool (or NULL for private pool)
- * @param h            header
- * @param tagN         type of dependency
- * @param Flags                comparison flags
- * @return             new dependency set
- */
-RPM_GNUC_INTERNAL
-rpmds rpmdsThisPool(rpmstrPool pool,
-                   Header h, rpmTagVal tagN, rpmsenseFlags Flags);
-
-/** \ingroup rpmds
- * Create, load and initialize a dependency set of size 1.
- * @param pool         string pool (or NULL for private pool)
- * @param tagN         type of dependency
- * @param N            name
- * @param EVR          epoch:version-release
- * @param Flags                comparison flags
- * @return             new dependency set
- */
-RPM_GNUC_INTERNAL
-rpmds rpmdsSinglePool(rpmstrPool pool, rpmTagVal tagN,
-                     const char * N, const char * EVR, rpmsenseFlags Flags);
-
-/**
- * Load rpmlib provides into a dependency set.
- * @param pool         shared string pool (or NULL for private pool)
- * @retval *dsp                (loaded) depedency set
- * @param tblp         rpmlib provides table (NULL uses internal table)
- * @return             0 on success
- */
-RPM_GNUC_INTERNAL
-int rpmdsRpmlibPool(rpmstrPool pool, rpmds * dsp, const void * tblp);
-
 /** \ingroup rpmds
  * Swiss army knife dependency matching function.
  * @param pool         string pool (or NULL for private pool)
@@ -67,6 +21,15 @@ RPM_GNUC_INTERNAL
 int rpmdsMatches(rpmstrPool pool, Header h, int prix,
                 rpmds req, int selfevr, int nopromote);
 
+/** \ingroup rpmds
+ * Notify of results of dependency match.
+ * @param ds           dependency set
+ * @param where                where dependency was resolved (or NULL)
+ * @param rc           0 == YES, otherwise NO
+ */
+RPM_GNUC_INTERNAL
+void rpmdsNotify(rpmds ds, const char * where, int rc);
+
 /** \ingroup rpmds
  * Return current dependency name pool id.
  * @param ds            dependency set
@@ -106,12 +69,24 @@ const char * rpmdsEVRIndex(rpmds ds, int i);
 RPM_GNUC_INTERNAL
 rpmsenseFlags rpmdsFlagsIndex(rpmds ds, int i);
 
+RPM_GNUC_INTERNAL
+int rpmdsTiIndex(rpmds ds, int i);
+
 RPM_GNUC_INTERNAL
 rpm_color_t rpmdsColorIndex(rpmds ds, int i);
 
 RPM_GNUC_INTERNAL
 int rpmdsCompareIndex(rpmds A, int aix, rpmds B, int bix);
 
+/** \ingroup rpmds
+ * Filter dependency set and return new dependency set containing only items
+ * with given trigger index.
+ * @param ds           dependency set
+ * @param ti           trigger index
+ * @return             new filtered dependency set
+ */
+RPM_GNUC_INTERNAL
+rpmds rpmdsFilterTi(rpmds ds, int ti);
 #ifdef __cplusplus
 }
 #endif
index 7f7ef2a7f679d89a4a290c6d24f3df0b00e7344c..beb2ae72b24098f1e4d815e118be467ca8af39d7 100644 (file)
 #include <rpm/rpmstring.h>
 #include <rpm/rpmmacro.h>      /* XXX rpmCleanPath */
 #include <rpm/rpmds.h>
+#include <errno.h>
 
 #include "lib/rpmfi_internal.h"
 #include "lib/rpmte_internal.h"        /* relocations */
 #include "lib/cpio.h"  /* XXX CPIO_FOO */
+#include "lib/fsm.h"   /* rpmpsm stuff for now */
+#include "lib/rpmug.h"
+#include "rpmio/rpmio_internal.h"       /* fdInit/FiniDigest */
 
 #include "debug.h"
 
+struct hardlinks_s {
+    int nlink;
+    int files[];
+};
+
+typedef struct hardlinks_s * hardlinks_t;
+
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+#define HASHTYPE nlinkHash
+#define HTKEYTYPE int
+#define HTDATATYPE struct hardlinks_s *
+#include "lib/rpmhash.H"
+#include "lib/rpmhash.C"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+
+typedef int (*iterfunc)(rpmfi fi);
+
+struct rpmfi_s {
+    int i;                     /*!< Current file index. */
+    int j;                     /*!< Current directory index. */
+    iterfunc next;             /*!< Iterator function. */
+    char * fn;                 /*!< File name buffer. */
+    char * ofn;                        /*!< Original file name buffer. */
+
+    int intervalStart;         /*!< Start of iterating interval. */
+    int intervalEnd;           /*!< End of iterating interval. */
+
+    rpmfiles files;            /*!< File info set */
+    rpmcpio_t archive;         /*!< Archive with payload */
+    unsigned char * found;     /*!< Bit field of files found in the archive */
+    int nrefs;                 /*!< Reference count */
+};
+
+struct rpmfn_s {
+    rpm_count_t dc;            /*!< No. of directories. */
+    rpm_count_t fc;            /*!< No. of files. */
+
+    rpmsid * bnid;             /*!< Index to base name(s) (pool) */
+    rpmsid * dnid;             /*!< Index to directory name(s) (pool) */
+    uint32_t * dil;            /*!< Directory indice(s) (from header) */
+};
+
+typedef struct rpmfn_s * rpmfn;
+
+/**
+ * A package filename set.
+ */
+struct rpmfiles_s {
+    Header h;                  /*!< Header for file info set (or NULL) */
+    rpmstrPool pool;           /*!< String pool of this file info set */
+
+    struct rpmfn_s fndata;     /*!< File name data */
+    struct rpmfn_s *ofndata;   /*!< Original file name data */
+
+    rpmsid * flinks;           /*!< Index to file link(s) (pool) */
+
+    rpm_flag_t * fflags;       /*!< File flag(s) (from header) */
+    rpm_off_t * fsizes;                /*!< File size(s) (from header) */
+    rpm_loff_t * lfsizes;      /*!< File size(s) (from header) */
+    rpm_time_t * fmtimes;      /*!< File modification time(s) (from header) */
+    rpm_mode_t * fmodes;       /*!< File mode(s) (from header) */
+    rpm_rdev_t * frdevs;       /*!< File rdev(s) (from header) */
+    rpm_ino_t * finodes;       /*!< File inodes(s) (from header) */
+
+    rpmsid * fuser;            /*!< Index to file owner(s) (misc pool) */
+    rpmsid * fgroup;           /*!< Index to file group(s) (misc pool) */
+    rpmsid * flangs;           /*!< Index to file lang(s) (misc pool) */
+
+    char * fstates;            /*!< File state(s) (from header) */
+
+    rpm_color_t * fcolors;     /*!< File color bits (header) */
+    char ** fcaps;             /*!< File capability strings (header) */
+
+    char ** cdict;             /*!< File class dictionary (header) */
+    rpm_count_t ncdict;                /*!< No. of class entries. */
+    uint32_t * fcdictx;                /*!< File class dictionary index (header) */
+
+    uint32_t * ddict;          /*!< File depends dictionary (header) */
+    rpm_count_t nddict;                /*!< No. of depends entries. */
+    uint32_t * fddictx;                /*!< File depends dictionary start (header) */
+    uint32_t * fddictn;                /*!< File depends dictionary count (header) */
+    rpm_flag_t * vflags;       /*!< File verify flag(s) (from header) */
+
+    rpmfiFlags fiflags;                /*!< file info set control flags */
+
+    struct fingerPrint_s * fps;        /*!< File fingerprint(s). */
+
+    int digestalgo;            /*!< File digest algorithm */
+    int signaturelength;       /*!< File signature length */
+    unsigned char * digests;   /*!< File digests in binary. */
+    unsigned char * signatures; /*!< File signatures in binary. */
+
+    struct nlinkHash_s * nlinks;/*!< Files connected by hardlinks */
+    rpm_off_t * replacedSizes; /*!< (TR_ADDED) */
+    rpm_loff_t * replacedLSizes;/*!< (TR_ADDED) */
+    int magic;
+    int nrefs;         /*!< Reference count. */
+};
+
+static int indexSane(rpmtd xd, rpmtd yd, rpmtd zd);
+static int cmpPoolFn(rpmstrPool pool, rpmfn files, int ix, const char * fn);
+
+static rpmfiles rpmfilesUnlink(rpmfiles fi)
+{
+    if (fi)
+       fi->nrefs--;
+    return NULL;
+}
+
+rpmfiles rpmfilesLink(rpmfiles fi)
+{
+    if (fi)
+       fi->nrefs++;
+    return fi;
+}
+
 static rpmfi rpmfiUnlink(rpmfi fi)
 {
     if (fi)
@@ -32,14 +156,146 @@ rpmfi rpmfiLink(rpmfi fi)
     return fi;
 }
 
+/*
+ * Collect and validate file path data from header.
+ * Return the number of files found (could be none) or -1 on error.
+ */
+static int rpmfnInit(rpmfn fndata, rpmTagVal bntag, Header h, rpmstrPool pool)
+{
+    struct rpmtd_s bn, dn, dx;
+    rpmTagVal dntag, ditag;
+    int rc = 0;
+
+    if (bntag == RPMTAG_BASENAMES) {
+       dntag = RPMTAG_DIRNAMES;
+       ditag = RPMTAG_DIRINDEXES;
+    } else if (bntag == RPMTAG_ORIGBASENAMES) {
+       dntag = RPMTAG_ORIGDIRNAMES;
+       ditag = RPMTAG_ORIGDIRINDEXES;
+    } else {
+       return -1;
+    }
+
+    /* Grab and validate file triplet data (if there is any) */
+    if (headerGet(h, bntag, &bn, HEADERGET_MINMEM)) {
+       headerGet(h, dntag, &dn, HEADERGET_MINMEM);
+       headerGet(h, ditag, &dx, HEADERGET_ALLOC);
+
+       if (indexSane(&bn, &dn, &dx)) {
+           /* Init the file triplet data */
+           fndata->fc = rpmtdCount(&bn);
+           fndata->dc = rpmtdCount(&dn);
+           fndata->bnid = rpmtdToPool(&bn, pool);
+           fndata->dnid = rpmtdToPool(&dn, pool);
+           /* Steal index data from the td (pooh...) */
+           fndata->dil = dx.data;
+           dx.data = NULL;
+           rc = fndata->fc;
+       } else {
+           memset(fndata, 0, sizeof(*fndata));
+           rc = -1;
+       }
+       rpmtdFreeData(&bn);
+       rpmtdFreeData(&dn);
+       rpmtdFreeData(&dx);
+    }
+
+    return rc;
+}
+
+static void rpmfnClear(rpmfn fndata)
+{
+    if (fndata) {
+       free(fndata->bnid);
+       free(fndata->dnid);
+       free(fndata->dil);
+       memset(fndata, 0, sizeof(*fndata));
+    }
+}
+
+static rpm_count_t rpmfnFC(rpmfn fndata)
+{
+    return (fndata != NULL) ? fndata->fc :0;
+}
+
+static rpm_count_t rpmfnDC(rpmfn fndata)
+{
+    return (fndata != NULL) ? fndata->dc : 0;
+}
+
+static int rpmfnDI(rpmfn fndata, int ix)
+{
+    int j = -1;
+    if (ix >= 0 && ix < rpmfnFC(fndata)) {
+       if (fndata->dil != NULL)
+           j = fndata->dil[ix];
+    }
+    return j;
+}
+
+static rpmsid rpmfnBNId(rpmfn fndata, int ix)
+{
+    rpmsid id = 0;
+    if (ix >= 0 && ix < rpmfnFC(fndata)) {
+       if (fndata->bnid != NULL)
+           id = fndata->bnid[ix];
+    }
+    return id;
+}
+
+static rpmsid rpmfnDNId(rpmfn fndata, int ix)
+{
+    rpmsid id = 0;
+    if (ix >= 0 && ix < rpmfnDC(fndata)) {
+       if (fndata->dnid != NULL)
+           id = fndata->dnid[ix];
+    }
+    return id;
+}
+
+static const char * rpmfnBN(rpmstrPool pool, rpmfn fndata, int ix)
+{
+    return rpmstrPoolStr(pool, rpmfnBNId(fndata, ix));
+}
+
+static const char * rpmfnDN(rpmstrPool pool, rpmfn fndata, int ix)
+{
+    return rpmstrPoolStr(pool, rpmfnDNId(fndata, ix));
+}
+
+static char * rpmfnFN(rpmstrPool pool, rpmfn fndata, int ix)
+{
+    char *fn = NULL;
+    if (ix >= 0 && ix < rpmfnFC(fndata)) {
+       fn = rstrscat(NULL, rpmfnDN(pool, fndata, rpmfnDI(fndata, ix)),
+                           rpmfnBN(pool, fndata, ix), NULL);
+    }
+    return fn;
+}
+
+rpm_count_t rpmfilesFC(rpmfiles fi)
+{
+    return (fi != NULL ? rpmfnFC(&fi->fndata) : 0);
+}
+
+rpm_count_t rpmfilesDC(rpmfiles fi)
+{
+    return (fi != NULL ? rpmfnDC(&fi->fndata) : 0);
+}
+
+int rpmfilesDigestAlgo(rpmfiles fi)
+{
+    return (fi != NULL) ? fi->digestalgo : 0;
+}
+
 rpm_count_t rpmfiFC(rpmfi fi)
 {
-    return (fi != NULL ? fi->fc : 0);
+    return (fi != NULL ? rpmfilesFC(fi->files) : 0);
 }
 
 rpm_count_t rpmfiDC(rpmfi fi)
 {
-    return (fi != NULL ? fi->dc : 0);
+    return (fi != NULL ? rpmfilesDC(fi->files) : 0);
 }
 
 #ifdef NOTYET
@@ -57,10 +313,10 @@ int rpmfiSetFX(rpmfi fi, int fx)
 {
     int i = -1;
 
-    if (fi != NULL && fx >= 0 && fx < fi->fc) {
+    if (fi != NULL && fx >= 0 && fx < rpmfilesFC(fi->files)) {
        i = fi->i;
        fi->i = fx;
-       fi->j = fi->dil[fi->i];
+       fi->j = rpmfilesDI(fi->files, fi->i);
     }
     return i;
 }
@@ -74,138 +330,222 @@ int rpmfiSetDX(rpmfi fi, int dx)
 {
     int j = -1;
 
-    if (fi != NULL && dx >= 0 && dx < fi->dc) {
+    if (fi != NULL && dx >= 0 && dx < rpmfiDC(fi)) {
        j = fi->j;
        fi->j = dx;
     }
     return j;
 }
 
-int rpmfiDIIndex(rpmfi fi, int dx)
+int rpmfilesDI(rpmfiles fi, int ix)
 {
-    int j = -1;
-    if (fi != NULL && dx >= 0 && dx < fi->fc) {
-       if (fi->dil != NULL)
-           j = fi->dil[dx];
-    }
-    return j;
+    return (fi != NULL) ? rpmfnDI(&fi->fndata, ix) : -1;
 }
 
-rpmsid rpmfiBNIdIndex(rpmfi fi, int ix)
+int rpmfilesODI(rpmfiles fi, int ix)
 {
-    rpmsid id = 0;
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
-       if (fi->bnid != NULL)
-           id = fi->bnid[ix];
-    }
-    return id;
+    return (fi != NULL) ? rpmfnDI(fi->ofndata, ix) : -1;
 }
 
-rpmsid rpmfiDNIdIndex(rpmfi fi, int jx)
+rpmsid rpmfilesBNId(rpmfiles fi, int ix)
 {
-    rpmsid id = 0;
-    if (fi != NULL && jx >= 0 && jx < fi->fc) {
-       if (fi->dnid != NULL)
-           id = fi->dnid[jx];
-    }
-    return id;
+    return (fi != NULL) ? rpmfnBNId(&fi->fndata, ix) : 0;
+}
+
+rpmsid rpmfilesOBNId(rpmfiles fi, int ix)
+{
+    return (fi != NULL) ? rpmfnBNId(fi->ofndata, ix) : 0;
+}
+
+rpmsid rpmfilesDNId(rpmfiles fi, int jx)
+{
+    return (fi != NULL) ? rpmfnDNId(&fi->fndata, jx) : 0;
+}
+
+rpmsid rpmfilesODNId(rpmfiles fi, int jx)
+{
+    return (fi != NULL) ? rpmfnDNId(fi->ofndata, jx) : 0;
+}
+
+const char * rpmfilesBN(rpmfiles fi, int ix)
+{
+    return (fi != NULL) ? rpmfnBN(fi->pool, &fi->fndata, ix) : NULL;
+}
+
+const char * rpmfilesOBN(rpmfiles fi, int ix)
+{
+    return (fi != NULL) ? rpmstrPoolStr(fi->pool, rpmfilesOBNId(fi, ix)) : NULL;
+}
+
+const char * rpmfilesDN(rpmfiles fi, int jx)
+{
+    return (fi != NULL) ? rpmfnDN(fi->pool, &fi->fndata, jx) : NULL;
+}
+
+const char * rpmfilesODN(rpmfiles fi, int jx)
+{
+    return (fi != NULL) ? rpmstrPoolStr(fi->pool, rpmfilesODNId(fi, jx)) : NULL;
 }
 
-const char * rpmfiBNIndex(rpmfi fi, int ix)
+char * rpmfilesFN(rpmfiles fi, int ix)
 {
-    const char * BN = NULL;
+    return (fi != NULL) ? rpmfnFN(fi->pool, &fi->fndata, ix) : NULL;
+}
+
+char * rpmfilesOFN(rpmfiles fi, int ix)
+{
+    return (fi != NULL) ? rpmfnFN(fi->pool, fi->ofndata, ix) : NULL;
+}
+
+/* Fn is expected to be relative path, convert directory to relative too */
+static int cmpPoolFn(rpmstrPool pool, rpmfn files, int ix, const char * fn)
+{
+    rpmsid dnid = rpmfnDNId(files, rpmfnDI(files, ix));
+    const char *dn = rpmstrPoolStr(pool, dnid);
+    const char *reldn = (dn[0] == '/') ? dn + 1 : dn;
+    size_t l = strlen(reldn);
+    int cmp = strncmp(reldn, fn, l);
+    if (cmp == 0)
+       cmp = strcmp(rpmfnBN(pool, files, ix), fn + l);
+    return cmp;
+}
+
+static int rpmfnFindFN(rpmstrPool pool, rpmfn files, const char * fn)
+{
+    int fc = rpmfnFC(files);
+
+    /*
+     * Skip payload prefix, turn absolute paths into relative. This
+     * allows handling binary rpm payloads with and without ./ prefix and
+     * srpm payloads which only contain basenames.
+     */
+    if (fn[0] == '.' && fn[1] == '/')
+       fn += 2;
+    if (fn[0] == '/')
+       fn += 1;
+
+    /* try binary search */
+
+    int lo = 0;
+    int hi = fc;
+    int mid, cmp;
+
+    while (hi > lo) {
+       mid = (hi + lo) / 2 ;
+       cmp = cmpPoolFn(pool, files, mid, fn);
+       if (cmp < 0) {
+           lo = mid+1;
+       } else if (cmp > 0) {
+           hi = mid;
+       } else {
+           return mid;
+       }
+    }
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
-       if (fi->bnid != NULL)
-           BN = rpmstrPoolStr(fi->pool, fi->bnid[ix]);
+    /* not found: try linear search */
+    for (int i=0; i < fc; i++) {
+       if (cmpPoolFn(pool, files, i, fn) == 0)
+           return i;
     }
-    return BN;
+    return -1;
+}
+
+int rpmfilesFindFN(rpmfiles files, const char * fn)
+{
+    return (files && fn) ? rpmfnFindFN(files->pool, &files->fndata, fn) : -1;
+}
+
+int rpmfilesFindOFN(rpmfiles files, const char * fn)
+{
+    return (files && fn) ? rpmfnFindFN(files->pool, files->ofndata, fn) : -1;
 }
 
-const char * rpmfiDNIndex(rpmfi fi, int jx)
+int rpmfiFindFN(rpmfi fi, const char * fn)
 {
-    const char * DN = NULL;
+    int ix = -1;
 
-    if (fi != NULL && jx >= 0 && jx < fi->dc) {
-       if (fi->dnid != NULL)
-           DN = rpmstrPoolStr(fi->pool, fi->dnid[jx]);
+    if (fi != NULL) {
+       ix = rpmfilesFindFN(fi->files, fn);
     }
-    return DN;
+    return ix;
 }
 
-char * rpmfiFNIndex(rpmfi fi, int ix)
+int rpmfiFindOFN(rpmfi fi, const char * fn)
 {
-    char *fn = NULL;
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
-       fn = rstrscat(NULL, rpmstrPoolStr(fi->pool, fi->dnid[fi->dil[ix]]),
-                           rpmstrPoolStr(fi->pool, fi->bnid[ix]), NULL);
+    int ix = -1;
+
+    if (fi != NULL) {
+       ix = rpmfilesFindOFN(fi->files, fn);
     }
-    return fn;
+    return ix;
+}
+
+/*
+ * Dirnames are not sorted when separated from basenames, we need to assemble
+ * the whole path for search (binary or otherwise) purposes.
+ */
+static int cmpPfx(rpmfiles files, int ix, const char *pfx, size_t plen)
+{
+    char *fn = rpmfilesFN(files, ix);
+    int rc = strncmp(pfx, fn, plen);
+    free(fn);
+    return rc;
 }
 
-rpmfileAttrs rpmfiFFlagsIndex(rpmfi fi, int ix)
+rpmfileAttrs rpmfilesFFlags(rpmfiles fi, int ix)
 {
     rpmfileAttrs FFlags = 0;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->fflags != NULL)
            FFlags = fi->fflags[ix];
     }
     return FFlags;
 }
 
-rpmVerifyAttrs rpmfiVFlagsIndex(rpmfi fi, int ix)
+rpmVerifyAttrs rpmfilesVFlags(rpmfiles fi, int ix)
 {
     rpmVerifyAttrs VFlags = 0;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->vflags != NULL)
            VFlags = fi->vflags[ix];
     }
     return VFlags;
 }
 
-rpm_mode_t rpmfiFModeIndex(rpmfi fi, int ix)
+rpm_mode_t rpmfilesFMode(rpmfiles fi, int ix)
 {
     rpm_mode_t fmode = 0;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->fmodes != NULL)
            fmode = fi->fmodes[ix];
     }
     return fmode;
 }
 
-rpmfileState rpmfiFStateIndex(rpmfi fi, int ix)
+rpmfileState rpmfilesFState(rpmfiles fi, int ix)
 {
     rpmfileState fstate = RPMFILE_STATE_MISSING;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->fstates != NULL)
            fstate = fi->fstates[ix];
     }
     return fstate;
 }
 
-const unsigned char * rpmfiMD5(rpmfi fi)
-{
-    const unsigned char *digest;
-    int algo = 0;
-
-    digest = rpmfiFDigest(fi, &algo, NULL);
-    return (algo == PGPHASHALGO_MD5) ? digest : NULL;
-}
-
 int rpmfiDigestAlgo(rpmfi fi)
 {
-    return fi ? fi->digestalgo : 0;
+    return fi ? rpmfilesDigestAlgo(fi->files) : 0;
 }
 
-const unsigned char * rpmfiFDigestIndex(rpmfi fi, int ix, int *algo, size_t *len)
+const unsigned char * rpmfilesFDigest(rpmfiles fi, int ix, int *algo, size_t *len)
 {
     const unsigned char *digest = NULL;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        size_t diglen = rpmDigestLength(fi->digestalgo);
        if (fi->digests != NULL)
            digest = fi->digests + (diglen * ix);
@@ -228,68 +568,89 @@ char * rpmfiFDigestHex(rpmfi fi, int *algo)
     return fdigest;
 }
 
-const char * rpmfiFLinkIndex(rpmfi fi, int ix)
+const unsigned char * rpmfilesFSignature(rpmfiles fi, int ix, size_t *len)
+{
+    const unsigned char *signature = NULL;
+
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
+       if (fi->signatures != NULL)
+           signature = fi->signatures + (fi->signaturelength * ix);
+       if (len)
+           *len = fi->signaturelength;
+    }
+    return signature;
+}
+
+const char * rpmfilesFLink(rpmfiles fi, int ix)
 {
     const char * flink = NULL;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->flinks != NULL)
            flink = rpmstrPoolStr(fi->pool, fi->flinks[ix]);
     }
     return flink;
 }
 
-rpm_loff_t rpmfiFSizeIndex(rpmfi fi, int ix)
+rpm_loff_t rpmfilesFSize(rpmfiles fi, int ix)
 {
     rpm_loff_t fsize = 0;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->fsizes != NULL)
            fsize = fi->fsizes[ix];
+       else if (fi->lfsizes != NULL)
+           fsize = fi->lfsizes[ix];
     }
     return fsize;
 }
 
-rpm_rdev_t rpmfiFRdevIndex(rpmfi fi, int ix)
+rpm_rdev_t rpmfilesFRdev(rpmfiles fi, int ix)
 {
     rpm_rdev_t frdev = 0;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->frdevs != NULL)
            frdev = fi->frdevs[ix];
     }
     return frdev;
 }
 
-rpm_ino_t rpmfiFInodeIndex(rpmfi fi, int ix)
+rpm_ino_t rpmfilesFInode(rpmfiles fi, int ix)
 {
     rpm_ino_t finode = 0;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->finodes != NULL)
            finode = fi->finodes[ix];
     }
     return finode;
 }
 
-rpm_color_t rpmfiColor(rpmfi fi)
+rpm_color_t rpmfilesColor(rpmfiles files)
 {
     rpm_color_t color = 0;
 
-    if (fi != NULL && fi->fcolors != NULL) {
-       for (int i = 0; i < fi->fc; i++)
-           color |= fi->fcolors[i];
+    if (files != NULL && files->fcolors != NULL) {
+       int fc = rpmfilesFC(files);
+       for (int i = 0; i < fc; i++)
+           color |= files->fcolors[i];
        /* XXX ignore all but lsnibble for now. */
        color &= 0xf;
     }
     return color;
 }
 
-rpm_color_t rpmfiFColorIndex(rpmfi fi, int ix)
+rpm_color_t rpmfiColor(rpmfi fi)
+{
+    return (fi != NULL) ? rpmfilesColor(fi->files) : 0;
+}
+
+rpm_color_t rpmfilesFColor(rpmfiles fi, int ix)
 {
     rpm_color_t fcolor = 0;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->fcolors != NULL)
            /* XXX ignore all but lsnibble for now. */
            fcolor = (fi->fcolors[ix] & 0x0f);
@@ -297,12 +658,12 @@ rpm_color_t rpmfiFColorIndex(rpmfi fi, int ix)
     return fcolor;
 }
 
-const char * rpmfiFClassIndex(rpmfi fi, int ix)
+const char * rpmfilesFClass(rpmfiles fi, int ix)
 {
     const char * fclass = NULL;
     int cdictx;
 
-    if (fi != NULL && fi->fcdictx != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && fi->fcdictx != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        cdictx = fi->fcdictx[ix];
        if (fi->cdict != NULL && cdictx >= 0 && cdictx < fi->ncdict)
            fclass = fi->cdict[cdictx];
@@ -310,13 +671,13 @@ const char * rpmfiFClassIndex(rpmfi fi, int ix)
     return fclass;
 }
 
-uint32_t rpmfiFDependsIndex(rpmfi fi, int ix, const uint32_t ** fddictp)
+uint32_t rpmfilesFDepends(rpmfiles fi, int ix, const uint32_t ** fddictp)
 {
     int fddictx = -1;
     int fddictn = 0;
     const uint32_t * fddict = NULL;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->fddictn != NULL)
            fddictn = fi->fddictn[ix];
        if (fddictn > 0 && fi->fddictx != NULL)
@@ -329,102 +690,189 @@ uint32_t rpmfiFDependsIndex(rpmfi fi, int ix, const uint32_t ** fddictp)
     return fddictn;
 }
 
-uint32_t rpmfiFNlinkIndex(rpmfi fi, int ix)
+uint32_t rpmfilesFLinks(rpmfiles fi, int ix, const int ** files)
 {
     uint32_t nlink = 0;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
-       /* XXX rpm-2.3.12 has not RPMTAG_FILEINODES */
-       if (fi->finodes && fi->frdevs) {
-           rpm_ino_t finode = fi->finodes[ix];
-           rpm_rdev_t frdev = fi->frdevs[ix];
-           int j;
-
-           for (j = 0; j < fi->fc; j++) {
-               if (fi->frdevs[j] == frdev && fi->finodes[j] == finode)
-                   nlink++;
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
+       nlink = 1;
+       if (fi->nlinks) {
+           struct hardlinks_s ** hardlinks = NULL;
+           nlinkHashGetEntry(fi->nlinks, ix, &hardlinks, NULL, NULL);
+           if (hardlinks) {
+               nlink = hardlinks[0]->nlink;
+               if (files) {
+                   *files = hardlinks[0]->files;
+               }
+           } else if (files){
+               *files = NULL;
            }
        }
     }
     return nlink;
 }
 
-rpm_time_t rpmfiFMtimeIndex(rpmfi fi, int ix)
+uint32_t rpmfiFLinks(rpmfi fi, const int ** files)
+{
+    return rpmfilesFLinks(fi->files, fi ? fi->i : -1, files);
+}
+
+uint32_t rpmfilesFNlink(rpmfiles fi, int ix)
+{
+    return rpmfilesFLinks(fi, ix, NULL);
+}
+
+rpm_time_t rpmfilesFMtime(rpmfiles fi, int ix)
 {
     rpm_time_t fmtime = 0;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->fmtimes != NULL)
            fmtime = fi->fmtimes[ix];
     }
     return fmtime;
 }
 
-const char * rpmfiFUserIndex(rpmfi fi, int ix)
+const char * rpmfilesFUser(rpmfiles fi, int ix)
 {
     const char * fuser = NULL;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->fuser != NULL)
            fuser = rpmstrPoolStr(fi->pool, fi->fuser[ix]);
     }
     return fuser;
 }
 
-const char * rpmfiFGroupIndex(rpmfi fi, int ix)
+const char * rpmfilesFGroup(rpmfiles fi, int ix)
 {
     const char * fgroup = NULL;
 
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->fgroup != NULL)
            fgroup = rpmstrPoolStr(fi->pool, fi->fgroup[ix]);
     }
     return fgroup;
 }
 
-const char * rpmfiFCapsIndex(rpmfi fi, int ix)
+const char * rpmfilesFCaps(rpmfiles fi, int ix)
 {
     const char *fcaps = NULL;
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        fcaps = fi->fcaps ? fi->fcaps[ix] : "";
     }
     return fcaps;
 }
 
-const char * rpmfiFLangsIndex(rpmfi fi, int ix)
+const char * rpmfilesFLangs(rpmfiles fi, int ix)
 {
     const char *flangs = NULL;
-    if (fi != NULL && fi->flangs != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && fi->flangs != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        flangs = rpmstrPoolStr(fi->pool, fi->flangs[ix]);
     }
     return flangs;
 }
 
-struct fingerPrint_s *rpmfiFps(rpmfi fi)
+int rpmfilesStat(rpmfiles fi, int ix, int flags, struct stat *sb)
+{
+    int rc = -1;
+    if (fi && sb) {
+       /* XXX FIXME define proper flags with sane semantics... */
+       int warn = flags & 0x1;
+       const char *user = rpmfilesFUser(fi, ix);
+       const char *group = rpmfilesFGroup(fi, ix);
+       const int * hardlinks = NULL;
+       uint32_t nlinks = rpmfilesFLinks(fi, ix, &hardlinks);
+
+       memset(sb, 0, sizeof(*sb));
+       sb->st_nlink = nlinks;
+       sb->st_ino = rpmfilesFInode(fi, ix);
+       sb->st_rdev = rpmfilesFRdev(fi, ix);
+       sb->st_mode = rpmfilesFMode(fi, ix);
+       sb->st_mtime = rpmfilesFMtime(fi, ix);
+
+       /* Only regular files and symlinks have a size */
+       if (S_ISREG(sb->st_mode)) {
+           /* Content and thus size comes with last hardlink */
+           if (!(nlinks > 1 && hardlinks[nlinks-1] != ix))
+               sb->st_size = rpmfilesFSize(fi, ix);
+       } else if (S_ISLNK(sb->st_mode)) {
+           /*
+            * Normally rpmfilesFSize() is correct for symlinks too, this is
+            * only needed for glob()'ed links from fakechroot environment.
+            */
+           sb->st_size = strlen(rpmfilesFLink(fi, ix));
+       }
+
+       if (user && rpmugUid(user, &sb->st_uid)) {
+           if (warn)
+               rpmlog(RPMLOG_WARNING,
+                       _("user %s does not exist - using %s\n"), user, UID_0_USER);
+           sb->st_mode &= ~S_ISUID;      /* turn off suid bit */
+       }
+
+       if (group && rpmugGid(group, &sb->st_gid)) {
+           if (warn)
+               rpmlog(RPMLOG_WARNING,
+                       _("group %s does not exist - using %s\n"), group, GID_0_GROUP);
+           sb->st_mode &= ~S_ISGID;    /* turn off sgid bit */
+       }
+
+       rc = 0;
+    }
+    return rc;
+}
+
+struct fingerPrint_s *rpmfilesFps(rpmfiles fi)
 {
     return (fi != NULL) ? fi->fps : NULL;
 }
 
+static int iterFwd(rpmfi fi)
+{
+    return fi->i + 1;
+}
+
+static int iterBack(rpmfi fi)
+{
+    return fi->i - 1;
+}
+
+static int iterInterval(rpmfi fi)
+{
+    if (fi->i == -1)
+       return fi->intervalStart;
+    else if (fi->i + 1 < fi->intervalEnd)
+       return fi->i + 1;
+    else
+       return RPMERR_ITER_END;
+}
+
 int rpmfiNext(rpmfi fi)
 {
-    int i = -1;
+    int next = -1;
+    if (fi != NULL) {
+       do {
+           next = fi->next(fi);
+       } while (next == RPMERR_ITER_SKIP);
 
-    if (fi != NULL && ++fi->i >= 0) {
-       if (fi->i < fi->fc) {
-           i = fi->i;
-           if (fi->dil != NULL)
-               fi->j = fi->dil[fi->i];
-       } else
+       if (next >= 0 && next < rpmfilesFC(fi->files)) {
+           fi->i = next;
+           fi->j = rpmfilesDI(fi->files, fi->i);
+       } else {
            fi->i = -1;
+           if (next >= 0) {
+               next = -1;
+           }
+       }
     }
-
-    return i;
+    return next;
 }
 
 rpmfi rpmfiInit(rpmfi fi, int fx)
 {
     if (fi != NULL) {
-       if (fx >= 0 && fx < fi->fc) {
+       if (fx >= 0 && fx < rpmfilesFC(fi->files)) {
            fi->i = fx - 1;
            fi->j = -1;
        }
@@ -438,7 +886,7 @@ int rpmfiNextD(rpmfi fi)
     int j = -1;
 
     if (fi != NULL && ++fi->j >= 0) {
-       if (fi->j < fi->dc)
+       if (fi->j < rpmfilesDC(fi->files))
            j = fi->j;
        else
            fi->j = -1;
@@ -450,7 +898,7 @@ int rpmfiNextD(rpmfi fi)
 rpmfi rpmfiInitD(rpmfi fi, int dx)
 {
     if (fi != NULL) {
-       if (dx >= 0 && dx < fi->fc)
+       if (dx >= 0 && dx < rpmfilesFC(fi->files))
            fi->j = dx - 1;
        else
            fi = NULL;
@@ -459,26 +907,6 @@ rpmfi rpmfiInitD(rpmfi fi, int dx)
     return fi;
 }
 
-/**
- * Identify a file type.
- * @param ft           file type
- * @return             string to identify a file type
- */
-static
-const char * ftstring (rpmFileTypes ft)
-{
-    switch (ft) {
-    case XDIR: return "directory";
-    case CDEV: return "char dev";
-    case BDEV: return "block dev";
-    case LINK: return "link";
-    case SOCK: return "sock";
-    case PIPE: return "fifo/pipe";
-    case REG:  return "file";
-    default:   return "unknown file type";
-    }
-}
-
 rpmFileTypes rpmfiWhatis(rpm_mode_t mode)
 {
     if (S_ISDIR(mode)) return XDIR;
@@ -490,30 +918,32 @@ rpmFileTypes rpmfiWhatis(rpm_mode_t mode)
     return REG;
 }
 
-int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix)
+int rpmfilesCompare(rpmfiles afi, int aix, rpmfiles bfi, int bix)
 {
-    mode_t amode = rpmfiFModeIndex(afi, aix);
-    mode_t bmode = rpmfiFModeIndex(bfi, bix);
+    mode_t amode = rpmfilesFMode(afi, aix);
+    mode_t bmode = rpmfilesFMode(bfi, bix);
     rpmFileTypes awhat = rpmfiWhatis(amode);
 
-    if ((rpmfiFFlagsIndex(afi, aix) & RPMFILE_GHOST) ||
-       (rpmfiFFlagsIndex(bfi, bix) & RPMFILE_GHOST)) return 0;
+    if ((rpmfilesFFlags(afi, aix) & RPMFILE_GHOST) ||
+       (rpmfilesFFlags(bfi, bix) & RPMFILE_GHOST)) return 0;
 
-    if (amode != bmode) return 1;
+    /* Mode difference is a conflict, except for symlinks */
+    if (!(awhat == LINK && rpmfiWhatis(bmode) == LINK) && amode != bmode)
+       return 1;
 
     if (awhat == LINK || awhat == REG) {
-       if (rpmfiFSizeIndex(afi, aix) != rpmfiFSizeIndex(bfi, bix))
+       if (rpmfilesFSize(afi, aix) != rpmfilesFSize(bfi, bix))
            return 1;
     }
 
-    if (!rstreq(rpmfiFUserIndex(afi, aix), rpmfiFUserIndex(bfi, bix)))
+    if (!rstreq(rpmfilesFUser(afi, aix), rpmfilesFUser(bfi, bix)))
        return 1;
-    if (!rstreq(rpmfiFGroupIndex(afi, aix), rpmfiFGroupIndex(bfi, bix)))
+    if (!rstreq(rpmfilesFGroup(afi, aix), rpmfilesFGroup(bfi, bix)))
        return 1;
 
     if (awhat == LINK) {
-       const char * alink = rpmfiFLinkIndex(afi, aix);
-       const char * blink = rpmfiFLinkIndex(bfi, bix);
+       const char * alink = rpmfilesFLink(afi, aix);
+       const char * blink = rpmfilesFLink(bfi, bix);
        if (alink == blink) return 0;
        if (alink == NULL) return 1;
        if (blink == NULL) return -1;
@@ -522,8 +952,8 @@ int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix)
        size_t adiglen, bdiglen;
        int aalgo, balgo;
        const unsigned char * adigest, * bdigest;
-       adigest = rpmfiFDigestIndex(afi, aix, &aalgo, &adiglen);
-       bdigest = rpmfiFDigestIndex(bfi, bix, &balgo, &bdiglen);
+       adigest = rpmfilesFDigest(afi, aix, &aalgo, &adiglen);
+       bdigest = rpmfilesFDigest(bfi, bix, &balgo, &bdiglen);
        if (adigest == bdigest) return 0;
        if (adigest == NULL) return 1;
        if (bdigest == NULL) return -1;
@@ -531,18 +961,88 @@ int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix)
        if (aalgo != balgo || adiglen != bdiglen) return -1;
        return memcmp(adigest, bdigest, adiglen);
     } else if (awhat == CDEV || awhat == BDEV) {
-       if (rpmfiFRdevIndex(afi, aix) != rpmfiFRdevIndex(bfi, bix))
+       if (rpmfilesFRdev(afi, aix) != rpmfilesFRdev(bfi, bix))
            return 1;
     }
 
     return 0;
 }
 
-rpmFileAction rpmfiDecideFateIndex(rpmfi ofi, int oix, rpmfi nfi, int nix,
+int rpmfileContentsEqual(rpmfiles ofi, int oix, rpmfiles nfi, int nix)
+{
+    char * fn = rpmfilesFN(nfi, nix);
+    rpmFileTypes diskWhat, newWhat, oldWhat;
+    struct stat sb;
+    int equal = 0;
+
+    if (fn == NULL || (lstat(fn, &sb))) {
+       goto exit; /* The file doesn't exist on the disk */
+    }
+
+    if (rpmfilesFSize(nfi, nix) != sb.st_size) {
+       goto exit;
+    }
+
+    diskWhat = rpmfiWhatis((rpm_mode_t)sb.st_mode);
+    newWhat = rpmfiWhatis(rpmfilesFMode(nfi, nix));
+    oldWhat = rpmfiWhatis(rpmfilesFMode(ofi, oix));
+    if ((diskWhat != newWhat) || (diskWhat != oldWhat)) {
+       goto exit;
+    }
+
+    if (diskWhat == REG) {
+       int oalgo, nalgo;
+       size_t odiglen, ndiglen;
+       const unsigned char * odigest, * ndigest;
+       char buffer[1024];
+
+       odigest = rpmfilesFDigest(ofi, oix, &oalgo, &odiglen);
+       ndigest = rpmfilesFDigest(nfi, nix, &nalgo, &ndiglen);
+       /* See if the file in old pkg is identical to the one in new pkg */
+       if ((oalgo != nalgo) || (odiglen != ndiglen) || (!ndigest) ||
+           (memcmp(odigest, ndigest, ndiglen) != 0)) {
+           goto exit;
+       }
+
+       if (rpmDoDigest(nalgo, fn, 0, (unsigned char *)buffer, NULL) != 0) {
+            goto exit;         /* assume file has been removed */
+       }
+
+       /* See if the file on disk is identical to the one in new pkg */
+       if (memcmp(ndigest, buffer, ndiglen) == 0) {
+           equal = 1;
+           goto exit;
+       }
+    }  else if (diskWhat == LINK) {
+       const char * nFLink;
+       char buffer[1024];
+       ssize_t link_len;
+
+       nFLink = rpmfilesFLink(nfi, nix);
+       link_len = readlink(fn, buffer, sizeof(buffer) - 1);
+       if (link_len == -1) {
+           goto exit;          /* assume file has been removed */
+       }
+       buffer[link_len] = '\0';
+       /* See if the link on disk is identical to the one in new pkg */
+       if (nFLink && rstreq(nFLink, buffer)) {
+           equal = 1;
+           goto exit;
+       }
+    }
+
+exit:
+    free(fn);
+    return equal;
+}
+
+
+rpmFileAction rpmfilesDecideFate(rpmfiles ofi, int oix,
+                                  rpmfiles nfi, int nix,
                                   int skipMissing)
 {
-    char * fn = rpmfiFNIndex(nfi, nix);
-    rpmfileAttrs newFlags = rpmfiFFlagsIndex(nfi, nix);
+    char * fn = rpmfilesFN(nfi, nix);
+    rpmfileAttrs newFlags = rpmfilesFFlags(nfi, nix);
     char buffer[1024];
     rpmFileTypes dbWhat, newWhat, diskWhat;
     struct stat sb;
@@ -571,39 +1071,47 @@ rpmFileAction rpmfiDecideFateIndex(rpmfi ofi, int oix, rpmfi nfi, int nix,
     }
 
     diskWhat = rpmfiWhatis((rpm_mode_t)sb.st_mode);
-    dbWhat = rpmfiWhatis(rpmfiFModeIndex(ofi, oix));
-    newWhat = rpmfiWhatis(rpmfiFModeIndex(nfi, nix));
+    dbWhat = rpmfiWhatis(rpmfilesFMode(ofi, oix));
+    newWhat = rpmfiWhatis(rpmfilesFMode(nfi, nix));
 
     /*
-     * This order matters - we'd prefer to CREATE the file if at all
+     * This order matters - we'd prefer to TOUCH the file if at all
      * possible in case something else (like the timestamp) has changed.
      * Only regular files and symlinks might need a backup, everything
      * else falls through here with FA_CREATE.
      */
-    memset(buffer, 0, sizeof(buffer));
     if (dbWhat == REG) {
        int oalgo, nalgo;
        size_t odiglen, ndiglen;
        const unsigned char * odigest, * ndigest;
 
+       /* See if the file on disk is identical to the one in new pkg */
+       ndigest = rpmfilesFDigest(nfi, nix, &nalgo, &ndiglen);
+       if (diskWhat == REG && newWhat == REG) {
+           if (rpmDoDigest(nalgo, fn, 0, (unsigned char *)buffer, NULL))
+               goto exit;              /* assume file has been removed */
+           if (ndigest && memcmp(ndigest, buffer, ndiglen) == 0) {
+               action = FA_TOUCH;
+               goto exit;              /* unmodified config file, touch it. */
+           }
+       }
+
        /* See if the file on disk is identical to the one in old pkg */
-       odigest = rpmfiFDigestIndex(ofi, oix, &oalgo, &odiglen);
+       odigest = rpmfilesFDigest(ofi, oix, &oalgo, &odiglen);
        if (diskWhat == REG) {
-           if (rpmDoDigest(oalgo, fn, 0, (unsigned char *)buffer, NULL))
-               goto exit;      /* assume file has been removed */
+           /* hash algo changed or digest was not computed, recalculate it */
+           if ((oalgo != nalgo) || (newWhat != REG)) {
+               if (rpmDoDigest(oalgo, fn, 0, (unsigned char *)buffer, NULL))
+                   goto exit;  /* assume file has been removed */
+               }
            if (odigest && memcmp(odigest, buffer, odiglen) == 0)
                goto exit;      /* unmodified config file, replace. */
        }
 
-       /* See if the file on disk is identical to the one in new pkg */
-       ndigest = rpmfiFDigestIndex(nfi, nix, &nalgo, &ndiglen);
-       if (diskWhat == REG && newWhat == REG) {
-           /* hash algo changed in new, recalculate digest */
-           if (oalgo != nalgo)
-               if (rpmDoDigest(nalgo, fn, 0, (unsigned char *)buffer, NULL))
-                   goto exit;          /* assume file has been removed */
-           if (ndigest && memcmp(ndigest, buffer, ndiglen) == 0)
-               goto exit;              /* file identical in new, replace. */
+       /* if new file is no longer config, backup it and replace it */
+       if (!(newFlags & RPMFILE_CONFIG)) {
+           action = FA_SAVE;
+           goto exit;
        }
 
        /* If file can be determined identical in old and new pkg, let it be */
@@ -619,24 +1127,36 @@ rpmFileAction rpmfiDecideFateIndex(rpmfi ofi, int oix, rpmfi nfi, int nix,
     } else if (dbWhat == LINK) {
        const char * oFLink, * nFLink;
 
-       /* See if the link on disk is identical to the one in old pkg */
-       oFLink = rpmfiFLinkIndex(ofi, oix);
        if (diskWhat == LINK) {
+           /* Read link from the disk */
            ssize_t link_len = readlink(fn, buffer, sizeof(buffer) - 1);
            if (link_len == -1)
                goto exit;              /* assume file has been removed */
            buffer[link_len] = '\0';
-           if (oFLink && rstreq(oFLink, buffer))
-               goto exit;              /* unmodified config file, replace. */
        }
 
        /* See if the link on disk is identical to the one in new pkg */
-       nFLink = rpmfiFLinkIndex(nfi, nix);
+       nFLink = rpmfilesFLink(nfi, nix);
        if (diskWhat == LINK && newWhat == LINK) {
-           if (nFLink && rstreq(nFLink, buffer))
+           if (nFLink && rstreq(nFLink, buffer)) {
+               action = FA_TOUCH;
+               goto exit;              /* unmodified config file, touch it. */
+           }
+       }
+
+       /* See if the link on disk is identical to the one in old pkg */
+       oFLink = rpmfilesFLink(ofi, oix);
+       if (diskWhat == LINK) {
+           if (oFLink && rstreq(oFLink, buffer))
                goto exit;              /* unmodified config file, replace. */
        }
 
+       /* if new file is no longer config, backup it and replace it */
+       if (!(newFlags & RPMFILE_CONFIG)) {
+           action = FA_SAVE;
+           goto exit;
+       }
+
        /* If link is identical in old and new pkg, let it be */
        if (newWhat == LINK && oFLink && nFLink && rstreq(oFLink, nFLink)) {
            action = FA_SKIP;           /* identical file, don't bother. */
@@ -652,10 +1172,10 @@ exit:
     return action;
 }
 
-int rpmfiConfigConflictIndex(rpmfi fi, int ix)
+int rpmfilesConfigConflict(rpmfiles fi, int ix)
 {
     char * fn = NULL;
-    rpmfileAttrs flags = rpmfiFFlagsIndex(fi, ix);
+    rpmfileAttrs flags = rpmfilesFFlags(fi, ix);
     char buffer[1024];
     rpmFileTypes newWhat, diskWhat;
     struct stat sb;
@@ -667,12 +1187,12 @@ int rpmfiConfigConflictIndex(rpmfi fi, int ix)
 
     /* Only links and regular files can be %config, this is kinda moot */
     /* XXX: Why are we returning 1 here? */
-    newWhat = rpmfiWhatis(rpmfiFModeIndex(fi, ix));
+    newWhat = rpmfiWhatis(rpmfilesFMode(fi, ix));
     if (newWhat != LINK && newWhat != REG)
        return 1;
 
     /* If it's not on disk, there's nothing to be saved */
-    fn = rpmfiFNIndex(fi, ix);
+    fn = rpmfilesFN(fi, ix);
     if (lstat(fn, &sb))
        goto exit;
 
@@ -697,7 +1217,7 @@ int rpmfiConfigConflictIndex(rpmfi fi, int ix)
     }
 
     /* Files of different sizes obviously are not identical */
-    if (rpmfiFSizeIndex(fi, ix) != sb.st_size) {
+    if (rpmfilesFSize(fi, ix) != sb.st_size) {
        rc = 1;
        goto exit;
     }
@@ -706,7 +1226,7 @@ int rpmfiConfigConflictIndex(rpmfi fi, int ix)
     if (newWhat == REG) {
        int algo;
        size_t diglen;
-       const unsigned char *ndigest = rpmfiFDigestIndex(fi,ix, &algo, &diglen);
+       const unsigned char *ndigest = rpmfilesFDigest(fi,ix, &algo, &diglen);
        if (rpmDoDigest(algo, fn, 0, (unsigned char *)buffer, NULL))
            goto exit;  /* assume file has been removed */
        if (ndigest && memcmp(ndigest, buffer, diglen) == 0)
@@ -717,7 +1237,7 @@ int rpmfiConfigConflictIndex(rpmfi fi, int ix)
        if (link_len == -1)
            goto exit;  /* assume file has been removed */
        buffer[link_len] = '\0';
-       nFLink = rpmfiFLinkIndex(fi, ix);
+       nFLink = rpmfilesFLink(fi, ix);
        if (nFLink && rstreq(nFLink, buffer))
            goto exit;  /* unmodified config file */
     }
@@ -729,334 +1249,24 @@ exit:
     return rc;
 }
 
-static char **duparray(char ** src, int size)
-{
-    char **dest = xmalloc((size+1) * sizeof(*dest));
-    for (int i = 0; i < size; i++) {
-       dest[i] = xstrdup(src[i]);
-    }
-    free(src);
-    return dest;
-}
-
-static int addPrefixes(Header h, rpmRelocation *relocations, int numRelocations)
-{
-    struct rpmtd_s validRelocs;
-    const char *validprefix;
-    const char ** actualRelocations;
-    int numActual = 0;
-
-    headerGet(h, RPMTAG_PREFIXES, &validRelocs, HEADERGET_MINMEM);
-    /*
-     * If no relocations are specified (usually the case), then return the
-     * original header. If there are prefixes, however, then INSTPREFIXES
-     * should be added for RPM_INSTALL_PREFIX environ variables in scriptlets, 
-     * but, since relocateFileList() can be called more than once for 
-     * the same header, don't bother if already present.
-     */
-    if (relocations == NULL || numRelocations == 0) {
-       if (rpmtdCount(&validRelocs) > 0) {
-           if (!headerIsEntry(h, RPMTAG_INSTPREFIXES)) {
-               rpmtdSetTag(&validRelocs, RPMTAG_INSTPREFIXES);
-               headerPut(h, &validRelocs, HEADERPUT_DEFAULT);
-           }
-           rpmtdFreeData(&validRelocs);
-       }
-       return 0;
-    }
-
-    actualRelocations = xmalloc(rpmtdCount(&validRelocs) * sizeof(*actualRelocations));
-    rpmtdInit(&validRelocs);
-    while ((validprefix = rpmtdNextString(&validRelocs))) {
-       int j;
-       for (j = 0; j < numRelocations; j++) {
-           if (relocations[j].oldPath == NULL || /* XXX can't happen */
-               !rstreq(validprefix, relocations[j].oldPath))
-               continue;
-           /* On install, a relocate to NULL means skip the path. */
-           if (relocations[j].newPath) {
-               actualRelocations[numActual] = relocations[j].newPath;
-               numActual++;
-           }
-           break;
-       }
-       if (j == numRelocations) {
-           actualRelocations[numActual] = validprefix;
-           numActual++;
-       }
-    }
-    rpmtdFreeData(&validRelocs);
-
-    if (numActual) {
-       headerPutStringArray(h, RPMTAG_INSTPREFIXES, actualRelocations, numActual);
-    }
-    free(actualRelocations);
-    return numActual;
-}
-
-static void saveRelocs(Header h, rpmtd bnames, rpmtd dnames, rpmtd dindexes)
-{
-       struct rpmtd_s td;
-       headerGet(h, RPMTAG_BASENAMES, &td, HEADERGET_MINMEM);
-       rpmtdSetTag(&td, RPMTAG_ORIGBASENAMES);
-       headerPut(h, &td, HEADERPUT_DEFAULT);
-       rpmtdFreeData(&td);
-
-       headerGet(h, RPMTAG_DIRNAMES, &td, HEADERGET_MINMEM);
-       rpmtdSetTag(&td, RPMTAG_ORIGDIRNAMES);
-       headerPut(h, &td, HEADERPUT_DEFAULT);
-       rpmtdFreeData(&td);
-
-       headerGet(h, RPMTAG_DIRINDEXES, &td, HEADERGET_MINMEM);
-       rpmtdSetTag(&td, RPMTAG_ORIGDIRINDEXES);
-       headerPut(h, &td, HEADERPUT_DEFAULT);
-       rpmtdFreeData(&td);
-
-       headerMod(h, bnames);
-       headerMod(h, dnames);
-       headerMod(h, dindexes);
-}
-
-void rpmRelocateFileList(rpmRelocation *relocations, int numRelocations, 
-                        rpmfs fs, Header h)
-{
-    static int _printed = 0;
-    char ** baseNames;
-    char ** dirNames;
-    uint32_t * dirIndexes;
-    rpm_count_t fileCount, dirCount;
-    int nrelocated = 0;
-    int fileAlloced = 0;
-    char * fn = NULL;
-    int haveRelocatedBase = 0;
-    size_t maxlen = 0;
-    int i, j;
-    struct rpmtd_s bnames, dnames, dindexes, fmodes;
-
-    addPrefixes(h, relocations, numRelocations);
-
-    if (!_printed) {
-       _printed = 1;
-       rpmlog(RPMLOG_DEBUG, "========== relocations\n");
-       for (i = 0; i < numRelocations; i++) {
-           if (relocations[i].oldPath == NULL) continue; /* XXX can't happen */
-           if (relocations[i].newPath == NULL)
-               rpmlog(RPMLOG_DEBUG, "%5d exclude  %s\n",
-                       i, relocations[i].oldPath);
-           else
-               rpmlog(RPMLOG_DEBUG, "%5d relocate %s -> %s\n",
-                       i, relocations[i].oldPath, relocations[i].newPath);
-       }
-    }
-
-    for (i = 0; i < numRelocations; i++) {
-       if (relocations[i].newPath == NULL) continue;
-       size_t len = strlen(relocations[i].newPath);
-       if (len > maxlen) maxlen = len;
-    }
-
-    headerGet(h, RPMTAG_BASENAMES, &bnames, HEADERGET_MINMEM);
-    headerGet(h, RPMTAG_DIRINDEXES, &dindexes, HEADERGET_ALLOC);
-    headerGet(h, RPMTAG_DIRNAMES, &dnames, HEADERGET_MINMEM);
-    headerGet(h, RPMTAG_FILEMODES, &fmodes, HEADERGET_MINMEM);
-    /* TODO XXX ugh.. use rpmtd iterators & friends instead */
-    baseNames = bnames.data;
-    dirIndexes = dindexes.data;
-    fileCount = rpmtdCount(&bnames);
-    dirCount = rpmtdCount(&dnames);
-    /* XXX TODO: use rpmtdDup() instead */
-    dirNames = dnames.data = duparray(dnames.data, dirCount);
-    dnames.flags |= RPMTD_PTR_ALLOCED;
-
-    /*
-     * For all relocations, we go through sorted file/relocation lists 
-     * backwards so that /usr/local relocations take precedence over /usr 
-     * ones.
-     */
-
-    /* Relocate individual paths. */
-
-    for (i = fileCount - 1; i >= 0; i--) {
-       rpmFileTypes ft;
-       int fnlen;
-
-       size_t len = maxlen +
-               strlen(dirNames[dirIndexes[i]]) + strlen(baseNames[i]) + 1;
-       if (len >= fileAlloced) {
-           fileAlloced = len * 2;
-           fn = xrealloc(fn, fileAlloced);
-       }
-
-assert(fn != NULL);            /* XXX can't happen */
-       *fn = '\0';
-       fnlen = stpcpy( stpcpy(fn, dirNames[dirIndexes[i]]), baseNames[i]) - fn;
-
-       /*
-        * See if this file path needs relocating.
-        */
-       /*
-        * XXX FIXME: Would a bsearch of the (already sorted) 
-        * relocation list be a good idea?
-        */
-       for (j = numRelocations - 1; j >= 0; j--) {
-           if (relocations[j].oldPath == NULL) /* XXX can't happen */
-               continue;
-           len = !rstreq(relocations[j].oldPath, "/")
-               ? strlen(relocations[j].oldPath)
-               : 0;
-
-           if (fnlen < len)
-               continue;
-           /*
-            * Only subdirectories or complete file paths may be relocated. We
-            * don't check for '\0' as our directory names all end in '/'.
-            */
-           if (!(fn[len] == '/' || fnlen == len))
-               continue;
-
-           if (!rstreqn(relocations[j].oldPath, fn, len))
-               continue;
-           break;
-       }
-       if (j < 0) continue;
-
-       rpmtdSetIndex(&fmodes, i);
-       ft = rpmfiWhatis(rpmtdGetNumber(&fmodes));
-
-       /* On install, a relocate to NULL means skip the path. */
-       if (relocations[j].newPath == NULL) {
-           if (ft == XDIR) {
-               /* Start with the parent, looking for directory to exclude. */
-               for (j = dirIndexes[i]; j < dirCount; j++) {
-                   len = strlen(dirNames[j]) - 1;
-                   while (len > 0 && dirNames[j][len-1] == '/') len--;
-                   if (fnlen != len)
-                       continue;
-                   if (!rstreqn(fn, dirNames[j], fnlen))
-                       continue;
-                   break;
-               }
-           }
-           rpmfsSetAction(fs, i, FA_SKIPNSTATE);
-           rpmlog(RPMLOG_DEBUG, "excluding %s %s\n",
-                  ftstring(ft), fn);
-           continue;
-       }
-
-       /* Relocation on full paths only, please. */
-       if (fnlen != len) continue;
-
-       rpmlog(RPMLOG_DEBUG, "relocating %s to %s\n",
-              fn, relocations[j].newPath);
-       nrelocated++;
-
-       strcpy(fn, relocations[j].newPath);
-       {   char * te = strrchr(fn, '/');
-           if (te) {
-               if (te > fn) te++;      /* root is special */
-               fnlen = te - fn;
-           } else
-               te = fn + strlen(fn);
-           if (!rstreq(baseNames[i], te)) { /* basename changed too? */
-               if (!haveRelocatedBase) {
-                   /* XXX TODO: use rpmtdDup() instead */
-                   bnames.data = baseNames = duparray(baseNames, fileCount);
-                   bnames.flags |= RPMTD_PTR_ALLOCED;
-                   haveRelocatedBase = 1;
-               }
-               free(baseNames[i]);
-               baseNames[i] = xstrdup(te);
-           }
-           *te = '\0';                 /* terminate new directory name */
-       }
-
-       /* Does this directory already exist in the directory list? */
-       for (j = 0; j < dirCount; j++) {
-           if (fnlen != strlen(dirNames[j]))
-               continue;
-           if (!rstreqn(fn, dirNames[j], fnlen))
-               continue;
-           break;
-       }
-       
-       if (j < dirCount) {
-           dirIndexes[i] = j;
-           continue;
-       }
-
-       /* Creating new paths is a pita */
-       dirNames = dnames.data = xrealloc(dnames.data, 
-                              sizeof(*dirNames) * (dirCount + 1));
-
-       dirNames[dirCount] = xstrdup(fn);
-       dirIndexes[i] = dirCount;
-       dirCount++;
-       dnames.count++;
-    }
-
-    /* Finish off by relocating directories. */
-    for (i = dirCount - 1; i >= 0; i--) {
-       for (j = numRelocations - 1; j >= 0; j--) {
-
-           if (relocations[j].oldPath == NULL) /* XXX can't happen */
-               continue;
-           size_t len = !rstreq(relocations[j].oldPath, "/")
-               ? strlen(relocations[j].oldPath)
-               : 0;
-
-           if (len && !rstreqn(relocations[j].oldPath, dirNames[i], len))
-               continue;
-
-           /*
-            * Only subdirectories or complete file paths may be relocated. We
-            * don't check for '\0' as our directory names all end in '/'.
-            */
-           if (dirNames[i][len] != '/')
-               continue;
-
-           if (relocations[j].newPath) { /* Relocate the path */
-               char *t = NULL;
-               rstrscat(&t, relocations[j].newPath, (dirNames[i] + len), NULL);
-               /* Unfortunatly rpmCleanPath strips the trailing slash.. */
-               (void) rpmCleanPath(t);
-               rstrcat(&t, "/");
-
-               rpmlog(RPMLOG_DEBUG,
-                      "relocating directory %s to %s\n", dirNames[i], t);
-               free(dirNames[i]);
-               dirNames[i] = t;
-               nrelocated++;
-           }
-       }
-    }
-
-    /* Save original filenames in header and replace (relocated) filenames. */
-    if (nrelocated) {
-       saveRelocs(h, &bnames, &dnames, &dindexes);
-    }
-
-    rpmtdFreeData(&bnames);
-    rpmtdFreeData(&dnames);
-    rpmtdFreeData(&dindexes);
-    rpmtdFreeData(&fmodes);
-    free(fn);
-}
-
-rpmfi rpmfiFree(rpmfi fi)
+rpmfiles rpmfilesFree(rpmfiles fi)
 {
     if (fi == NULL) return NULL;
 
     if (fi->nrefs > 1)
-       return rpmfiUnlink(fi);
+       return rpmfilesUnlink(fi);
 
-    if (fi->fc > 0) {
-       fi->bnid = _free(fi->bnid);
-       fi->dnid = _free(fi->dnid);
-       fi->dil = _free(fi->dil);
+    if (rpmfilesFC(fi) > 0) {
+       if (fi->ofndata != &fi->fndata) {
+           rpmfnClear(fi->ofndata);
+           free(fi->ofndata);
+       }
+       rpmfnClear(&fi->fndata);
 
        fi->flinks = _free(fi->flinks);
        fi->flangs = _free(fi->flangs);
        fi->digests = _free(fi->digests);
+       fi->signatures = _free(fi->signatures);
        fi->fcaps = _free(fi->fcaps);
 
        fi->cdict = _free(fi->cdict);
@@ -1067,8 +1277,6 @@ rpmfi rpmfiFree(rpmfi fi)
        fi->fstates = _free(fi->fstates);
        fi->fps = _free(fi->fps);
 
-       fi->pool = rpmstrPoolFree(fi->pool);
-
        /* these point to header memory if KEEPHEADER is used, dont free */
        if (!(fi->fiflags & RPMFI_KEEPHEADER) && fi->h == NULL) {
            fi->fmtimes = _free(fi->fmtimes);
@@ -1076,6 +1284,7 @@ rpmfi rpmfiFree(rpmfi fi)
            fi->fflags = _free(fi->fflags);
            fi->vflags = _free(fi->vflags);
            fi->fsizes = _free(fi->fsizes);
+           fi->lfsizes = _free(fi->lfsizes);
            fi->frdevs = _free(fi->frdevs);
            fi->finodes = _free(fi->finodes);
 
@@ -1088,26 +1297,46 @@ rpmfi rpmfiFree(rpmfi fi)
        }
     }
 
-    fi->fn = _free(fi->fn);
-    fi->apath = _free(fi->apath);
-
     fi->replacedSizes = _free(fi->replacedSizes);
+    fi->replacedLSizes = _free(fi->replacedLSizes);
 
     fi->h = headerFree(fi->h);
+    fi->pool = rpmstrPoolFree(fi->pool);
+
+    fi->nlinks = nlinkHashFree(fi->nlinks);
 
-    (void) rpmfiUnlink(fi);
+    (void) rpmfilesUnlink(fi);
     memset(fi, 0, sizeof(*fi));                /* XXX trash and burn */
     fi = _free(fi);
 
     return NULL;
 }
 
-static rpmsid * tag2pool(rpmstrPool pool, Header h, rpmTag tag)
+rpmfi rpmfiFree(rpmfi fi)
+{
+    if (fi == NULL) return NULL;
+
+    if (fi->nrefs > 1)
+       return rpmfiUnlink(fi);
+
+    fi->files = rpmfilesFree(fi->files);
+    fi->fn = _free(fi->fn);
+    fi->ofn = _free(fi->ofn);
+    fi->found = _free(fi->found);
+    fi->archive = rpmcpioFree(fi->archive);
+
+    free(fi);
+    return NULL;
+}
+
+static rpmsid * tag2pool(rpmstrPool pool, Header h, rpmTag tag, rpm_count_t size)
 {
     rpmsid *sids = NULL;
     struct rpmtd_s td;
     if (headerGet(h, tag, &td, HEADERGET_MINMEM)) {
-       sids = rpmtdToPool(&td, pool);
+       if ((size >= 0) && (rpmtdCount(&td) == size)) { /* ensure right size */
+           sids = rpmtdToPool(&td, pool);
+       }
        rpmtdFreeData(&td);
     }
     return sids;
@@ -1122,30 +1351,182 @@ static int indexSane(rpmtd xd, rpmtd yd, rpmtd zd)
     uint32_t zc = rpmtdCount(zd);
 
     /* check that the amount of data in each is sane */
-    if (xc > 0 && yc > 0 && yc <= xc && zc == xc) {
-       uint32_t * i;
+    /* normally yc <= xc but larger values are not fatal (RhBug:1001553) */
+    if (xc > 0 && yc > 0 && zc == xc) {
+       uint32_t * i, nvalid = 0;
        /* ...and that the indexes are within bounds */
        while ((i = rpmtdNextUint32(zd))) {
            if (*i >= yc)
                break;
+           nvalid++;
        }
        /* unless the loop runs to finish, the data is broken */
-       sane = (i == NULL);
+       sane = (nvalid == zc);
     }
     return sane;
 }
 
+/* Get file data from header */
+/* Requires totalfc to be set and label err: to goto on error */
 #define _hgfi(_h, _tag, _td, _flags, _data) \
-    if (headerGet((_h), (_tag), (_td), (_flags))) \
-       _data = (td.data)
+    if (headerGet((_h), (_tag), (_td), (_flags))) { \
+       if (rpmtdCount(_td) != totalfc) { \
+           rpmlog(RPMLOG_ERR, _("Wrong number of entries for tag %s: %u found but %u expected.\n"), rpmTagGetName(_tag), rpmtdCount(_td), totalfc); \
+           goto err; \
+       } \
+       if (rpmTagGetTagType(_tag) != RPM_STRING_ARRAY_TYPE && rpmTagGetTagType(_tag) != RPM_I18NSTRING_TYPE && \
+           (_td)->size < totalfc * sizeof(*(_data))) {         \
+           rpmlog(RPMLOG_ERR, _("Malformed data for tag %s: %u bytes found but %u expected.\n"), rpmTagGetName(_tag), (_td)->size, totalfc * sizeof(*(_data))); \
+           goto err;                           \
+       } \
+       _data = ((_td)->data); \
+    }
+/* Get file data from header without checking number of entries */
+#define _hgfinc(_h, _tag, _td, _flags, _data) \
+    if (headerGet((_h), (_tag), (_td), (_flags))) {\
+       _data = ((_td)->data);     \
+    }
+
+/*** Hard link handling ***/
+
+struct fileid_s {
+    rpm_dev_t id_dev;
+    rpm_ino_t id_ino;
+};
+
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+#define HASHTYPE fileidHash
+#define HTKEYTYPE struct fileid_s
+#define HTDATATYPE int
+#include "lib/rpmhash.H"
+#include "lib/rpmhash.C"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+
+static unsigned int fidHashFunc(struct fileid_s a)
+{
+    return  a.id_ino + (a.id_dev<<16) + (a.id_dev>>16);
+}
+
+static int fidCmp(struct fileid_s a, struct fileid_s b)
+{
+    return  !((a.id_dev == b.id_dev) && (a.id_ino == b.id_ino));
+}
+
+static unsigned int intHash(int a)
+{
+    return a < 0 ? UINT_MAX-a : a;
+}
+
+static int intCmp(int a, int b)
+{
+    return a != b;
+}
+
+static struct hardlinks_s * freeNLinks(struct hardlinks_s * nlinks)
+{
+    nlinks->nlink--;
+    if (!nlinks->nlink) {
+       nlinks = _free(nlinks);
+    }
+    return nlinks;
+}
+
+static void rpmfilesBuildNLink(rpmfiles fi, Header h)
+{
+    struct fileid_s f_id;
+    fileidHash files;
+    rpm_dev_t * fdevs = NULL;
+    struct rpmtd_s td;
+    int fc = 0;
+    int totalfc = rpmfilesFC(fi);
+
+    if (!fi->finodes)
+       return;
+
+    _hgfi(h, RPMTAG_FILEDEVICES, &td, HEADERGET_ALLOC, fdevs);
+    if (!fdevs)
+       return;
+
+    files = fileidHashCreate(totalfc, fidHashFunc, fidCmp, NULL, NULL);
+    for (int i=0; i < totalfc; i++) {
+       if (!S_ISREG(rpmfilesFMode(fi, i)) ||
+               (rpmfilesFFlags(fi, i) & RPMFILE_GHOST) ||
+               fi->finodes[i] <= 0) {
+           continue;
+       }
+       fc++;
+       f_id.id_dev = fdevs[i];
+       f_id.id_ino = fi->finodes[i];
+       fileidHashAddEntry(files, f_id, i);
+    }
+    if (fileidHashNumKeys(files) != fc) {
+       /* Hard links */
+       fi->nlinks = nlinkHashCreate(2*(totalfc - fileidHashNumKeys(files)),
+               intHash, intCmp, NULL, freeNLinks);
+       for (int i=0; i < totalfc; i++) {
+           int fcnt;
+           int * data;
+           if (!S_ISREG(rpmfilesFMode(fi, i)) ||
+                   (rpmfilesFFlags(fi, i) & RPMFILE_GHOST)) {
+               continue;
+           }
+           f_id.id_dev = fdevs[i];
+           f_id.id_ino = fi->finodes[i];
+           fileidHashGetEntry(files, f_id, &data, &fcnt, NULL);
+           if (fcnt > 1 && !nlinkHashHasEntry(fi->nlinks, i)) {
+               struct hardlinks_s * hlinks;
+               hlinks = xmalloc(sizeof(struct hardlinks_s)+
+                       fcnt*sizeof(hlinks->files[0]));
+               hlinks->nlink = fcnt;
+               for (int j=0; j<fcnt; j++) {
+                   hlinks->files[j] = data[j];
+                   nlinkHashAddEntry(fi->nlinks, data[j], hlinks);
+               }
+           }
+       }
+    }
+    _free(fdevs);
+    files = fileidHashFree(files);
+err:
+    return;
+}
+
+/* Convert a tag of hex strings to binary presentation */
+static uint8_t *hex2bin(Header h, rpmTagVal tag, rpm_count_t num, size_t len)
+{
+    struct rpmtd_s td;
+    uint8_t *bin = NULL;
+
+    if (headerGet(h, tag, &td, HEADERGET_MINMEM) && rpmtdCount(&td) == num) {
+       uint8_t *t = bin = xmalloc(num * len);
+       const char *s;
+
+       while ((s = rpmtdNextString(&td))) {
+           if (*s == '\0') {
+               memset(t, 0, len);
+               t += len;
+               continue;
+           }
+           for (int j = 0; j < len; j++, t++, s += 2)
+               *t = (rnibble(s[0]) << 4) | rnibble(s[1]);
+       }
+    }
+    rpmtdFreeData(&td);
 
-static int rpmfiPopulate(rpmfi fi, Header h, rpmfiFlags flags)
+    return bin;
+}
+
+static int rpmfilesPopulate(rpmfiles fi, Header h, rpmfiFlags flags)
 {
     headerGetFlags scareFlags = (flags & RPMFI_KEEPHEADER) ? 
                                HEADERGET_MINMEM : HEADERGET_ALLOC;
     headerGetFlags defFlags = HEADERGET_ALLOC;
-    struct rpmtd_s fdigests, digalgo, td;
-    unsigned char * t;
+    struct rpmtd_s digalgo, td;
+    rpm_count_t totalfc = rpmfilesFC(fi);
 
     /* XXX TODO: all these should be sanity checked, ugh... */
     if (!(flags & RPMFI_NOFILEMODES))
@@ -1154,22 +1535,23 @@ static int rpmfiPopulate(rpmfi fi, Header h, rpmfiFlags flags)
        _hgfi(h, RPMTAG_FILEFLAGS, &td, scareFlags, fi->fflags);
     if (!(flags & RPMFI_NOFILEVERIFYFLAGS))
        _hgfi(h, RPMTAG_FILEVERIFYFLAGS, &td, scareFlags, fi->vflags);
-    if (!(flags & RPMFI_NOFILESIZES))
+    if (!(flags & RPMFI_NOFILESIZES)) {
        _hgfi(h, RPMTAG_FILESIZES, &td, scareFlags, fi->fsizes);
-
+       _hgfi(h, RPMTAG_LONGFILESIZES, &td, scareFlags, fi->lfsizes);
+    }
     if (!(flags & RPMFI_NOFILECOLORS))
        _hgfi(h, RPMTAG_FILECOLORS, &td, scareFlags, fi->fcolors);
 
     if (!(flags & RPMFI_NOFILECLASS)) {
-       _hgfi(h, RPMTAG_CLASSDICT, &td, scareFlags, fi->cdict);
+       _hgfinc(h, RPMTAG_CLASSDICT, &td, scareFlags, fi->cdict);
        fi->ncdict = rpmtdCount(&td);
        _hgfi(h, RPMTAG_FILECLASS, &td, scareFlags, fi->fcdictx);
     }
     if (!(flags & RPMFI_NOFILEDEPS)) {
-       _hgfi(h, RPMTAG_DEPENDSDICT, &td, scareFlags, fi->ddict);
+       _hgfinc(h, RPMTAG_DEPENDSDICT, &td, scareFlags, fi->ddict);
        fi->nddict = rpmtdCount(&td);
-       _hgfi(h, RPMTAG_FILEDEPENDSX, &td, scareFlags, fi->fddictx);
-       _hgfi(h, RPMTAG_FILEDEPENDSN, &td, scareFlags, fi->fddictn);
+       _hgfinc(h, RPMTAG_FILEDEPENDSX, &td, scareFlags, fi->fddictx);
+       _hgfinc(h, RPMTAG_FILEDEPENDSN, &td, scareFlags, fi->fddictn);
     }
 
     if (!(flags & RPMFI_NOFILESTATES))
@@ -1179,10 +1561,10 @@ static int rpmfiPopulate(rpmfi fi, Header h, rpmfiFlags flags)
        _hgfi(h, RPMTAG_FILECAPS, &td, defFlags, fi->fcaps);
 
     if (!(flags & RPMFI_NOFILELINKTOS))
-       fi->flinks = tag2pool(fi->pool, h, RPMTAG_FILELINKTOS);
+       fi->flinks = tag2pool(fi->pool, h, RPMTAG_FILELINKTOS, totalfc);
     /* FILELANGS are only interesting when installing */
     if ((headerGetInstance(h) == 0) && !(flags & RPMFI_NOFILELANGS))
-       fi->flangs = tag2pool(fi->pool, h, RPMTAG_FILELANGS);
+       fi->flangs = tag2pool(fi->pool, h, RPMTAG_FILELANGS, totalfc);
 
     /* See if the package has non-md5 file digests */
     fi->digestalgo = PGPHASHALGO_MD5;
@@ -1196,22 +1578,17 @@ static int rpmfiPopulate(rpmfi fi, Header h, rpmfiFlags flags)
 
     fi->digests = NULL;
     /* grab hex digests from header and store in binary format */
-    if (!(flags & RPMFI_NOFILEDIGESTS) &&
-       headerGet(h, RPMTAG_FILEDIGESTS, &fdigests, HEADERGET_MINMEM)) {
-       const char *fdigest;
+    if (!(flags & RPMFI_NOFILEDIGESTS)) {
        size_t diglen = rpmDigestLength(fi->digestalgo);
-       fi->digests = t = xmalloc(rpmtdCount(&fdigests) * diglen);
+       fi->digests = hex2bin(h, RPMTAG_FILEDIGESTS, totalfc, diglen);
+    }
 
-       while ((fdigest = rpmtdNextString(&fdigests))) {
-           if (!(fdigest && *fdigest != '\0')) {
-               memset(t, 0, diglen);
-               t += diglen;
-               continue;
-           }
-           for (int j = 0; j < diglen; j++, t++, fdigest += 2)
-               *t = (rnibble(fdigest[0]) << 4) | rnibble(fdigest[1]);
-       }
-       rpmtdFreeData(&fdigests);
+    fi->signatures = NULL;
+    /* grab hex signatures from header and store in binary format */
+    if (!(flags & RPMFI_NOFILESIGNATURES)) {
+       fi->signaturelength = headerGetNumber(h, RPMTAG_FILESIGNATURELENGTH);
+       fi->signatures = hex2bin(h, RPMTAG_FILESIGNATURES,
+                                totalfc, fi->signaturelength);
     }
 
     /* XXX TR_REMOVED doesn;t need fmtimes, frdevs, finodes */
@@ -1219,67 +1596,170 @@ static int rpmfiPopulate(rpmfi fi, Header h, rpmfiFlags flags)
        _hgfi(h, RPMTAG_FILEMTIMES, &td, scareFlags, fi->fmtimes);
     if (!(flags & RPMFI_NOFILERDEVS))
        _hgfi(h, RPMTAG_FILERDEVS, &td, scareFlags, fi->frdevs);
-    if (!(flags & RPMFI_NOFILEINODES))
+    if (!(flags & RPMFI_NOFILEINODES)) {
        _hgfi(h, RPMTAG_FILEINODES, &td, scareFlags, fi->finodes);
-
-    if (!(flags & RPMFI_NOFILEUSER)) 
-       fi->fuser = tag2pool(fi->pool, h, RPMTAG_FILEUSERNAME);
-    if (!(flags & RPMFI_NOFILEGROUP)) 
-       fi->fgroup = tag2pool(fi->pool, h, RPMTAG_FILEGROUPNAME);
-
+       rpmfilesBuildNLink(fi, h);
+    }
+    if (!(flags & RPMFI_NOFILEUSER)) {
+       fi->fuser = tag2pool(fi->pool, h, RPMTAG_FILEUSERNAME, totalfc);
+       if (!fi->fuser) goto err;
+    }
+    if (!(flags & RPMFI_NOFILEGROUP)) {
+       fi->fgroup = tag2pool(fi->pool, h, RPMTAG_FILEGROUPNAME, totalfc);
+       if (!fi->fgroup) goto err;
+    }
     /* TODO: validate and return a real error */
     return 0;
+ err:
+    return -1;
 }
 
-rpmfi rpmfiNewPool(rpmstrPool pool, Header h, rpmTagVal tagN, rpmfiFlags flags)
+rpmfiles rpmfilesNew(rpmstrPool pool, Header h, rpmTagVal tagN, rpmfiFlags flags)
 {
-    rpmfi fi = xcalloc(1, sizeof(*fi)); 
-    struct rpmtd_s bn, dn, dx;
+    rpmfiles fi = xcalloc(1, sizeof(*fi)); 
+    int fc;
 
     fi->magic = RPMFIMAGIC;
-    fi->i = -1;
     fi->fiflags = flags;
+    /* private or shared pool? */
+    fi->pool = (pool != NULL) ? rpmstrPoolLink(pool) : rpmstrPoolCreate();
 
     /*
      * Grab and validate file triplet data. Headers with no files simply
      * fall through here and an empty file set is returned.
      */
-    if (headerGet(h, RPMTAG_BASENAMES, &bn, HEADERGET_MINMEM)) {
-       headerGet(h, RPMTAG_DIRNAMES, &dn, HEADERGET_MINMEM);
-       headerGet(h, RPMTAG_DIRINDEXES, &dx, HEADERGET_ALLOC);
+    fc = rpmfnInit(&fi->fndata, RPMTAG_BASENAMES, h, fi->pool);
+
+    /* Broken data, bail out */
+    if (fc < 0)
+       goto err;
+
+    /* populate the rest of the stuff if we have files */
+    if (fc > 0) {
+       if (headerIsEntry(h, RPMTAG_ORIGBASENAMES)) {
+           /* For relocated packages, grab the original paths too */
+           int ofc;
+           fi->ofndata = xmalloc(sizeof(*fi->ofndata));
+           ofc = rpmfnInit(fi->ofndata, RPMTAG_ORIGBASENAMES, h, fi->pool);
+           
+           if (ofc != 0 && ofc != fc)
+               goto err;
+       } else {
+           /* In the normal case, orig is the same as actual path data */
+           fi->ofndata = &fi->fndata;
+       }
+           
+       if (rpmfilesPopulate(fi, h, flags))
+           goto err;
+    }
 
-       if (indexSane(&bn, &dn, &dx)) {
-           /* private or shared pool? */
-           fi->pool = (pool != NULL) ? rpmstrPoolLink(pool) :
-                                       rpmstrPoolCreate();
-
-           /* init the file triplet data */
-           fi->fc = rpmtdCount(&bn);
-           fi->dc = rpmtdCount(&dn);
-           fi->bnid = rpmtdToPool(&bn, fi->pool);
-           fi->dnid = rpmtdToPool(&dn, fi->pool);
-           /* steal index data from the td (pooh...) */
-           fi->dil = dx.data;
-           dx.data = NULL;
+    /* freeze the pool to save memory, but only if private pool */
+    if (fi->pool != pool)
+       rpmstrPoolFreeze(fi->pool, 0);
 
-           /* populate the rest of the stuff */
-           rpmfiPopulate(fi, h, flags);
+    fi->h = (fi->fiflags & RPMFI_KEEPHEADER) ? headerLink(h) : NULL;
 
-           /* freeze the pool to save memory, but only if private pool */
-           if (fi->pool != pool)
-               rpmstrPoolFreeze(fi->pool, 0);
+    return rpmfilesLink(fi);
 
-           fi->h = (fi->fiflags & RPMFI_KEEPHEADER) ? headerLink(h) : NULL;
-       } else {
-           /* broken data, free and return NULL */
-           fi = _free(fi);
+err:
+    rpmfilesFree(fi);
+    return NULL;
+}
+
+static int iterWriteArchiveNext(rpmfi fi);
+static int iterReadArchiveNext(rpmfi fi);
+static int iterReadArchiveNextContentFirst(rpmfi fi);
+static int iterReadArchiveNextOmitHardlinks(rpmfi fi);
+
+static int (*nextfuncs[])(rpmfi fi) = {
+    iterFwd,
+    iterBack,
+    iterWriteArchiveNext,
+    iterReadArchiveNext,
+    iterReadArchiveNextContentFirst,
+    iterReadArchiveNextOmitHardlinks,
+    iterInterval,
+};
+
+
+static rpmfi initIter(rpmfiles files, int itype, int link)
+{
+    rpmfi fi = NULL;
+
+    if (files && itype>=0 && itype<=RPMFILEITERMAX) {
+       fi = xcalloc(1, sizeof(*fi)); 
+       fi->i = -1;
+       fi->files = link ? rpmfilesLink(files) : files;
+       fi->next = nextfuncs[itype];
+       fi->i = -1;
+       if (itype == RPMFI_ITER_BACK) {
+           fi->i = rpmfilesFC(fi->files);
+       } else if (itype >=RPMFI_ITER_READ_ARCHIVE
+           && itype <= RPMFI_ITER_READ_ARCHIVE_OMIT_HARDLINKS) {
+
+           fi->found = xcalloc(1, (rpmfiFC(fi)>>3) + 1);
        }
-       rpmtdFreeData(&bn);
-       rpmtdFreeData(&dn);
-       rpmtdFreeData(&dx);
+       rpmfiLink(fi);
+    }
+    return fi;
+}
+
+rpmfi rpmfilesIter(rpmfiles files, int itype)
+{
+    /* standalone iterators need to bump our refcount */
+    return initIter(files, itype, 1);
+}
+
+rpmfi rpmfilesFindPrefix(rpmfiles fi, const char *pfx)
+{
+    int l, u, c, comparison;
+    rpmfi iterator = NULL;
+
+    if (!fi || !pfx)
+       return NULL;
+
+    size_t plen = strlen(pfx);
+    l = 0;
+    u = rpmfilesFC(fi);
+    while (l < u) {
+       c = (l + u) / 2;
+
+       comparison = cmpPfx(fi, c, pfx, plen);
+
+       if (comparison < 0)
+           u = c;
+       else if (comparison > 0)
+           l = c + 1;
+       else {
+           if (cmpPfx(fi, l, pfx, plen))
+               l = c;
+           while (l > 0 && !cmpPfx(fi, l - 1, pfx, plen))
+               l--;
+           if ( u >= rpmfilesFC(fi) || cmpPfx(fi, u, pfx, plen))
+               u = c;
+           while (++u < rpmfilesFC(fi)) {
+               if (cmpPfx(fi, u, pfx, plen))
+                   break;
+           }
+           break;
+       }
+
+    }
+
+    if (l < u) {
+       iterator = initIter(fi, RPMFI_ITER_INTERVAL, 1);
+       iterator->intervalStart = l;
+       iterator->intervalEnd = u;
     }
 
-    return rpmfiLink(fi);
+    return iterator;
+}
+
+rpmfi rpmfiNewPool(rpmstrPool pool, Header h, rpmTagVal tagN, rpmfiFlags flags)
+{
+    rpmfiles files = rpmfilesNew(pool, h, tagN, flags);
+    /* we already own rpmfiles, avoid extra refcount on it */
+    return initIter(files, RPMFI_ITER_FWD, 0);
 }
 
 rpmfi rpmfiNew(const rpmts ts, Header h, rpmTagVal tagN, rpmfiFlags flags)
@@ -1287,36 +1767,52 @@ rpmfi rpmfiNew(const rpmts ts, Header h, rpmTagVal tagN, rpmfiFlags flags)
     return rpmfiNewPool(NULL, h, tagN, flags);
 }
 
-void rpmfiSetFReplacedSizeIndex(rpmfi fi, int ix, rpm_loff_t newsize)
+void rpmfilesSetFReplacedSize(rpmfiles fi, int ix, rpm_loff_t newsize)
 {
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
-       if (fi->replacedSizes == NULL) {
-           fi->replacedSizes = xcalloc(fi->fc, sizeof(*fi->replacedSizes));
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
+       /* Switch over to 64 bit variant */
+       int fc = rpmfilesFC(fi);
+       if (newsize > UINT32_MAX && fi->replacedLSizes == NULL) {
+           fi->replacedLSizes = xcalloc(fc, sizeof(*fi->replacedLSizes));
+           /* copy 32 bit data */
+           if (fi->replacedSizes) {
+               for (int i=0; i < fc; i++)
+                   fi->replacedLSizes[i] = fi->replacedSizes[i];
+               fi->replacedSizes = _free(fi->replacedSizes);
+           }
+       }
+       if (fi->replacedLSizes != NULL) {
+           fi->replacedLSizes[ix] = newsize;
+       } else {
+           if (fi->replacedSizes == NULL)
+               fi->replacedSizes = xcalloc(fc, sizeof(*fi->replacedSizes));
+           fi->replacedSizes[ix] = (rpm_off_t) newsize;
        }
-       /* XXX watch out, replacedSizes is not rpm_loff_t (yet) */
-       fi->replacedSizes[ix] = (rpm_off_t) newsize;
     }
 }
 
-rpm_loff_t rpmfiFReplacedSizeIndex(rpmfi fi, int ix)
+rpm_loff_t rpmfilesFReplacedSize(rpmfiles fi, int ix)
 {
     rpm_loff_t rsize = 0;
-    if (fi != NULL && ix >= 0 && ix < fi->fc) {
+    if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
        if (fi->replacedSizes) {
            rsize = fi->replacedSizes[ix];
+       } else if (fi->replacedLSizes) {
+           rsize = fi->replacedLSizes[ix];
        }
     }
     return rsize;
 }
 
-void rpmfiFpLookup(rpmfi fi, fingerPrintCache fpc)
+void rpmfilesFpLookup(rpmfiles fi, fingerPrintCache fpc)
 {
     /* This can get called twice (eg yum), scratch former results and redo */
-    if (fi->fc > 0) {
+    if (rpmfilesFC(fi) > 0) {
+       rpmfn fn = &fi->fndata;
        if (fi->fps)
            free(fi->fps);
        fi->fps = fpLookupList(fpc, fi->pool,
-                              fi->dnid, fi->bnid, fi->dil, fi->fc);
+                              fn->dnid, fn->bnid, fn->dil, fn->fc);
     }
 }
 
@@ -1326,12 +1822,14 @@ void rpmfiFpLookup(rpmfi fi, fingerPrintCache fpc)
  */
 
 #define RPMFI_ITERFUNC(TYPE, NAME, IXV) \
-    TYPE rpmfi ## NAME(rpmfi fi) { return rpmfi ## NAME ## Index(fi, fi ? fi->IXV : -1); }
+    TYPE rpmfi ## NAME(rpmfi fi) { return rpmfiles ## NAME(fi ? fi->files : NULL, fi ? fi->IXV : -1); }
 
 RPMFI_ITERFUNC(rpmsid, BNId, i)
 RPMFI_ITERFUNC(rpmsid, DNId, j)
 RPMFI_ITERFUNC(const char *, BN, i)
 RPMFI_ITERFUNC(const char *, DN, j)
+RPMFI_ITERFUNC(const char *, OBN, i)
+RPMFI_ITERFUNC(const char *, ODN, j)
 RPMFI_ITERFUNC(const char *, FLink, i)
 RPMFI_ITERFUNC(const char *, FUser, i)
 RPMFI_ITERFUNC(const char *, FGroup, i)
@@ -1354,41 +1852,545 @@ const char * rpmfiFN(rpmfi fi)
     const char *fn = ""; /* preserve behavior on errors */
     if (fi != NULL) {
        free(fi->fn);
-       fi->fn = rpmfiFNIndex(fi, fi->i);
+       fi->fn = rpmfilesFN(fi->files, fi->i);
        if (fi->fn != NULL)
            fn = fi->fn;
     }
     return fn;
 }
 
+const char * rpmfiOFN(rpmfi fi)
+{
+    const char *fn = ""; /* preserve behavior on errors */
+    if (fi != NULL) {
+       free(fi->ofn);
+       fi->ofn = rpmfilesOFN(fi->files, fi->i);
+       if (fi->ofn != NULL)
+           fn = fi->ofn;
+    }
+    return fn;
+}
+
 const unsigned char * rpmfiFDigest(rpmfi fi, int *algo, size_t *len)
 {
-    return rpmfiFDigestIndex(fi, fi ? fi->i : -1, algo, len);
+    return rpmfilesFDigest(fi->files, fi ? fi->i : -1, algo, len);
+}
+
+const unsigned char * rpmfiFSignature(rpmfi fi, size_t *len)
+{
+    return rpmfilesFSignature(fi->files, fi ? fi->i : -1, len);
 }
 
 uint32_t rpmfiFDepends(rpmfi fi, const uint32_t ** fddictp)
 {
-    return rpmfiFDependsIndex(fi,  fi ? fi->i : -1, fddictp);
+    return rpmfilesFDepends(fi->files,  fi ? fi->i : -1, fddictp);
 }
 
-int rpmfiCompare(const rpmfi afi, const rpmfi bfi)
+int rpmfiStat(rpmfi fi, int flags, struct stat *sb)
 {
-    return rpmfiCompareIndex(afi, afi ? afi->i : -1, bfi, bfi ? bfi->i : -1);
+    return rpmfilesStat(fi->files, fi->i, flags, sb);
 }
 
-rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing)
+int rpmfiCompare(const rpmfi afi, const rpmfi bfi)
 {
-    return rpmfiDecideFateIndex(ofi, ofi ? ofi->i : -1,
-                               nfi, nfi ? nfi->i : -1,
-                               skipMissing);
+    return rpmfilesCompare(afi->files, afi ? afi->i : -1, bfi->files, bfi ? bfi->i : -1);
 }
 
-int rpmfiConfigConflict(const rpmfi fi)
+rpmVerifyAttrs rpmfiVerify(rpmfi fi, rpmVerifyAttrs omitMask)
 {
-    return rpmfiConfigConflictIndex(fi, fi ? fi->i : -1);
+    return rpmfilesVerify(fi->files, fi->i, omitMask);
 }
 
-rpmstrPool rpmfiPool(rpmfi fi)
+rpmstrPool rpmfilesPool(rpmfiles fi)
 {
     return (fi != NULL) ? fi->pool : NULL;
 }
+
+rpmfiles rpmfiFiles(rpmfi fi)
+{
+    return (fi != NULL) ? fi->files : NULL;
+}
+
+/******************************************************/
+/*** Archive handling *********************************/
+/******************************************************/
+
+rpmfi rpmfiNewArchiveReader(FD_t fd, rpmfiles files, int itype)
+{
+    rpmcpio_t archive = rpmcpioOpen(fd, O_RDONLY);
+    rpmfi fi = NULL;
+    if (archive && itype >= RPMFI_ITER_READ_ARCHIVE) {
+       fi = rpmfilesIter(files, itype);
+    }
+    if (fi) {
+       fi->archive = archive;
+    } else {
+       rpmcpioFree(archive);
+    }
+    return fi;
+}
+
+rpmfi rpmfiNewArchiveWriter(FD_t fd, rpmfiles files)
+{
+    rpmcpio_t archive = rpmcpioOpen(fd, O_WRONLY);
+    rpmfi fi = NULL;
+    if (archive) {
+       fi = rpmfilesIter(files, RPMFI_ITER_WRITE_ARCHIVE);
+    }
+    if (fi) {
+       fi->archive = archive;
+    } else {
+       rpmcpioFree(archive);
+    }
+    return fi;
+}
+
+int rpmfiArchiveClose(rpmfi fi)
+{
+    if (fi == NULL)
+       return -1;
+    int rc = rpmcpioClose(fi->archive);
+    return rc;
+}
+
+rpm_loff_t rpmfiArchiveTell(rpmfi fi)
+{
+    if (fi == NULL || fi->archive == NULL)
+       return 0;
+    return (rpm_loff_t) rpmcpioTell(fi->archive);
+}
+
+static int rpmfiArchiveWriteHeader(rpmfi fi)
+{
+    int rc;
+    struct stat st;
+
+    if (rpmfiStat(fi, 0, &st))
+       return -1;
+
+    rpmfiles files = fi->files;
+
+    if (files->lfsizes) {
+       return rpmcpioStrippedHeaderWrite(fi->archive, rpmfiFX(fi), st.st_size);
+    } else {
+       const char * dn = rpmfiDN(fi);
+       char * path = rstrscat(NULL, (dn[0] == '/' && !rpmExpandNumeric("%{_noPayloadPrefix}")) ? "." : "",
+                              dn, rpmfiBN(fi), NULL);
+       rc = rpmcpioHeaderWrite(fi->archive, path, &st);
+       free(path);
+    }
+
+    return rc;
+}
+
+static int iterWriteArchiveNextFile(rpmfi fi)
+{
+    rpmfiles files = rpmfiFiles(fi);
+    int fx = rpmfiFX(fi);
+    int fc = rpmfiFC(fi);
+    const int * hardlinks;
+    int numHardlinks = 0;
+
+    /* already processing hard linked files */
+    if (rpmfiFNlink(fi) > 1) {
+       /* search next hard linked file */
+       fi->i = -1;
+       for (int i=fx+1; i<fc; i++) {
+           /* no ghosts */
+           if (rpmfilesFFlags(files, i) & RPMFILE_GHOST)
+               continue;
+           numHardlinks = rpmfilesFLinks(files, i, &hardlinks);
+           if (numHardlinks > 1 && hardlinks[0] == i) {
+               rpmfiSetFX(fi, i);
+               break;
+           }
+       }
+    } else {
+       fi->i = -1;
+       /* search next non hardlinked file */
+       for (int i=fx+1; i<fc; i++) {
+           /* no ghosts */
+           if (rpmfilesFFlags(files, i) & RPMFILE_GHOST)
+               continue;
+           if (rpmfilesFNlink(files, i) < 2) {
+               rpmfiSetFX(fi, i);
+               break;
+           }
+       }
+       if (rpmfiFX(fi) == -1) {
+           /* continue with first hard linked file */
+           for (int i=0; i<fc; i++) {
+               /* no ghosts */
+               if (rpmfilesFFlags(files, i) & RPMFILE_GHOST)
+                   continue;
+               numHardlinks = rpmfilesFLinks(files, i, &hardlinks);
+               if (numHardlinks > 1) {
+                   rpmfiSetFX(fi, i);
+                   break;
+               }
+           }
+       }
+    }
+    if (rpmfiFX(fi) == -1)
+       return -1;
+
+    /* write header(s) */
+    if (numHardlinks>1) {
+       for (int i=0; i<numHardlinks; i++) {
+           rpmfiSetFX(fi, hardlinks[i]);
+           int rc = rpmfiArchiveWriteHeader(fi);
+           if (rc) {
+               return rc;
+           }
+       }
+       rpmfiSetFX(fi, hardlinks[0]);
+    } else {
+       int rc = rpmfiArchiveWriteHeader(fi);
+       if (rc) {
+           return rc;
+       }
+    }
+    return rpmfiFX(fi);
+}
+
+static int iterWriteArchiveNext(rpmfi fi)
+{
+    int fx;
+    /* loop over the files we can handle ourself */
+    do {
+       fx = iterWriteArchiveNextFile(fi);
+       if (S_ISLNK(rpmfiFMode(fi))) {
+           /* write symlink target */
+           const char *lnk = rpmfiFLink(fi);
+           size_t len = strlen(lnk);
+           if (rpmfiArchiveWrite(fi, lnk, len) != len) {
+               return RPMERR_WRITE_FAILED;
+           }
+       } else if (S_ISREG(rpmfiFMode(fi)) && rpmfiFSize(fi)) {
+           /* this file actually needs some content */
+           return fx;
+       }
+       /* go on for special files, directories and empty files */
+    } while (fx >= 0);
+    return fx;
+}
+
+size_t rpmfiArchiveWrite(rpmfi fi, const void * buf, size_t size)
+{
+    if (fi == NULL || fi->archive == NULL)
+       return -1;
+    return rpmcpioWrite(fi->archive, buf, size);
+}
+
+int rpmfiArchiveWriteFile(rpmfi fi, FD_t fd)
+{
+    rpm_loff_t left;
+    int rc = 0;
+    size_t len;
+    char buf[BUFSIZ*4];
+
+    if (fi == NULL || fi->archive == NULL || fd == NULL)
+       return -1;
+
+    left = rpmfiFSize(fi);
+
+    while (left) {
+       len = (left > sizeof(buf) ? sizeof(buf) : left);
+       if (Fread(buf, sizeof(*buf), len, fd) != len || Ferror(fd)) {
+           rc = RPMERR_READ_FAILED;
+           break;
+       }
+
+       if (rpmcpioWrite(fi->archive, buf, len) != len) {
+           rc = RPMERR_WRITE_FAILED;
+           break;
+       }
+       left -= len;
+    }
+    return rc;
+}
+
+static void rpmfiSetFound(rpmfi fi, int ix)
+{
+    fi->found[ix >> 3] |= (1 << (ix % 8));
+}
+
+static int rpmfiFound(rpmfi fi, int ix)
+{
+    return fi->found[ix >> 3] & (1 << (ix % 8));
+}
+
+static int iterReadArchiveNext(rpmfi fi)
+{
+    int rc;
+    int fx = -1;
+    int fc = rpmfilesFC(fi->files);
+    char * path = NULL;
+
+    if (fi->archive == NULL)
+       return -1;
+
+    /* Read next payload header. */
+    rc = rpmcpioHeaderRead(fi->archive, &path, &fx);
+
+    /* if archive ended, check if we found all files */
+    if (rc == RPMERR_ITER_END) {
+       for (int i=0; i<fc; i++) {
+           if (!rpmfiFound(fi, i) &&
+                       !(rpmfilesFFlags(fi->files, i) & RPMFILE_GHOST)) {
+                rc = RPMERR_MISSING_FILE;
+               break;
+            }
+       }
+    }
+    if (rc) {
+       return rc;
+    }
+
+    if (path) {
+       /* Regular cpio archive, identify mapping index. */
+       fx = rpmfilesFindOFN(fi->files, path);
+       free(path);
+    }
+
+    if (fx >= 0 && fx < fc) {
+       rpm_loff_t fsize = 0;
+       rpm_mode_t mode = rpmfilesFMode(fi->files, fx);
+
+       /* %ghost in payload, should not be there but rpm < 4.11 sometimes did this */
+       if (rpmfilesFFlags(fi->files, fx) & RPMFILE_GHOST)
+           return RPMERR_ITER_SKIP;
+
+       if (S_ISREG(mode)) {
+           const int * links;
+           uint32_t numlinks = rpmfilesFLinks(fi->files, fx, &links);
+           if (!(numlinks > 1 && links[numlinks-1] != fx))
+               fsize = rpmfilesFSize(fi->files, fx);
+       } else if (S_ISLNK(mode)) {
+           /* Skip over symlink target data in payload */
+           rpm_loff_t lsize = rpmfilesFSize(fi->files, fx);
+           char *buf = xmalloc(lsize + 1);
+           if (rpmcpioRead(fi->archive, buf, lsize) != lsize)
+               rc = RPMERR_READ_FAILED;
+           /* XXX should we validate the payload matches? */
+           free(buf);
+       }
+       rpmcpioSetExpectedFileSize(fi->archive, fsize);
+       rpmfiSetFound(fi, fx);
+    } else {
+       /* Mapping error */
+       rc = RPMERR_UNMAPPED_FILE;
+    }
+    return (rc != 0) ? rc : fx;
+}
+
+
+static int iterReadArchiveNextOmitHardlinks(rpmfi fi)
+{
+    int fx;
+    const int * links;
+    int nlink;
+    do {
+       fx = iterReadArchiveNext(fi);
+       nlink = rpmfilesFLinks(fi->files, fx, &links);
+    } while (fx>=0 && nlink>1 && links[nlink-1]!=fx);
+    return fx;
+}
+
+static int iterReadArchiveNextContentFirst(rpmfi fi)
+{
+    int fx = rpmfiFX(fi);
+    const int * links;
+    int nlink;
+    /* decide what to do on the basis of the last entry */
+    nlink = rpmfilesFLinks(fi->files, fx, &links);
+    if (nlink > 1) {
+       /* currently reading through hard links */
+       if (fx == links[nlink-1]) {
+           /* arrived back at last entry, read on */
+           fx = iterReadArchiveNext(fi);    
+       } else {
+           /* next hard link */
+           /* scales poorly but shouldn't matter */
+           for (int i=0; i<nlink; i++) {
+               if (links[i] == fx) {
+                   fx = links[i+1];
+                   return fx;
+               }
+           }
+           /* should never happen */
+           return -1;
+       }
+    } else {
+       fx = iterReadArchiveNext(fi);
+    }
+
+    /* look at the new entry */
+    nlink = rpmfilesFLinks(fi->files, fx, &links);
+    /* arrived at new set of hardlinks? */
+    if (nlink > 1) {
+       /* read over all entries to the last one (containing the content) */
+       do {
+           fx = iterReadArchiveNext(fi);
+       } while (fx >=0 && fx != links[nlink-1]);
+       /* rewind to the first entry */
+       if (fx >= 0) {
+           fx = links[0];
+       }
+    }
+    return fx;
+}
+
+int rpmfiArchiveHasContent(rpmfi fi)
+{
+    int res = 0;
+    if (fi && S_ISREG(rpmfiFMode(fi))) {
+       const int * links;
+       int nlink = rpmfiFLinks(fi, &links);
+       if (nlink > 1) {
+           if (fi->next == iterReadArchiveNext ||
+               fi->next == iterReadArchiveNextOmitHardlinks) {
+               res = rpmfiFX(fi) == links[nlink-1];
+           } else if (fi->next == iterReadArchiveNextContentFirst) {
+               res = rpmfiFX(fi) == links[0];
+           }
+       } else {
+           res = 1;
+       }
+    }
+    return res;
+}
+
+size_t rpmfiArchiveRead(rpmfi fi, void * buf, size_t size)
+{
+    if (fi == NULL || fi->archive == NULL)
+       return -1;
+    return rpmcpioRead(fi->archive, buf, size);
+}
+
+int rpmfiArchiveReadToFilePsm(rpmfi fi, FD_t fd, int nodigest, rpmpsm psm)
+{
+    if (fi == NULL || fi->archive == NULL || fd == NULL)
+       return -1;
+
+    rpm_loff_t left = rpmfiFSize(fi);
+    const unsigned char * fidigest = NULL;
+    pgpHashAlgo digestalgo = 0;
+    int rc = 0;
+    char buf[BUFSIZ*4];
+
+    if (!nodigest) {
+       digestalgo = rpmfiDigestAlgo(fi);
+       fidigest = rpmfilesFDigest(fi->files, rpmfiFX(fi), NULL, NULL);
+       fdInitDigest(fd, digestalgo, 0);
+    }
+
+    while (left) {
+       size_t len;
+       len = (left > sizeof(buf) ? sizeof(buf) : left);
+       if (rpmcpioRead(fi->archive, buf, len) != len) {
+           rc = RPMERR_READ_FAILED;
+           goto exit;
+       }
+       if ((Fwrite(buf, sizeof(*buf), len, fd) != len) || Ferror(fd)) {
+           rc = RPMERR_WRITE_FAILED;
+           goto exit;
+       }
+
+       rpmpsmNotify(psm, RPMCALLBACK_INST_PROGRESS, rpmfiArchiveTell(fi));
+       left -= len;
+    }
+
+    if (!nodigest) {
+       void * digest = NULL;
+
+       (void) Fflush(fd);
+       fdFiniDigest(fd, digestalgo, &digest, NULL, 0);
+
+       if (digest != NULL && fidigest != NULL) {
+           size_t diglen = rpmDigestLength(digestalgo);
+           if (memcmp(digest, fidigest, diglen)) {
+               rc = RPMERR_DIGEST_MISMATCH;
+
+               /* ...but in old packages, empty files have zeros for digest */
+               if (rpmfiFSize(fi) == 0 && digestalgo == PGPHASHALGO_MD5) {
+                   uint8_t zeros[diglen];
+                   memset(&zeros, 0, diglen);
+                   if (memcmp(zeros, fidigest, diglen) == 0)
+                       rc = 0;
+               }
+           }
+       } else {
+           rc = RPMERR_DIGEST_MISMATCH;
+       }
+       free(digest);
+    }
+
+exit:
+    return rc;
+}
+
+int rpmfiArchiveReadToFile(rpmfi fi, FD_t fd, int nodigest)
+{
+    return rpmfiArchiveReadToFilePsm(fi, fd, nodigest, NULL);
+}
+
+char * rpmfileStrerror(int rc)
+{
+    char *msg = NULL;
+    const char *s = NULL;
+    const char *prefix = "cpio";
+    int myerrno = errno;
+
+    switch (rc) {
+    default:
+       break;
+    case RPMERR_BAD_MAGIC:     s = _("Bad magic");             break;
+    case RPMERR_BAD_HEADER:    s = _("Bad/unreadable  header");break;
+
+    case RPMERR_OPEN_FAILED:   s = "open";     break;
+    case RPMERR_CHMOD_FAILED:  s = "chmod";    break;
+    case RPMERR_CHOWN_FAILED:  s = "chown";    break;
+    case RPMERR_WRITE_FAILED:  s = "write";    break;
+    case RPMERR_UTIME_FAILED:  s = "utime";    break;
+    case RPMERR_UNLINK_FAILED: s = "unlink";   break;
+    case RPMERR_RENAME_FAILED: s = "rename";   break;
+    case RPMERR_SYMLINK_FAILED: s = "symlink"; break;
+    case RPMERR_STAT_FAILED:   s = "stat";     break;
+    case RPMERR_LSTAT_FAILED:  s = "lstat";    break;
+    case RPMERR_MKDIR_FAILED:  s = "mkdir";    break;
+    case RPMERR_RMDIR_FAILED:  s = "rmdir";    break;
+    case RPMERR_MKNOD_FAILED:  s = "mknod";    break;
+    case RPMERR_MKFIFO_FAILED: s = "mkfifo";   break;
+    case RPMERR_LINK_FAILED:   s = "link";     break;
+    case RPMERR_READLINK_FAILED: s = "readlink";       break;
+    case RPMERR_READ_FAILED:   s = "read";     break;
+    case RPMERR_COPY_FAILED:   s = "copy";     break;
+    case RPMERR_LSETFCON_FAILED: s = "lsetfilecon";    break;
+    case RPMERR_SETCAP_FAILED: s = "cap_set_file";     break;
+
+    case RPMERR_HDR_SIZE:      s = _("Header size too big");   break;
+    case RPMERR_FILE_SIZE:     s = _("File too large for archive");    break;
+    case RPMERR_UNKNOWN_FILETYPE: s = _("Unknown file type");  break;
+    case RPMERR_MISSING_FILE: s = _("Missing file(s)"); break;
+    case RPMERR_DIGEST_MISMATCH: s = _("Digest mismatch");     break;
+    case RPMERR_INTERNAL:      s = _("Internal error");        break;
+    case RPMERR_UNMAPPED_FILE: s = _("Archive file not in header"); break;
+    case RPMERR_ENOENT:        s = strerror(ENOENT); break;
+    case RPMERR_ENOTEMPTY:     s = strerror(ENOTEMPTY); break;
+    case RPMERR_EXIST_AS_DIR:
+       s = _("File from package already exists as a directory in system");
+       break;
+    }
+
+    if (s != NULL) {
+       rasprintf(&msg, "%s: %s", prefix, s);
+       if ((rc <= RPMERR_CHECK_ERRNO) && myerrno) {
+           rstrscat(&msg, _(" failed - "), strerror(myerrno), NULL);
+       }
+    } else {
+       rasprintf(&msg, _("%s: (error 0x%x)"), prefix, rc);
+    }
+
+    return msg;
+}
index b77c828955a04afa23344667a91c7db40b415f55..cb22acae7fa6838510fbe7518b361b4164b389d3 100644 (file)
 #ifndef H_RPMFI
 #define H_RPMFI
 
-/** \ingroup rpmdep rpmtrans
+/** \ingroup rpmfi
  * \file lib/rpmfi.h
- * Structure(s) used for file info tag sets.
+ * File info set iterator API.
  */
 
 #include <rpm/rpmtypes.h>
-#include <rpm/rpmvf.h>
-#include <rpm/rpmpgp.h>
+#include <rpm/rpmfiles.h>
+#include <rpm/rpmarchive.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /** \ingroup rpmfi
- * File types.
- * These are the file types used internally by rpm. The file
- * type is determined by applying stat(2) macros like S_ISDIR to
- * the file mode tag from a header. The values are arbitrary,
- * but are identical to the linux stat(2) file types.
- */
-typedef enum rpmFileTypes_e {
-    PIPE       =  1,   /*!< pipe/fifo */
-    CDEV       =  2,   /*!< character device */
-    XDIR       =  4,   /*!< directory */
-    BDEV       =  6,   /*!< block device */
-    REG                =  8,   /*!< regular file */
-    LINK       = 10,   /*!< hard link */
-    SOCK       = 12    /*!< socket */
-} rpmFileTypes;
-
-/**
- * File States (when installed).
- */
-typedef enum rpmfileState_e {
-    RPMFILE_STATE_MISSING      = -1,   /* used for unavailable data */
-    RPMFILE_STATE_NORMAL       = 0,
-    RPMFILE_STATE_REPLACED     = 1,
-    RPMFILE_STATE_NOTINSTALLED = 2,
-    RPMFILE_STATE_NETSHARED    = 3,
-    RPMFILE_STATE_WRONGCOLOR   = 4
-} rpmfileState;
-
-#define RPMFILE_IS_INSTALLED(_x) ((_x) == RPMFILE_STATE_NORMAL || (_x) == RPMFILE_STATE_NETSHARED)
-
-/**
- * Exported File Attributes (ie RPMTAG_FILEFLAGS)
- */
-enum rpmfileAttrs_e {
-    RPMFILE_NONE       = 0,
-    RPMFILE_CONFIG     = (1 <<  0),    /*!< from %%config */
-    RPMFILE_DOC                = (1 <<  1),    /*!< from %%doc */
-    RPMFILE_ICON       = (1 <<  2),    /*!< from %%donotuse. */
-    RPMFILE_MISSINGOK  = (1 <<  3),    /*!< from %%config(missingok) */
-    RPMFILE_NOREPLACE  = (1 <<  4),    /*!< from %%config(noreplace) */
-    RPMFILE_SPECFILE   = (1 <<  5),    /*!< @todo (unnecessary) marks 1st file in srpm. */
-    RPMFILE_GHOST      = (1 <<  6),    /*!< from %%ghost */
-    RPMFILE_LICENSE    = (1 <<  7),    /*!< from %%license */
-    RPMFILE_README     = (1 <<  8),    /*!< from %%readme */
-    /* bits 9-10 unused */
-    RPMFILE_PUBKEY     = (1 << 11),    /*!< from %%pubkey */
-    RPMFILE_SECMANIFEST        = (1 << 12),    /*!< from %%manifest */
-};
-
-typedef rpmFlags rpmfileAttrs;
-
-#define        RPMFILE_ALL     ~(RPMFILE_NONE)
-
-/** \ingroup rpmfi
- * File disposition(s) during package install/erase transaction.
- */
-typedef enum rpmFileAction_e {
-    FA_UNKNOWN = 0,    /*!< initial action for file ... */
-    FA_CREATE,         /*!< ... copy in from payload. */
-    FA_COPYIN,         /*!< ... copy in from payload. */
-    FA_COPYOUT,                /*!< ... copy out to payload. */
-    FA_BACKUP,         /*!< ... renamed with ".rpmorig" extension. */
-    FA_SAVE,           /*!< ... renamed with ".rpmsave" extension. */
-    FA_SKIP,           /*!< ... already replaced, don't remove. */
-    FA_ALTNAME,                /*!< ... create with ".rpmnew" extension. */
-    FA_ERASE,          /*!< ... to be removed. */
-    FA_SKIPNSTATE,     /*!< ... untouched, state "not installed". */
-    FA_SKIPNETSHARED,  /*!< ... untouched, state "netshared". */
-    FA_SKIPCOLOR       /*!< ... untouched, state "wrong color". */
-} rpmFileAction;
-
-#define XFA_SKIPPING(_a)       \
-    ((_a) == FA_SKIP || (_a) == FA_SKIPNSTATE || (_a) == FA_SKIPNETSHARED || (_a) == FA_SKIPCOLOR)
-
-/**
- * We pass these around as an array with a sentinel.
- */
-struct rpmRelocation_s {
-    char * oldPath;    /*!< NULL here evals to RPMTAG_DEFAULTPREFIX, */
-    char * newPath;    /*!< NULL means to omit the file completely! */
-};
-
-/** \ingroup rpmfi
- * Reference a file info set instance.
- * @param fi           file info set
- * @return             new file info set reference
+
+ * Reference a file info set iterator instance.
+ * @param fi           file info set iterator
+ * @return             new file info set iterator reference
  */
 rpmfi rpmfiLink (rpmfi fi);
 
 /** \ingroup rpmfi
- * Return file count from file info set.
- * @param fi           file info set
+ * Return file count from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file count
  */
 rpm_count_t rpmfiFC(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file index from file info set.
- * @param fi           file info set
+ * Return current file index from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file index
  */
 int rpmfiFX(rpmfi fi);
 
 /** \ingroup rpmfi
- * Set current file index in file info set.
- * @param fi           file info set
+ * Set current file index in file info set iterator.
+ * @param fi           file info set iterator
  * @param fx           new file index
  * @return             current file index
  */
 int rpmfiSetFX(rpmfi fi, int fx);
 
 /** \ingroup rpmfi
- * Return directory count from file info set.
- * @param fi           file info set
+ * Return directory count from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current directory count
  */
 rpm_count_t rpmfiDC(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current directory index from file info set.
- * @param fi           file info set
+ * Return current directory index from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current directory index
  */
 int rpmfiDX(rpmfi fi);
 
 /** \ingroup rpmfi
- * Set current directory index in file info set.
- * @param fi           file info set
+ * Set current directory index in file info set iterator.
+ * @param fi           file info set iterator
  * @param dx           new directory index
  * @return             current directory index
  */
 int rpmfiSetDX(rpmfi fi, int dx);
 
 /** \ingroup rpmfi
- * Return current base name from file info set.
- * @param fi           file info set
+ * Return current base name from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current base name, NULL on invalid
  */
 const char * rpmfiBN(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current directory name from file info set.
- * @param fi           file info set
+ * Return current directory name from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current directory, NULL on invalid
  */
 const char * rpmfiDN(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file name from file info set.
- * @param fi           file info set
+ * Return current file name from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file name
  */
 const char * rpmfiFN(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file flags from file info set.
- * @param fi           file info set
+ * Return file index of the given file name or -1 if file is not in the rpmfi.
+ * The file name may have "." prefixed but is then interpreted as a global
+ * path without the prefixing "."
+ * @param fi            file info set iterator
+ * @param fn           file name
+ * @return              file index or -1
+ */
+int rpmfiFindFN(rpmfi fi, const char * fn);
+
+/** \ingroup rpmfi
+ * Return current original base name from file info set iterator.
+ * @param fi           file info set iterator
+ * @return             current base name, NULL on invalid
+ */
+const char * rpmfiOBN(rpmfi fi);
+
+/** \ingroup rpmfi
+ * Return current original directory name from file info set iterator.
+ * @param fi           file info set iterator
+ * @return             current directory, NULL on invalid
+ */
+const char * rpmfiODN(rpmfi fi);
+
+/** \ingroup rpmfi
+ * Return current original file name from file info set iterator.
+ * @param fi           file info set iterator
+ * @return             current file name
+ */
+const char * rpmfiOFN(rpmfi fi);
+
+/** \ingroup rpmfi
+ * Return file index of the given original file name or -1 if file is not
+ * in the rpmfi. The file name may have "." prefixed but is then interpreted
+ * as a global path without the prefixing "."
+ * @param fi            file info set iterator
+ * @param fn           file name
+ * @return              file index or -1
+ */
+int rpmfiFindOFN(rpmfi fi, const char * fn);
+
+/** \ingroup rpmfi
+ * Return current file flags from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file flags, 0 on invalid
  */
 rpmfileAttrs rpmfiFFlags(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file verify flags from file info set.
- * @param fi           file info set
+ * Return current file verify flags from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file verify flags, 0 on invalid
  */
 rpmVerifyAttrs rpmfiVFlags(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file mode from file info set.
- * @param fi           file info set
+ * Return current file mode from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file mode, 0 on invalid
  */
 rpm_mode_t rpmfiFMode(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file state from file info set.
- * @param fi           file info set
+ * Return current file state from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file state, 0 on invalid
  */
 rpmfileState rpmfiFState(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return digest algorithm of a file info set.
- * @param fi           file info set
- * @return             digest algorithm of file info set, 0 on invalid
+ * Return digest algorithm of a file info set iterator.
+ * @param fi           file info set iterator
+ * @return             digest algorithm of file info set iterator, 0 on invalid
  */
 int rpmfiDigestAlgo(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file (binary) digest of file info set.
- * @param fi           file info set
- * @retval algo                digest hash algoritm used (pass NULL to ignore)
+ * Return current file (binary) digest of file info set iterator.
+ * @param fi           file info set iterator
+ * @retval algo                digest hash algorithm used (pass NULL to ignore)
  * @retval diglen      digest hash length (pass NULL to ignore)
  * @return             current file digest, NULL on invalid
  */
 const unsigned char * rpmfiFDigest(rpmfi fi, int *algo, size_t *diglen);
 
 /** \ingroup rpmfi
- * Return current file (hex) digest of file info set.
- * The file info set stores file digests in binary format to conserve
+ * Return current file (hex) digest of file info set iterator.
+ * The file info set iterator stores file digests in binary format to conserve
  * memory, this converts the binary data back to hex presentation used in
  * headers. 
- * @param fi           file info set
- * @retval algo                digest hash algoritm used (pass NULL to ignore)
+ * @param fi           file info set iterator
+ * @retval algo                digest hash algorithm used (pass NULL to ignore)
  * @return             current file digest (malloc'ed), NULL on invalid
  */
 char * rpmfiFDigestHex(rpmfi fi, int *algo);
 
 /** \ingroup rpmfi
- * Return current file (binary) md5 digest from file info set.
- * @deprecated         Use rpmfiFDigest() instead
- * @param fi           file info set
- * @return             current file md5 digest, NULL on invalid
+ * Return current file (binary) signature of file info set iterator.
+ * @param fi           file info set iterator
+ * @retval siglen      signature length (pass NULL to ignore)
+ * @return             current file signature, NULL on invalid
  */
-const unsigned char * rpmfiMD5(rpmfi fi) RPM_GNUC_DEPRECATED;
+const unsigned char * rpmfiFSignature(rpmfi fi, size_t *siglen);
 
 /** \ingroup rpmfi
- * Return current file linkto (i.e. symlink(2) target) from file info set.
- * @param fi           file info set
+ * Return current file linkto (i.e. symlink(2) target) from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file linkto, NULL on invalid
  */
 const char * rpmfiFLink(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file size from file info set.
- * @param fi           file info set
+ * Return current file size from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file size, 0 on invalid
  */
 rpm_loff_t rpmfiFSize(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file rdev from file info set.
- * @param fi           file info set
+ * Return current file rdev from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file rdev, 0 on invalid
  */
 rpm_rdev_t rpmfiFRdev(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file inode from file info set.
- * @param fi           file info set
+ * Return current file inode from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file inode, 0 on invalid
  */
 rpm_ino_t rpmfiFInode(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return union of all file color bits from file info set.
- * @param fi           file info set
+ * Return union of all file color bits from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current color
  */
 rpm_color_t rpmfiColor(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file color bits from file info set.
- * @param fi           file info set
+ * Return current file color bits from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file color
  */
 rpm_color_t rpmfiFColor(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file class from file info set.
- * @param fi           file info set
+ * Return current file class from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file class, 0 on invalid
  */
 const char * rpmfiFClass(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file depends dictionary from file info set.
- * @param fi           file info set
+ * Return current file depends dictionary from file info set iterator.
+ * @param fi           file info set iterator
  * @retval *fddictp    file depends dictionary array (or NULL)
  * @return             no. of file depends entries, 0 on invalid
  */
@@ -291,133 +250,121 @@ uint32_t rpmfiFDepends(rpmfi fi,
                const uint32_t ** fddictp);
 
 /** \ingroup rpmfi
- * Return (calculated) current file nlink count from file info set.
- * @param fi           file info set
+ * Return (calculated) current file nlink count from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file nlink count, 0 on invalid
  */
 uint32_t rpmfiFNlink(rpmfi fi);
 
+
+/** \ingroup rpmfi
+ * Return (calculated) current file nlink count from file info set iterator.
+ * @param fi           file info set iterator
+ * @param files         returns array of file ids hardlinked including ix,
+                       NULL for nlink count == 1
+ * @return             current file nlink count, 0 on invalid
+ */
+uint32_t rpmfiFLinks(rpmfi fi, const int ** files);
+
 /** \ingroup rpmfi
- * Return current file modify time from file info set.
- * @param fi           file info set
+ * Return current file modify time from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file modify time, 0 on invalid
  */
 rpm_time_t rpmfiFMtime(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file owner from file info set.
- * @param fi           file info set
+ * Return current file owner from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file owner, NULL on invalid
  */
 const char * rpmfiFUser(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file group from file info set.
- * @param fi           file info set
+ * Return current file group from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file group, NULL on invalid
  */
 const char * rpmfiFGroup(rpmfi fi);
 
 /** \ingroup rpmfi
  * Return textual representation of current file capabilities 
- * from file info set. See cap_from_text(3) for details.
- * @param fi           file info set
+ * from file info set iterator. See cap_from_text(3) for details.
+ * @param fi           file info set iterator
  * @return             file capability description, "" for no capabilities
  *                     and NULL on invalid
  */
 const char * rpmfiFCaps(rpmfi fi);
 
 /** \ingroup rpmfi
- * Return current file language(s) from file info set.
- * @param fi           file info set
+ * Return current file language(s) from file info set iterator.
+ * @param fi           file info set iterator
  * @return             current file language(s), NULL on invalid
  */
 const char * rpmfiFLangs(rpmfi fi);
 
+/** \ingroup rpmfi
+ * Map file stat(2) info.
+ * @param fi           file info iterator
+ * @param flags                flags
+ * @retval sb          mapped stat(2) data
+ */
+int rpmfiStat(rpmfi fi, int flags, struct stat *sb);
+
 /** \ingroup rpmfi
  * Return next file iterator index.
- * @param fi           file info set
+ * @param fi           file info set iterator
  * @return             file iterator index, -1 on termination
  */
 int rpmfiNext(rpmfi fi);
 
 /** \ingroup rpmfi
  * Initialize file iterator index.
- * @param fi           file info set
+ * @param fi           file info set iterator
  * @param fx           file iterator index
- * @return             file info set
+ * @return             file info set iterator
  */
 rpmfi rpmfiInit(rpmfi fi, int fx);
 
 /** \ingroup rpmfi
  * Return next directory iterator index.
- * @param fi           file info set
+ * @param fi           file info set iterator
  * @return             directory iterator index, -1 on termination
  */
 int rpmfiNextD(rpmfi fi);
 
 /** \ingroup rpmfi
  * Initialize directory iterator index.
- * @param fi           file info set
+ * @param fi           file info set iterator
  * @param dx           directory iterator index
- * @return             file info set, NULL if dx is out of range
+ * @return             file info set iterator, NULL if dx is out of range
  */
 rpmfi rpmfiInitD(rpmfi fi, int dx);
 
 /** \ingroup rpmfi
- * Destroy a file info set.
- * @param fi           file info set
+ * Destroy a file info set iterator.
+ * @param fi           file info set iterator
  * @return             NULL always
  */
 rpmfi rpmfiFree(rpmfi fi);
 
-enum rpmfiFlags_e {
-    RPMFI_NOHEADER             = 0,
-    RPMFI_KEEPHEADER           = (1 << 0),
-    RPMFI_NOFILECLASS          = (1 << 1),
-    RPMFI_NOFILEDEPS           = (1 << 2),
-    RPMFI_NOFILELANGS          = (1 << 3),
-    RPMFI_NOFILEUSER           = (1 << 4),
-    RPMFI_NOFILEGROUP          = (1 << 5),
-    RPMFI_NOFILEMODES          = (1 << 6),
-    RPMFI_NOFILESIZES          = (1 << 7),
-    RPMFI_NOFILECAPS           = (1 << 8),
-    RPMFI_NOFILELINKTOS                = (1 << 9),
-    RPMFI_NOFILEDIGESTS                = (1 << 10),
-    RPMFI_NOFILEMTIMES         = (1 << 11),
-    RPMFI_NOFILERDEVS          = (1 << 12),
-    RPMFI_NOFILEINODES         = (1 << 13),
-    RPMFI_NOFILESTATES         = (1 << 14),
-    RPMFI_NOFILECOLORS         = (1 << 15),
-    RPMFI_NOFILEVERIFYFLAGS    = (1 << 16),
-    RPMFI_NOFILEFLAGS          = (1 << 17),
-};
-
-typedef rpmFlags rpmfiFlags;
-
-#define RPMFI_FLAGS_ERASE \
-    (RPMFI_NOFILECLASS | RPMFI_NOFILELANGS | \
-     RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | RPMFI_NOFILEINODES | \
-     RPMFI_NOFILEVERIFYFLAGS)
-
-#define RPMFI_FLAGS_INSTALL \
-    (RPMFI_NOFILECLASS | RPMFI_NOFILEVERIFYFLAGS)
-
-#define RPMFI_FLAGS_VERIFY \
-    (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
-     RPMFI_NOFILECOLORS)
-
-#define RPMFI_FLAGS_QUERY \
-    (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
-     RPMFI_NOFILECOLORS | RPMFI_NOFILEVERIFYFLAGS)
-
-/** \ingroup rpmfi
- * Create and load a file info set.
+/** \ingroup rpmfi
+ * Create and load a file info set iterator.
+ * @param pool         shared string pool (or NULL for private pool)
+ * @param h            header
+ * @param tagN         unused
+ * @param flags                Flags to control what information is loaded.
+ * @return             new file info set iterator
+ */
+rpmfi rpmfiNewPool(rpmstrPool pool, Header h, rpmTagVal tagN, rpmfiFlags flags);
+
+/** \ingroup rpmfi
+ * Create and load a file info set iterator.
  * @param ts           unused
  * @param h            header
  * @param tagN         unused
  * @param flags                Flags to control what information is loaded.
- * @return             new file info set
+ * @return             new file info set iterator
  */
 rpmfi rpmfiNew(const rpmts ts, Header h, rpmTagVal tagN, rpmfiFlags flags);
 
@@ -437,20 +384,12 @@ rpmFileTypes rpmfiWhatis(rpm_mode_t mode);
 int rpmfiCompare(const rpmfi afi, const rpmfi bfi);
 
 /** \ingroup rpmfi
- * Return file disposition.
- * @param ofi          old file info
- * @param nfi          new file info
- * @param skipMissing  OK to skip missing files?
- * @return             file dispostion
- */
-rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing);
-
-/** \ingroup rpmfi
- * Return whether file is conflicting config
- * @param fi           file info
- * @return             1 if config file and file on disk conflicts
+ * Verify file attributes (including digest).
+ * @param fi           file info iterator
+ * @param omitMask     bit(s) to disable verify checks
+ * @return             bit(s) to indicate failure (ie 0 for passed verify)
  */
-int rpmfiConfigConflict(const rpmfi fi);
+rpmVerifyAttrs rpmfiVerify(rpmfi fi, rpmVerifyAttrs omitMask);
 
 #ifdef __cplusplus
 }
index 19484ec5acc747f276edd232d27839f124c9155c..dccc6ccbe8f6795a579afc9155b6c5ca98dbc9ff 100644 (file)
@@ -5,91 +5,21 @@
 #include <rpm/rpmfi.h>
 #include <rpm/rpmstrpool.h>
 #include "lib/fprint.h"
+#include "lib/cpio.h"
 
 #define        RPMFIMAGIC      0x09697923
 
-/**
- * A package filename set.
- */
-struct rpmfi_s {
-    int i;                     /*!< Current file index. */
-    int j;                     /*!< Current directory index. */
-
-    Header h;                  /*!< Header for file info set (or NULL) */
-    rpmstrPool pool;           /*!< String pool of this file info set */
-
-    rpmsid * bnid;             /*!< Index to base name(s) (pool) */
-    rpmsid * dnid;             /*!< Index to directory name(s) (pool) */
-
-    rpmsid * flinks;           /*!< Index to file link(s) (pool) */
-
-    uint32_t * dil;            /*!< Directory indice(s) (from header) */
-    rpm_flag_t * fflags;       /*!< File flag(s) (from header) */
-    rpm_off_t * fsizes;                /*!< File size(s) (from header) */
-    rpm_time_t * fmtimes;      /*!< File modification time(s) (from header) */
-    rpm_mode_t * fmodes;       /*!< File mode(s) (from header) */
-    rpm_rdev_t * frdevs;       /*!< File rdev(s) (from header) */
-    rpm_ino_t * finodes;       /*!< File inodes(s) (from header) */
-
-    rpmsid * fuser;            /*!< Index to file owner(s) (misc pool) */
-    rpmsid * fgroup;           /*!< Index to file group(s) (misc pool) */
-    rpmsid * flangs;           /*!< Index to file lang(s) (misc pool) */
-
-    char * fstates;            /*!< File state(s) (from header) */
-
-    rpm_color_t * fcolors;     /*!< File color bits (header) */
-    char ** fcaps;             /*!< File capability strings (header) */
-
-    char ** cdict;             /*!< File class dictionary (header) */
-    rpm_count_t ncdict;                /*!< No. of class entries. */
-    uint32_t * fcdictx;                /*!< File class dictionary index (header) */
-
-    uint32_t * ddict;          /*!< File depends dictionary (header) */
-    rpm_count_t nddict;                /*!< No. of depends entries. */
-    uint32_t * fddictx;                /*!< File depends dictionary start (header) */
-    uint32_t * fddictn;                /*!< File depends dictionary count (header) */
-    rpm_flag_t * vflags;       /*!< File verify flag(s) (from header) */
-
-    rpm_count_t dc;            /*!< No. of directories. */
-    rpm_count_t fc;            /*!< No. of files. */
-
-    rpmfiFlags fiflags;                /*!< file info set control flags */
-
-    struct fingerPrint_s * fps;        /*!< File fingerprint(s). */
-
-    int digestalgo;            /*!< File digest algorithm */
-    unsigned char * digests;   /*!< File digests in binary. */
-
-    char * fn;                 /*!< File name buffer. */
-
-    char ** apath;
-    rpm_off_t * replacedSizes; /*!< (TR_ADDED) */
-    int magic;
-    int nrefs;         /*!< Reference count. */
-};
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/** \ingroup rpmfi
- * Create and load a file info set.
- * @param pool         shared string pool (or NULL for private pool)
- * @param h            header
- * @param tagN         unused
- * @param flags                Flags to control what information is loaded.
- * @return             new file info set
- */
-RPM_GNUC_INTERNAL
-rpmfi rpmfiNewPool(rpmstrPool pool, Header h, rpmTagVal tagN, rpmfiFlags flags);
-
 /** \ingroup rpmfi
  * Return file info set string pool handle
  * @param fi           file info
  * @return             string pool handle (weak reference)
  */
 RPM_GNUC_INTERNAL
-rpmstrPool rpmfiPool(rpmfi fi);
+rpmstrPool rpmfilesPool(rpmfiles fi);
 
 /** \ingroup rpmfi
  * Return current base name pool id from file info set.
@@ -108,99 +38,75 @@ RPM_GNUC_INTERNAL
 rpmsid rpmfiDNId(rpmfi fi);
 
 RPM_GNUC_INTERNAL
-int rpmfiDIIndex(rpmfi fi, int dx);
-
-RPM_GNUC_INTERNAL
-rpmsid rpmfiBNIdIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-rpmsid rpmfiDNIdIndex(rpmfi fi, int jx);
-
-RPM_GNUC_INTERNAL
-const char * rpmfiBNIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-const char * rpmfiDNIndex(rpmfi fi, int jx);
-
-RPM_GNUC_INTERNAL
-char * rpmfiFNIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-rpmVerifyAttrs rpmfiVFlagsIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-rpmfileState rpmfiFStateIndex(rpmfi fi, int ix);
+rpmsid rpmfilesBNId(rpmfiles fi, int ix);
 
 RPM_GNUC_INTERNAL
-const char * rpmfiFLinkIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-rpm_loff_t rpmfiFSizeIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-rpm_color_t rpmfiFColorIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-const char * rpmfiFClassIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-uint32_t rpmfiFDependsIndex(rpmfi fi, int ix, const uint32_t ** fddictp);
-
-RPM_GNUC_INTERNAL
-uint32_t rpmfiFNlinkIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-const char * rpmfiFLangsIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-rpmfileAttrs rpmfiFFlagsIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-rpm_mode_t rpmfiFModeIndex(rpmfi fi, int ix);
-
-RPM_GNUC_INTERNAL
-const unsigned char * rpmfiFDigestIndex(rpmfi fi, int ix, int *algo, size_t *len);
+rpmsid rpmfilesDNId(rpmfiles fi, int jx);
 
+/** \ingroup rpmfi
+ * Return current original base name pool id from file info set.
+ * @param fi           file info set
+ * @return             current base name id, 0 on invalid
+ */
 RPM_GNUC_INTERNAL
-rpm_rdev_t rpmfiFRdevIndex(rpmfi fi, int ix);
+rpmsid rpmfiOBNId(rpmfi fi);
 
+/** \ingroup rpmfi
+ * Return current original directory name pool id from file info set.
+ * @param fi           file info set
+ * @return             current base name id, 0 on invalid
+ */
 RPM_GNUC_INTERNAL
-rpm_ino_t rpmfiFInodeIndex(rpmfi fi, int ix);
+rpmsid rpmfiODNId(rpmfi fi);
 
 RPM_GNUC_INTERNAL
-rpm_time_t rpmfiFMtimeIndex(rpmfi fi, int ix);
+rpmsid rpmfilesOBNId(rpmfiles fi, int ix);
 
 RPM_GNUC_INTERNAL
-const char * rpmfiFUserIndex(rpmfi fi, int ix);
+rpmsid rpmfilesODNId(rpmfiles fi, int jx);
 
 RPM_GNUC_INTERNAL
-const char * rpmfiFGroupIndex(rpmfi fi, int ix);
+struct fingerPrint_s *rpmfilesFps(rpmfiles fi);
 
+/** \ingroup rpmfi
+ * Check if the file in new package, in old package and on the disk have the same contents.
+ * @param      new file info set
+ * @param      new file index
+ * @param      old file info set
+ * @param      old file index
+ * @return     1 if the condition is satisfied, 0 otherwise
+ */
 RPM_GNUC_INTERNAL
-const char * rpmfiFCapsIndex(rpmfi fi, int ix);
+int rpmfileContentsEqual(rpmfiles ofi, int oix, rpmfiles nfi, int nix);
 
-RPM_GNUC_INTERNAL
-struct fingerPrint_s *rpmfiFps(rpmfi fi);
 
 RPM_GNUC_INTERNAL
-rpmFileAction rpmfiDecideFateIndex(rpmfi ofi, int oix, rpmfi nfi, int nix,
+rpmFileAction rpmfilesDecideFate(rpmfiles ofi, int oix,
+                                  rpmfiles nfi, int nix,
                                    int skipMissing);
 
 RPM_GNUC_INTERNAL
-int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix);
+int rpmfilesConfigConflict(rpmfiles fi, int ix);
 
 RPM_GNUC_INTERNAL
-int rpmfiConfigConflictIndex(rpmfi fi, int ix);
+void rpmfilesSetFReplacedSize(rpmfiles fi, int ix, rpm_loff_t newsize);
 
 RPM_GNUC_INTERNAL
-void rpmfiSetFReplacedSizeIndex(rpmfi fi, int ix, rpm_loff_t newsize);
+rpm_loff_t rpmfilesFReplacedSize(rpmfiles fi, int ix);
 
 RPM_GNUC_INTERNAL
-rpm_loff_t rpmfiFReplacedSizeIndex(rpmfi fi, int ix);
+void rpmfilesFpLookup(rpmfiles fi, fingerPrintCache fpc);
 
-RPM_GNUC_INTERNAL
-void rpmfiFpLookup(rpmfi fi, fingerPrintCache fpc);
+rpmfiles rpmfiFiles(rpmfi fi);
 
+/** \ingroup rpmfi
+ * Return file iterator through files starting with given prefix.
+ * @param fi           file info set
+ * @param pfx          prefix
+ * @return             file iterator
+ */
+RPM_GNUC_INTERNAL
+rpmfi rpmfilesFindPrefix(rpmfiles fi, const char *pfx);
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/rpmfiles.h b/lib/rpmfiles.h
new file mode 100644 (file)
index 0000000..4caef97
--- /dev/null
@@ -0,0 +1,519 @@
+#ifndef _RPMFILES_H
+#define _RPMFILES_H
+
+/** \ingroup rpmfilesles
+ * \file lib/rpmfiles.h
+ * File info set API.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <rpm/rpmtypes.h>
+#include <rpm/rpmvf.h>
+#include <rpm/rpmpgp.h>
+
+/** \ingroup rpmfiles
+ * File types.
+ * These are the file types used internally by rpm. The file
+ * type is determined by applying stat(2) macros like S_ISDIR to
+ * the file mode tag from a header. The values are arbitrary,
+ * but are identical to the linux stat(2) file types.
+ */
+typedef enum rpmFileTypes_e {
+    PIPE       =  1,   /*!< pipe/fifo */
+    CDEV       =  2,   /*!< character device */
+    XDIR       =  4,   /*!< directory */
+    BDEV       =  6,   /*!< block device */
+    REG                =  8,   /*!< regular file */
+    LINK       = 10,   /*!< hard link */
+    SOCK       = 12    /*!< socket */
+} rpmFileTypes;
+
+/**
+ * File States (when installed).
+ */
+typedef enum rpmfileState_e {
+    RPMFILE_STATE_MISSING      = -1,   /* used for unavailable data */
+    RPMFILE_STATE_NORMAL       = 0,
+    RPMFILE_STATE_REPLACED     = 1,
+    RPMFILE_STATE_NOTINSTALLED = 2,
+    RPMFILE_STATE_NETSHARED    = 3,
+    RPMFILE_STATE_WRONGCOLOR   = 4
+} rpmfileState;
+
+#define RPMFILE_IS_INSTALLED(_x) ((_x) == RPMFILE_STATE_NORMAL || (_x) == RPMFILE_STATE_NETSHARED)
+
+/**
+ * Exported File Attributes (ie RPMTAG_FILEFLAGS)
+ */
+enum rpmfileAttrs_e {
+    RPMFILE_NONE       = 0,
+    RPMFILE_CONFIG     = (1 <<  0),    /*!< from %%config */
+    RPMFILE_DOC                = (1 <<  1),    /*!< from %%doc */
+    RPMFILE_ICON       = (1 <<  2),    /*!< from %%donotuse. */
+    RPMFILE_MISSINGOK  = (1 <<  3),    /*!< from %%config(missingok) */
+    RPMFILE_NOREPLACE  = (1 <<  4),    /*!< from %%config(noreplace) */
+    RPMFILE_SPECFILE   = (1 <<  5),    /*!< @todo (unnecessary) marks 1st file in srpm. */
+    RPMFILE_GHOST      = (1 <<  6),    /*!< from %%ghost */
+    RPMFILE_LICENSE    = (1 <<  7),    /*!< from %%license */
+    RPMFILE_README     = (1 <<  8),    /*!< from %%readme */
+    /* bits 9-10 unused */
+    RPMFILE_PUBKEY     = (1 << 11),    /*!< from %%pubkey */
+    RPMFILE_ARTIFACT   = (1 << 12),    /*!< from %%artifact */
+    RPMFILE_SECMANIFEST        = (1 << 13),    /*!< from %%manifest */
+};
+
+typedef rpmFlags rpmfileAttrs;
+
+#define        RPMFILE_ALL     ~(RPMFILE_NONE)
+
+/** \ingroup rpmfiles
+ * File disposition(s) during package install/erase transaction.
+ */
+typedef enum rpmFileAction_e {
+    FA_UNKNOWN         = 0,    /*!< initial action for file ... */
+    FA_CREATE          = 1,    /*!< ... create from payload. */
+    FA_COPYIN          = 2,    /*!< obsolete, unused. */
+    FA_COPYOUT         = 3,    /*!< obsolete, unused. */
+    FA_BACKUP          = 4,    /*!< ... renamed with ".rpmorig" extension. */
+    FA_SAVE            = 5,    /*!< ... renamed with ".rpmsave" extension. */
+    FA_SKIP            = 6,    /*!< ... already replaced, don't remove. */
+    FA_ALTNAME         = 7,    /*!< ... create with ".rpmnew" extension. */
+    FA_ERASE           = 8,    /*!< ... to be removed. */
+    FA_SKIPNSTATE      = 9,    /*!< ... untouched, state "not installed". */
+    FA_SKIPNETSHARED   = 10,   /*!< ... untouched, state "netshared". */
+    FA_SKIPCOLOR       = 11,   /*!< ... untouched, state "wrong color". */
+    FA_TOUCH           = 12,   /*!< ... change metadata only. */
+    /* bits 16-31 reserved */
+} rpmFileAction;
+
+#define XFA_SKIPPING(_a)       \
+    ((_a) == FA_SKIP || (_a) == FA_SKIPNSTATE || (_a) == FA_SKIPNETSHARED || (_a) == FA_SKIPCOLOR)
+
+/**
+ * We pass these around as an array with a sentinel.
+ */
+struct rpmRelocation_s {
+    char * oldPath;    /*!< NULL here evals to RPMTAG_DEFAULTPREFIX, */
+    char * newPath;    /*!< NULL means to omit the file completely! */
+};
+
+enum rpmfiFlags_e {
+    RPMFI_NOHEADER             = 0,
+    RPMFI_KEEPHEADER           = (1 << 0),
+    RPMFI_NOFILECLASS          = (1 << 1),
+    RPMFI_NOFILEDEPS           = (1 << 2),
+    RPMFI_NOFILELANGS          = (1 << 3),
+    RPMFI_NOFILEUSER           = (1 << 4),
+    RPMFI_NOFILEGROUP          = (1 << 5),
+    RPMFI_NOFILEMODES          = (1 << 6),
+    RPMFI_NOFILESIZES          = (1 << 7),
+    RPMFI_NOFILECAPS           = (1 << 8),
+    RPMFI_NOFILELINKTOS                = (1 << 9),
+    RPMFI_NOFILEDIGESTS                = (1 << 10),
+    RPMFI_NOFILEMTIMES         = (1 << 11),
+    RPMFI_NOFILERDEVS          = (1 << 12),
+    RPMFI_NOFILEINODES         = (1 << 13),
+    RPMFI_NOFILESTATES         = (1 << 14),
+    RPMFI_NOFILECOLORS         = (1 << 15),
+    RPMFI_NOFILEVERIFYFLAGS    = (1 << 16),
+    RPMFI_NOFILEFLAGS          = (1 << 17),
+    RPMFI_NOFILESIGNATURES     = (1 << 18),
+};
+
+typedef rpmFlags rpmfiFlags;
+
+#define RPMFI_FLAGS_ERASE \
+    (RPMFI_NOFILECLASS | RPMFI_NOFILELANGS | \
+     RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | RPMFI_NOFILEINODES | \
+     RPMFI_NOFILEVERIFYFLAGS)
+
+#define RPMFI_FLAGS_INSTALL \
+    (RPMFI_NOFILECLASS | RPMFI_NOFILEVERIFYFLAGS)
+
+#define RPMFI_FLAGS_VERIFY \
+    (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
+     RPMFI_NOFILECOLORS)
+
+#define RPMFI_FLAGS_QUERY \
+    (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
+     RPMFI_NOFILECOLORS | RPMFI_NOFILEVERIFYFLAGS)
+
+#define RPMFI_FLAGS_FILETRIGGER \
+    (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
+     RPMFI_NOFILEUSER | RPMFI_NOFILEGROUP | RPMFI_NOFILEMODES | \
+     RPMFI_NOFILESIZES | RPMFI_NOFILECAPS | RPMFI_NOFILELINKTOS | \
+     RPMFI_NOFILEDIGESTS | RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | \
+     RPMFI_NOFILEINODES | RPMFI_NOFILECOLORS | \
+     RPMFI_NOFILEVERIFYFLAGS | RPMFI_NOFILEFLAGS)
+
+#define RPMFI_FLAGS_ONLY_FILENAMES \
+    (RPMFI_FLAGS_FILETRIGGER | RPMFI_NOFILESTATES)
+
+typedef enum rpmFileIter_e {
+    RPMFI_ITER_FWD     = 0,
+    RPMFI_ITER_BACK    = 1,
+    RPMFI_ITER_WRITE_ARCHIVE   = 2,
+    RPMFI_ITER_READ_ARCHIVE    = 3,
+    RPMFI_ITER_READ_ARCHIVE_CONTENT_FIRST = 4,
+    RPMFI_ITER_READ_ARCHIVE_OMIT_HARDLINKS = 5,
+    RPMFI_ITER_INTERVAL = 6,
+} rpmFileIter;
+
+#define RPMFILEITERMAX 6
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** \ingroup rpmfiles
+ * Create and load a file info set.
+ * @param pool         shared string pool (or NULL for private pool)
+ * @param h            header
+ * @param tagN         unused
+ * @param flags                Flags to control what information is loaded.
+ * @return             new file info set
+ */
+rpmfiles rpmfilesNew(rpmstrPool pool, Header h, rpmTagVal tagN, rpmfiFlags flags);
+
+/** \ingroup rpmfiles
+ * Reference a file info set instance.
+ * @param fi           file info set
+ * @return             new file info set reference
+ */
+rpmfiles rpmfilesLink(rpmfiles fi);
+
+/** \ingroup rpmfiles
+ * Destroy a file info set.
+ * @param fi           file info set
+ * @return             NULL always
+ */
+rpmfiles rpmfilesFree(rpmfiles fi);
+
+/** \ingroup rpmfiles
+ * Return file count from file info set.
+ * @param fi           file info set
+ * @return             file count
+ */
+rpm_count_t rpmfilesFC(rpmfiles fi);
+
+/** \ingroup rpmfiles
+ * Return directory count from file info set.
+ * @param fi           file info set
+ * @return             directory count
+ */
+rpm_count_t rpmfilesDC(rpmfiles fi);
+
+/** \ingroup rpmfiles
+ * Return file index of the given file name or -1 if file is not in the rpmfi.
+ * The file name may have "." prefixed but is then interpreted as a global
+ * path without the prefixing "."
+ * @param files         file info set
+ * @param fn           file name
+ * @return              file index or -1
+ */
+int rpmfilesFindFN(rpmfiles files, const char * fn);
+
+/** \ingroup rpmfiles
+ * Return file index of the given original file name or -1 if file is not
+ * in the rpmfi. The file name may have "." prefixed but is then interpreted
+ * as a global path without the prefixing "."
+ * @param files         file info set
+ * @param fn           file name
+ * @return              file index or -1
+ */
+int rpmfilesFindOFN(rpmfiles files, const char * fn);
+
+rpmfi rpmfilesIter(rpmfiles files, int itype);
+
+/** \ingroup rpmfiles
+ * Return digest algorithm of a file info set.
+ * @param fi           file info set
+ * @return             digest algorithm of file info set, 0 on invalid
+ */
+int rpmfilesDigestAlgo(rpmfiles fi);
+
+/** \ingroup rpmfiles
+ * Return union of all file color bits from file info set.
+ * @param files                file info set
+ * @return             color
+ */
+rpm_color_t rpmfilesColor(rpmfiles files);
+
+/** \ingroup rpmfiles
+ * Return file info comparison.
+ * @param afi          1st file info
+ * @param aix          index of the 1st file
+ * @param bfi          2nd file info
+ * @param bix          index of the 2nd file
+ * @return             0 if identical
+ */
+int rpmfilesCompare(rpmfiles afi, int aix, rpmfiles bfi, int bix);
+
+/** \ingroup rpmfiles
+ * Return base name from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             base name, NULL on invalid
+ */
+const char * rpmfilesBN(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return directory name from file info set. Note the index is on
+ * distinct directories within the file set, not a file index. The
+ * directory index associated with a given file index can be retrieved
+ * with rpmfilesDI(). Ie to constuct the full path of file index X
+ * you'd catenate the results of rpmfilesDN(f, rpmfilesDI(f, X)) and
+ * rpmfilesBN(f, X).
+ * @param fi           file info set
+ * @param jx           directory index
+ * @return             directory, NULL on invalid
+ */
+const char * rpmfilesDN(rpmfiles fi, int jx);
+
+/** \ingroup rpmfiles
+ * Return directory index from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             directory index, -1 on invalid
+ */
+int rpmfilesDI(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file name from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file name (malloced)
+ */
+char * rpmfilesFN(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return original directory index from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             directory index, -1 on invalid
+ */
+int rpmfilesODI(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return original base name from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             base name, NULL on invalid
+ */
+const char * rpmfilesOBN(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return original directory name from file info set. Note the index is on
+ * distinct directories within the file set, not a file index. The
+ * directory index associated with a given file index can be retrieved
+ * with rpmfilesODI(). Ie to constuct the full path of file index X
+ * you'd catenate the results of rpmfilesODN(f, rpmfilesODI(f, X)) and
+ * rpmfilesOBN(f, X). 
+ * @param fi           file info set
+ * @param jx           directory index
+ * @return             directory, NULL on invalid
+ */
+const char * rpmfilesODN(rpmfiles fi, int jx);
+
+/** \ingroup rpmfiles
+ * Return original file name from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file name
+ */
+char * rpmfilesOFN(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file verify flags from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file verify flags, 0 on invalid
+ */
+rpmVerifyAttrs rpmfilesVFlags(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file state from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file state, 0 on invalid
+ */
+rpmfileState rpmfilesFState(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file linkto (i.e. symlink(2) target) from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file linkto, NULL on invalid
+ */
+const char * rpmfilesFLink(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file size from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file size, 0 on invalid
+ */
+rpm_loff_t rpmfilesFSize(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file color bits from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file color
+ */
+rpm_color_t rpmfilesFColor(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file class from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file class, 0 on invalid
+ */
+const char * rpmfilesFClass(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file depends dictionary from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @retval *fddictp    file depends dictionary array (or NULL)
+ * @return             no. of file depends entries, 0 on invalid
+ */
+uint32_t rpmfilesFDepends(rpmfiles fi, int ix, const uint32_t ** fddictp);
+
+/** \ingroup rpmfiles
+ * Return (calculated) file nlink count from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file nlink count, 0 on invalid
+ */
+uint32_t rpmfilesFNlink(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return (calculated) file nlink count from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @param files         returns array of file ids hardlinked including ix,
+                       NULL for nlink count == 1
+ * @return             file nlink count, 0 on invalid
+ */
+uint32_t rpmfilesFLinks(rpmfiles fi, int ix, const int ** files);
+
+/** \ingroup rpmfiles
+ * Return file language(s) from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file language(s), NULL on invalid
+ */
+const char * rpmfilesFLangs(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file flags from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file flags, 0 on invalid
+ */
+rpmfileAttrs rpmfilesFFlags(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file mode from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file mode, 0 on invalid
+ */
+rpm_mode_t rpmfilesFMode(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file (binary) digest of file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @retval algo                digest hash algorithm used (pass NULL to ignore)
+ * @retval len         digest hash length (pass NULL to ignore)
+ * @return             file digest, NULL on invalid
+ */
+const unsigned char * rpmfilesFDigest(rpmfiles fi, int ix, int *algo, size_t *len);
+
+/** \ingroup rpmfiles
+ * Return file (binary) digest of file info set.
+ * @param fi            file info set
+ * @param ix            file index
+ * @retval len       signature length (pass NULL to ignore)
+ * @return              file signature, NULL on invalid
+ */
+const unsigned char * rpmfilesFSignature(rpmfiles fi, int ix, size_t *len);
+
+/** \ingroup rpmfiles
+ * Return file rdev from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file rdev, 0 on invalid
+ */
+rpm_rdev_t rpmfilesFRdev(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file inode from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file inode, 0 on invalid
+ */
+rpm_ino_t rpmfilesFInode(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file modify time from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file modify time, 0 on invalid
+ */
+rpm_time_t rpmfilesFMtime(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file owner from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file owner, NULL on invalid
+ */
+const char * rpmfilesFUser(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return file group from file info set.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file group, NULL on invalid
+ */
+const char * rpmfilesFGroup(rpmfiles fi, int ix);
+
+/** \ingroup rpmfiles
+ * Return textual representation of file capabilities 
+ * from file info set. See cap_from_text(3) for details.
+ * @param fi           file info set
+ * @param ix           file index
+ * @return             file capability description, "" for no capabilities
+ *                     and NULL on invalid
+ */
+const char * rpmfilesFCaps(rpmfiles fi, int ix);
+
+/** \ingroup rpmfi
+ * Map file stat(2) info.
+ * @param fi           file info set
+ * @param ix           file index
+ * @param flags                flags
+ * @retval sb          mapped stat(2) data
+ * @return             0 on success
+ */
+int rpmfilesStat(rpmfiles fi, int ix, int flags, struct stat *sb);
+
+/** \ingroup rpmfiles
+ * Verify file attributes (including digest).
+ * @param fi           file info set
+ * @param ix           file index
+ * @param omitMask     bit(s) to disable verify checks
+ * @return             bit(s) to indicate failure (ie 0 for passed verify)
+ */
+rpmVerifyAttrs rpmfilesVerify(rpmfiles fi, int ix, rpmVerifyAttrs omitMask);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RPMFILES_H */
index 764618d94a457821e4df45711b4c127048931a7b..7d807e06be5bb1fd593e5d03d13fc00266864eee 100644 (file)
@@ -18,7 +18,7 @@ rpmfs rpmfsNew(rpm_count_t fc, int initState)
     rpmfs fs = xcalloc(1, sizeof(*fs));
     fs->fc = fc;
     fs->actions = xmalloc(fs->fc * sizeof(*fs->actions));
-    memset(fs->actions, FA_UNKNOWN, fs->fc * sizeof(*fs->actions));
+    rpmfsResetActions(fs);
     if (initState) {
        fs->states = xmalloc(sizeof(*fs->states) * fs->fc);
        memset(fs->states, RPMFILE_STATE_NORMAL, fs->fc);
@@ -101,7 +101,7 @@ rpm_fstate_t * rpmfsGetStates(rpmfs fs)
 rpmFileAction rpmfsGetAction(rpmfs fs, unsigned int ix)
 {
     rpmFileAction action;
-    if (fs->actions != NULL && ix < fs->fc) {
+    if (fs && fs->actions != NULL && ix < fs->fc) {
        action = fs->actions[ix];
     } else {
        action = FA_UNKNOWN;
@@ -115,3 +115,10 @@ void rpmfsSetAction(rpmfs fs, unsigned int ix, rpmFileAction action)
        fs->actions[ix] = action;
     }
 }
+
+void rpmfsResetActions(rpmfs fs)
+{
+    if (fs && fs->actions) {
+       memset(fs->actions, FA_UNKNOWN, fs->fc * sizeof(*fs->actions));
+    }
+}
index 5f747533c16ee213a037b8d7c84d29d25ae7d206..83f99d15ab5bc5c460857da33723da7c8a587601 100644 (file)
@@ -57,6 +57,9 @@ rpmFileAction rpmfsGetAction(rpmfs fs, unsigned int ix);
 RPM_GNUC_INTERNAL
 void rpmfsSetAction(rpmfs fs, unsigned int ix, rpmFileAction action);
 
+RPM_GNUC_INTERNAL
+void rpmfsResetActions(rpmfs fs);
+
 #ifdef __cplusplus
 }
 #endif
index 89707df6445ee123c0ecf81235f44022f7781323..c6663fde1f62c42f192353a20186678703bcbb91 100644 (file)
@@ -17,6 +17,8 @@
 
 #include "debug.h"
 
+#define MANIFEST_RECURSIONS 1000 /* Max. number of allowed manifest recursions */
+
 RPM_GNUC_INTERNAL
 rpmgiFlags giFlags = RPMGI_NONE;
 
@@ -31,6 +33,10 @@ struct rpmgi_s {
 
     ARGV_t argv;
     int argc;
+
+    int curLvl;                        /*!< Current recursion level */
+    int        recLvls[MANIFEST_RECURSIONS]; /*!< Reversed end index for given level */
+
 };
 
 /**
@@ -123,11 +129,24 @@ static Header rpmgiLoadReadHeader(rpmgi gi)
     if (gi->argv != NULL && gi->argv[gi->i] != NULL)
     do {
        char * fn = gi->argv[gi->i];
-       int rc = rpmgiReadHeader(gi, fn, &h);
+       int rc;
+
+       while (gi->recLvls[gi->curLvl] > gi->argc - gi->i)
+           gi->curLvl--;
+
+       rc = rpmgiReadHeader(gi, fn, &h);
 
        if (h != NULL || (gi->flags & RPMGI_NOMANIFEST) || rc == 0)
            break;
 
+       if (gi->curLvl == MANIFEST_RECURSIONS - 1) {
+           rpmlog(RPMLOG_ERR,
+                  _("Max level of manifest recursion exceeded: %s\n"), fn);
+           break;
+       }
+       gi->curLvl++;
+       gi->recLvls[gi->curLvl] = gi->argc - gi->i;
+
        /* Not a header, so try for a manifest. */
        gi->argv[gi->i] = NULL;         /* Mark the insertion point */
        if (rpmgiLoadManifest(gi, fn) != RPMRC_OK) {
@@ -195,11 +214,13 @@ rpmgi rpmgiNew(rpmts ts, rpmgiFlags flags, ARGV_const_t argv)
     gi->i = -1;
     gi->errors = 0;
 
-    gi->flags = flags;
     gi->argv = argvNew();
     gi->argc = 0;
     rpmgiGlobArgv(gi, argv);
 
+    gi->curLvl = 0;
+    gi->recLvls[gi->curLvl] = 1;
+
     return gi;
 }
 
index 98203272d1c1438a7c4b480d074262db232a5493..6875397aad330564974b165238d84dc58331c070 100644 (file)
@@ -69,8 +69,8 @@ HASHTYPE HASHPREFIX(Create)(int numBuckets,
     HASHTYPE ht;
 
     ht = xmalloc(sizeof(*ht));
-    ht->numBuckets = numBuckets;
-    ht->buckets = xcalloc(numBuckets, sizeof(*ht->buckets));
+    ht->numBuckets = numBuckets > 11 ? numBuckets : 11;
+    ht->buckets = xcalloc(ht->numBuckets, sizeof(*ht->buckets));
     ht->freeKey = freeKey;
 #ifdef HTDATATYPE
     ht->freeData = freeData;
@@ -142,6 +142,8 @@ void HASHPREFIX(AddHEntry)(HASHTYPE ht, HTKEYTYPE key, unsigned int keyHash
     }
 #ifdef HTDATATYPE
     else {
+       if (ht->freeKey)
+           ht->freeKey(key);
        // resizing bucket TODO: increase exponentially
        // Bucket_s already contains space for one dataset
        b = *b_addr = xrealloc(
index a3623fd3a5863a34b9d65646f80c226e259807dd..e10392e0f8a58c7d85cf14c91bb3682dd850eb6d 100644 (file)
@@ -10,6 +10,7 @@
 #include <rpm/rpmdb.h>
 #include <rpm/rpmds.h>
 #include <rpm/rpmts.h>
+#include <rpm/rpmsq.h>
 #include <rpm/rpmlog.h>
 #include <rpm/rpmfileutil.h>
 
@@ -22,6 +23,7 @@ static int rpmcliHashesCurrent = 0;
 static int rpmcliHashesTotal = 0;
 static int rpmcliProgressCurrent = 0;
 static int rpmcliProgressTotal = 0;
+static int rpmcliProgressState = 0;
 
 /**
  * Print a CLI progress bar.
@@ -103,7 +105,6 @@ void * rpmShowProgress(const void * arg,
     void * rc = NULL;
     const char * filename = (const char *)key;
     static FD_t fd = NULL;
-    static int state = -1;
 
     switch (what) {
     case RPMCALLBACK_INST_OPEN_FILE:
@@ -134,8 +135,8 @@ void * rpmShowProgress(const void * arg,
 
     case RPMCALLBACK_INST_START:
     case RPMCALLBACK_UNINST_START:
-       if (state != what) {
-           state = what;
+       if (rpmcliProgressState != what) {
+           rpmcliProgressState = what;
            if (flags & INSTALL_HASH) {
                if (what == RPMCALLBACK_INST_START) {
                    fprintf(stdout, _("Updating / installing...\n"));
@@ -185,7 +186,7 @@ void * rpmShowProgress(const void * arg,
        rpmcliProgressTotal = 1;
        rpmcliProgressCurrent = 0;
        rpmcliPackagesTotal = total;
-       state = what;
+       rpmcliProgressState = what;
        if (!(flags & INSTALL_LABEL))
            break;
        if (flags & INSTALL_HASH)
@@ -290,8 +291,8 @@ static int rpmcliTransaction(rpmts ts, struct rpmInstallArguments_s * ia,
 
        ps = rpmtsProblems(ts);
 
-       if ((rpmpsNumProblems(ps) > 0) && (eflags? 1 : (rc > 0)))
-           rpmpsPrint((eflags? NULL : stderr), ps);
+       if (rpmpsNumProblems(ps) > 0 && (eflags || rc > 0))
+           rpmpsPrint(NULL, ps);
        ps = rpmpsFree(ps);
     }
 
@@ -311,7 +312,8 @@ static int tryReadManifest(struct rpmEIU * eiu)
            Fclose(fd);
            fd = NULL;
        }
-       eiu->numFailed++; *eiu->fnp = NULL;
+       eiu->numFailed++;
+       *eiu->fnp = NULL;
        return RPMRC_FAIL;
     }
 
@@ -323,8 +325,10 @@ static int tryReadManifest(struct rpmEIU * eiu)
     Fclose(fd);
     fd = NULL;
 
-    if (rc != RPMRC_OK)
-        eiu->numFailed++; *eiu->fnp = NULL;
+    if (rc != RPMRC_OK) {
+        eiu->numFailed++;
+        *eiu->fnp = NULL;
+    }
 
     return rc;
 }
@@ -340,7 +344,8 @@ static int tryReadHeader(rpmts ts, struct rpmEIU * eiu, Header * hdrp)
            Fclose(fd);
           fd = NULL;
        }
-       eiu->numFailed++; *eiu->fnp = NULL;
+       eiu->numFailed++;
+       *eiu->fnp = NULL;
        return RPMRC_FAIL;
    }
 
@@ -353,9 +358,10 @@ static int tryReadHeader(rpmts ts, struct rpmEIU * eiu, Header * hdrp)
    if (eiu->rpmrc == RPMRC_NOTFOUND && (giFlags & RPMGI_NOMANIFEST))
        eiu->rpmrc = RPMRC_FAIL;
 
-   if(eiu->rpmrc == RPMRC_FAIL) {
+   if (eiu->rpmrc == RPMRC_FAIL) {
        rpmlog(RPMLOG_ERR, _("%s cannot be installed\n"), *eiu->fnp);
-       eiu->numFailed++; *eiu->fnp = NULL;
+       eiu->numFailed++;
+       *eiu->fnp = NULL;
    }
 
    return RPMRC_OK;
@@ -385,6 +391,19 @@ static int checkFreshenStatus(rpmts ts, Header h)
     return (oldH != NULL);
 }
 
+static int rpmNoGlob(const char *fn, int *argcPtr, ARGV_t * argvPtr)
+{
+    struct stat sb;
+    int rc = stat(fn, &sb);
+    if (rc == 0) {
+       argvAdd(argvPtr, fn);
+       *argcPtr = 1;
+    } else {
+       *argcPtr = 0;
+    }
+    return rc;
+}
+
 /** @todo Generalize --freshen policies. */
 int rpmInstall(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_t fileArgv)
 {
@@ -417,13 +436,20 @@ int rpmInstall(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_t fileArgv)
     for (eiu->fnp = fileArgv; *eiu->fnp != NULL; eiu->fnp++) {
        ARGV_t av = NULL;
        int ac = 0;
-       char * fn;
 
-       fn = rpmEscapeSpaces(*eiu->fnp);
-       rc = rpmGlob(fn, &ac, &av);
-       fn = _free(fn);
+       if (giFlags & RPMGI_NOGLOB) {
+           rc = rpmNoGlob(*eiu->fnp, &ac, &av);
+       } else {
+           char * fn = rpmEscapeSpaces(*eiu->fnp);
+           rc = rpmGlob(fn, &ac, &av);
+           fn = _free(fn);
+       }
        if (rc || ac == 0) {
-           rpmlog(RPMLOG_ERR, _("File not found by glob: %s\n"), *eiu->fnp);
+           if (giFlags & RPMGI_NOGLOB) {
+               rpmlog(RPMLOG_ERR, _("File not found: %s\n"), *eiu->fnp);
+           } else {
+               rpmlog(RPMLOG_ERR, _("File not found by glob: %s\n"), *eiu->fnp);
+           }
            eiu->numFailed++;
            continue;
        }
@@ -520,6 +546,10 @@ restart:
        }
 
        if (headerIsSource(h)) {
+           if (ia->installInterfaceFlags & INSTALL_FRESHEN) {
+               headerFree(h);
+               continue;
+           }
            rpmlog(RPMLOG_DEBUG, "\tadded source package [%d]\n",
                eiu->numSRPMS);
            eiu->sourceURL = xrealloc(eiu->sourceURL,
@@ -552,7 +582,10 @@ restart:
                continue;
            }
 
-       rc = rpmtsAddInstallElement(ts, h, (fnpyKey)fileName,
+       if (ia->installInterfaceFlags & INSTALL_REINSTALL)
+           rc = rpmtsAddReinstallElement(ts, h, (fnpyKey)fileName);
+       else
+           rc = rpmtsAddInstallElement(ts, h, (fnpyKey)fileName,
                        (ia->installInterfaceFlags & INSTALL_UPGRADE) != 0,
                        relocations);
 
@@ -560,7 +593,7 @@ restart:
        if (eiu->relocations)
            eiu->relocations->oldPath = _free(eiu->relocations->oldPath);
 
-       switch(rc) {
+       switch (rc) {
        case 0:
            rpmlog(RPMLOG_DEBUG, "\tadded binary package [%d]\n",
                        eiu->numRPMS);
@@ -594,8 +627,11 @@ restart:
     }
 
     if (eiu->numSRPMS && (eiu->sourceURL != NULL)) {
+       rpmcliProgressState = 0;
+       rpmcliProgressTotal = 0;
+       rpmcliProgressCurrent = 0;
        for (i = 0; i < eiu->numSRPMS; i++) {
-           rpmdbCheckSignals();
+           rpmsqPoll();
            if (eiu->sourceURL[i] != NULL) {
                rc = RPMRC_OK;
                if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_TEST))
index 8e56bfc386d55cd8db4bb742f144adc4cf134fda..981bc8f6099dd7587e664f4f26e6ccae6d723b2c 100644 (file)
@@ -17,6 +17,9 @@
 
 #include "debug.h"
 
+/* A long time ago in a galaxy far far away, signatures were not in a header */
+#define RPMSIGTYPE_HEADERSIG 5
+
 static unsigned char const lead_magic[] = {
     RPMLEAD_MAGIC0, RPMLEAD_MAGIC1, RPMLEAD_MAGIC2, RPMLEAD_MAGIC3
 };
@@ -39,10 +42,8 @@ struct rpmlead_s {
     char reserved[16];      /*!< Pad to 96 bytes -- 8 byte aligned! */
 };
 
-rpmlead rpmLeadFromHeader(Header h)
+static int rpmLeadFromHeader(Header h, struct rpmlead_s *l)
 {
-    rpmlead l = NULL;
-
     if (h != NULL) {
        int archnum, osnum;
        char * nevr = headerGetAsString(h, RPMTAG_NEVR);
@@ -51,7 +52,7 @@ rpmlead rpmLeadFromHeader(Header h)
        rpmGetArchInfo(NULL, &archnum);
        rpmGetOsInfo(NULL, &osnum);
 
-       l = xcalloc(1, sizeof(*l));
+       memset(l, 0, sizeof(*l));
        l->major = 3;
        l->minor = 0;
        l->archnum = archnum;
@@ -65,36 +66,30 @@ rpmlead rpmLeadFromHeader(Header h)
        free(nevr);
     }
 
-    return l;
-}
-
-rpmlead rpmLeadFree(rpmlead lead)
-{
-    free(lead);
-    return NULL;
+    return (h != NULL);
 }
 
 /* The lead needs to be 8 byte aligned */
-rpmRC rpmLeadWrite(FD_t fd, rpmlead lead)
+rpmRC rpmLeadWrite(FD_t fd, Header h)
 {
     rpmRC rc = RPMRC_FAIL;
+    struct rpmlead_s l;
 
-    if (lead != NULL) {
-       struct rpmlead_s l;
-       memcpy(&l, lead, sizeof(l));
+    if (rpmLeadFromHeader(h, &l)) {
        
-       l.type = htons(lead->type);
-       l.archnum = htons(lead->archnum);
-       l.osnum = htons(lead->osnum);
-       l.signature_type = htons(lead->signature_type);
+       l.type = htons(l.type);
+       l.archnum = htons(l.archnum);
+       l.osnum = htons(l.osnum);
+       l.signature_type = htons(l.signature_type);
            
        if (Fwrite(&l, 1, sizeof(l), fd) == sizeof(l))
            rc = RPMRC_OK;
     }
+
     return rc;
 }
 
-static rpmRC rpmLeadCheck(rpmlead lead, char **msg)
+static rpmRC rpmLeadCheck(struct rpmlead_s *lead, char **msg)
 {
     if (memcmp(lead->magic, lead_magic, sizeof(lead_magic))) {
        *msg = xstrdup(_("not an rpm package"));
@@ -111,7 +106,7 @@ static rpmRC rpmLeadCheck(rpmlead lead, char **msg)
     return RPMRC_OK;
 }
 
-rpmRC rpmLeadRead(FD_t fd, rpmlead *lead, int *type, char **emsg)
+rpmRC rpmLeadRead(FD_t fd, int *type, char **emsg)
 {
     rpmRC rc = RPMRC_OK;
     struct rpmlead_s l;
@@ -135,10 +130,6 @@ rpmRC rpmLeadRead(FD_t fd, rpmlead *lead, int *type, char **emsg)
     }
 
     if (rc == RPMRC_OK) {
-       if (lead != NULL) {
-           *lead = xmalloc(sizeof(l));
-           memcpy(*lead, &l, sizeof(l));
-       }
        if (type != NULL)
            *type = l.type;
     } else {
index a7f4730ad965fb9c9a3297212f6e56c9f651edc3..48d4df287169088718c549d0e073cabe2a2530c6 100644 (file)
@@ -19,39 +19,22 @@ extern "C" {
 
 #define RPMLEAD_SIZE 96         /*!< Don't rely on sizeof(struct) */
 
-typedef struct rpmlead_s * rpmlead;
-
-/** \ingroup lead
- * Initialize a lead structure from header
- * param h             Header
- * @return             Pointer to populated lead structure (malloced)
- */
-rpmlead rpmLeadFromHeader(Header h);
-
-/** \ingroup lead
- * Free a lead structure
- * @param lead         Pointer to lead structure
- * @return             NULL always
- */
-rpmlead rpmLeadFree(rpmlead lead);
-
 /** \ingroup lead
  * Write lead to file handle.
  * @param fd           file handle
- * @param lead         package lead
+ * @param h            package header
  * @return             RPMRC_OK on success, RPMRC_FAIL on error
  */
-rpmRC rpmLeadWrite(FD_t fd, rpmlead lead);
+rpmRC rpmLeadWrite(FD_t fd, Header h);
 
 /** \ingroup lead
  * Read lead from file handle.
  * @param fd           file handle
- * @retval lead                pointer to package lead (malloced)
  * @retval type                RPMLEAD_BINARY or RPMLEAD_SOURCE on success
  * @retval emsg                failure message on error (malloced)
  * @return             RPMRC_OK on success, RPMRC_FAIL/RPMRC_NOTFOUND on error
  */
-rpmRC rpmLeadRead(FD_t fd, rpmlead *lead, int *type, char **emsg);
+rpmRC rpmLeadRead(FD_t fd, int *type, char **emsg);
 
 #ifdef __cplusplus
 }
index 41a285d04aafe17d6d84214efdeaa82d732d5af5..2e1da831a036ece42bd53389d1cdf4225caab77f 100644 (file)
@@ -15,8 +15,9 @@
 #include <rpm/rpmtag.h>
 #include <rpm/rpmds.h> /* XXX move rpmlib provides to rpmds instead */
 #include <rpm/rpmpgp.h>
+
 #ifdef _RPM_4_4_COMPAT
-#include <rpm/rpmlegacy.h> /* legacy compat definitions if enabled */
+#warning RPM 4.4.x compatibility layer has been removed in RPM >= 4.14
 #endif
 
 #ifdef __cplusplus
@@ -137,7 +138,7 @@ rpmRC headerCheck(rpmts ts, const void * uh, size_t uc, char ** msg);
 
 /**  \ingroup header
  * Return checked and loaded header.
- * @param ts           transaction set
+ * @param ts           unused
  * @param fd           file handle
  * @retval hdrp                address of header (or NULL)
  * @retval *msg                verification error message (or NULL)
index cf9947ea5ca67c7e6cb4cae103209909936c1a4f..f27d8d9b37d05b3bca89658e44cf08e9deed598c 100644 (file)
 
 /* Internal interface */
 
-enum {
-    RPMLOCK_READ   = 1 << 0,
-    RPMLOCK_WRITE  = 1 << 1,
-    RPMLOCK_WAIT   = 1 << 2,
-};
-
 struct rpmlock_s {
     int fd;
     int openmode;
+    char *path;
+    char *descr;
+    int fdrefs;
 };
 
-static rpmlock rpmlock_new(const char *lock_path)
+static rpmlock rpmlock_new(const char *lock_path, const char *descr)
 {
     rpmlock lock = (rpmlock) malloc(sizeof(*lock));
 
@@ -33,7 +30,8 @@ static rpmlock rpmlock_new(const char *lock_path)
        (void) umask(oldmask);
 
        if (lock->fd == -1) {
-           lock->fd = open(lock_path, O_RDONLY);
+           if (errno == EACCES)
+               lock->fd = open(lock_path, O_RDONLY);
            if (lock->fd == -1) {
                free(lock);
                lock = NULL;
@@ -43,13 +41,20 @@ static rpmlock rpmlock_new(const char *lock_path)
        } else {
            lock->openmode = RPMLOCK_WRITE | RPMLOCK_READ;
        }
+       if (lock) {
+           lock->path = xstrdup(lock_path);
+           lock->descr = xstrdup(descr);
+           lock->fdrefs = 1;
+       }
     }
     return lock;
 }
 
 static void rpmlock_free(rpmlock lock)
 {
-    if (lock) {
+    if (--lock->fdrefs == 0) {
+       free(lock->path);
+       free(lock->descr);
        (void) close(lock->fd);
        free(lock);
     }
@@ -58,7 +63,13 @@ static void rpmlock_free(rpmlock lock)
 static int rpmlock_acquire(rpmlock lock, int mode)
 {
     int res = 0;
-    if (lock && (mode & lock->openmode)) {
+
+    if (!(mode & lock->openmode))
+       return res;
+
+    if (lock->fdrefs > 1) {
+       res = 1;
+    } else {
        struct flock info;
        int cmd;
        if (mode & RPMLOCK_WAIT)
@@ -76,12 +87,19 @@ static int rpmlock_acquire(rpmlock lock, int mode)
        if (fcntl(lock->fd, cmd, &info) != -1)
            res = 1;
     }
+
+    lock->fdrefs += res;
+
     return res;
 }
 
 static void rpmlock_release(rpmlock lock)
 {
-    if (lock) {
+    /* if not locked then we must not release */
+    if (lock->fdrefs <= 1)
+       return;
+
+    if (--lock->fdrefs == 1) {
        struct flock info;
        info.l_type = F_UNLCK;
        info.l_whence = SEEK_SET;
@@ -94,31 +112,56 @@ static void rpmlock_release(rpmlock lock)
 
 
 /* External interface */
-
-rpmlock rpmlockAcquire(const char *lock_path, const char *descr)
+rpmlock rpmlockNew(const char *lock_path, const char *descr)
 {
-    rpmlock lock = rpmlock_new(lock_path);
+    rpmlock lock = rpmlock_new(lock_path, descr);
     if (!lock) {
        rpmlog(RPMLOG_ERR, _("can't create %s lock on %s (%s)\n"), 
                descr, lock_path, strerror(errno));
-    } else if (!rpmlock_acquire(lock, RPMLOCK_WRITE)) {
-       if (lock->openmode & RPMLOCK_WRITE)
+    }
+    return lock;
+}
+
+int rpmlockAcquire(rpmlock lock)
+{
+    int locked = 0; /* assume failure */
+    int maywait = isatty(STDIN_FILENO); /* dont wait within scriptlets */
+
+    if (lock) {
+       locked = rpmlock_acquire(lock, RPMLOCK_WRITE);
+       if (!locked && (lock->openmode & RPMLOCK_WRITE) && maywait) {
            rpmlog(RPMLOG_WARNING, _("waiting for %s lock on %s\n"),
-                   descr, lock_path);
-       if (!rpmlock_acquire(lock, RPMLOCK_WRITE|RPMLOCK_WAIT)) {
+                   lock->descr, lock->path);
+           locked = rpmlock_acquire(lock, (RPMLOCK_WRITE|RPMLOCK_WAIT));
+       }
+       if (!locked) {
            rpmlog(RPMLOG_ERR, _("can't create %s lock on %s (%s)\n"), 
-                  descr, lock_path, strerror(errno));
-           rpmlock_free(lock);
-           lock = NULL;
+                  lock->descr, lock->path, strerror(errno));
        }
     }
+    return locked;
+}
+
+void rpmlockRelease(rpmlock lock)
+{
+    if (lock)
+       rpmlock_release(lock);
+}
+
+rpmlock rpmlockNewAcquire(const char *lock_path, const char *descr)
+{
+    rpmlock lock = rpmlockNew(lock_path, descr);
+    if (!rpmlockAcquire(lock))
+       lock = rpmlockFree(lock);
     return lock;
 }
 
 rpmlock rpmlockFree(rpmlock lock)
 {
-    rpmlock_release(lock); /* Not really needed here. */
-    rpmlock_free(lock);
+    if (lock) {
+       rpmlock_release(lock);
+       rpmlock_free(lock);
+    }
     return NULL;
 }
 
index aa85451d6e9bb20dd98f46800f9c8f89223f222c..308794feaa5d6c8917e22c8f3ba2e8a669709c39 100644 (file)
@@ -5,12 +5,27 @@
 
 typedef struct rpmlock_s * rpmlock;
 
+enum {
+    RPMLOCK_READ   = 1 << 0,
+    RPMLOCK_WRITE  = 1 << 1,
+    RPMLOCK_WAIT   = 1 << 2,
+};
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 RPM_GNUC_INTERNAL
-rpmlock rpmlockAcquire(const char *lock_path, const char *descr);
+rpmlock rpmlockNew(const char *lock_path, const char *descr);
+
+RPM_GNUC_INTERNAL
+rpmlock rpmlockNewAcquire(const char *lock_path, const char *descr);
+
+RPM_GNUC_INTERNAL
+int rpmlockAcquire(rpmlock lock);
+
+RPM_GNUC_INTERNAL
+void rpmlockRelease(rpmlock lock);
 
 RPM_GNUC_INTERNAL
 rpmlock rpmlockFree(rpmlock lock);
diff --git a/lib/rpmplugin.h b/lib/rpmplugin.h
new file mode 100644 (file)
index 0000000..d3cdece
--- /dev/null
@@ -0,0 +1,145 @@
+#ifndef _RPMPLUGIN_H
+#define _RPMPLUGIN_H
+
+#include <rpm/rpmtypes.h>
+#include <rpm/rpmfi.h>
+
+/** \ingroup rpmplugin
+ * Rpm plugin API
+ */
+
+/* indicates if a directory is part of rpm package or created by rpm itself */
+typedef enum rpmPluginDirType_e {
+    DIR_TYPE_NONE    = 0,
+    DIR_TYPE_NORMAL    = 1 << 0,
+    DIR_TYPE_UNOWNED    = 1 << 1
+} rpmPluginDirType;
+
+
+/* indicates the way the scriptlet is executed */
+typedef enum rpmScriptletExecutionFlow_e {
+    RPMSCRIPTLET_NONE    = 0,
+    RPMSCRIPTLET_FORK    = 1 << 0,
+    RPMSCRIPTLET_EXEC    = 1 << 1
+} rpmScriptletExecutionFlow;
+
+
+/** \ingroup rpmfi
+ * File disposition flags during package install/erase transaction.
+ * XXX: Move these to rpmfi.h once things stabilize.
+ */
+enum rpmFileActionFlags_e {
+    /* bits 0-15 reserved for actions */
+    FAF_UNOWNED                = (1 << 31)
+};
+typedef rpmFlags rpmFileActionFlags;
+
+/** \ingroup rpmfi
+ * File action and associated flags on install/erase
+ */
+typedef rpmFlags rpmFsmOp;
+
+#define XFA_MASK       0x0000ffff
+#define XFAF_MASK      ~(XFA_MASK)
+#define XFO_ACTION(_a) ((_a) & XFA_MASK)       /*!< File op action part */
+#define XFO_FLAGS(_a)  ((_a) & XFAF_MASK)      /*!< File op flags part */
+
+/* plugin hook typedefs */
+typedef rpmRC (*plugin_init_func)(rpmPlugin plugin, rpmts ts);
+typedef void (*plugin_cleanup_func)(rpmPlugin plugin);
+typedef rpmRC (*plugin_tsm_pre_func)(rpmPlugin plugin, rpmts ts);
+typedef rpmRC (*plugin_tsm_post_func)(rpmPlugin plugin, rpmts ts, int res);
+typedef rpmRC (*plugin_psm_pre_func)(rpmPlugin plugin, rpmte te);
+typedef rpmRC (*plugin_psm_post_func)(rpmPlugin plugin, rpmte te, int res);
+typedef rpmRC (*plugin_psm_verify_func)(rpmKeyring keyring, rpmtd sigtd, pgpDigParams sig, DIGEST_CTX ctx, int res);
+
+typedef rpmRC (*plugin_scriptlet_pre_func)(rpmPlugin plugin,
+                                          const char *s_name, int type);
+typedef rpmRC (*plugin_scriptlet_fork_post_func)(rpmPlugin plugin,
+                                                const char *path, int type);
+typedef rpmRC (*plugin_scriptlet_post_func)(rpmPlugin plugin,
+                                           const char *s_name, int type,
+                                           int res);
+typedef rpmRC (*plugin_fsm_file_pre_func)(rpmPlugin plugin, rpmfi fi,
+                                         const char* path, mode_t file_mode,
+                                         rpmFsmOp op);
+typedef rpmRC (*plugin_fsm_file_post_func)(rpmPlugin plugin, rpmfi fi,
+                                          const char* path, mode_t file_mode,
+                                          rpmFsmOp op, int res);
+typedef rpmRC (*plugin_fsm_file_prepare_func)(rpmPlugin plugin, rpmfi fi,
+                                             const char* path,
+                                             const char *dest,
+                                             mode_t file_mode, rpmFsmOp op);
+typedef rpmRC (*plugin_fsm_file_init_func)(const char* path, mode_t mode);
+typedef rpmRC (*plugin_fsm_file_commit_func)(const char* path, mode_t mode, int type);
+typedef rpmRC (*plugin_fsm_file_conflict_func)(rpmts ts, char* path, Header oldHeader, rpmfi oldFi, int rpmrc);
+
+typedef struct rpmPluginHooks_s * rpmPluginHooks;
+struct rpmPluginHooks_s {
+    /* plugin constructor and destructor hooks */
+    plugin_init_func                   init;
+    plugin_cleanup_func                        cleanup;
+    /* per transaction plugin hooks */
+    plugin_tsm_pre_func                        tsm_pre;
+    plugin_tsm_post_func               tsm_post;
+    /* per transaction element hooks */
+    plugin_psm_pre_func                        psm_pre;
+    plugin_psm_post_func               psm_post;
+       plugin_psm_verify_func          psm_verify;
+    /* per scriptlet hooks */
+    plugin_scriptlet_pre_func          scriptlet_pre;
+    plugin_scriptlet_fork_post_func    scriptlet_fork_post;
+    plugin_scriptlet_post_func         scriptlet_post;
+    /* per file hooks */
+    plugin_fsm_file_pre_func           fsm_file_pre;
+    plugin_fsm_file_post_func          fsm_file_post;
+    plugin_fsm_file_prepare_func       fsm_file_prepare;
+       plugin_fsm_file_init_func               fsm_file_init;
+       plugin_fsm_file_commit_func             fsm_file_commit;
+       plugin_fsm_file_conflict_func   fsm_file_conflict;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** \ingroup rpmplugin
+ * Return plugin name
+ * @param plugin       plugin handle
+ * @return             plugin name string
+ */
+const char *rpmPluginName(rpmPlugin plugin);
+
+/** \ingroup rpmplugin
+ * Return plugin options
+ * @param plugin       plugin handle
+ * @return             plugin options string (or NULL if none)
+ */
+const char *rpmPluginOpts(rpmPlugin plugin);
+
+/** \ingroup rpmplugin
+ * Set plugin private data
+ * @param plugin       plugin handle
+ * @param data         pointer to plugin private data
+ */
+void rpmPluginSetData(rpmPlugin plugin, void *data);
+
+/** \ingroup rpmplugin
+ * Get plugin private data
+ * @param plugin       plugin handle
+ * @return             pointer to plugin private data
+ */
+void * rpmPluginGetData(rpmPlugin plugin);
+
+/** \ingroup rpmplugin
+ * Get plugin count
+ * @param plugins      plugins handle
+ * @return             count of plugins in the plugins handle
+ */
+int rpmPluginsGetCount(rpmPlugins plugin);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _RPMPLUGIN_H */
index 2d4fb01cd3df6f1b991d55961203c8e5bdcd1b93..88d4f06ad6220a495612e2d1c6c7b0d9f772faec 100644 (file)
 #define STR1(x) #x
 #define STR(x) STR1(x)
 
+static rpmRC rpmpluginsCallInit(rpmPlugin plugin, rpmts ts);
+
+struct rpmPlugin_s {
+    char *name;
+    char *opts;
+    void *handle;
+    void *priv;
+    rpmPluginHooks hooks;
+};
+
 struct rpmPlugins_s {
-    void **handles;
-    ARGV_t names;
+    rpmPlugin *plugins;
     int count;
     rpmts ts;
 };
 
-static int rpmpluginsGetPluginIndex(rpmPlugins plugins, const char *name)
+static rpmPlugin rpmpluginsGetPlugin(rpmPlugins plugins, const char *name)
 {
     int i;
     for (i = 0; i < plugins->count; i++) {
-       if (rstreq(plugins->names[i], name)) {
-           return i;
+       rpmPlugin plugin = plugins->plugins[i];
+       if (rstreq(plugin->name, name)) {
+           return plugin;
        }
     }
-    return -1;
-}
-
-static int rpmpluginsHookIsSupported(void *handle, rpmPluginHook hook)
-{
-    rpmPluginHook *supportedHooks =
-       (rpmPluginHook *) dlsym(handle, STR(PLUGIN_HOOKS));
-    return (*supportedHooks & hook);
+    return NULL;
 }
 
 int rpmpluginsPluginAdded(rpmPlugins plugins, const char *name)
 {
-    return (rpmpluginsGetPluginIndex(plugins, name) >= 0);
+    return (rpmpluginsGetPlugin(plugins, name) != NULL);
 }
 
 rpmPlugins rpmpluginsNew(rpmts ts)
@@ -49,31 +52,100 @@ rpmPlugins rpmpluginsNew(rpmts ts)
     return plugins;
 }
 
-rpmRC rpmpluginsAdd(rpmPlugins plugins, const char *name, const char *path,
-                   const char *opts)
+static rpmPlugin rpmPluginNew(const char *name, const char *path,
+                             const char *opts)
 {
+    rpmPlugin plugin = NULL;
+    rpmPluginHooks hooks = NULL;
     char *error;
+    char *hooks_name = NULL;
 
     void *handle = dlopen(path, RTLD_LAZY);
     if (!handle) {
        rpmlog(RPMLOG_ERR, _("Failed to dlopen %s %s\n"), path, dlerror());
-       return RPMRC_FAIL;
+       return NULL;
     }
 
     /* make sure the plugin has the supported hooks flag */
-    (void) dlsym(handle, STR(PLUGIN_HOOKS));
+    hooks_name = rstrscat(NULL, name, "_hooks", NULL);
+    hooks = dlsym(handle, hooks_name);
     if ((error = dlerror()) != NULL) {
        rpmlog(RPMLOG_ERR, _("Failed to resolve symbol %s: %s\n"),
-              STR(PLUGIN_HOOKS), error);
-       return RPMRC_FAIL;
+              hooks_name, error);
+    } else {
+       plugin = xcalloc(1, sizeof(*plugin));
+       plugin->name = xstrdup(name);
+       plugin->handle = handle;
+       plugin->hooks = hooks;
+       if (opts)
+           plugin->opts = xstrdup(opts);
+    }
+    free(hooks_name);
+
+    return plugin;
+}
+
+static rpmPlugin rpmPluginFree(rpmPlugin plugin)
+{
+    if (plugin) {
+       rpmPluginHooks hooks = plugin->hooks;
+       if (hooks->cleanup)
+           hooks->cleanup(plugin);
+       dlclose(plugin->handle);
+       free(plugin->name);
+       free(plugin->opts);
+       free(plugin);
     }
+    return NULL;
+}
+
+const char *rpmPluginName(rpmPlugin plugin)
+{
+    return (plugin != NULL) ? plugin->name : NULL;
+}
+
+const char *rpmPluginOpts(rpmPlugin plugin)
+{
+    return (plugin != NULL) ? plugin->opts : NULL;
+}
+
+void * rpmPluginGetData(rpmPlugin plugin)
+{
+    return (plugin != NULL) ? plugin->priv : NULL;
+}
+
+int rpmPluginsGetCount(rpmPlugins plugins)
+{
+    return (plugins != NULL) ? plugins->count : 0;
+}
+
+void rpmPluginSetData(rpmPlugin plugin, void *data)
+{
+    if (plugin)
+       plugin->priv = data;
+}
+
+rpmRC rpmpluginsAdd(rpmPlugins plugins, const char *name, const char *path,
+                   const char *opts)
+{
+    rpmRC rc;
+    rpmPlugin plugin = rpmPluginNew(name, path, opts);
 
-    argvAdd(&plugins->names, name);
-    plugins->handles = xrealloc(plugins->handles, (plugins->count + 1) * sizeof(*plugins->handles));
-    plugins->handles[plugins->count] = handle;
-    plugins->count++;
+    if (plugin == NULL)
+       return RPMRC_FAIL;
+    
+    rc = rpmpluginsCallInit(plugin, plugins->ts);
+
+    if (rc == RPMRC_OK) {
+       plugins->plugins = xrealloc(plugins->plugins,
+                           (plugins->count + 1) * sizeof(*plugins->plugins));
+       plugins->plugins[plugins->count] = plugin;
+       plugins->count++;
+    } else {
+       rpmPluginFree(plugin);
+    }
 
-    return rpmpluginsCallInit(plugins, name, opts);
+    return rc;
 }
 
 rpmRC rpmpluginsAddPlugin(rpmPlugins plugins, const char *type, const char *name)
@@ -83,9 +155,11 @@ rpmRC rpmpluginsAddPlugin(rpmPlugins plugins, const char *type, const char *name
     rpmRC rc = RPMRC_FAIL;
 
     path = rpmExpand("%{?__", type, "_", name, "}", NULL);
+       //rpmlog(RPMLOG_WARNING, "rpmpluginsAddPlugin, path:%s\n", path);
     if (!path || rstreq(path, "")) {
-       rpmlog(RPMLOG_ERR, _("Failed to expand %%__%s_%s macro\n"),
+       rpmlog(RPMLOG_DEBUG, _("Plugin %%__%s_%s not configured\n"),
               type, name);
+       rc = RPMRC_NOTFOUND;
        goto exit;
     }
 
@@ -112,222 +186,245 @@ rpmRC rpmpluginsAddPlugin(rpmPlugins plugins, const char *type, const char *name
 
 rpmPlugins rpmpluginsFree(rpmPlugins plugins)
 {
-    int i;
-    for (i = 0; i < plugins->count; i++) {
-       rpmpluginsCallCleanup(plugins, plugins->names[i]);
-       dlclose(plugins->handles[i]);
+    if (plugins) {
+       for (int i = 0; i < plugins->count; i++) {
+           rpmPlugin plugin = plugins->plugins[i];
+           rpmPluginFree(plugin);
+       }
+       plugins->plugins = _free(plugins->plugins);
+       plugins->ts = NULL;
+       _free(plugins);
     }
-    plugins->handles = _free(plugins->handles);
-    plugins->names = argvFree(plugins->names);
-    plugins->ts = NULL;
-    _free(plugins);
 
     return NULL;
 }
 
+#define RPMPLUGINS_GET_PLUGIN(name) \
+       plugin = rpmpluginsGetPlugin(plugins, name); \
+       if (plugin == NULL || plugin->handle == NULL) { \
+               rpmlog(RPMLOG_ERR, _("Plugin %s not loaded\n"), name); \
+               return RPMRC_FAIL; \
+       }
 
 /* Common define for all rpmpluginsCall* hook functions */
 #define RPMPLUGINS_SET_HOOK_FUNC(hook) \
-       void *handle = NULL; \
-       int index; \
-       char * error; \
-       index = rpmpluginsGetPluginIndex(plugins, name); \
-       if (index < 0) { \
-               rpmlog(RPMLOG_ERR, _("Plugin %s not loaded\n"), name); \
-               return RPMRC_FAIL; \
-       } \
-       handle = plugins->handles[index]; \
-       if (!handle) { \
-               rpmlog(RPMLOG_ERR, _("Plugin %s not loaded\n"), name); \
-               return RPMRC_FAIL; \
-       } \
-       if (!rpmpluginsHookIsSupported(handle, hook)) { \
-               return RPMRC_OK; \
-       } \
-       *(void **)(&hookFunc) = dlsym(handle, STR(hook##_FUNC)); \
-       if ((error = dlerror()) != NULL) { \
-               rpmlog(RPMLOG_ERR, _("Failed to resolve %s plugin symbol %s: %s\n"), name, STR(hook##_FUNC), error); \
-               return RPMRC_FAIL; \
-       } \
-       if (rpmtsFlags(plugins->ts) & (RPMTRANS_FLAG_TEST | RPMTRANS_FLAG_JUSTDB)) { \
-               return RPMRC_OK; \
-       } \
-       rpmlog(RPMLOG_DEBUG, "Plugin: calling hook %s in %s plugin\n", STR(hook##_FUNC), name);
+       rpmPluginHooks hooks = (plugin != NULL) ? plugin->hooks : NULL; \
+       hookFunc = (hooks != NULL) ? hooks->hook : NULL; \
+       if (hookFunc) { \
+           rpmlog(RPMLOG_DEBUG, "Plugin: calling hook %s in %s plugin\n", \
+                  STR(hook), plugin->name); \
+       }
 
-rpmRC rpmpluginsCallInit(rpmPlugins plugins, const char *name, const char *opts)
+static rpmRC rpmpluginsCallInit(rpmPlugin plugin, rpmts ts)
 {
-    rpmRC (*hookFunc)(rpmts, const char *, const char *);
-    RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_INIT);
-    return hookFunc(plugins->ts, name, opts);
+    rpmRC rc = RPMRC_OK;
+    plugin_init_func hookFunc;
+    RPMPLUGINS_SET_HOOK_FUNC(init);
+    if (hookFunc) {
+        rc = hookFunc(plugin, ts);
+        if (rc != RPMRC_OK && rc != RPMRC_NOTFOUND)
+            rpmlog(RPMLOG_ERR, "Plugin %s: hook init failed\n", plugin->name);
+    }
+    return rc;
 }
 
-rpmRC rpmpluginsCallCleanup(rpmPlugins plugins, const char *name)
+rpmRC rpmpluginsCallTsmPre(rpmPlugins plugins, rpmts ts)
 {
-    rpmRC (*hookFunc)(void);
-    RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_CLEANUP);
-    return hookFunc();
-}
+    plugin_tsm_pre_func hookFunc;
+    int i;
+    rpmRC rc = RPMRC_OK;
 
-rpmRC rpmpluginsCallOpenTE(rpmPlugins plugins, const char *name, rpmte te)
-{
-    rpmRC (*hookFunc)(rpmte);
-    RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_OPENTE);
-    return hookFunc(te);
-}
+    for (i = 0; i < plugins->count; i++) {
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(tsm_pre);
+       if (hookFunc && hookFunc(plugin, ts) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_ERR, "Plugin %s: hook tsm_pre failed\n", plugin->name);
+           rc = RPMRC_FAIL;
+       }
+    }
 
-rpmRC rpmpluginsCallCollectionPostAdd(rpmPlugins plugins, const char *name)
-{
-    rpmRC (*hookFunc)(void);
-    RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_COLL_POST_ADD);
-    return hookFunc();
+    return rc;
 }
 
-rpmRC rpmpluginsCallCollectionPostAny(rpmPlugins plugins, const char *name)
+rpmRC rpmpluginsCallTsmPost(rpmPlugins plugins, rpmts ts, int res)
 {
-    rpmRC (*hookFunc)(void);
-    RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_COLL_POST_ANY);
-    return hookFunc();
+    plugin_tsm_post_func hookFunc;
+    int i;
+    rpmRC rc = RPMRC_OK;
+
+    for (i = 0; i < plugins->count; i++) {
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(tsm_post);
+       if (hookFunc && hookFunc(plugin, ts, res) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_WARNING, "Plugin %s: hook tsm_post failed\n", plugin->name);
+       }
+    }
+
+    return rc;
 }
 
-rpmRC rpmpluginsCallCollectionPreRemove(rpmPlugins plugins, const char *name)
+rpmRC rpmpluginsCallPsmPre(rpmPlugins plugins, rpmte te)
 {
-    rpmRC (*hookFunc)(void);
-    RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_COLL_PRE_REMOVE);
-    return hookFunc();
+    plugin_psm_pre_func hookFunc;
+    int i;
+    rpmRC rc = RPMRC_OK;
+
+    for (i = 0; i < plugins->count; i++) {
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(psm_pre);
+       if (hookFunc && hookFunc(plugin, te) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_ERR, "Plugin %s: hook psm_pre failed\n", plugin->name);
+           rc = RPMRC_FAIL;
+       }
+    }
+
+    return rc;
 }
 
-rpmRC rpmpluginsCallTsmPre(rpmPlugins plugins, rpmts ts)
+rpmRC rpmpluginsCallPsmPost(rpmPlugins plugins, rpmte te, int res)
 {
-    rpmRC (*hookFunc)(rpmts);
+    plugin_psm_post_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
 
     for (i = 0; i < plugins->count; i++) {
-       name = plugins->names[i];
-       RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_TSM_PRE);
-       if (hookFunc(ts) == RPMRC_FAIL)
-           rc = RPMRC_FAIL;
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(psm_post);
+       if (hookFunc && hookFunc(plugin, te, res) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_WARNING, "Plugin %s: hook psm_post failed\n", plugin->name);
+       }
     }
 
     return rc;
 }
 
-rpmRC rpmpluginsCallTsmPost(rpmPlugins plugins, rpmts ts, int res)
+rpmRC rpmpluginsCallScriptletPre(rpmPlugins plugins, const char *s_name, int type)
 {
-    rpmRC (*hookFunc)(rpmts, int);
+    plugin_scriptlet_pre_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
 
     for (i = 0; i < plugins->count; i++) {
-       name = plugins->names[i];
-       RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_TSM_POST);
-       if (hookFunc(ts, res) == RPMRC_FAIL)
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(scriptlet_pre);
+       if (hookFunc && hookFunc(plugin, s_name, type) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_ERR, "Plugin %s: hook scriplet_pre failed\n", plugin->name);
            rc = RPMRC_FAIL;
+       }
     }
 
     return rc;
 }
 
-rpmRC rpmpluginsCallPsmPre(rpmPlugins plugins, rpmte te)
+rpmRC rpmpluginsCallScriptletForkPost(rpmPlugins plugins, const char *path, int type)
 {
-    rpmRC (*hookFunc)(rpmte);
+    plugin_scriptlet_fork_post_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
 
     for (i = 0; i < plugins->count; i++) {
-       name = plugins->names[i];
-       RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_PSM_PRE);
-       if (hookFunc(te) == RPMRC_FAIL)
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(scriptlet_fork_post);
+       if (hookFunc && hookFunc(plugin, path, type) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_ERR, "Plugin %s: hook scriplet_fork_post failed\n", plugin->name);
            rc = RPMRC_FAIL;
+       }
     }
 
     return rc;
 }
 
-rpmRC rpmpluginsCallPsmPost(rpmPlugins plugins, rpmte te, int res)
+rpmRC rpmpluginsCallScriptletPost(rpmPlugins plugins, const char *s_name, int type, int res)
 {
-    rpmRC (*hookFunc)(rpmte, int);
+    plugin_scriptlet_post_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
 
     for (i = 0; i < plugins->count; i++) {
-       name = plugins->names[i];
-       RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_PSM_POST);
-       if (hookFunc(te, res) == RPMRC_FAIL)
-           rc = RPMRC_FAIL;
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(scriptlet_post);
+       if (hookFunc && hookFunc(plugin, s_name, type, res) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_WARNING, "Plugin %s: hook scriplet_post failed\n", plugin->name);
+       }
     }
 
     return rc;
 }
 
-rpmRC rpmpluginsCallScriptletPre(rpmPlugins plugins, const char *s_name, int type)
+rpmRC rpmpluginsCallFsmFilePre(rpmPlugins plugins, rpmfi fi, const char *path,
+                              mode_t file_mode, rpmFsmOp op)
 {
-    rpmRC (*hookFunc)(const char*, int);
+    plugin_fsm_file_pre_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
 
     for (i = 0; i < plugins->count; i++) {
-       name = plugins->names[i];
-       RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_SCRIPTLET_PRE);
-       if (hookFunc(s_name, type) == RPMRC_FAIL)
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(fsm_file_pre);
+       if (hookFunc && hookFunc(plugin, fi, path, file_mode, op) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_ERR, "Plugin %s: hook fsm_file_pre failed\n", plugin->name);
            rc = RPMRC_FAIL;
+       }
     }
 
     return rc;
 }
 
-rpmRC rpmpluginsCallScriptletForkPost(rpmPlugins plugins, const char *path, int type)
+rpmRC rpmpluginsCallFsmFilePost(rpmPlugins plugins, rpmfi fi, const char *path,
+                                mode_t file_mode, rpmFsmOp op, int res)
 {
-    rpmRC (*hookFunc)(const char*, int);
+    plugin_fsm_file_post_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
 
     for (i = 0; i < plugins->count; i++) {
-       name = plugins->names[i];
-       RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_SCRIPTLET_FORK_POST);
-       if (hookFunc(path, type) == RPMRC_FAIL)
-           rc = RPMRC_FAIL;
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(fsm_file_post);
+       if (hookFunc && hookFunc(plugin, fi, path, file_mode, op, res) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_WARNING, "Plugin %s: hook fsm_file_post failed\n", plugin->name);
+       }
     }
 
     return rc;
 }
 
-rpmRC rpmpluginsCallScriptletPost(rpmPlugins plugins, const char *s_name, int type, int res)
+rpmRC rpmpluginsCallFsmFilePrepare(rpmPlugins plugins, rpmfi fi,
+                                  const char *path, const char *dest,
+                                  mode_t file_mode, rpmFsmOp op)
 {
-    rpmRC (*hookFunc)(const char*, int, int);
+    plugin_fsm_file_prepare_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
 
     for (i = 0; i < plugins->count; i++) {
-       name = plugins->names[i];
-       RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_SCRIPTLET_POST);
-       if (hookFunc(s_name, type, res) == RPMRC_FAIL)
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(fsm_file_prepare);
+       if (hookFunc && hookFunc(plugin, fi, path, dest, file_mode, op) == RPMRC_FAIL) {
+           rpmlog(RPMLOG_ERR, "Plugin %s: hook fsm_file_prepare failed\n", plugin->name);
            rc = RPMRC_FAIL;
+       }
     }
 
     return rc;
 }
 
-rpmRC rpmpluginsCallVerify(rpmPlugins plugins, rpmKeyring keyring, rpmtd sigtd, 
+rpmRC rpmpluginsCallVerify(rpmPlugins plugins, rpmKeyring keyring, int sigTagId, 
                            pgpDigParams sig, DIGEST_CTX ctx, int res)
 {
-    rpmRC (*hookFunc)(rpmKeyring, rpmtd, pgpDigParams, DIGEST_CTX, int);
+    plugin_psm_verify_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
+
 
     for (i = 0; i < plugins->count; i++) {
-       name = plugins->names[i];
-       RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_VERIFY);
-       if (hookFunc(keyring, sigtd, sig, ctx, res) == RPMRC_FAIL)
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(psm_verify);
+
+       if (hookFunc && hookFunc(keyring, sigTagId, sig, ctx, res) == RPMRC_FAIL)
+       {
+               rpmlog(RPMLOG_ERR, "Plugin %s: hook psm_verify failed\n", plugin->name);
            rc = RPMRC_FAIL;
+       }
     }
 
     return rc;
@@ -336,16 +433,21 @@ rpmRC rpmpluginsCallVerify(rpmPlugins plugins, rpmKeyring keyring, rpmtd sigtd,
 rpmRC rpmpluginsCallFsmInit(rpmPlugins plugins, const char* path,
                                 mode_t mode)
 {
-    rpmRC (*hookFunc)(const char*, mode_t);
+    plugin_fsm_file_init_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
+
 
     for (i = 0; i < plugins->count; i++) {
-        name = plugins->names[i];
-        RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_FSM_INIT);
-        if (hookFunc(path, mode) == RPMRC_FAIL)
-            rc = RPMRC_FAIL;
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(fsm_file_init);
+
+       if (hookFunc && hookFunc(path, mode) == RPMRC_FAIL)
+       {
+               rpmlog(RPMLOG_ERR, "Plugin %s: hook fsm_file_init failed\n", plugin->name);
+           rc = RPMRC_FAIL;
+
+       }
     }
 
     return rc;
@@ -354,16 +456,19 @@ rpmRC rpmpluginsCallFsmInit(rpmPlugins plugins, const char* path,
 rpmRC rpmpluginsCallFsmCommit(rpmPlugins plugins, const char* path,
                                 mode_t mode, int type)
 {
-    rpmRC (*hookFunc)(const char*, mode_t, int);
+    plugin_fsm_file_commit_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
 
     for (i = 0; i < plugins->count; i++) {
-        name = plugins->names[i];
-        RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_FSM_COMMIT);
-        if (hookFunc(path, mode, type) == RPMRC_FAIL)
-            rc = RPMRC_FAIL;
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(fsm_file_commit);
+
+       if (hookFunc && hookFunc(path, mode, type) == RPMRC_FAIL)
+       {
+               rpmlog(RPMLOG_ERR, "Plugin %s: hook fsm_file_commit failed\n", plugin->name);
+               rc = RPMRC_FAIL;
+       }
     }
 
     return rc;
@@ -372,17 +477,22 @@ rpmRC rpmpluginsCallFsmCommit(rpmPlugins plugins, const char* path,
 rpmRC rpmpluginsCallFileConflict(rpmPlugins plugins, rpmts ts, char* path,
                                Header oldHeader, rpmfi oldFi, int res)
 {
-    rpmRC (*hookFunc)(rpmts, char*, Header, rpmfi, int);
+    plugin_fsm_file_conflict_func hookFunc;
     int i;
     rpmRC rc = RPMRC_OK;
-    const char *name = NULL;
 
     for (i = 0; i < plugins->count; i++) {
-        name = plugins->names[i];
-        RPMPLUGINS_SET_HOOK_FUNC(PLUGINHOOK_FILE_CONFLICT);
-        if (hookFunc(ts, path, oldHeader, oldFi, res) == RPMRC_FAIL)
-            rc = RPMRC_FAIL;
+       rpmPlugin plugin = plugins->plugins[i];
+       RPMPLUGINS_SET_HOOK_FUNC(fsm_file_conflict);
+
+       if (hookFunc && hookFunc(ts, path, oldHeader, oldFi, res) == RPMRC_FAIL)
+    {
+               rpmlog(RPMLOG_ERR, "Plugin %s: hook fsm_file_conflict failed\n", plugin->name);
+               rc = RPMRC_FAIL;
+    }
     }
 
     return rc;
 }
+
+
index 8e35d81ab7b763650ac95f74588d44b83ee1b451..0ef6e3eb4af6ecd6a6129e06924f64f4ff303ff4 100644 (file)
@@ -2,79 +2,19 @@
 #define _PLUGINS_H
 
 #include <rpm/rpmtypes.h>
+#include <rpm/rpmfi.h>
+#include "lib/rpmplugin.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#define PLUGIN_HOOKS   plugin_hooks
-
-#define PLUGINHOOK_INIT_FUNC                   pluginhook_init
-#define PLUGINHOOK_CLEANUP_FUNC                        pluginhook_cleanup
-
-#define PLUGINHOOK_OPENTE_FUNC                 pluginhook_opente
-#define PLUGINHOOK_COLL_POST_ADD_FUNC          pluginhook_coll_post_add
-#define PLUGINHOOK_COLL_POST_ANY_FUNC          pluginhook_coll_post_any
-#define PLUGINHOOK_COLL_PRE_REMOVE_FUNC                pluginhook_coll_pre_remove
-
-#define PLUGINHOOK_TSM_PRE_FUNC        pluginhook_tsm_pre
-#define PLUGINHOOK_TSM_POST_FUNC        pluginhook_tsm_post
-
-#define PLUGINHOOK_PSM_PRE_FUNC        pluginhook_psm_pre
-#define PLUGINHOOK_PSM_POST_FUNC        pluginhook_psm_post
-#define PLUGINHOOK_VERIFY_FUNC    pluginhook_verify
-
-#define PLUGINHOOK_SCRIPTLET_PRE_FUNC    pluginhook_scriptlet_pre
-#define PLUGINHOOK_SCRIPTLET_FORK_POST_FUNC    pluginhook_scriptlet_fork_post
-#define PLUGINHOOK_SCRIPTLET_POST_FUNC    pluginhook_scriptlet_post
-
-#define PLUGINHOOK_FSM_INIT_FUNC        pluginhook_fsm_init
-#define PLUGINHOOK_FSM_COMMIT_FUNC        pluginhook_fsm_commit
-#define PLUGINHOOK_FILE_CONFLICT    pluginhook_file_conflict
-
-enum rpmPluginHook_e {
-    PLUGINHOOK_NONE            = 0,
-    PLUGINHOOK_INIT            = 1 << 0,
-    PLUGINHOOK_CLEANUP         = 1 << 1,
-    PLUGINHOOK_OPENTE          = 1 << 2,
-    PLUGINHOOK_COLL_POST_ADD   = 1 << 3,
-    PLUGINHOOK_COLL_POST_ANY   = 1 << 4,
-    PLUGINHOOK_COLL_PRE_REMOVE = 1 << 5,
-    PLUGINHOOK_TSM_PRE         = 1 << 6,
-    PLUGINHOOK_TSM_POST        = 1 << 7,
-    PLUGINHOOK_PSM_PRE         = 1 << 8,
-    PLUGINHOOK_PSM_POST        = 1 << 9,
-    PLUGINHOOK_SCRIPTLET_PRE    = 1 << 10,
-    PLUGINHOOK_SCRIPTLET_FORK_POST    = 1 << 11,
-    PLUGINHOOK_SCRIPTLET_POST    = 1 << 12,
-    PLUGINHOOK_VERIFY    = 1 << 13,
-    PLUGINHOOK_FSM_INIT    = 1 << 14,
-    PLUGINHOOK_FSM_COMMIT    = 1 << 15,
-    PLUGINHOOK_FILE_CONFLICT    = 1 << 16
-    
-};
-
-/* indicates if a directory is part of rpm package or created by rpm itself */
-typedef enum rpmPluginDirType_e {
-    DIR_TYPE_NONE    = 0,
-    DIR_TYPE_NORMAL    = 1 << 0, 
-    DIR_TYPE_UNOWNED    = 1 << 1
-} rpmPluginDirType;
-
-/* indicates the way the scriptlet is executed */
-typedef enum rpmScriptletExecutionFlow_e {
-    RPMSCRIPTLET_NONE    = 0,
-    RPMSCRIPTLET_FORK    = 1 << 0, 
-    RPMSCRIPTLET_EXEC    = 1 << 1
-} rpmScriptletExecutionFlow;
-
-typedef rpmFlags rpmPluginHook;
-
 /** \ingroup rpmplugins
  * Create a new plugins structure
  * @param ts           transaction set
  * @return             new plugin structure
  */
+RPM_GNUC_INTERNAL
 rpmPlugins rpmpluginsNew(rpmts ts);
 
 /** \ingroup rpmplugins
@@ -82,6 +22,7 @@ rpmPlugins rpmpluginsNew(rpmts ts);
  * @param plugins      plugins structure to destroy
  * @return             NULL always
  */
+RPM_GNUC_INTERNAL
 rpmPlugins rpmpluginsFree(rpmPlugins plugins);
 
 /** \ingroup rpmplugins
@@ -92,15 +33,17 @@ rpmPlugins rpmpluginsFree(rpmPlugins plugins);
  * @param opts         options to pass to the plugin
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsAdd(rpmPlugins plugins, const char *name, const char *path, const char *opts);
 
 /** \ingroup rpmplugins
  * Add and open a rpm plugin
- * @param plugins      plugins structure to add a collection plugin to
+ * @param plugins      plugins structure to add a plugin to
  * @param type     type of plugin
  * @param name         name of plugin
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsAddPlugin(rpmPlugins plugins, const char *type, const char *name);
 
 /** \ingroup rpmplugins
@@ -109,65 +52,16 @@ rpmRC rpmpluginsAddPlugin(rpmPlugins plugins, const char *type, const char *name
  * @param name         name of plugin to check
  * @return             1 if plugin name has already been added, 0 otherwise
  */
+RPM_GNUC_INTERNAL
 int rpmpluginsPluginAdded(rpmPlugins plugins, const char *name);
 
-
-/** \ingroup rpmplugins
- * Call the init plugin hook
- * @param plugins      plugins structure
- * @param name         name of plugin
- * @param opts         plugin options
- * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
- */
-rpmRC rpmpluginsCallInit(rpmPlugins plugins, const char *name, const char *opts);
-
-/** \ingroup rpmplugins
- * Call the cleanup plugin hook
- * @param plugins      plugins structure
- * @param name         name of plugin
- * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
- */
-rpmRC rpmpluginsCallCleanup(rpmPlugins plugins, const char *name);
-
-/** \ingroup rpmplugins
- * Call the open te plugin hook
- * @param plugins      plugins structure
- * @param name         name of plugin
- * @param te           transaction element opened
- * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
- */
-rpmRC rpmpluginsCallOpenTE(rpmPlugins plugins, const char *name, rpmte te);
-
-/** \ingroup rpmplugins
- * Call the collection post add plugin hook
- * @param plugins      plugins structure
- * @param name         name of plugin
- * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
- */
-rpmRC rpmpluginsCallCollectionPostAdd(rpmPlugins plugins, const char *name);
-
-/** \ingroup rpmplugins
- * Call the collection post any plugin hook
- * @param plugins      plugins structure
- * @param name         name of plugin
- * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
- */
-rpmRC rpmpluginsCallCollectionPostAny(rpmPlugins plugins, const char *name);
-
-/** \ingroup rpmplugins
- * Call the collection pre remove plugin hook
- * @param plugins      plugins structure
- * @param name         name of plugin
- * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
- */
-rpmRC rpmpluginsCallCollectionPreRemove(rpmPlugins plugins, const char *name);
-
 /** \ingroup rpmplugins
  * Call the pre transaction plugin hook
  * @param plugins      plugins structure
  * @param ts           processed transaction
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallTsmPre(rpmPlugins plugins, rpmts ts);
 
 /** \ingroup rpmplugins
@@ -177,6 +71,7 @@ rpmRC rpmpluginsCallTsmPre(rpmPlugins plugins, rpmts ts);
  * @param res          transaction result code
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallTsmPost(rpmPlugins plugins, rpmts ts, int res);
 
 /** \ingroup rpmplugins
@@ -185,6 +80,7 @@ rpmRC rpmpluginsCallTsmPost(rpmPlugins plugins, rpmts ts, int res);
  * @param te           processed transaction element
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallPsmPre(rpmPlugins plugins, rpmte te);
 
 /** \ingroup rpmplugins
@@ -194,6 +90,7 @@ rpmRC rpmpluginsCallPsmPre(rpmPlugins plugins, rpmte te);
  * @param res          transaction element result code
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallPsmPost(rpmPlugins plugins, rpmte te, int res);
 
 /** \ingroup rpmplugins
@@ -203,6 +100,7 @@ rpmRC rpmpluginsCallPsmPost(rpmPlugins plugins, rpmte te, int res);
  * @param type         indicates the scriptlet execution flow, see rpmScriptletExecutionFlow
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallScriptletPre(rpmPlugins plugins, const char *s_name, int type);
 
 /** \ingroup rpmplugins
@@ -212,6 +110,7 @@ rpmRC rpmpluginsCallScriptletPre(rpmPlugins plugins, const char *s_name, int typ
  * @param type         indicates the scriptlet execution flow, see rpmScriptletExecutionFlow
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallScriptletForkPost(rpmPlugins plugins, const char *path, int type);
 
 /** \ingroup rpmplugins
@@ -222,8 +121,51 @@ rpmRC rpmpluginsCallScriptletForkPost(rpmPlugins plugins, const char *path, int
  * @param res          scriptlet execution result code
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallScriptletPost(rpmPlugins plugins, const char *s_name, int type, int res);
 
+/** \ingroup rpmplugins
+ * Call the fsm file pre plugin hook
+ * @param plugins      plugins structure
+ * @param fi           file info iterator (or NULL)
+ * @param path         file object path
+ * @param file_mode    file object mode
+ * @param op           file operation + associated flags
+ * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
+ */
+RPM_GNUC_INTERNAL
+rpmRC rpmpluginsCallFsmFilePre(rpmPlugins plugins, rpmfi fi, const char* path,
+                                mode_t file_mode, rpmFsmOp op);
+
+/** \ingroup rpmplugins
+ * Call the fsm file post plugin hook
+ * @param plugins      plugins structure
+ * @param fi           file info iterator (or NULL)
+ * @param path         file object path
+ * @param file_mode    file object mode
+ * @param op           file operation + associated flags
+ * @param res          fsm result code
+ * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
+ */
+RPM_GNUC_INTERNAL
+rpmRC rpmpluginsCallFsmFilePost(rpmPlugins plugins, rpmfi fi, const char* path,
+                                mode_t file_mode, rpmFsmOp op, int res);
+
+/** \ingroup rpmplugins
+ * Call the fsm file prepare plugin hook. Called after setting
+ * permissions etc, but before committing file to destination path.
+ * @param plugins      plugins structure
+ * @param fi           file info iterator (or NULL)
+ * @param path         file object current path
+ * @param dest         file object destination path
+ * @param mode         file object mode
+ * @param op           file operation + associated flags
+ * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
+ */
+RPM_GNUC_INTERNAL
+rpmRC rpmpluginsCallFsmFilePrepare(rpmPlugins plugins, rpmfi fi,
+                                   const char *path, const char *dest,
+                                   mode_t mode, rpmFsmOp op);
 /** \ingroup rpmplugins
  * Call the verify hook
  * @param plugins      plugins structure
@@ -233,7 +175,8 @@ rpmRC rpmpluginsCallScriptletPost(rpmPlugins plugins, const char *s_name, int ty
  * @param res          scriptlet execution result code
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
-rpmRC rpmpluginsCallVerify(rpmPlugins plugins, rpmKeyring keyring, rpmtd sigtd, 
+RPM_GNUC_INTERNAL
+rpmRC rpmpluginsCallVerify(rpmPlugins plugins, rpmKeyring keyring, int sigTagId, 
                            pgpDigParams sig, DIGEST_CTX ctx, int res);
 
 /** \ingroup rpmplugins
@@ -243,8 +186,9 @@ rpmRC rpmpluginsCallVerify(rpmPlugins plugins, rpmKeyring keyring, rpmtd sigtd,
  * @param mode         file mode
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallFsmInit(rpmPlugins plugins, const char* path, mode_t mode);
-                           
+
 /** \ingroup rpmplugins
  * Call the fsm commit hook
  * @param plugins      plugins structure
@@ -253,6 +197,7 @@ rpmRC rpmpluginsCallFsmInit(rpmPlugins plugins, const char* path, mode_t mode);
  * @param type         file type
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallFsmCommit(rpmPlugins plugins, const char* path, mode_t mode, int type);
 
 /** \ingroup rpmplugins
@@ -265,8 +210,10 @@ rpmRC rpmpluginsCallFsmCommit(rpmPlugins plugins, const char* path, mode_t mode,
  * @param res           return code
  * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
  */
+RPM_GNUC_INTERNAL
 rpmRC rpmpluginsCallFileConflict(rpmPlugins plugins, rpmts ts, char* path, Header oldHeader, rpmfi oldFi, int res);
 
+
 #ifdef __cplusplus
 }
 #endif
index 2b89f15ef1bf7ad7860c2f1644ad02fd5fe98b4a..ac57885c67ea547be79a8df93e49a6980198f3ed 100644 (file)
@@ -43,7 +43,7 @@ typedef enum rpmProblemType_e {
     RPMPROB_BADRELOCATE,/*!< path ... is not relocatable for package ... */
     RPMPROB_REQUIRES,  /*!< package ... has unsatisfied Requires: ... */
     RPMPROB_CONFLICT,  /*!< package ... has unsatisfied Conflicts: ... */
-    RPMPROB_NEW_FILE_CONFLICT, /*!< file ... conflicts between attemped installs of ... */
+    RPMPROB_NEW_FILE_CONFLICT, /*!< file ... conflicts between attempted installs of ... */
     RPMPROB_FILE_CONFLICT,/*!< file ... from install of ... conflicts with file from package ... */
     RPMPROB_OLDPACKAGE,        /*!< package ... (which is newer than ...) is already installed */
     RPMPROB_DISKSPACE, /*!< installing package ... needs ... on the ... filesystem */
index 7638e81147cad6024232a208c5d8356b0114ae92..cada3f7881d27a7797b949a82dbacf5d4ee238cb 100644 (file)
@@ -1,6 +1,7 @@
 #include "system.h"
 
 #include <stdarg.h>
+#include <pthread.h>
 
 #if defined(__linux__)
 #include <elf.h>
@@ -11,7 +12,6 @@
 #if HAVE_SYS_UTSNAME_H
 #include <sys/utsname.h>
 #endif
-#include <netdb.h>
 #include <ctype.h>     /* XXX for /etc/rpm/platform contents */
 
 #if HAVE_SYS_SYSTEMCFG_H
 #define __power_pc() 0
 #endif
 
+#ifdef HAVE_SYS_AUXV_H
+#include <sys/auxv.h>
+#endif
+
 #include <rpm/rpmlib.h>                        /* RPM_MACTABLE*, Rc-prototypes */
 #include <rpm/rpmmacro.h>
 #include <rpm/rpmfileutil.h>
 #include <rpm/rpmstring.h>
 #include <rpm/rpmlog.h>
+#include <rpm/argv.h>
 
 #include "rpmio/rpmlua.h"
 #include "rpmio/rpmio_internal.h"      /* XXX for rpmioSlurp */
 #include "lib/misc.h"
 #include "lib/rpmliblua.h"
+#include "lib/rpmug.h"
 
 #include "debug.h"
 
 static const char * defrcfiles = NULL;
 const char * macrofiles = NULL;
 
-static const char * const platform = SYSCONFDIR "/rpm/platform";
-static char ** platpat = NULL;
-static int nplatpat = 0;
-
-typedef char * cptr_t;
-
 typedef struct machCacheEntry_s {
     char * name;
     int count;
-    cptr_t * equivs;
+    char ** equivs;
     int visited;
 } * machCacheEntry;
 
@@ -111,13 +111,6 @@ typedef struct tableType_s {
     int canonsLength;
 } * tableType;
 
-static struct tableType_s tables[RPM_MACHTABLE_COUNT] = {
-    { "arch", 1, 0 },
-    { "os", 1, 0 },
-    { "buildarch", 0, 1 },
-    { "buildos", 0, 1 }
-};
-
 /* XXX get rid of this stuff... */
 /* Stuff for maintaining "variables" like SOURCEDIR, BUILDDIR, etc */
 #define RPMVAR_OPTFLAGS                 3
@@ -142,23 +135,58 @@ static const size_t optionTableSize = sizeof(optionTable) / sizeof(*optionTable)
 #define OS     0
 #define ARCH   1
 
-static cptr_t current[2];
+typedef struct rpmrcCtx_s * rpmrcCtx;
+struct rpmrcCtx_s {
+    ARGV_t platpat;
+    char *current[2];
+    int currTables[2];
+    struct rpmvarValue values[RPMVAR_NUM];
+    struct tableType_s tables[RPM_MACHTABLE_COUNT];
+    int machDefaults;
+    int pathDefaults;
+    pthread_rwlock_t lock;
+};
 
-static int currTables[2] = { RPM_MACHTABLE_INSTOS, RPM_MACHTABLE_INSTARCH };
+/* prototypes */
+static rpmRC doReadRC(rpmrcCtx ctx, const char * urlfn);
 
-static struct rpmvarValue values[RPMVAR_NUM];
+static void rpmSetVarArch(rpmrcCtx ctx,
+                         int var, const char * val, const char * arch);
 
-static int defaultsInitialized = 0;
+static void rebuildCompatTables(rpmrcCtx ctx, int type, const char * name);
 
-/* prototypes */
-static rpmRC doReadRC(const char * urlfn);
+static void rpmRebuildTargetVars(rpmrcCtx ctx, const char **target, const char ** canontarget);
 
-static void rpmSetVarArch(int var, const char * val,
-               const char * arch);
+/* Force context (lock) acquisition through a function */
+static rpmrcCtx rpmrcCtxAcquire(int write)
+{
+    static struct rpmrcCtx_s _globalCtx = {
+       .lock = PTHREAD_RWLOCK_INITIALIZER,
+       .currTables = { RPM_MACHTABLE_INSTOS, RPM_MACHTABLE_INSTARCH },
+       .tables = {
+           { "arch", 1, 0 },
+           { "os", 1, 0 },
+           { "buildarch", 0, 1 },
+           { "buildos", 0, 1 }
+       },
+    };
+    rpmrcCtx ctx = &_globalCtx;
+
+    /* XXX: errors should be handled */
+    if (write)
+       pthread_rwlock_wrlock(&ctx->lock);
+    else
+       pthread_rwlock_rdlock(&ctx->lock);
 
-static void rebuildCompatTables(int type, const char * name);
+    return ctx;
+}
 
-static void rpmRebuildTargetVars(const char **target, const char ** canontarget);
+/* Release context (lock) */
+static rpmrcCtx rpmrcCtxRelease(rpmrcCtx ctx)
+{
+    pthread_rwlock_unlock(&ctx->lock);
+    return NULL;
+}
 
 static int optionCompare(const void * a, const void * b)
 {
@@ -452,7 +480,7 @@ static void setDefaults(void)
 }
 
 /* FIX: se usage inconsistent, W2DO? */
-static rpmRC doReadRC(const char * urlfn)
+static rpmRC doReadRC(rpmrcCtx ctx, const char * urlfn)
 {
     char *s;
     char *se, *next, *buf = NULL, *fn;
@@ -519,7 +547,7 @@ static rpmRC doReadRC(const char * urlfn)
                while (*se && !risspace(*se)) se++;
                if (*se != '\0') *se = '\0';
 
-               if (doReadRC(s)) {
+               if (doReadRC(ctx, s)) {
                    rpmlog(RPMLOG_ERR, _("cannot open %s at %s:%d: %m\n"),
                        s, fn, linenum);
                    goto exit;
@@ -551,48 +579,49 @@ static rpmRC doReadRC(const char * urlfn)
 
            /* Only add macros if appropriate for this arch */
            if (option->macroize &&
-             (arch == NULL || rstreq(arch, current[ARCH]))) {
+             (arch == NULL || rstreq(arch, ctx->current[ARCH]))) {
                char *n, *name;
                n = name = xmalloc(strlen(option->name)+2);
                if (option->localize)
                    *n++ = '_';
                strcpy(n, option->name);
-               addMacro(NULL, name, NULL, val, RMIL_RPMRC);
+               rpmPushMacro(NULL, name, NULL, val, RMIL_RPMRC);
                free(name);
            }
-           rpmSetVarArch(option->var, val, arch);
+           rpmSetVarArch(ctx, option->var, val, arch);
            fn = _free(fn);
 
-       } else {        /* For arch/os compatibilty tables ... */
+       } else {        /* For arch/os compatibility tables ... */
            int gotit;
            int i;
 
            gotit = 0;
 
            for (i = 0; i < RPM_MACHTABLE_COUNT; i++) {
-               if (rstreqn(tables[i].key, s, strlen(tables[i].key)))
+               if (rstreqn(ctx->tables[i].key, s, strlen(ctx->tables[i].key)))
                    break;
            }
 
            if (i < RPM_MACHTABLE_COUNT) {
-               const char *rest = s + strlen(tables[i].key);
+               const char *rest = s + strlen(ctx->tables[i].key);
                if (*rest == '_') rest++;
 
                if (rstreq(rest, "compat")) {
                    if (machCompatCacheAdd(se, fn, linenum,
-                                               &tables[i].cache))
+                                               &ctx->tables[i].cache))
                        goto exit;
                    gotit = 1;
-               } else if (tables[i].hasTranslate &&
+               } else if (ctx->tables[i].hasTranslate &&
                           rstreq(rest, "translate")) {
-                   if (addDefault(&tables[i].defaults,
-                                  &tables[i].defaultsLength,
+                   if (addDefault(&ctx->tables[i].defaults,
+                                  &ctx->tables[i].defaultsLength,
                                   se, fn, linenum))
                        goto exit;
                    gotit = 1;
-               } else if (tables[i].hasCanon &&
+               } else if (ctx->tables[i].hasCanon &&
                           rstreq(rest, "canon")) {
-                   if (addCanon(&tables[i].canons, &tables[i].canonsLength,
+                   if (addCanon(&ctx->tables[i].canons,
+                                &ctx->tables[i].canonsLength,
                                 se, fn, linenum))
                        goto exit;
                    gotit = 1;
@@ -618,7 +647,7 @@ exit:
 
 /**
  */
-static rpmRC rpmPlatform(const char * platform)
+static rpmRC rpmPlatform(rpmrcCtx ctx, const char * platform)
 {
     const char *cpu = NULL, *vendor = NULL, *os = NULL, *gnu = NULL;
     uint8_t * b = NULL;
@@ -651,10 +680,7 @@ static rpmRC rpmPlatform(const char * platform)
            while (--t > p && isspace(*t))
                *t = '\0';
            if (t > p) {
-               platpat = xrealloc(platpat, (nplatpat + 2) * sizeof(*platpat));
-               platpat[nplatpat] = xstrdup(p);
-               nplatpat++;
-               platpat[nplatpat] = NULL;
+               argvAdd(&ctx->platpat, p);
            }
            continue;
        }
@@ -690,14 +716,14 @@ static rpmRC rpmPlatform(const char * platform)
            if (*p != '\0') *p = '\0';
        }
 
-       addMacro(NULL, "_host_cpu", NULL, cpu, -1);
-       addMacro(NULL, "_host_vendor", NULL, vendor, -1);
-       addMacro(NULL, "_host_os", NULL, os, -1);
+       rpmPushMacro(NULL, "_host_cpu", NULL, cpu, -1);
+       rpmPushMacro(NULL, "_host_vendor", NULL, vendor, -1);
+       rpmPushMacro(NULL, "_host_os", NULL, os, -1);
 
-       platpat = xrealloc(platpat, (nplatpat + 2) * sizeof(*platpat));
-       platpat[nplatpat] = rpmExpand("%{_host_cpu}-%{_host_vendor}-%{_host_os}", (gnu && *gnu ? "-" : NULL), gnu, NULL);
-       nplatpat++;
-       platpat[nplatpat] = NULL;
+       char *plat = rpmExpand("%{_host_cpu}-%{_host_vendor}-%{_host_os}",
+                               (gnu && *gnu ? "-" : NULL), gnu, NULL);
+       argvAdd(&ctx->platpat, plat);
+       free(plat);
        
        init_platform++;
     }
@@ -789,8 +815,21 @@ static inline int RPMClass(void)
        
        cpu = (tfms>>8)&15;
        
+       if (cpu == 5
+           && cpuid_ecx(0) == '68xM'
+           && cpuid_edx(0) == 'Teni'
+           && (cpuid_edx(1) & ((1<<8)|(1<<15))) == ((1<<8)|(1<<15))) {
+               sigaction(SIGILL, &oldsa, NULL);
+               return 6;       /* has CX8 and CMOV */
+       }
+
        sigaction(SIGILL, &oldsa, NULL);
 
+#define USER686 ((1<<4) | (1<<8) | (1<<15))
+       /* Transmeta Crusoe CPUs say that their CPU family is "5" but they have enough features for i686. */
+       if (cpu == 5 && (cap & USER686) == USER686)
+               return 6;
+
        if (cpu < 6)
                return cpu;
                
@@ -912,13 +951,19 @@ static int is_geode(void)
 
 #if defined(__linux__)
 /**
- * Populate rpmat structure with parsed info from /proc/self/auxv
+ * Populate rpmat structure with auxv values
  */
-static void parse_auxv(void)
+static void read_auxv(void)
 {
     static int oneshot = 1;
 
     if (oneshot) {
+#ifdef HAVE_GETAUXVAL
+       rpmat.platform = (char *) getauxval(AT_PLATFORM);
+       if (!rpmat.platform)
+           rpmat.platform = "";
+       rpmat.hwcap = getauxval(AT_HWCAP);
+#else
        rpmat.platform = "";
        int fd = open("/proc/self/auxv", O_RDONLY);
 
@@ -943,6 +988,7 @@ static void parse_auxv(void)
            }
            close(fd);
        }
+#endif
        oneshot = 0; /* only try once even if it fails */
     }
     return;
@@ -951,22 +997,21 @@ static void parse_auxv(void)
 
 /**
  */
-static void defaultMachine(const char ** arch,
-               const char ** os)
+static void defaultMachine(rpmrcCtx ctx, const char ** arch, const char ** os)
 {
+    const char * const platform_path = SYSCONFDIR "/rpm/platform";
     static struct utsname un;
-    static int gotDefaults = 0;
     char * chptr;
     canonEntry canon;
     int rc;
 
 #if defined(__linux__)
     /* Populate rpmat struct with hw info */
-    parse_auxv();
+    read_auxv();
 #endif
 
-    while (!gotDefaults) {
-       if (!rpmPlatform(platform)) {
+    while (!ctx->machDefaults) {
+       if (!rpmPlatform(ctx, platform_path)) {
            char * s = rpmExpand("%{_host_cpu}", NULL);
            if (s) {
                rstrlcpy(un.machine, s, sizeof(un.machine));
@@ -977,7 +1022,7 @@ static void defaultMachine(const char ** arch,
                rstrlcpy(un.sysname, s, sizeof(un.sysname));
                free(s);
            }
-           gotDefaults = 1;
+           ctx->machDefaults = 1;
            break;
        }
        rc = uname(&un);
@@ -988,11 +1033,15 @@ static void defaultMachine(const char ** arch,
            strcpy(un.machine, __power_pc() ? "ppc" : "rs6000");
            sprintf(un.sysname,"aix%s.%s", un.version, un.release);
        }
-       else if(rstreq(un.sysname, "Darwin")) { 
-#ifdef __ppc__
+       else if (rstreq(un.sysname, "Darwin")) { 
+#if defined(__ppc__)
            strcpy(un.machine, "ppc");
-#else ifdef __i386__
+#elif defined(__i386__)
            strcpy(un.machine, "i386");
+#elif defined(__x86_64__)
+           strcpy(un.machine, "x86_64");
+#else
+           #warning "No architecture defined! Automatic detection may not work!"
 #endif 
        }
        else if (rstreq(un.sysname, "SunOS")) {
@@ -1020,12 +1069,54 @@ static void defaultMachine(const char ** arch,
 
 #      if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL)
            /* little endian */
-           strcpy(un.machine, "mipsel");
+#              if defined(__mips64)
+                   /* 64-bit */
+#                      if !defined(__mips_isa_rev) || __mips_isa_rev < 6
+                           /* r1-r5 */
+                           strcpy(un.machine, "mips64el");
+#                      else
+                           /* r6 */
+                           strcpy(un.machine, "mips64r6el");
+#                      endif
+#              else
+                   /* 32-bit */
+#                      if !defined(__mips_isa_rev) || __mips_isa_rev < 6
+                           /* r1-r5 */
+                           strcpy(un.machine, "mipsel");
+#                      else
+                           /* r6 */
+                           strcpy(un.machine, "mipsr6el");
+#                      endif
+#              endif
 #      elif defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB)
           /* big endian */
-               strcpy(un.machine, "mips");
+#              if defined(__mips64)
+                   /* 64-bit */
+#                      if !defined(__mips_isa_rev) || __mips_isa_rev < 6
+                           /* r1-r5 */
+                           strcpy(un.machine, "mips64");
+#                      else
+                           /* r6 */
+                           strcpy(un.machine, "mips64r6");
+#                      endif
+#              else
+                   /* 32-bit */
+#                      if !defined(__mips_isa_rev) || __mips_isa_rev < 6
+                           /* r1-r5 */
+                           strcpy(un.machine, "mips");
+#                      else
+                           /* r6 */
+                           strcpy(un.machine, "mipsr6");
+#                      endif
+#              endif
 #      endif
 
+#if defined(__linux__)
+       /* in linux, lets rename parisc to hppa */
+       if (rstreq(un.machine, "parisc"))
+           strcpy(un.machine, "hppa");
+#endif
+
 #      if defined(__hpux) && defined(_SC_CPU_VERSION)
        {
 #          if !defined(CPU_PA_RISC1_2)
@@ -1069,6 +1160,9 @@ static void defaultMachine(const char ** arch,
 #      endif   /* hpux */
 
 #      if defined(__linux__) && defined(__sparc__)
+#      if !defined(HWCAP_SPARC_BLKINIT)
+#          define HWCAP_SPARC_BLKINIT  0x00000040
+#      endif
        if (rstreq(un.machine, "sparc")) {
            #define PERS_LINUX          0x00000000
            #define PERS_LINUX_32BIT    0x00800000
@@ -1088,10 +1182,20 @@ static void defaultMachine(const char ** arch,
                }
                personality(oldpers);
            }
+
+           /* This is how glibc detects Niagara so... */
+           if (rpmat.hwcap & HWCAP_SPARC_BLKINIT) {
+               if (rstreq(un.machine, "sparcv9") || rstreq(un.machine, "sparc")) {
+                   strcpy(un.machine, "sparcv9v");
+               } else if (rstreq(un.machine, "sparc64")) {
+                   strcpy(un.machine, "sparc64v");
+               }
+           }
        }
 #      endif   /* sparc*-linux */
 
 #      if defined(__linux__) && defined(__powerpc__)
+#      if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
        {
             int powerlvl;
             if (!rstreq(un.machine, "ppc") &&
@@ -1100,8 +1204,43 @@ static void defaultMachine(const char ** arch,
                 strcpy(un.machine, "ppc64p7");
            }
         }
+#      endif   /* __ORDER_BIG_ENDIAN__ */
 #      endif   /* ppc64*-linux */
 
+#      if defined(__linux__) && defined(__arm__) && defined(__ARM_PCS_VFP)
+#      if !defined(HWCAP_ARM_VFP)
+#          define HWCAP_ARM_VFP        (1 << 6)
+#      endif
+#      if !defined(HWCAP_ARM_NEON)
+#          define HWCAP_ARM_NEON       (1 << 12)
+#      endif
+#      if !defined(HWCAP_ARM_VFPv3)
+#          define HWCAP_ARM_VFPv3      (1 << 13)
+#      endif
+       if (rstreq(un.machine, "armv7l")) {
+           if (rpmat.hwcap & HWCAP_ARM_VFPv3) {
+               if (rpmat.hwcap & HWCAP_ARM_NEON)
+                   strcpy(un.machine, "armv7hnl");
+               else
+                   strcpy(un.machine, "armv7hl");
+           }
+       } else if (rstreq(un.machine, "armv6l")) {
+           if (rpmat.hwcap & HWCAP_ARM_VFP)
+               strcpy(un.machine, "armv6hl");
+       }
+#      endif   /* arm*-linux */
+
+#      if defined(__linux__) && defined(__riscv__)
+       if (rstreq(un.machine, "riscv")) {
+               if (sizeof(long) == 4)
+                       strcpy(un.machine, "riscv32");
+               else if (sizeof(long) == 8)
+                       strcpy(un.machine, "riscv64");
+               else if (sizeof(long) == 16)
+                       strcpy(un.machine, "riscv128");
+       }
+#      endif   /* riscv */
+
 #      if defined(__GNUC__) && defined(__alpha__)
        {
            unsigned long amask, implver;
@@ -1147,17 +1286,17 @@ static void defaultMachine(const char ** arch,
 
        /* the uname() result goes through the arch_canon table */
        canon = lookupInCanonTable(un.machine,
-                                  tables[RPM_MACHTABLE_INSTARCH].canons,
-                                  tables[RPM_MACHTABLE_INSTARCH].canonsLength);
+                          ctx->tables[RPM_MACHTABLE_INSTARCH].canons,
+                          ctx->tables[RPM_MACHTABLE_INSTARCH].canonsLength);
        if (canon)
            rstrlcpy(un.machine, canon->short_name, sizeof(un.machine));
 
        canon = lookupInCanonTable(un.sysname,
-                                  tables[RPM_MACHTABLE_INSTOS].canons,
-                                  tables[RPM_MACHTABLE_INSTOS].canonsLength);
+                          ctx->tables[RPM_MACHTABLE_INSTOS].canons,
+                          ctx->tables[RPM_MACHTABLE_INSTOS].canonsLength);
        if (canon)
            rstrlcpy(un.sysname, canon->short_name, sizeof(un.sysname));
-       gotDefaults = 1;
+       ctx->machDefaults = 1;
        break;
     }
 
@@ -1166,34 +1305,30 @@ static void defaultMachine(const char ** arch,
 }
 
 static
-const char * rpmGetVarArch(int var, const char * arch)
+const char * rpmGetVarArch(rpmrcCtx ctx, int var, const char * arch)
 {
     const struct rpmvarValue * next;
 
-    if (arch == NULL) arch = current[ARCH];
+    if (arch == NULL) arch = ctx->current[ARCH];
 
     if (arch) {
-       next = &values[var];
+       next = &ctx->values[var];
        while (next) {
            if (next->arch && rstreq(next->arch, arch)) return next->value;
            next = next->next;
        }
     }
 
-    next = values + var;
+    next = ctx->values + var;
     while (next && next->arch) next = next->next;
 
     return next ? next->value : NULL;
 }
 
-static const char *rpmGetVar(int var)
-{
-    return rpmGetVarArch(var, NULL);
-}
-
-static void rpmSetVarArch(int var, const char * val, const char * arch)
+static void rpmSetVarArch(rpmrcCtx ctx,
+                         int var, const char * val, const char * arch)
 {
-    struct rpmvarValue * next = values + var;
+    struct rpmvarValue * next = ctx->values + var;
 
     if (next->value) {
        if (arch) {
@@ -1225,39 +1360,23 @@ static void rpmSetVarArch(int var, const char * val, const char * arch)
     next->arch = (arch ? xstrdup(arch) : NULL);
 }
 
-static void rpmSetTables(int archTable, int osTable)
+static void rpmSetTables(rpmrcCtx ctx, int archTable, int osTable)
 {
     const char * arch, * os;
 
-    defaultMachine(&arch, &os);
+    defaultMachine(ctx, &arch, &os);
 
-    if (currTables[ARCH] != archTable) {
-       currTables[ARCH] = archTable;
-       rebuildCompatTables(ARCH, arch);
+    if (ctx->currTables[ARCH] != archTable) {
+       ctx->currTables[ARCH] = archTable;
+       rebuildCompatTables(ctx, ARCH, arch);
     }
 
-    if (currTables[OS] != osTable) {
-       currTables[OS] = osTable;
-       rebuildCompatTables(OS, os);
+    if (ctx->currTables[OS] != osTable) {
+       ctx->currTables[OS] = osTable;
+       rebuildCompatTables(ctx, OS, os);
     }
 }
 
-int rpmMachineScore(int type, const char * name)
-{
-    machEquivInfo info = NULL;
-    if (name)
-       info = machEquivSearch(&tables[type].equiv, name);
-    return info ? info->score : 0;
-}
-
-int rpmIsKnownArch(const char *name)
-{
-    canonEntry canon = lookupInCanonTable(name,
-                       tables[RPM_MACHTABLE_INSTARCH].canons,
-                       tables[RPM_MACHTABLE_INSTARCH].canonsLength);
-    return (canon != NULL || rstreq(name, "noarch"));
-}
-
 /** \ingroup rpmrc
  * Set current arch/os names.
  * NULL as argument is set to the default value (munged uname())
@@ -1265,43 +1384,44 @@ int rpmIsKnownArch(const char *name)
  * @deprecated Use addMacro to set _target_* macros.
  * @todo Eliminate 
  *
+ * @param ctx          rpmrc context
  * @param arch          arch name (or NULL)
  * @param os            os name (or NULL)
  *          */
 
-static void rpmSetMachine(const char * arch, const char * os)
+static void rpmSetMachine(rpmrcCtx ctx, const char * arch, const char * os)
 {
     const char * host_cpu, * host_os;
 
-    defaultMachine(&host_cpu, &host_os);
+    defaultMachine(ctx, &host_cpu, &host_os);
 
     if (arch == NULL) {
        arch = host_cpu;
-       if (tables[currTables[ARCH]].hasTranslate)
+       if (ctx->tables[ctx->currTables[ARCH]].hasTranslate)
            arch = lookupInDefaultTable(arch,
-                           tables[currTables[ARCH]].defaults,
-                           tables[currTables[ARCH]].defaultsLength);
+                           ctx->tables[ctx->currTables[ARCH]].defaults,
+                           ctx->tables[ctx->currTables[ARCH]].defaultsLength);
     }
     if (arch == NULL) return;  /* XXX can't happen */
 
     if (os == NULL) {
        os = host_os;
-       if (tables[currTables[OS]].hasTranslate)
+       if (ctx->tables[ctx->currTables[OS]].hasTranslate)
            os = lookupInDefaultTable(os,
-                           tables[currTables[OS]].defaults,
-                           tables[currTables[OS]].defaultsLength);
+                           ctx->tables[ctx->currTables[OS]].defaults,
+                           ctx->tables[ctx->currTables[OS]].defaultsLength);
     }
     if (os == NULL) return;    /* XXX can't happen */
 
-    if (!current[ARCH] || !rstreq(arch, current[ARCH])) {
-       current[ARCH] = _free(current[ARCH]);
-       current[ARCH] = xstrdup(arch);
-       rebuildCompatTables(ARCH, host_cpu);
+    if (!ctx->current[ARCH] || !rstreq(arch, ctx->current[ARCH])) {
+       ctx->current[ARCH] = _free(ctx->current[ARCH]);
+       ctx->current[ARCH] = xstrdup(arch);
+       rebuildCompatTables(ctx, ARCH, host_cpu);
     }
 
-    if (!current[OS] || !rstreq(os, current[OS])) {
+    if (!ctx->current[OS] || !rstreq(os, ctx->current[OS])) {
        char * t = xstrdup(os);
-       current[OS] = _free(current[OS]);
+       ctx->current[OS] = _free(ctx->current[OS]);
        /*
         * XXX Capitalizing the 'L' is needed to insure that old
         * XXX os-from-uname (e.g. "Linux") is compatible with the new
@@ -1312,79 +1432,49 @@ static void rpmSetMachine(const char * arch, const char * os)
         */
        if (rstreq(t, "linux"))
            *t = 'L';
-       current[OS] = t;
+       ctx->current[OS] = t;
        
-       rebuildCompatTables(OS, host_os);
+       rebuildCompatTables(ctx, OS, host_os);
     }
 }
 
-static void rebuildCompatTables(int type, const char * name)
+static void rebuildCompatTables(rpmrcCtx ctx, int type, const char * name)
 {
-    machFindEquivs(&tables[currTables[type]].cache,
-                  &tables[currTables[type]].equiv,
+    machFindEquivs(&ctx->tables[ctx->currTables[type]].cache,
+                  &ctx->tables[ctx->currTables[type]].equiv,
                   name);
 }
 
-static void getMachineInfo(int type, const char ** name,
-                       int * num)
+static void getMachineInfo(rpmrcCtx ctx,
+                          int type, const char ** name, int * num)
 {
     canonEntry canon;
-    int which = currTables[type];
+    int which = ctx->currTables[type];
 
     /* use the normal canon tables, even if we're looking up build stuff */
     if (which >= 2) which -= 2;
 
-    canon = lookupInCanonTable(current[type],
-                              tables[which].canons,
-                              tables[which].canonsLength);
+    canon = lookupInCanonTable(ctx->current[type],
+                              ctx->tables[which].canons,
+                              ctx->tables[which].canonsLength);
 
     if (canon) {
        if (num) *num = canon->num;
        if (name) *name = canon->short_name;
     } else {
        if (num) *num = 255;
-       if (name) *name = current[type];
+       if (name) *name = ctx->current[type];
 
-       if (tables[currTables[type]].hasCanon) {
-           rpmlog(RPMLOG_WARNING, _("Unknown system: %s\n"), current[type]);
+       if (ctx->tables[ctx->currTables[type]].hasCanon) {
+           rpmlog(RPMLOG_WARNING, _("Unknown system: %s\n"),
+                  ctx->current[type]);
            rpmlog(RPMLOG_WARNING, _("Please contact %s\n"), PACKAGE_BUGREPORT);
        }
     }
 }
 
-void rpmGetArchInfo(const char ** name, int * num)
-{
-    getMachineInfo(ARCH, name, num);
-}
-
-int rpmGetArchColor(const char *arch)
-{
-    const char *color;
-    char *e;
-    int color_i;
-
-    arch = lookupInDefaultTable(arch,
-                               tables[currTables[ARCH]].defaults,
-                               tables[currTables[ARCH]].defaultsLength);
-    color = rpmGetVarArch(RPMVAR_ARCHCOLOR, arch);
-    if (color == NULL) {
-       return -1;
-    }
-
-    color_i = strtol(color, &e, 10);
-    if (!(e && *e == '\0')) {
-       return -1;
-    }
-
-    return color_i;
-}
-
-void rpmGetOsInfo(const char ** name, int * num)
-{
-    getMachineInfo(OS, name, num);
-}
-
-static void rpmRebuildTargetVars(const char ** target, const char ** canontarget)
+static void rpmRebuildTargetVars(rpmrcCtx ctx,
+                       const char ** target, const char ** canontarget)
 {
 
     char *ca = NULL, *co = NULL, *ct = NULL;
@@ -1392,9 +1482,9 @@ static void rpmRebuildTargetVars(const char ** target, const char ** canontarget
 
     /* Rebuild the compat table to recalculate the current target arch.  */
 
-    rpmSetMachine(NULL, NULL);
-    rpmSetTables(RPM_MACHTABLE_INSTARCH, RPM_MACHTABLE_INSTOS);
-    rpmSetTables(RPM_MACHTABLE_BUILDARCH, RPM_MACHTABLE_BUILDOS);
+    rpmSetMachine(ctx, NULL, NULL);
+    rpmSetTables(ctx, RPM_MACHTABLE_INSTARCH, RPM_MACHTABLE_INSTOS);
+    rpmSetTables(ctx, RPM_MACHTABLE_BUILDARCH, RPM_MACHTABLE_BUILDOS);
 
     if (target && *target) {
        char *c;
@@ -1419,16 +1509,16 @@ static void rpmRebuildTargetVars(const char ** target, const char ** canontarget
        const char *a = NULL;
        const char *o = NULL;
        /* Set build target from rpm arch and os */
-       rpmGetArchInfo(&a, NULL);
+       getMachineInfo(ctx, ARCH, &a, NULL);
        ca = (a) ? xstrdup(a) : NULL;
-       rpmGetOsInfo(&o, NULL);
+       getMachineInfo(ctx, OS, &o, NULL);
        co = (o) ? xstrdup(o) : NULL;
     }
 
     /* If still not set, Set target arch/os from default uname(2) values */
     if (ca == NULL) {
        const char *a = NULL;
-       defaultMachine(&a, NULL);
+       defaultMachine(ctx, &a, NULL);
        ca = xstrdup(a ? a : "(arch)");
     }
     for (x = 0; ca[x] != '\0'; x++)
@@ -1436,7 +1526,7 @@ static void rpmRebuildTargetVars(const char ** target, const char ** canontarget
 
     if (co == NULL) {
        const char *o = NULL;
-       defaultMachine(NULL, &o);
+       defaultMachine(ctx, NULL, &o);
        co = xstrdup(o ? o : "(os)");
     }
     for (x = 0; co[x] != '\0'; x++)
@@ -1451,19 +1541,19 @@ static void rpmRebuildTargetVars(const char ** target, const char ** canontarget
  * XXX All this macro pokery/jiggery could be achieved by doing a delayed
  *     rpmInitMacros(NULL, PER-PLATFORM-MACRO-FILE-NAMES);
  */
-    delMacro(NULL, "_target");
-    addMacro(NULL, "_target", NULL, ct, RMIL_RPMRC);
-    delMacro(NULL, "_target_cpu");
-    addMacro(NULL, "_target_cpu", NULL, ca, RMIL_RPMRC);
-    delMacro(NULL, "_target_os");
-    addMacro(NULL, "_target_os", NULL, co, RMIL_RPMRC);
+    rpmPopMacro(NULL, "_target");
+    rpmPushMacro(NULL, "_target", NULL, ct, RMIL_RPMRC);
+    rpmPopMacro(NULL, "_target_cpu");
+    rpmPushMacro(NULL, "_target_cpu", NULL, ca, RMIL_RPMRC);
+    rpmPopMacro(NULL, "_target_os");
+    rpmPushMacro(NULL, "_target_os", NULL, co, RMIL_RPMRC);
 /*
  * XXX Make sure that per-arch optflags is initialized correctly.
  */
-  { const char *optflags = rpmGetVarArch(RPMVAR_OPTFLAGS, ca);
+  { const char *optflags = rpmGetVarArch(ctx, RPMVAR_OPTFLAGS, ca);
     if (optflags != NULL) {
-       delMacro(NULL, "optflags");
-       addMacro(NULL, "optflags", NULL, optflags, RMIL_RPMRC);
+       rpmPopMacro(NULL, "optflags");
+       rpmPushMacro(NULL, "optflags", NULL, optflags, RMIL_RPMRC);
     }
   }
 
@@ -1475,97 +1565,20 @@ static void rpmRebuildTargetVars(const char ** target, const char ** canontarget
     free(co);
 }
 
-void rpmFreeRpmrc(void)
-{
-    int i, j, k;
-
-    if (platpat)
-    for (i = 0; i < nplatpat; i++)
-       platpat[i] = _free(platpat[i]);
-    platpat = _free(platpat);
-    nplatpat = 0;
-
-    for (i = 0; i < RPM_MACHTABLE_COUNT; i++) {
-       tableType t;
-       t = tables + i;
-       if (t->equiv.list) {
-           for (j = 0; j < t->equiv.count; j++)
-               t->equiv.list[j].name = _free(t->equiv.list[j].name);
-           t->equiv.list = _free(t->equiv.list);
-           t->equiv.count = 0;
-       }
-       if (t->cache.cache) {
-           for (j = 0; j < t->cache.size; j++) {
-               machCacheEntry e;
-               e = t->cache.cache + j;
-               if (e == NULL)
-                   continue;
-               e->name = _free(e->name);
-               if (e->equivs) {
-                   for (k = 0; k < e->count; k++)
-                       e->equivs[k] = _free(e->equivs[k]);
-                   e->equivs = _free(e->equivs);
-               }
-           }
-           t->cache.cache = _free(t->cache.cache);
-           t->cache.size = 0;
-       }
-       if (t->defaults) {
-           for (j = 0; j < t->defaultsLength; j++) {
-               t->defaults[j].name = _free(t->defaults[j].name);
-               t->defaults[j].defName = _free(t->defaults[j].defName);
-           }
-           t->defaults = _free(t->defaults);
-           t->defaultsLength = 0;
-       }
-       if (t->canons) {
-           for (j = 0; j < t->canonsLength; j++) {
-               t->canons[j].name = _free(t->canons[j].name);
-               t->canons[j].short_name = _free(t->canons[j].short_name);
-           }
-           t->canons = _free(t->canons);
-           t->canonsLength = 0;
-       }
-    }
-
-    for (i = 0; i < RPMVAR_NUM; i++) {
-       struct rpmvarValue * vp;
-       while ((vp = values[i].next) != NULL) {
-           values[i].next = vp->next;
-           vp->value = _free(vp->value);
-           vp->arch = _free(vp->arch);
-           vp = _free(vp);
-       }
-       values[i].value = _free(values[i].value);
-       values[i].arch = _free(values[i].arch);
-    }
-    current[OS] = _free(current[OS]);
-    current[ARCH] = _free(current[ARCH]);
-    defaultsInitialized = 0;
-/* FIX: platpat/current may be NULL */
-
-    /* XXX doesn't really belong here but... */
-    rpmFreeCrypto();
-#ifdef WITH_LUA
-    rpmLuaFree();
-#endif
-
-    return;
-}
-
 /** \ingroup rpmrc
  * Read rpmrc (and macro) configuration file(s).
+ * @param ctx          rpmrc context
  * @param rcfiles      colon separated files to read (NULL uses default)
  * @return             RPMRC_OK on success
  */
-static rpmRC rpmReadRC(const char * rcfiles)
+static rpmRC rpmReadRC(rpmrcCtx ctx, const char * rcfiles)
 {
     ARGV_t p, globs = NULL, files = NULL;
     rpmRC rc = RPMRC_FAIL;
 
-    if (!defaultsInitialized) {
+    if (!ctx->pathDefaults) {
        setDefaults();
-       defaultsInitialized = 1;
+       ctx->pathDefaults = 1;
     }
 
     if (rcfiles == NULL)
@@ -1592,29 +1605,47 @@ static rpmRC rpmReadRC(const char * rcfiles)
            goto exit;
            break;
        } else {
-           rc = doReadRC(*p);
+           rc = doReadRC(ctx, *p);
        }
     }
     rc = RPMRC_OK;
-    rpmSetMachine(NULL, NULL); /* XXX WTFO? Why bother? */
+    rpmSetMachine(ctx, NULL, NULL);    /* XXX WTFO? Why bother? */
 
 exit:
     argvFree(files);
     return rc;
 }
 
+static void register_atexit(void)
+{
+    if (atexit(rpmAtExit) != 0)
+       rpmlog(RPMLOG_WARNING, _("failed to register exit handler"));
+}
+
+/* External interfaces */
+
 int rpmReadConfigFiles(const char * file, const char * target)
 {
+    static pthread_once_t atexit_registered = PTHREAD_ONCE_INIT;
+    int rc = -1; /* assume failure */
+    rpmrcCtx ctx = rpmrcCtxAcquire(1);
+
+    pthread_once(&atexit_registered, register_atexit);
+
     /* Force preloading of dlopen()'ed libraries in case we go chrooting */
-    (void) gethostbyname("localhost");
-    (void) rpmInitCrypto();
+    if (rpmugInit())
+       goto exit;
+
+    if (rpmInitCrypto())
+       goto exit;
 
     /* Preset target macros */
        /* FIX: target can be NULL */
-    rpmRebuildTargetVars(&target, NULL);
+    rpmRebuildTargetVars(ctx, &target, NULL);
 
     /* Read the files */
-    if (rpmReadRC(file)) return -1;
+    if (rpmReadRC(ctx, file))
+       goto exit;
 
     if (macrofiles != NULL) {
        char *mf = rpmGetPath(macrofiles, NULL);
@@ -1623,12 +1654,12 @@ int rpmReadConfigFiles(const char * file, const char * target)
     }
 
     /* Reset target macros */
-    rpmRebuildTargetVars(&target, NULL);
+    rpmRebuildTargetVars(ctx, &target, NULL);
 
     /* Finally set target platform */
     {  char *cpu = rpmExpand("%{_target_cpu}", NULL);
        char *os = rpmExpand("%{_target_os}", NULL);
-       rpmSetMachine(cpu, os);
+       rpmSetMachine(ctx, cpu, os);
        free(cpu);
        free(os);
     }
@@ -1637,12 +1668,93 @@ int rpmReadConfigFiles(const char * file, const char * target)
     /* Force Lua state initialization */
     rpmLuaInit();
 #endif
+    rc = 0;
 
-    return 0;
+exit:
+    rpmrcCtxRelease(ctx);
+    return rc;
+}
+
+void rpmFreeRpmrc(void)
+{
+    rpmrcCtx ctx = rpmrcCtxAcquire(1);
+    int i, j, k;
+
+    ctx->platpat = argvFree(ctx->platpat);
+
+    for (i = 0; i < RPM_MACHTABLE_COUNT; i++) {
+       tableType t;
+       t = ctx->tables + i;
+       if (t->equiv.list) {
+           for (j = 0; j < t->equiv.count; j++)
+               t->equiv.list[j].name = _free(t->equiv.list[j].name);
+           t->equiv.list = _free(t->equiv.list);
+           t->equiv.count = 0;
+       }
+       if (t->cache.cache) {
+           for (j = 0; j < t->cache.size; j++) {
+               machCacheEntry e;
+               e = t->cache.cache + j;
+               if (e == NULL)
+                   continue;
+               e->name = _free(e->name);
+               if (e->equivs) {
+                   for (k = 0; k < e->count; k++)
+                       e->equivs[k] = _free(e->equivs[k]);
+                   e->equivs = _free(e->equivs);
+               }
+           }
+           t->cache.cache = _free(t->cache.cache);
+           t->cache.size = 0;
+       }
+       if (t->defaults) {
+           for (j = 0; j < t->defaultsLength; j++) {
+               t->defaults[j].name = _free(t->defaults[j].name);
+               t->defaults[j].defName = _free(t->defaults[j].defName);
+           }
+           t->defaults = _free(t->defaults);
+           t->defaultsLength = 0;
+       }
+       if (t->canons) {
+           for (j = 0; j < t->canonsLength; j++) {
+               t->canons[j].name = _free(t->canons[j].name);
+               t->canons[j].short_name = _free(t->canons[j].short_name);
+           }
+           t->canons = _free(t->canons);
+           t->canonsLength = 0;
+       }
+    }
+
+    for (i = 0; i < RPMVAR_NUM; i++) {
+       struct rpmvarValue * vp;
+       while ((vp = ctx->values[i].next) != NULL) {
+           ctx->values[i].next = vp->next;
+           vp->value = _free(vp->value);
+           vp->arch = _free(vp->arch);
+           vp = _free(vp);
+       }
+       ctx->values[i].value = _free(ctx->values[i].value);
+       ctx->values[i].arch = _free(ctx->values[i].arch);
+    }
+    ctx->current[OS] = _free(ctx->current[OS]);
+    ctx->current[ARCH] = _free(ctx->current[ARCH]);
+    ctx->machDefaults = 0;
+    ctx->pathDefaults = 0;
+
+    /* XXX doesn't really belong here but... */
+    rpmFreeCrypto();
+#ifdef WITH_LUA
+    rpmLuaFree();
+#endif
+
+    rpmrcCtxRelease(ctx);
+    return;
 }
 
 int rpmShowRC(FILE * fp)
 {
+    /* Write-context necessary as this calls rpmSetTables(), ugh */
+    rpmrcCtx ctx = rpmrcCtxAcquire(1);
     const struct rpmOption *opt;
     rpmds ds = NULL;
     int i;
@@ -1650,43 +1762,43 @@ int rpmShowRC(FILE * fp)
 
     /* the caller may set the build arch which should be printed here */
     fprintf(fp, "ARCHITECTURE AND OS:\n");
-    fprintf(fp, "build arch            : %s\n", current[ARCH]);
+    fprintf(fp, "build arch            : %s\n", ctx->current[ARCH]);
 
     fprintf(fp, "compatible build archs:");
-    equivTable = &tables[RPM_MACHTABLE_BUILDARCH].equiv;
+    equivTable = &ctx->tables[RPM_MACHTABLE_BUILDARCH].equiv;
     for (i = 0; i < equivTable->count; i++)
        fprintf(fp," %s", equivTable->list[i].name);
     fprintf(fp, "\n");
 
-    fprintf(fp, "build os              : %s\n", current[OS]);
+    fprintf(fp, "build os              : %s\n", ctx->current[OS]);
 
     fprintf(fp, "compatible build os's :");
-    equivTable = &tables[RPM_MACHTABLE_BUILDOS].equiv;
+    equivTable = &ctx->tables[RPM_MACHTABLE_BUILDOS].equiv;
     for (i = 0; i < equivTable->count; i++)
        fprintf(fp," %s", equivTable->list[i].name);
     fprintf(fp, "\n");
 
-    rpmSetTables(RPM_MACHTABLE_INSTARCH, RPM_MACHTABLE_INSTOS);
-    rpmSetMachine(NULL, NULL); /* XXX WTFO? Why bother? */
+    rpmSetTables(ctx, RPM_MACHTABLE_INSTARCH, RPM_MACHTABLE_INSTOS);
+    rpmSetMachine(ctx, NULL, NULL);    /* XXX WTFO? Why bother? */
 
-    fprintf(fp, "install arch          : %s\n", current[ARCH]);
-    fprintf(fp, "install os            : %s\n", current[OS]);
+    fprintf(fp, "install arch          : %s\n", ctx->current[ARCH]);
+    fprintf(fp, "install os            : %s\n", ctx->current[OS]);
 
     fprintf(fp, "compatible archs      :");
-    equivTable = &tables[RPM_MACHTABLE_INSTARCH].equiv;
+    equivTable = &ctx->tables[RPM_MACHTABLE_INSTARCH].equiv;
     for (i = 0; i < equivTable->count; i++)
        fprintf(fp," %s", equivTable->list[i].name);
     fprintf(fp, "\n");
 
     fprintf(fp, "compatible os's       :");
-    equivTable = &tables[RPM_MACHTABLE_INSTOS].equiv;
+    equivTable = &ctx->tables[RPM_MACHTABLE_INSTOS].equiv;
     for (i = 0; i < equivTable->count; i++)
        fprintf(fp," %s", equivTable->list[i].name);
     fprintf(fp, "\n");
 
     fprintf(fp, "\nRPMRC VALUES:\n");
     for (i = 0, opt = optionTable; i < optionTableSize; i++, opt++) {
-       const char *s = rpmGetVar(opt->var);
+       const char *s = rpmGetVarArch(ctx, opt->var, NULL);
        if (s != NULL || rpmIsVerbose())
            fprintf(fp, "%-21s : %s\n", opt->name, s ? s : "(not set)");
     }
@@ -1703,7 +1815,74 @@ int rpmShowRC(FILE * fp)
     ds = rpmdsFree(ds);
     fprintf(fp, "\n");
 
+    fprintf(fp, "Macro path: %s\n", macrofiles);
+    fprintf(fp, "\n");
+
     rpmDumpMacroTable(NULL, fp);
 
+    /* XXX: Move this earlier eventually... */
+    rpmrcCtxRelease(ctx);
+
     return 0;
 }
+
+int rpmMachineScore(int type, const char * name)
+{
+    int score = 0;
+    if (name) {
+       rpmrcCtx ctx = rpmrcCtxAcquire(0);
+       machEquivInfo info = machEquivSearch(&ctx->tables[type].equiv, name);
+       if (info)
+           score = info->score;
+       rpmrcCtxRelease(ctx);
+    }
+    return score;
+}
+
+int rpmIsKnownArch(const char *name)
+{
+    rpmrcCtx ctx = rpmrcCtxAcquire(0);
+    canonEntry canon = lookupInCanonTable(name,
+                           ctx->tables[RPM_MACHTABLE_INSTARCH].canons,
+                           ctx->tables[RPM_MACHTABLE_INSTARCH].canonsLength);
+    int known = (canon != NULL || rstreq(name, "noarch"));
+    rpmrcCtxRelease(ctx);
+    return known;
+}
+
+void rpmGetArchInfo(const char ** name, int * num)
+{
+    rpmrcCtx ctx = rpmrcCtxAcquire(0);
+    getMachineInfo(ctx, ARCH, name, num);
+    rpmrcCtxRelease(ctx);
+}
+
+int rpmGetArchColor(const char *arch)
+{
+    rpmrcCtx ctx = rpmrcCtxAcquire(0);
+    const char *color;
+    char *e;
+    int color_i = -1; /* assume failure */
+
+    arch = lookupInDefaultTable(arch,
+                           ctx->tables[ctx->currTables[ARCH]].defaults,
+                           ctx->tables[ctx->currTables[ARCH]].defaultsLength);
+    color = rpmGetVarArch(ctx, RPMVAR_ARCHCOLOR, arch);
+    if (color) {
+       color_i = strtol(color, &e, 10);
+       if (!(e && *e == '\0')) {
+           color_i = -1;
+       }
+    }
+    rpmrcCtxRelease(ctx);
+
+    return color_i;
+}
+
+void rpmGetOsInfo(const char ** name, int * num)
+{
+    rpmrcCtx ctx = rpmrcCtxAcquire(0);
+    getMachineInfo(ctx, OS, name, num);
+    rpmrcCtxRelease(ctx);
+}
+
index a27251c9a8bb0fba0169e8840e40b6f9362e6174..cc98c4885d6bf2f59935792aff71a7e438590487 100644 (file)
@@ -10,6 +10,7 @@
 #include <rpm/rpmio.h>
 #include <rpm/rpmlog.h>
 #include <rpm/header.h>
+#include <rpm/rpmds.h>
 
 #include "rpmio/rpmlua.h"
 #include "lib/rpmscript.h"
 
 #include "debug.h"
 
+struct scriptNextFileFunc_s {
+    char *(*func)(void *);     /* function producing input for script */
+    void *param;               /* parameter for func */
+};
+
+typedef struct scriptNextFileFunc_s *scriptNextFileFunc;
+
 struct rpmScript_s {
+    rpmscriptTypes type;       /* script type */
     rpmTagVal tag;             /* script tag */
     char **args;               /* scriptlet call arguments */
     char *body;                        /* script body */
     char *descr;               /* description for logging */
     rpmscriptFlags flags;      /* flags to control operation */
+    struct scriptNextFileFunc_s nextFileFunc;  /* input function */
+};
+
+struct scriptInfo_s {
+    rpmscriptTypes type;
+    const char *desc;
+    rpmsenseFlags sense;
+    rpmTagVal tag;
+    rpmTagVal progtag;
+    rpmTagVal flagtag;
+};
+
+static const struct scriptInfo_s scriptInfo[] = {
+    { RPMSCRIPT_PREIN, "%prein", 0,
+       RPMTAG_PREIN, RPMTAG_PREINPROG, RPMTAG_PREINFLAGS },
+    { RPMSCRIPT_PREUN, "%preun", 0,
+       RPMTAG_PREUN, RPMTAG_PREUNPROG, RPMTAG_PREUNFLAGS },
+    { RPMSCRIPT_POSTIN, "%post", 0,
+       RPMTAG_POSTIN, RPMTAG_POSTINPROG, RPMTAG_POSTINFLAGS },
+    { RPMSCRIPT_POSTUN, "%postun", 0,
+       RPMTAG_POSTUN, RPMTAG_POSTUNPROG, RPMTAG_POSTUNFLAGS },
+    { RPMSCRIPT_PRETRANS, "%pretrans", 0,
+       RPMTAG_PRETRANS, RPMTAG_PRETRANSPROG, RPMTAG_PRETRANSFLAGS },
+    { RPMSCRIPT_POSTTRANS, "%posttrans", 0,
+       RPMTAG_POSTTRANS, RPMTAG_POSTTRANSPROG, RPMTAG_POSTTRANSFLAGS },
+    { RPMSCRIPT_TRIGGERPREIN, "%triggerprein", RPMSENSE_TRIGGERPREIN,
+       RPMTAG_TRIGGERPREIN, 0, 0 },
+    { RPMSCRIPT_TRIGGERUN, "%triggerun", RPMSENSE_TRIGGERUN,
+       RPMTAG_TRIGGERUN, 0, 0 },
+    { RPMSCRIPT_TRIGGERIN, "%triggerin", RPMSENSE_TRIGGERIN,
+       RPMTAG_TRIGGERIN, 0, 0 },
+    { RPMSCRIPT_TRIGGERPOSTUN, "%triggerpostun", RPMSENSE_TRIGGERPOSTUN,
+       RPMTAG_TRIGGERPOSTUN, 0, 0 },
+    { RPMSCRIPT_VERIFY, "%verify", 0,
+       RPMTAG_VERIFYSCRIPT, RPMTAG_VERIFYSCRIPTPROG, RPMTAG_VERIFYSCRIPTFLAGS},
+    { 0, "unknown", 0,
+       RPMTAG_NOT_FOUND, RPMTAG_NOT_FOUND, RPMTAG_NOT_FOUND }
 };
 
+static const struct scriptInfo_s * findTag(rpmTagVal tag)
+{
+    const struct scriptInfo_s * si = scriptInfo;
+    while (si->type && si->tag != tag)
+       si++;
+    return si;
+}
 /**
  * Run internal Lua script.
  */
-static rpmRC runLuaScript(rpmPlugins plugins, int selinux, ARGV_const_t prefixes,
+static rpmRC runLuaScript(rpmPlugins plugins, ARGV_const_t prefixes,
                   const char *sname, rpmlogLvl lvl, FD_t scriptFd,
-                  ARGV_t * argvp, const char *script, int arg1, int arg2)
+                  ARGV_t * argvp, const char *script, int arg1, int arg2,
+                  scriptNextFileFunc nextFileFunc)
 {
     rpmRC rc = RPMRC_FAIL;
 #ifdef WITH_LUA
@@ -45,6 +99,7 @@ static rpmRC runLuaScript(rpmPlugins plugins, int selinux, ARGV_const_t prefixes
     /* Create arg variable */
     rpmluaPushTable(lua, "arg");
     rpmluavSetListMode(var, 1);
+    rpmluaSetNextFileFunc(nextFileFunc->func, nextFileFunc->param);
     if (argv) {
        char **p;
        for (p = argv; *p; p++) {
@@ -68,10 +123,16 @@ static rpmRC runLuaScript(rpmPlugins plugins, int selinux, ARGV_const_t prefixes
     if (cwd != -1) {
        mode_t oldmask = umask(0);
        umask(oldmask);
+       pid_t pid = getpid();
 
        if (chdir("/") == 0 && rpmluaRunScript(lua, script, sname) == 0) {
            rc = RPMRC_OK;
        }
+       if (pid != getpid()) {
+           /* Terminate child process forked in lua scriptlet */
+           rpmlog(RPMLOG_ERR, _("No exec() called after fork() in lua scriptlet\n"));
+           _exit(EXIT_FAILURE);
+       }
        /* This failing would be fatal, return something different for it... */
        if (fchdir(cwd)) {
            rpmlog(RPMLOG_ERR, _("Unable to restore current directory: %m"));
@@ -93,22 +154,16 @@ static rpmRC runLuaScript(rpmPlugins plugins, int selinux, ARGV_const_t prefixes
 
 static const char * const SCRIPT_PATH = "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin";
 
-static void doScriptExec(int selinux, ARGV_const_t argv, ARGV_const_t prefixes,
+static void doScriptExec(ARGV_const_t argv, ARGV_const_t prefixes,
                        FD_t scriptFd, FD_t out)
 {
-    int pipes[2];
     int flag;
     int fdno;
     int xx;
     int open_max;
 
+    /* SIGPIPE is ignored in rpm, reset to default for the scriptlet */
     (void) signal(SIGPIPE, SIG_DFL);
-    pipes[0] = pipes[1] = 0;
-    /* make stdin inaccessible */
-    xx = pipe(pipes);
-    xx = close(pipes[1]);
-    xx = dup2(pipes[0], STDIN_FILENO);
-    xx = close(pipes[0]);
 
     /* XXX Force FD_CLOEXEC on all inherited fdno's. */
     open_max = sysconf(_SC_OPEN_MAX);
@@ -165,11 +220,6 @@ static void doScriptExec(int selinux, ARGV_const_t argv, ARGV_const_t prefixes,
        /* XXX Don't mtrace into children. */
        unsetenv("MALLOC_CHECK_");
 
-       /* Permit libselinux to do the scriptlet exec. */
-       if (selinux == 1) {     
-           xx = rpm_execcon(0, argv[0], argv, environ);
-       }
-
        if (xx == 0) {
            xx = execv(argv[0], argv);
        }
@@ -204,14 +254,19 @@ exit:
 /**
  * Run an external script.
  */
-static rpmRC runExtScript(rpmPlugins plugins, int selinux, ARGV_const_t prefixes,
+static rpmRC runExtScript(rpmPlugins plugins, ARGV_const_t prefixes,
                   const char *sname, rpmlogLvl lvl, FD_t scriptFd,
-                  ARGV_t * argvp, const char *script, int arg1, int arg2)
+                  ARGV_t * argvp, const char *script, int arg1, int arg2,
+                  scriptNextFileFunc nextFileFunc)
 {
     FD_t out = NULL;
     char * fn = NULL;
     pid_t pid, reaped;
     int status;
+    int inpipe[2];
+    FILE *in = NULL;
+    const char *line;
+    char *mline = NULL;
     rpmRC rc = RPMRC_FAIL;
 
     rpmlog(RPMLOG_DEBUG, "%s: scriptlet start\n", sname);
@@ -234,6 +289,14 @@ static rpmRC runExtScript(rpmPlugins plugins, int selinux, ARGV_const_t prefixes
        }
     }
 
+    if (pipe(inpipe) < 0) {
+       rpmlog(RPMLOG_ERR,
+               ("Couldn't create pipe: %s\n"), strerror(errno));
+       goto exit;
+    }
+    in = fdopen(inpipe[1], "w");
+    inpipe[1] = 0;
+
     if (scriptFd != NULL) {
        if (rpmIsVerbose()) {
            out = fdDup(Fileno(scriptFd));
@@ -261,13 +324,41 @@ static rpmRC runExtScript(rpmPlugins plugins, int selinux, ARGV_const_t prefixes
        rpmlog(RPMLOG_DEBUG, "%s: execv(%s) pid %d\n",
               sname, *argvp[0], (unsigned)getpid());
 
+       fclose(in);
+       dup2(inpipe[0], STDIN_FILENO);
+
        /* Run scriptlet post fork hook for all plugins */
        if (rpmpluginsCallScriptletForkPost(plugins, *argvp[0], RPMSCRIPTLET_FORK | RPMSCRIPTLET_EXEC) != RPMRC_FAIL) {
-           doScriptExec(selinux, *argvp, prefixes, scriptFd, out);
+           doScriptExec(*argvp, prefixes, scriptFd, out);
        } else {
            _exit(126); /* exit 126 for compatibility with bash(1) */
        }
     }
+    close(inpipe[0]);
+    inpipe[0] = 0;
+
+    if (nextFileFunc->func) {
+       while ((line = nextFileFunc->func(nextFileFunc->param)) != NULL) {
+           size_t size = strlen(line);
+           size_t ret_size;
+           mline = xstrdup(line);
+           mline[size] = '\n';
+
+           ret_size = fwrite(mline, size + 1, 1, in);
+           mline = _free(mline);
+           if (ret_size != 1) {
+               if (errno == EPIPE) {
+                   break;
+               } else {
+                   rpmlog(RPMLOG_ERR, _("Fwrite failed: %s"), strerror(errno));
+                   rc = RPMRC_FAIL;
+                   goto exit;
+               }
+           }
+       }
+    }
+    fclose(in);
+    in = NULL;
 
     do {
        reaped = waitpid(pid, &status, 0);
@@ -293,6 +384,12 @@ static rpmRC runExtScript(rpmPlugins plugins, int selinux, ARGV_const_t prefixes
     }
 
 exit:
+    if (in)
+       fclose(in);
+
+    if (inpipe[0])
+       close(inpipe[0]);
+
     if (out)
        Fclose(out);    /* XXX dup'd STDOUT_FILENO */
 
@@ -301,11 +398,13 @@ exit:
            unlink(fn);
        free(fn);
     }
+    free(mline);
+
     return rc;
 }
 
 rpmRC rpmScriptRun(rpmScript script, int arg1, int arg2, FD_t scriptFd,
-                  ARGV_const_t prefixes, int warn_only, int selinux, rpmPlugins plugins)
+                  ARGV_const_t prefixes, int warn_only, rpmPlugins plugins)
 {
     ARGV_t args = NULL;
     rpmlogLvl lvl = warn_only ? RPMLOG_WARNING : RPMLOG_ERR;
@@ -329,9 +428,9 @@ rpmRC rpmScriptRun(rpmScript script, int arg1, int arg2, FD_t scriptFd,
 
     if (rc != RPMRC_FAIL) {
        if (script_type & RPMSCRIPTLET_EXEC) {
-           rc = runExtScript(plugins, selinux, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2);
+           rc = runExtScript(plugins, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2, &script->nextFileFunc);
        } else {
-           rc = runLuaScript(plugins, selinux, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2);
+           rc = runLuaScript(plugins, prefixes, script->descr, lvl, scriptFd, &args, script->body, arg1, arg2, &script->nextFileFunc);
        }
     }
 
@@ -343,54 +442,24 @@ rpmRC rpmScriptRun(rpmScript script, int arg1, int arg2, FD_t scriptFd,
     return rc;
 }
 
+static rpmscriptTypes getScriptType(rpmTagVal scriptTag)
+{
+    return findTag(scriptTag)->type;
+}
+
 static rpmTagVal getProgTag(rpmTagVal scriptTag)
 {
-    switch (scriptTag) {
-    case RPMTAG_PREIN:         return RPMTAG_PREINPROG;
-    case RPMTAG_POSTIN:        return RPMTAG_POSTINPROG;
-    case RPMTAG_PREUN:                 return RPMTAG_PREUNPROG;
-    case RPMTAG_POSTUN:        return RPMTAG_POSTUNPROG;
-    case RPMTAG_PRETRANS:      return RPMTAG_PRETRANSPROG;
-    case RPMTAG_POSTTRANS:     return RPMTAG_POSTTRANSPROG;
-    case RPMTAG_VERIFYSCRIPT:  return RPMTAG_VERIFYSCRIPTPROG;
-    default:                   return RPMTAG_NOT_FOUND;
-    }
+    return findTag(scriptTag)->progtag;
 }
 
 static rpmTagVal getFlagTag(rpmTagVal scriptTag)
 {
-    switch (scriptTag) {
-    case RPMTAG_PRETRANS:      return RPMTAG_PRETRANSFLAGS;
-    case RPMTAG_POSTTRANS:     return RPMTAG_POSTTRANSFLAGS;
-    case RPMTAG_PREUN:         return RPMTAG_PREUNFLAGS;
-    case RPMTAG_POSTUN:                return RPMTAG_POSTUNFLAGS;
-    case RPMTAG_PREIN:         return RPMTAG_PREINFLAGS;
-    case RPMTAG_POSTIN:                return RPMTAG_POSTINFLAGS;
-    case RPMTAG_VERIFYSCRIPT:  return RPMTAG_VERIFYSCRIPTFLAGS;
-    case RPMTAG_TRIGGERSCRIPTS:        return RPMTAG_TRIGGERSCRIPTFLAGS;
-    default:
-       break;
-    }
-    return RPMTAG_NOT_FOUND;
+    return findTag(scriptTag)->flagtag;
 }
 
 static const char * tag2sln(rpmTagVal tag)
 {
-    switch (tag) {
-    case RPMTAG_PRETRANS:       return "%pretrans";
-    case RPMTAG_TRIGGERPREIN:   return "%triggerprein";
-    case RPMTAG_PREIN:          return "%pre";
-    case RPMTAG_POSTIN:         return "%post";
-    case RPMTAG_TRIGGERIN:      return "%triggerin";
-    case RPMTAG_TRIGGERUN:      return "%triggerun";
-    case RPMTAG_PREUN:          return "%preun";
-    case RPMTAG_POSTUN:         return "%postun";
-    case RPMTAG_POSTTRANS:      return "%posttrans";
-    case RPMTAG_TRIGGERPOSTUN:  return "%triggerpostun";
-    case RPMTAG_VERIFYSCRIPT:   return "%verify";
-    default: break;
-    }
-    return "%unknownscript";
+    return findTag(tag)->desc;
 }
 
 static rpmScript rpmScriptNew(Header h, rpmTagVal tag, const char *body,
@@ -399,6 +468,7 @@ static rpmScript rpmScriptNew(Header h, rpmTagVal tag, const char *body,
     char *nevra = headerGetAsString(h, RPMTAG_NEVRA);
     rpmScript script = xcalloc(1, sizeof(*script));
     script->tag = tag;
+    script->type = getScriptType(tag);
     script->flags = flags;
     script->body = (body != NULL) ? xstrdup(body) : NULL;
     rasprintf(&script->descr, "%s(%s)", tag2sln(tag), nevra);
@@ -416,20 +486,101 @@ static rpmScript rpmScriptNew(Header h, rpmTagVal tag, const char *body,
        script->body = body;
     }
 
+    script->nextFileFunc.func = NULL;
+    script->nextFileFunc.param = NULL;
+
     free(nevra);
     return script;
 }
 
-rpmScript rpmScriptFromTriggerTag(Header h, rpmTagVal triggerTag, uint32_t ix)
+void rpmScriptSetNextFileFunc(rpmScript script, char *(*func)(void *),
+                           void *param)
+{
+    script->nextFileFunc.func = func;
+    script->nextFileFunc.param = param;
+}
+
+rpmTagVal triggerDsTag(rpmscriptTriggerModes tm)
+{
+    rpmTagVal tag = RPMTAG_NOT_FOUND;
+    switch (tm) {
+    case RPMSCRIPT_NORMALTRIGGER:
+       tag = RPMTAG_TRIGGERNAME;
+       break;
+    case RPMSCRIPT_FILETRIGGER:
+       tag = RPMTAG_FILETRIGGERNAME;
+       break;
+    case RPMSCRIPT_TRANSFILETRIGGER:
+       tag = RPMTAG_TRANSFILETRIGGERNAME;
+       break;
+    }
+    return tag;
+}
+
+rpmscriptTriggerModes triggerMode(rpmTagVal tag)
+{
+    rpmscriptTriggerModes tm = 0;
+    switch (tag) {
+    case RPMTAG_TRIGGERNAME:
+       tm = RPMSCRIPT_NORMALTRIGGER;
+       break;
+    case RPMTAG_FILETRIGGERNAME:
+       tm = RPMSCRIPT_FILETRIGGER;
+       break;
+    case RPMTAG_TRANSFILETRIGGERNAME:
+       tm = RPMSCRIPT_TRANSFILETRIGGER;
+       break;
+    }
+    return tm;
+}
+
+rpmTagVal triggertag(rpmsenseFlags sense)
+{
+    rpmTagVal tag = RPMTAG_NOT_FOUND;
+    switch (sense) {
+    case RPMSENSE_TRIGGERIN:
+       tag = RPMTAG_TRIGGERIN;
+       break;
+    case RPMSENSE_TRIGGERUN:
+       tag = RPMTAG_TRIGGERUN;
+       break;
+    case RPMSENSE_TRIGGERPOSTUN:
+       tag = RPMTAG_TRIGGERPOSTUN;
+       break;
+    case RPMSENSE_TRIGGERPREIN:
+       tag = RPMTAG_TRIGGERPREIN;
+       break;
+    default:
+       break;
+    }
+    return tag;
+}
+
+rpmScript rpmScriptFromTriggerTag(Header h, rpmTagVal triggerTag,
+                           rpmscriptTriggerModes tm, uint32_t ix)
 {
     rpmScript script = NULL;
     struct rpmtd_s tscripts, tprogs, tflags;
     headerGetFlags hgflags = HEADERGET_MINMEM;
 
-    headerGet(h, RPMTAG_TRIGGERSCRIPTS, &tscripts, hgflags);
-    headerGet(h, RPMTAG_TRIGGERSCRIPTPROG, &tprogs, hgflags);
-    headerGet(h, RPMTAG_TRIGGERSCRIPTFLAGS, &tflags, hgflags);
-    
+    switch (tm) {
+       case RPMSCRIPT_NORMALTRIGGER:
+           headerGet(h, RPMTAG_TRIGGERSCRIPTS, &tscripts, hgflags);
+           headerGet(h, RPMTAG_TRIGGERSCRIPTPROG, &tprogs, hgflags);
+           headerGet(h, RPMTAG_TRIGGERSCRIPTFLAGS, &tflags, hgflags);
+           break;
+       case RPMSCRIPT_FILETRIGGER:
+           headerGet(h, RPMTAG_FILETRIGGERSCRIPTS, &tscripts, hgflags);
+           headerGet(h, RPMTAG_FILETRIGGERSCRIPTPROG, &tprogs, hgflags);
+           headerGet(h, RPMTAG_FILETRIGGERSCRIPTFLAGS, &tflags, hgflags);
+           break;
+       case RPMSCRIPT_TRANSFILETRIGGER:
+           headerGet(h, RPMTAG_TRANSFILETRIGGERSCRIPTS, &tscripts, hgflags);
+           headerGet(h, RPMTAG_TRANSFILETRIGGERSCRIPTPROG, &tprogs, hgflags);
+           headerGet(h, RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS, &tflags, hgflags);
+           break;
+    }
+
     if (rpmtdSetIndex(&tscripts, ix) >= 0 && rpmtdSetIndex(&tprogs, ix) >= 0) {
        rpmscriptFlags sflags = 0;
        const char *prog = rpmtdGetString(&tprogs);
@@ -487,3 +638,8 @@ rpmTagVal rpmScriptTag(rpmScript script)
 {
     return (script != NULL) ? script->tag : RPMTAG_NOT_FOUND;
 }
+
+rpmscriptTypes rpmScriptType(rpmScript script)
+{
+    return (script != NULL) ? script->type : 0;
+}
index 852735b8d77953cf28d9380951c84f3c98edc6ae..3768077c7a9d034c11cf26d2d8ed7f225a20cb8f 100644 (file)
@@ -3,6 +3,33 @@
 
 #include <rpm/rpmtypes.h>
 #include <rpm/argv.h>
+#include <rpm/rpmds.h>
+
+/* Rpm scriptlet types */
+enum rpmscriptTypes_e {
+    RPMSCRIPT_PREIN            = (1 << 0),
+    RPMSCRIPT_PREUN            = (1 << 1),
+    RPMSCRIPT_POSTIN           = (1 << 2),
+    RPMSCRIPT_POSTUN           = (1 << 3),
+    RPMSCRIPT_TRIGGERPREIN     = (1 << 4),
+    RPMSCRIPT_TRIGGERUN                = (1 << 6),
+    RPMSCRIPT_TRIGGERIN                = (1 << 5),
+    RPMSCRIPT_TRIGGERPOSTUN    = (1 << 7),
+    RPMSCRIPT_PRETRANS         = (1 << 8),
+    RPMSCRIPT_POSTTRANS                = (1 << 9),
+    /* ... */
+    RPMSCRIPT_VERIFY           = (1 << 24),
+};
+
+typedef rpmFlags rpmscriptTypes;
+
+enum rpmscriptTriggerMode_e {
+    RPMSCRIPT_NORMALTRIGGER    = (1 << 0),
+    RPMSCRIPT_FILETRIGGER      = (1 << 1),
+    RPMSCRIPT_TRANSFILETRIGGER = (1 << 2),
+};
+
+typedef rpmFlags rpmscriptTriggerModes;
 
 enum rpmscriptFlags_e {
     RPMSCRIPT_FLAG_NONE                = 0,
@@ -18,21 +45,38 @@ typedef struct rpmScript_s * rpmScript;
 extern "C" {
 #endif
 
+RPM_GNUC_INTERNAL
+rpmTagVal triggerDsTag(rpmscriptTriggerModes tm);
+
+RPM_GNUC_INTERNAL
+rpmscriptTriggerModes triggerMode(rpmTagVal tag);
+
+RPM_GNUC_INTERNAL
+rpmTagVal triggertag(rpmsenseFlags sense);
+
 RPM_GNUC_INTERNAL
 rpmScript rpmScriptFromTag(Header h, rpmTagVal scriptTag);
 
 RPM_GNUC_INTERNAL
-rpmScript rpmScriptFromTriggerTag(Header h, rpmTagVal triggerTag, uint32_t ix);
+rpmScript rpmScriptFromTriggerTag(Header h, rpmTagVal triggerTag,
+                                   rpmscriptTriggerModes tm, uint32_t ix);
 
 RPM_GNUC_INTERNAL
 rpmScript rpmScriptFree(rpmScript script);
 
 RPM_GNUC_INTERNAL
 rpmRC rpmScriptRun(rpmScript script, int arg1, int arg2, FD_t scriptFd,
-                   ARGV_const_t prefixes, int warn_only, int selinux, rpmPlugins plugins);
+                   ARGV_const_t prefixes, int warn_only, rpmPlugins plugins);
 
 RPM_GNUC_INTERNAL
 rpmTagVal rpmScriptTag(rpmScript script);
+
+RPM_GNUC_INTERNAL
+rpmscriptTypes rpmScriptType(rpmScript script);
+
+RPM_GNUC_INTERNAL
+void rpmScriptSetNextFileFunc(rpmScript script, char *(*func)(void *),
+                           void *param);
 #ifdef __cplusplus
 }
 #endif
index 025a0a41576334fbdb0037e452ef5265f755bcf1..4491aa9a4a7f3b57294bac1b7718f63a288e0653 100644 (file)
@@ -1,6 +1,12 @@
 #ifndef _RPMTAG_H
 #define _RPMTAG_H
 
+/** \ingroup rpmtag
+ *  \file lib/rpmtag.h
+ *
+ * Accessing RPM tags: values, types, ...
+ */
+
 #include <rpm/rpmtypes.h>
 
 #ifdef __cplusplus
@@ -57,6 +63,8 @@ typedef enum rpmTag_e {
 #define        RPMTAG_HDRID    RPMTAG_SHA1HEADER       /* s */
     RPMTAG_LONGSIGSIZE         = RPMTAG_SIG_BASE+14,   /* l */
     RPMTAG_LONGARCHIVESIZE     = RPMTAG_SIG_BASE+15,   /* l */
+    /* RPMTAG_SIG_BASE+16 reserved */
+    RPMTAG_SHA256HEADER                = RPMTAG_SIG_BASE+17,   /* s */
 
     RPMTAG_NAME                = 1000, /* s */
 #define        RPMTAG_N        RPMTAG_NAME     /* s */
@@ -117,8 +125,8 @@ typedef enum rpmTag_e {
     RPMTAG_REQUIRENAME         = 1049, /* s[] */
 #define        RPMTAG_REQUIRES RPMTAG_REQUIRENAME      /* s[] */
     RPMTAG_REQUIREVERSION      = 1050, /* s[] */
-    RPMTAG_NOSOURCE            = 1051, /* i */
-    RPMTAG_NOPATCH             = 1052, /* i */
+    RPMTAG_NOSOURCE            = 1051, /* i[] */
+    RPMTAG_NOPATCH             = 1052, /* i[] */
     RPMTAG_CONFLICTFLAGS       = 1053, /* i[] */
     RPMTAG_CONFLICTNAME                = 1054, /* s[] */
 #define        RPMTAG_CONFLICTS RPMTAG_CONFLICTNAME    /* s[] */
@@ -217,14 +225,14 @@ typedef enum rpmTag_e {
     RPMTAG_PRETRANSPROG                = 1153, /* s[] */
     RPMTAG_POSTTRANSPROG       = 1154, /* s[] */
     RPMTAG_DISTTAG             = 1155, /* s */
-    RPMTAG_SUGGESTSNAME                = 1156, /* s[] extension */
-#define        RPMTAG_SUGGESTS RPMTAG_SUGGESTSNAME     /* s[] */
-    RPMTAG_SUGGESTSVERSION     = 1157, /* s[] extension */
-    RPMTAG_SUGGESTSFLAGS       = 1158, /* i[] extension */
-    RPMTAG_ENHANCESNAME                = 1159, /* s[] extension */
-#define        RPMTAG_ENHANCES RPMTAG_ENHANCESNAME     /* s[] */
-    RPMTAG_ENHANCESVERSION     = 1160, /* s[] extension */
-    RPMTAG_ENHANCESFLAGS       = 1161, /* i[] extension */
+    RPMTAG_OLDSUGGESTSNAME     = 1156, /* s[] - obsolete */
+#define RPMTAG_OLDSUGGESTS RPMTAG_OLDSUGGESTSNAME /* s[] - obsolete */
+    RPMTAG_OLDSUGGESTSVERSION  = 1157, /* s[] - obsolete */
+    RPMTAG_OLDSUGGESTSFLAGS    = 1158, /* i[] - obsolete */
+    RPMTAG_OLDENHANCESNAME     = 1159, /* s[] - obsolete */
+#define RPMTAG_OLDENHANCES RPMTAG_OLDENHANCESNAME /* s[] - obsolete */
+    RPMTAG_OLDENHANCESVERSION  = 1160, /* s[] - obsolete */
+    RPMTAG_OLDENHANCESFLAGS    = 1161, /* i[] - obsolete */
     RPMTAG_PRIORITY            = 1162, /* i[] extension placeholder (unimplemented) */
     RPMTAG_CVSID               = 1163, /* s (unimplemented) */
 #define        RPMTAG_SVNID    RPMTAG_CVSID    /* s (unimplemented) */
@@ -261,7 +269,9 @@ typedef enum rpmTag_e {
     RPMTAG_BUILDOBSOLETES      = 1194, /* internal (unimplemented) */
     RPMTAG_DBINSTANCE          = 1195, /* i extension */
     RPMTAG_NVRA                        = 1196, /* s extension */
-    /* tags 1997-4999 reserved */
+    RPMTAG_MULTIFILELIST        = 1197, /* s */
+
+    /* tags 1998-4999 reserved */
     RPMTAG_FILENAMES           = 5000, /* s[] extension */
     RPMTAG_FILEPROVIDE         = 5001, /* s[] extension */
     RPMTAG_FILEREQUIRE         = 5002, /* s[] extension */
@@ -290,7 +300,7 @@ typedef enum rpmTag_e {
     RPMTAG_POSTTRANSFLAGS      = 5025, /* i */
     RPMTAG_VERIFYSCRIPTFLAGS   = 5026, /* i */
     RPMTAG_TRIGGERSCRIPTFLAGS  = 5027, /* i[] */
-    RPMTAG_COLLECTIONS         = 5029, /* s[] list of collections */
+    RPMTAG_COLLECTIONS         = 5029, /* s[] list of collections (unimplemented) */
     RPMTAG_POLICYNAMES         = 5030, /* s[] */
     RPMTAG_POLICYTYPES         = 5031, /* s[] */
     RPMTAG_POLICYTYPESINDEXES  = 5032, /* i[] */
@@ -307,8 +317,62 @@ typedef enum rpmTag_e {
     RPMTAG_OBSOLETENEVRS       = 5043, /* s[] extension */
     RPMTAG_CONFLICTNEVRS       = 5044, /* s[] extension */
     RPMTAG_FILENLINKS          = 5045, /* i[] extension */
+    RPMTAG_RECOMMENDNAME       = 5046, /* s[] */
+#define        RPMTAG_RECOMMENDS RPMTAG_RECOMMENDNAME  /* s[] */
+    RPMTAG_RECOMMENDVERSION    = 5047, /* s[] */
+    RPMTAG_RECOMMENDFLAGS      = 5048, /* i[] */
+    RPMTAG_SUGGESTNAME         = 5049, /* s[] */
+#define        RPMTAG_SUGGESTS RPMTAG_SUGGESTNAME      /* s[] */
+    RPMTAG_SUGGESTVERSION      = 5050, /* s[] extension */
+    RPMTAG_SUGGESTFLAGS                = 5051, /* i[] extension */
+    RPMTAG_SUPPLEMENTNAME      = 5052, /* s[] */
+#define        RPMTAG_SUPPLEMENTS RPMTAG_SUPPLEMENTNAME /* s[] */
+    RPMTAG_SUPPLEMENTVERSION   = 5053, /* s[] */
+    RPMTAG_SUPPLEMENTFLAGS     = 5054, /* i[] */
+    RPMTAG_ENHANCENAME         = 5055, /* s[] */
+#define        RPMTAG_ENHANCES RPMTAG_ENHANCENAME      /* s[] */
+    RPMTAG_ENHANCEVERSION      = 5056, /* s[] */
+    RPMTAG_ENHANCEFLAGS                = 5057, /* i[] */
+    RPMTAG_RECOMMENDNEVRS      = 5058, /* s[] extension */
+    RPMTAG_SUGGESTNEVRS                = 5059, /* s[] extension */
+    RPMTAG_SUPPLEMENTNEVRS     = 5060, /* s[] extension */
+    RPMTAG_ENHANCENEVRS                = 5061, /* s[] extension */
+    RPMTAG_ENCODING            = 5062, /* s */
+    RPMTAG_FILETRIGGERIN               = 5063, /* internal */
+    RPMTAG_FILETRIGGERUN               = 5064, /* internal */
+    RPMTAG_FILETRIGGERPOSTUN           = 5065, /* internal */
+    RPMTAG_FILETRIGGERSCRIPTS          = 5066, /* s[] */
+    RPMTAG_FILETRIGGERSCRIPTPROG       = 5067, /* s[] */
+    RPMTAG_FILETRIGGERSCRIPTFLAGS      = 5068, /* i[] */
+    RPMTAG_FILETRIGGERNAME             = 5069, /* s[] */
+    RPMTAG_FILETRIGGERINDEX            = 5070, /* i[] */
+    RPMTAG_FILETRIGGERVERSION          = 5071, /* s[] */
+    RPMTAG_FILETRIGGERFLAGS            = 5072, /* i[] */
+    RPMTAG_TRANSFILETRIGGERIN          = 5073, /* internal */
+    RPMTAG_TRANSFILETRIGGERUN          = 5074, /* internal */
+    RPMTAG_TRANSFILETRIGGERPOSTUN      = 5075, /* internal */
+    RPMTAG_TRANSFILETRIGGERSCRIPTS     = 5076, /* s[] */
+    RPMTAG_TRANSFILETRIGGERSCRIPTPROG  = 5077, /* s[] */
+    RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS = 5078, /* i[] */
+    RPMTAG_TRANSFILETRIGGERNAME                = 5079, /* s[] */
+    RPMTAG_TRANSFILETRIGGERINDEX       = 5080, /* i[] */
+    RPMTAG_TRANSFILETRIGGERVERSION     = 5081, /* s[] */
+    RPMTAG_TRANSFILETRIGGERFLAGS       = 5082, /* i[] */
+    RPMTAG_REMOVEPATHPOSTFIXES  = 5083, /* s internal */
+    RPMTAG_FILETRIGGERPRIORITIES       = 5084, /* i[] */
+    RPMTAG_TRANSFILETRIGGERPRIORITIES  = 5085, /* i[] */
+    RPMTAG_FILETRIGGERCONDS            = 5086, /* s[] extension */
+    RPMTAG_FILETRIGGERTYPE             = 5087, /* s[] extension */
+    RPMTAG_TRANSFILETRIGGERCONDS       = 5088, /* s[] extension */
+    RPMTAG_TRANSFILETRIGGERTYPE                = 5089, /* s[] extension */
+    RPMTAG_FILESIGNATURES      = 5090, /* s[] */
+    RPMTAG_FILESIGNATURELENGTH  = 5091, /* i */
+    RPMTAG_PAYLOADDIGEST       = 5092, /* s[] */
+    RPMTAG_PAYLOADDIGESTALGO   = 5093, /* i */
+    /* Skip numbers which might be used in new RPM versions */
+    RPMTAG_BUILDINFO                   = 7000, /* s[] information about build */
 
-    RPMTAG_FIRSTFREE_TAG       /*!< internal */
+    RPMTAG_FIRSTFREE_TAG,      /*!< internal */
 } rpmTag;
 
 #define        RPMTAG_EXTERNAL_TAG             1000000
@@ -332,6 +396,12 @@ typedef enum rpmDbiTag_e {
     RPMDBI_SIGMD5              = RPMTAG_SIGMD5,
     RPMDBI_SHA1HEADER          = RPMTAG_SHA1HEADER,
     RPMDBI_INSTFILENAMES       = RPMTAG_INSTFILENAMES,
+    RPMDBI_FILETRIGGERNAME     = RPMTAG_FILETRIGGERNAME,
+    RPMDBI_TRANSFILETRIGGERNAME = RPMTAG_TRANSFILETRIGGERNAME,
+    RPMDBI_RECOMMENDNAME       = RPMTAG_RECOMMENDNAME,
+    RPMDBI_SUGGESTNAME         = RPMTAG_SUGGESTNAME,
+    RPMDBI_SUPPLEMENTNAME      = RPMTAG_SUPPLEMENTNAME,
+    RPMDBI_ENHANCENAME         = RPMTAG_ENHANCENAME,
 } rpmDbiTag;
 
 /** \ingroup signature
@@ -346,13 +416,15 @@ typedef enum rpmSigTag_e {
     RPMSIGTAG_GPG      = 1005, /*!< internal GnuPG signature. */
     RPMSIGTAG_PGP5     = 1006, /*!< internal PGP5 signature @deprecated legacy. */
     RPMSIGTAG_PAYLOADSIZE = 1007,/*!< internal uncompressed payload size (32bit) in bytes. */
+    RPMSIGTAG_RESERVEDSPACE = 1008,/*!< internal space reserved for signatures */
     RPMSIGTAG_BADSHA1_1        = RPMTAG_BADSHA1_1,     /*!< internal Broken SHA1, take 1. */
     RPMSIGTAG_BADSHA1_2        = RPMTAG_BADSHA1_2,     /*!< internal Broken SHA1, take 2. */
-    RPMSIGTAG_SHA1     = RPMTAG_SHA1HEADER,    /*!< internal sha1 header digest. */
     RPMSIGTAG_DSA      = RPMTAG_DSAHEADER,     /*!< internal DSA header signature. */
     RPMSIGTAG_RSA      = RPMTAG_RSAHEADER,     /*!< internal RSA header signature. */
+    RPMSIGTAG_SHA1     = RPMTAG_SHA1HEADER,    /*!< internal sha1 header digest. */
     RPMSIGTAG_LONGSIZE = RPMTAG_LONGSIGSIZE,   /*!< internal Header+Payload size (64bit) in bytes. */
     RPMSIGTAG_LONGARCHIVESIZE = RPMTAG_LONGARCHIVESIZE, /*!< internal uncompressed payload size (64bit) in bytes. */
+    RPMSIGTAG_SHA256   = RPMTAG_SHA256HEADER,
 } rpmSigTag;
 
 
index 550d733ab8d285fabfcf17ae13274b09207a7ddc..e33c8cb53b77961a571a65e084d5d2295906b408 100644 (file)
@@ -19,7 +19,7 @@ rpmtd rpmtdFree(rpmtd td)
 {
     /* permit free on NULL td */
     if (td != NULL) {
-       /* XXX should we free data too - a flag maybe? */
+       rpmtdFreeData(td);
        free(td);
     }
     return NULL;
@@ -27,19 +27,16 @@ rpmtd rpmtdFree(rpmtd td)
 
 void rpmtdReset(rpmtd td)
 {
-    assert(td != NULL);
-
-    memset(td, 0, sizeof(*td));
-    td->ix = -1;
+    if (td) {
+       memset(td, 0, sizeof(*td));
+       td->ix = -1;
+    }
 }
 
 void rpmtdFreeData(rpmtd td)
 {
-    assert(td != NULL);
-
-    if (td->flags & RPMTD_ALLOCED) {
+    if (td && td->data && td->flags & RPMTD_ALLOCED) {
        if (td->flags & RPMTD_PTR_ALLOCED) {
-           assert(td->data != NULL);
            char **data = td->data;
            for (int i = 0; i < td->count; i++) {
                free(data[i]);
@@ -52,27 +49,32 @@ void rpmtdFreeData(rpmtd td)
 
 rpm_count_t rpmtdCount(rpmtd td)
 {
-    assert(td != NULL);
-    /* fix up for binary type abusing count as data length */
-    return (td->type == RPM_BIN_TYPE) ? 1 : td->count;
+    rpm_count_t count = 0;
+    if (td != NULL) {
+       /* fix up for binary type abusing count as data length */
+       count = (td->type == RPM_BIN_TYPE) ? 1 : td->count;
+    }
+    return count;
+}
+
+rpm_count_t rpmtdSize(rpmtd td)
+{
+    return (td != NULL) ? td->size : 0;
 }
 
 rpmTagVal rpmtdTag(rpmtd td)
 {
-    assert(td != NULL);
-    return td->tag;
+    return (td != NULL) ? td->tag : 0;
 }
 
 rpmTagType rpmtdType(rpmtd td)
 {
-    assert(td != NULL);
-    return td->type;
+    return (td != NULL) ? td->type : 0;
 }
 
 rpmTagClass rpmtdClass(rpmtd td)
 {
-    assert(td != NULL);
-    return rpmTagTypeGetClass(td->type);
+    return (td != NULL) ? rpmTagTypeGetClass(td->type) : 0;
 }
 
 rpmtdFlags rpmtdGetFlags(rpmtd td)
@@ -82,15 +84,12 @@ rpmtdFlags rpmtdGetFlags(rpmtd td)
 
 int rpmtdGetIndex(rpmtd td)
 {
-    assert(td != NULL);
-    return td->ix;
+    return (td != NULL) ? td->ix : -1;
 }
 
 int rpmtdSetIndex(rpmtd td, int index)
 {
-    assert(td != NULL);
-
-    if (index < 0 || index >= rpmtdCount(td)) {
+    if (td == NULL || index < 0 || index >= rpmtdCount(td)) {
        return -1;
     }
     td->ix = index;
@@ -99,7 +98,8 @@ int rpmtdSetIndex(rpmtd td, int index)
 
 int rpmtdInit(rpmtd td)
 {
-    assert(td != NULL);
+    if (td == NULL)
+       return -1;
 
     /* XXX check that this is an array type? */
     td->ix = -1;
@@ -108,11 +108,9 @@ int rpmtdInit(rpmtd td)
 
 int rpmtdNext(rpmtd td)
 {
-    assert(td != NULL);
-
     int i = -1;
     
-    if (++td->ix >= 0) {
+    if (td != NULL && ++td->ix >= 0) {
        if (td->ix < rpmtdCount(td)) {
            i = td->ix;
        } else {
@@ -124,7 +122,6 @@ int rpmtdNext(rpmtd td)
 
 uint32_t *rpmtdNextUint32(rpmtd td)
 {
-    assert(td != NULL);
     uint32_t *res = NULL;
     if (rpmtdNext(td) >= 0) {
        res = rpmtdGetUint32(td);
@@ -134,7 +131,6 @@ uint32_t *rpmtdNextUint32(rpmtd td)
 
 uint64_t *rpmtdNextUint64(rpmtd td)
 {
-    assert(td != NULL);
     uint64_t *res = NULL;
     if (rpmtdNext(td) >= 0) {
        res = rpmtdGetUint64(td);
@@ -144,7 +140,6 @@ uint64_t *rpmtdNextUint64(rpmtd td)
 
 const char *rpmtdNextString(rpmtd td)
 {
-    assert(td != NULL);
     const char *res = NULL;
     if (rpmtdNext(td) >= 0) {
        res = rpmtdGetString(td);
@@ -156,9 +151,7 @@ char * rpmtdGetChar(rpmtd td)
 {
     char *res = NULL;
 
-    assert(td != NULL);
-
-    if (td->type == RPM_CHAR_TYPE) {
+    if (td != NULL && td->type == RPM_CHAR_TYPE) {
        int ix = (td->ix >= 0 ? td->ix : 0);
        res = (char *) td->data + ix;
     } 
@@ -168,9 +161,7 @@ uint16_t * rpmtdGetUint16(rpmtd td)
 {
     uint16_t *res = NULL;
 
-    assert(td != NULL);
-
-    if (td->type == RPM_INT16_TYPE) {
+    if (td != NULL && td->type == RPM_INT16_TYPE) {
        int ix = (td->ix >= 0 ? td->ix : 0);
        res = (uint16_t *) td->data + ix;
     } 
@@ -181,9 +172,7 @@ uint32_t * rpmtdGetUint32(rpmtd td)
 {
     uint32_t *res = NULL;
 
-    assert(td != NULL);
-
-    if (td->type == RPM_INT32_TYPE) {
+    if (td != NULL && td->type == RPM_INT32_TYPE) {
        int ix = (td->ix >= 0 ? td->ix : 0);
        res = (uint32_t *) td->data + ix;
     } 
@@ -194,9 +183,7 @@ uint64_t * rpmtdGetUint64(rpmtd td)
 {
     uint64_t *res = NULL;
 
-    assert(td != NULL);
-
-    if (td->type == RPM_INT64_TYPE) {
+    if (td != NULL && td->type == RPM_INT64_TYPE) {
        int ix = (td->ix >= 0 ? td->ix : 0);
        res = (uint64_t *) td->data + ix;
     } 
@@ -207,7 +194,8 @@ const char * rpmtdGetString(rpmtd td)
 {
     const char *str = NULL;
 
-    assert(td != NULL);
+    if (td == NULL)
+       return NULL;
 
     if (td->type == RPM_STRING_TYPE) {
        str = (const char *) td->data;
@@ -222,10 +210,12 @@ const char * rpmtdGetString(rpmtd td)
 
 uint64_t rpmtdGetNumber(rpmtd td)
 {
-    assert(td != NULL);
     uint64_t val = 0;
     int ix = (td->ix >= 0 ? td->ix : 0);
 
+    if (td == NULL)
+       return 0;
+
     switch (td->type) {
     case RPM_INT64_TYPE:
        val = *((uint64_t *) td->data + ix);
@@ -248,12 +238,12 @@ uint64_t rpmtdGetNumber(rpmtd td)
 
 char *rpmtdFormat(rpmtd td, rpmtdFormats fmt, const char *errmsg)
 {
-    headerTagFormatFunction func = rpmHeaderFormatFuncByValue(fmt);
+    headerFmt ext = rpmHeaderFormatByValue(fmt);
     const char *err = NULL;
     char *str = NULL;
 
-    if (func) {
-       str = func(td);
+    if (ext) {
+       str = rpmHeaderFormatCall(ext, td);
     } else {
        err = _("Unknown format");
     }
@@ -267,10 +257,12 @@ char *rpmtdFormat(rpmtd td, rpmtdFormats fmt, const char *errmsg)
 
 int rpmtdSetTag(rpmtd td, rpmTagVal tag)
 {
-    assert(td != NULL);
     rpmTagType newtype = rpmTagGetTagType(tag);
     int rc = 0;
 
+    if (td == NULL)
+       goto exit;
+
     /* 
      * Sanity checks: 
      * - is the new tag valid at all
@@ -425,8 +417,10 @@ rpmtd rpmtdDup(rpmtd td)
     rpmtd newtd = NULL;
     char **data = NULL;
     int i;
+
+    if (td == NULL)
+       return NULL;
     
-    assert(td != NULL);
     /* TODO: permit other types too */
     if (td->type != RPM_STRING_ARRAY_TYPE && td->type != RPM_I18NSTRING_TYPE) {
        return NULL;
index de7101123770f3cce3868252ad5665c355469793..040ddb340e466f24da0a8cd81e27d2c6be5571cf 100644 (file)
@@ -1,6 +1,12 @@
 #ifndef _RPMTD_H
 #define _RPMTD_H
 
+/** \ingroup rpmtd
+ *  \file lib/rpmtd.h
+ *
+ *  RPM Tag Data Container API
+ */
+
 #include <rpm/rpmtypes.h>
 #include <rpm/argv.h>
 
@@ -30,6 +36,7 @@ struct rpmtd_s {
     rpm_data_t data;   /* pointer to actual data */
     rpmtdFlags flags;  /* flags on memory allocation etc */
     int ix;            /* iteration index */
+    rpm_count_t size;  /* size of data (only works for RPMTD_IMMUTABLE atm) */
 };
 
 /** \ingroup rpmtd
@@ -66,6 +73,14 @@ void rpmtdFreeData(rpmtd td);
  */
 rpm_count_t rpmtdCount(rpmtd td);
 
+/** \ingroup rpmtd
+ * Retrieve container data size (eg required for allocation).
+ * Note this currently only works for RPMTD_IMMUTABLE data.
+ * @param td           Tag data container
+ * @return             Data size in bytes.
+ */
+rpm_count_t rpmtdSize(rpmtd td);
+
 /** \ingroup rpmtd
  * Retrieve tag of the container.
  * @param td           Tag data container
index da6f48c5c5523f036d6f12cf0b77a58a07321530..66194dc3bb518eb797c3f32ba89689c4bc2254ec 100644 (file)
@@ -13,6 +13,7 @@
 #include <rpm/rpmdb.h>
 #include <rpm/rpmlog.h>
 
+#include "lib/misc.h"
 #include "lib/rpmplugins.h"
 #include "lib/rpmte_internal.h"
 /* strpool-related interfaces */
@@ -50,7 +51,8 @@ struct rpmte_s {
     rpmds conflicts;           /*!< Conflicts: dependencies. */
     rpmds obsoletes;           /*!< Obsoletes: dependencies. */
     rpmds order;               /*!< Order: dependencies. */
-    rpmfi fi;                  /*!< File information. */
+    rpmfiles files;            /*!< File information. */
+    rpmfi fi;                  /*!< File iterator (backwards compat) */
     rpmps probs;               /*!< Problems (relocations) */
     rpmts ts;                  /*!< Parent transaction */
 
@@ -70,11 +72,6 @@ struct rpmte_s {
     int failed;                        /*!< (parent) install/erase failed */
 
     rpmfs fs;
-
-    ARGV_t lastInCollectionsAny;       /*!< list of collections this te is the last to be installed or removed */
-    ARGV_t lastInCollectionsAdd;       /*!< list of collections this te is the last to be only installed */
-    ARGV_t firstInCollectionsRemove;   /*!< list of collections this te is the first to be only removed */
-    ARGV_t collections;                        /*!< list of collections */
 };
 
 /* forward declarations */
@@ -91,111 +88,26 @@ void rpmteCleanDS(rpmte te)
     te->order = rpmdsFree(te->order);
 }
 
-static rpmfi getFI(rpmte p, Header h)
+static rpmfiles getFiles(rpmte p, Header h)
 {
     rpmfiFlags fiflags;
     fiflags = (p->type == TR_ADDED) ? (RPMFI_NOHEADER | RPMFI_FLAGS_INSTALL) :
                                      (RPMFI_NOHEADER | RPMFI_FLAGS_ERASE);
 
     /* relocate stuff in header if necessary */
-    if (rpmteType(p) == TR_ADDED && rpmfsFC(p->fs) > 0 && p->nrelocs) {
-       if (!headerIsSource(h) && !headerIsEntry(h, RPMTAG_ORIGBASENAMES)) {
-           rpmRelocateFileList(p->relocs, p->nrelocs, p->fs, h);
-       }
-    }
-    return rpmfiNewPool(rpmtsPool(p->ts), h, RPMTAG_BASENAMES, fiflags);
-}
-
-/* stupid bubble sort, but it's probably faster here */
-static void sortRelocs(rpmRelocation *relocations, int numRelocations)
-{
-    for (int i = 0; i < numRelocations; i++) {
-       int madeSwap = 0;
-       for (int j = 1; j < numRelocations; j++) {
-           rpmRelocation tmpReloc;
-           if (relocations[j - 1].oldPath == NULL || /* XXX can't happen */
-               relocations[j    ].oldPath == NULL || /* XXX can't happen */
-               strcmp(relocations[j - 1].oldPath, relocations[j].oldPath) <= 0)
-               continue;
-           tmpReloc = relocations[j - 1];
-           relocations[j - 1] = relocations[j];
-           relocations[j] = tmpReloc;
-           madeSwap = 1;
-       }
-       if (!madeSwap) break;
-    }
-}
-
-static char * stripTrailingChar(char * s, char c)
-{
-    char * t;
-    for (t = s + strlen(s) - 1; *t == c && t >= s; t--)
-       *t = '\0';
-    return s;
-}
-
-static void buildRelocs(rpmte p, Header h, rpmRelocation *relocs)
-{
-    int i;
-    struct rpmtd_s validRelocs;
-
-    for (rpmRelocation *r = relocs; r->oldPath || r->newPath; r++)
-       p->nrelocs++;
-
-    headerGet(h, RPMTAG_PREFIXES, &validRelocs, HEADERGET_MINMEM);
-    p->relocs = xmalloc(sizeof(*p->relocs) * (p->nrelocs+1));
-
-    /* Build sorted relocation list from raw relocations. */
-    for (i = 0; i < p->nrelocs; i++) {
-       char * t;
-
-       /*
-        * Default relocations (oldPath == NULL) are handled in the UI,
-        * not rpmlib.
-        */
-       if (relocs[i].oldPath == NULL) continue; /* XXX can't happen */
-
-       /* FIXME: Trailing /'s will confuse us greatly. Internal ones will 
-          too, but those are more trouble to fix up. :-( */
-       t = xstrdup(relocs[i].oldPath);
-       p->relocs[i].oldPath = (t[0] == '/' && t[1] == '\0')
-           ? t
-           : stripTrailingChar(t, '/');
-
-       /* An old path w/o a new path is valid, and indicates exclusion */
-       if (relocs[i].newPath) {
-           int valid = 0;
-           const char *validprefix;
-
-           t = xstrdup(relocs[i].newPath);
-           p->relocs[i].newPath = (t[0] == '/' && t[1] == '\0')
-               ? t
-               : stripTrailingChar(t, '/');
-
-               /* FIX:  relocations[i].oldPath == NULL */
-           /* Verify that the relocation's old path is in the header. */
-           rpmtdInit(&validRelocs);
-           while ((validprefix = rpmtdNextString(&validRelocs))) {
-               if (rstreq(validprefix, p->relocs[i].oldPath)) {
-                   valid = 1;
-                   break;
+    if (rpmteType(p) == TR_ADDED && rpmfsFC(p->fs) > 0) {
+       if (!headerIsEntry(h, RPMTAG_ORIGBASENAMES)) {
+           if (rpmteIsSource(p)) {
+               /* Unlike binary packages, source relocation can fail */
+               if (rpmRelocateSrpmFileList(h, rpmtsRootDir(p->ts)) < 0) {
+                   return NULL;
                }
+           } else {
+               rpmRelocateFileList(p->relocs, p->nrelocs, p->fs, h);
            }
-
-           if (!valid) {
-               if (p->badrelocs == NULL)
-                   p->badrelocs = xcalloc(p->nrelocs, sizeof(*p->badrelocs));
-               p->badrelocs[i] = 1;
-           }
-       } else {
-           p->relocs[i].newPath = NULL;
        }
     }
-    p->relocs[i].oldPath = NULL;
-    p->relocs[i].newPath = NULL;
-    sortRelocs(p->relocs, p->nrelocs);
-    
-    rpmtdFreeData(&validRelocs);
+    return rpmfilesNew(rpmtsPool(p->ts), h, RPMTAG_BASENAMES, fiflags);
 }
 
 /**
@@ -208,7 +120,7 @@ static void buildRelocs(rpmte p, Header h, rpmRelocation *relocs)
 static int addTE(rpmte p, Header h, fnpyKey key, rpmRelocation * relocs)
 {
     rpmstrPool tspool = rpmtsPool(p->ts);
-    struct rpmtd_s colls, bnames;
+    struct rpmtd_s bnames;
     int rc = 1; /* assume failure */
 
     p->name = headerGetAsString(h, RPMTAG_NAME);
@@ -237,7 +149,7 @@ static int addTE(rpmte p, Header h, fnpyKey key, rpmRelocation * relocs)
     p->relocs = NULL;
     p->badrelocs = NULL;
     if (relocs != NULL)
-       buildRelocs(p, h, relocs);
+       rpmRelocationBuild(h, relocs, &p->nrelocs, &p->relocs, &p->badrelocs);
 
     p->db_instance = headerGetInstance(h);
     p->key = key;
@@ -258,10 +170,10 @@ static int addTE(rpmte p, Header h, fnpyKey key, rpmRelocation * relocs)
     p->fs = rpmfsNew(rpmtdCount(&bnames), (p->type == TR_ADDED));
     rpmtdFreeData(&bnames);
 
-    p->fi = getFI(p, h);
+    p->files = getFiles(p, h);
 
     /* Packages with no files return an empty file info set, NULL is an error */
-    if (p->fi == NULL)
+    if (p->files == NULL)
        goto exit;
 
     /* See if we have pre/posttrans scripts. */
@@ -272,19 +184,6 @@ static int addTE(rpmte p, Header h, fnpyKey key, rpmRelocation * relocs)
                         headerIsEntry(h, RPMTAG_POSTTRANSPROG)) ?
                        RPMTE_HAVE_POSTTRANS : 0;
 
-    p->lastInCollectionsAny = NULL;
-    p->lastInCollectionsAdd = NULL;
-    p->firstInCollectionsRemove = NULL;
-    p->collections = NULL;
-    if (headerGet(h, RPMTAG_COLLECTIONS, &colls, HEADERGET_MINMEM)) {
-       const char *collname;
-       while ((collname = rpmtdNextString(&colls))) {
-           argvAdd(&p->collections, collname);
-       }
-       argvSort(p->collections, NULL);
-       rpmtdFreeData(&colls);
-    }
-
     rpmteColorDS(p, RPMTAG_PROVIDENAME);
     rpmteColorDS(p, RPMTAG_REQUIRENAME);
 
@@ -320,16 +219,12 @@ rpmte rpmteFree(rpmte te)
 
        fdFree(te->fd);
        rpmfiFree(te->fi);
+       rpmfilesFree(te->files);
        headerFree(te->h);
        rpmfsFree(te->fs);
        rpmpsFree(te->probs);
        rpmteCleanDS(te);
 
-       argvFree(te->collections);
-       argvFree(te->lastInCollectionsAny);
-       argvFree(te->lastInCollectionsAdd);
-       argvFree(te->firstInCollectionsRemove);
-
        memset(te, 0, sizeof(*te));     /* XXX trash and burn */
        free(te);
     }
@@ -433,46 +328,6 @@ rpm_color_t rpmteSetColor(rpmte te, rpm_color_t color)
     return ocolor;
 }
 
-ARGV_const_t rpmteCollections(rpmte te)
-{
-    return (te != NULL) ? te->collections : NULL;
-}
-
-int rpmteHasCollection(rpmte te, const char *collname)
-{
-    return (argvSearch(rpmteCollections(te), collname, NULL) != NULL);
-}
-
-int rpmteAddToLastInCollectionAdd(rpmte te, const char *collname)
-{
-    if (te != NULL) {
-       argvAdd(&te->lastInCollectionsAdd, collname);
-       argvSort(te->lastInCollectionsAdd, NULL);
-       return 0;
-    }
-    return -1;
-}
-
-int rpmteAddToLastInCollectionAny(rpmte te, const char *collname)
-{
-    if (te != NULL) {
-       argvAdd(&te->lastInCollectionsAny, collname);
-       argvSort(te->lastInCollectionsAny, NULL);
-       return 0;
-    }
-    return -1;
-}
-
-int rpmteAddToFirstInCollectionRemove(rpmte te, const char *collname)
-{
-    if (te != NULL) {
-       argvAdd(&te->firstInCollectionsRemove, collname);
-       argvSort(te->firstInCollectionsRemove, NULL);
-       return 0;
-    }
-    return -1;
-}
-
 rpm_loff_t rpmtePkgFileSize(rpmte te)
 {
     return (te != NULL ? te->pkgFileSize : 0);
@@ -571,14 +426,12 @@ rpmds rpmteDS(rpmte te, rpmTagVal tag)
     return NULL;
 }
 
-rpmfi rpmteSetFI(rpmte te, rpmfi fi)
+void rpmteCleanFiles(rpmte te)
 {
     if (te != NULL)  {
        te->fi = rpmfiFree(te->fi);
-       if (fi != NULL)
-           te->fi = rpmfiLink(fi);
+       te->files = rpmfilesFree(te->files);
     }
-    return NULL;
 }
 
 rpmfi rpmteFI(rpmte te)
@@ -586,12 +439,20 @@ rpmfi rpmteFI(rpmte te)
     if (te == NULL)
        return NULL;
 
+    if (te->fi == NULL)
+       te->fi = rpmfilesIter(te->files, RPMFI_ITER_FWD);
+
     return te->fi; /* XXX take fi reference here? */
 }
 
+rpmfiles rpmteFiles(rpmte te)
+{
+    return (te != NULL) ? rpmfilesLink(te->files) : NULL;
+}
+
 static void rpmteColorDS(rpmte te, rpmTag tag)
 {
-    rpmfi fi = rpmteFI(te);
+    rpmfi fi;
     rpmds ds = rpmteDS(te, tag);
     char deptype = 'R';
     char mydt;
@@ -602,7 +463,7 @@ static void rpmteColorDS(rpmte te, rpmTag tag)
     unsigned ix;
     int ndx, i;
 
-    if (!(te && (Count = rpmdsCount(ds)) > 0 && rpmfiFC(fi) > 0))
+    if (!(te && (Count = rpmdsCount(ds)) > 0 && rpmfilesFC(te->files) > 0))
        return;
 
     switch (tag) {
@@ -620,8 +481,7 @@ static void rpmteColorDS(rpmte te, rpmTag tag)
     colors = xcalloc(Count, sizeof(*colors));
 
     /* Calculate dependency color. */
-    fi = rpmfiInit(fi, 0);
-    if (fi != NULL)
+    fi = rpmfilesIter(te->files, RPMFI_ITER_FWD);
     while (rpmfiNext(fi) >= 0) {
        val = rpmfiFColor(fi);
        ddict = NULL;
@@ -646,6 +506,7 @@ assert (ix < Count);
        (void) rpmdsSetColor(ds, val);
     }
     free(colors);
+    rpmfiFree(fi);
 }
 
 static Header rpmteDBHeader(rpmte te)
@@ -707,8 +568,8 @@ static int rpmteOpen(rpmte te, int reload_fi)
     if (h != NULL) {
        if (reload_fi) {
            /* This can fail if we get a different, bad header from callback */
-           te->fi = getFI(te, h);
-           rc = (te->fi != NULL);
+           te->files = getFiles(te, h);
+           rc = (te->files != NULL);
        } else {
            rc = 1;
        }
@@ -739,7 +600,7 @@ static int rpmteClose(rpmte te, int reset_fi)
     }
     rpmteSetHeader(te, NULL);
     if (reset_fi) {
-       rpmteSetFI(te, NULL);
+       rpmteCleanFiles(te);
     }
     return 1;
 }
@@ -864,7 +725,7 @@ void rpmteAddRelocProblems(rpmte te)
 
 const char * rpmteTypeString(rpmte te)
 {
-    switch(rpmteType(te)) {
+    switch (rpmteType(te)) {
     case TR_ADDED:     return _("install");
     case TR_REMOVED:   return _("erase");
     default:           return "???";
@@ -876,70 +737,7 @@ rpmfs rpmteGetFileStates(rpmte te)
     return te->fs;
 }
 
-rpmRC rpmteSetupCollectionPlugins(rpmte te)
-{
-    ARGV_const_t colls = rpmteCollections(te);
-    rpmPlugins plugins = rpmtsPlugins(te->ts);
-    rpmRC rc = RPMRC_OK;
-
-    if (!colls) {
-       return rc;
-    }
-
-    rpmteOpen(te, 0);
-    for (; colls && *colls; colls++) {
-       if (!rpmpluginsPluginAdded(plugins, *colls)) {
-           rc = rpmpluginsAddPlugin(plugins, "collection", *colls);
-           if (rc != RPMRC_OK) {
-               break;
-           }
-       }
-       rc = rpmpluginsCallOpenTE(plugins, *colls, te);
-       if (rc != RPMRC_OK) {
-           break;
-       }
-    }
-    rpmteClose(te, 0);
-
-    return rc;
-}
-
-static rpmRC rpmteRunAllCollections(rpmte te, rpmPluginHook hook)
-{
-    ARGV_const_t colls;
-    rpmRC(*collHook) (rpmPlugins, const char *);
-    rpmRC rc = RPMRC_OK;
-
-    if (rpmtsFlags(te->ts) & RPMTRANS_FLAG_NOCOLLECTIONS) {
-       goto exit;
-    }
-
-    switch (hook) {
-    case PLUGINHOOK_COLL_POST_ADD:
-       colls = te->lastInCollectionsAdd;
-       collHook = rpmpluginsCallCollectionPostAdd;
-       break;
-    case PLUGINHOOK_COLL_POST_ANY:
-       colls = te->lastInCollectionsAny;
-       collHook = rpmpluginsCallCollectionPostAny;
-       break;
-    case PLUGINHOOK_COLL_PRE_REMOVE:
-       colls = te->firstInCollectionsRemove;
-       collHook = rpmpluginsCallCollectionPreRemove;
-       break;
-    default:
-       goto exit;
-    }
-
-    for (; colls && *colls; colls++) {
-       rc = collHook(rpmtsPlugins(te->ts), *colls);
-    }
-
-  exit:
-    return rc;
-}
-
-int rpmteProcess(rpmte te, pkgGoal goal)
+int rpmteProcess(rpmte te, pkgGoal goal, int num)
 {
     /* Only install/erase resets pkg file info */
     int scriptstage = (goal != PKG_INSTALL && goal != PKG_ERASE);
@@ -954,20 +752,16 @@ int rpmteProcess(rpmte te, pkgGoal goal)
        }
     }
 
-    if (!scriptstage) {
-       rpmteRunAllCollections(te, PLUGINHOOK_COLL_PRE_REMOVE);
-    }
-
     if (rpmteOpen(te, reset_fi)) {
+       if (!scriptstage) {
+           rpmtsNotify(te->ts, te, RPMCALLBACK_ELEM_PROGRESS, num,
+                       rpmtsMembers(te->ts)->orderCount);
+       }
+
        failed = rpmpsmRun(te->ts, te, goal);
        rpmteClose(te, reset_fi);
     }
     
-    if (!scriptstage) {
-       rpmteRunAllCollections(te, PLUGINHOOK_COLL_POST_ADD);
-       rpmteRunAllCollections(te, PLUGINHOOK_COLL_POST_ANY);
-    }
-
     if (failed) {
        failed = rpmteMarkFailed(te);
     }
index a66c1e91f83c5b17568bad3638c420e271c6c2cc..c52c44a092943b2709e9d91383e4a6dbfbe2e002 100644 (file)
@@ -233,27 +233,19 @@ int rpmteFailed(rpmte te);
 rpmds rpmteDS(rpmte te, rpmTagVal tag);
 
 /** \ingroup rpmte
- * Retrieve file info tag set from transaction element.
+ * Retrieve file info set from transaction element.
  * @param te           transaction element
- * @return             file info tag set
+ * @return             file info set (refcounted)
  */
-rpmfi rpmteFI(rpmte te);
+rpmfiles rpmteFiles(rpmte te);
 
 /** \ingroup rpmte
- * Retrieve list of collections
+ * Retrieve file info iterator from transaction element.
+ * @deprecated         use rpmteFiles() instead
  * @param te           transaction element
- * @return             list of collections
- */
-ARGV_const_t rpmteCollections(rpmte te);
-
-/** \ingroup rpmte
- * Determine a transaction element is part of a collection
- * @param te           transaction element
- * @param collname     collection name
- * @return             1 if collname is part of a collection, 0 if not
+ * @return             file info tag set
  */
-int rpmteHasCollection(rpmte te, const char * collname);
-
+rpmfi rpmteFI(rpmte te);
 
 #ifdef __cplusplus
 }
index abcdb9020822ce89798e9896a30af34384e1b3ba..a5a991ec51d60f63f176cd8ffc3ad5b0ba83781c 100644 (file)
@@ -14,6 +14,8 @@ typedef enum pkgGoal_e {
     PKG_VERIFY         = RPMTAG_VERIFYSCRIPT,
     PKG_PRETRANS       = RPMTAG_PRETRANS,
     PKG_POSTTRANS      = RPMTAG_POSTTRANS,
+    PKG_TRANSFILETRIGGERIN     = RPMTAG_TRANSFILETRIGGERIN,
+    PKG_TRANSFILETRIGGERUN     = RPMTAG_TRANSFILETRIGGERUN,
 } pkgGoal;
 
 /** \ingroup rpmte
@@ -47,7 +49,7 @@ RPM_GNUC_INTERNAL
 rpmte rpmteFree(rpmte te);
 
 RPM_GNUC_INTERNAL
-rpmfi rpmteSetFI(rpmte te, rpmfi fi);
+void rpmteCleanFiles(rpmte te);
 
 RPM_GNUC_INTERNAL
 FD_t rpmteSetFd(rpmte te, FD_t fd);
@@ -56,7 +58,7 @@ RPM_GNUC_INTERNAL
 FD_t rpmtePayload(rpmte te);
 
 RPM_GNUC_INTERNAL
-int rpmteProcess(rpmte te, pkgGoal goal);
+int rpmteProcess(rpmte te, pkgGoal goal, int num);
 
 RPM_GNUC_INTERNAL
 void rpmteAddProblem(rpmte te, rpmProblemType type,
@@ -84,18 +86,6 @@ int rpmteHaveTransScript(rpmte te, rpmTagVal tag);
 /* XXX should be internal too but build code needs for now... */
 rpmfs rpmteGetFileStates(rpmte te);
 
-/* XXX here for now... */
-/**
- * Relocate files in header.
- * @todo multilib file dispositions need to be checked.
- * @param relocations          relocations
- * @param numRelocations       number of relocations
- * @param fs                   file state set
- * @param h                    package header to relocate
- */
-RPM_GNUC_INTERNAL
-void rpmRelocateFileList(rpmRelocation *relocs, int numRelocations, rpmfs fs, Header h);
-
 /** \ingroup rpmte
  * Retrieve size in bytes of package header.
  * @param te           transaction element
@@ -114,44 +104,6 @@ unsigned int rpmteHeaderSize(rpmte te);
 RPM_GNUC_INTERNAL
 rpmRC rpmpsmRun(rpmts ts, rpmte te, pkgGoal goal);
 
-/** \ingroup rpmte
- * Add a collection to the list of last collections for the installation
- * section of a transaction element
- * @param te           transaction element
- * @param collname             collection name
- * @return             0 on success, non-zero on error
- */
-RPM_GNUC_INTERNAL
-int rpmteAddToLastInCollectionAdd(rpmte te, const char * collname);
-
-/** \ingroup rpmte
- * Add a collection to the list of last collections for the installation
- * or removal section of a transaction element
- * @param te           transaction element
- * @param collname             collection name
- * @return             0 on success, non-zero on error
- */
-RPM_GNUC_INTERNAL
-int rpmteAddToLastInCollectionAny(rpmte te, const char * collname);
-
-/** \ingroup rpmte
- * Add a collection to the list of first collections for the removal
- * section of a transaction element
- * @param te           transaction element
- * @param collname             collection name
- * @return             0 on success, non-zero on error
- */
-RPM_GNUC_INTERNAL
-int rpmteAddToFirstInCollectionRemove(rpmte te, const char * collname);
-
-/** \ingroup rpmte
- * Sends the open te plugin hook for each plugins with the transaction element open
- * @param te           transaction element
- * @return             0 on success, non-zero on error
- */
-RPM_GNUC_INTERNAL
-rpmRC rpmteSetupCollectionPlugins(rpmte te);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/rpmtriggers.c b/lib/rpmtriggers.c
new file mode 100644 (file)
index 0000000..23a913d
--- /dev/null
@@ -0,0 +1,632 @@
+#include "system.h"
+
+#include <rpm/rpmts.h>
+#include <rpm/rpmdb.h>
+#include <rpm/rpmds.h>
+#include <rpm/rpmfi.h>
+#include <stdlib.h>
+
+#include "lib/rpmtriggers.h"
+#include "lib/rpmts_internal.h"
+#include "lib/rpmdb_internal.h"
+#include "lib/rpmds_internal.h"
+#include "lib/rpmfi_internal.h"
+#include "lib/rpmte_internal.h"
+#include "lib/rpmchroot.h"
+
+#define TRIGGER_PRIORITY_BOUND 10000
+
+rpmtriggers rpmtriggersCreate(unsigned int hint)
+{
+    rpmtriggers triggers = xmalloc(sizeof(struct rpmtriggers_s));
+    triggers->count = 0;
+    triggers->alloced = hint;
+    triggers->triggerInfo = xmalloc(sizeof(struct triggerInfo_s) *
+                                   triggers->alloced);
+    return triggers;
+}
+
+rpmtriggers rpmtriggersFree(rpmtriggers triggers)
+{
+    _free(triggers->triggerInfo);
+    _free(triggers);
+
+    return NULL;
+}
+
+static void rpmtriggersAdd(rpmtriggers trigs, unsigned int hdrNum,
+                           unsigned int tix, unsigned int priority)
+{
+    if (trigs->count == trigs->alloced) {
+       trigs->alloced <<= 1;
+       trigs->triggerInfo = xrealloc(trigs->triggerInfo,
+                               sizeof(struct triggerInfo_s) * trigs->alloced);
+    }
+
+    trigs->triggerInfo[trigs->count].hdrNum = hdrNum;
+    trigs->triggerInfo[trigs->count].tix = tix;
+    trigs->triggerInfo[trigs->count].priority = priority;
+    trigs->count++;
+}
+
+static int trigCmp(const void *a, const void *b)
+{
+    const struct triggerInfo_s *trigA = a, *trigB = b;
+
+    if (trigA->priority < trigB->priority)
+       return 1;
+
+    if (trigA->priority > trigB->priority)
+       return -1;
+
+    if (trigA->hdrNum < trigB->hdrNum)
+       return -1;
+
+    if (trigA->hdrNum > trigB->hdrNum)
+       return 1;
+
+    if (trigA->tix < trigB->tix)
+       return -1;
+
+    if (trigA->tix > trigB->tix)
+       return 1;
+
+    return 0;
+}
+
+static void rpmtriggersSortAndUniq(rpmtriggers trigs)
+{
+    unsigned int from;
+    unsigned int to = 0;
+    unsigned int count = trigs->count;
+
+    if (count > 1)
+       qsort(trigs->triggerInfo, count, sizeof(struct triggerInfo_s), trigCmp);
+
+    for (from = 0; from < count; from++) {
+       if (from > 0 &&
+           !trigCmp((const void *) &trigs->triggerInfo[from - 1],
+                   (const void *) &trigs->triggerInfo[from])) {
+
+           trigs->count--;
+           continue;
+       }
+       if (from != to)
+           trigs->triggerInfo[to] = trigs->triggerInfo[from];
+       to++;
+    }
+}
+
+void rpmtriggersPrepPostUnTransFileTrigs(rpmts ts, rpmte te)
+{
+    rpmdbMatchIterator mi;
+    rpmdbIndexIterator ii;
+    Header trigH;
+    const void *key;
+    size_t keylen;
+    rpmfiles files;
+    rpmds rpmdsTriggers;
+    rpmds rpmdsTrigger;
+
+    ii = rpmdbIndexIteratorInit(rpmtsGetRdb(ts), RPMDBI_TRANSFILETRIGGERNAME);
+    mi = rpmdbNewIterator(rpmtsGetRdb(ts), RPMDBI_PACKAGES);
+    files = rpmteFiles(te);
+
+    /* Iterate over file triggers in rpmdb */
+    while ((rpmdbIndexIteratorNext(ii, &key, &keylen)) == 0) {
+       char pfx[keylen + 1];
+       memcpy(pfx, key, keylen);
+       pfx[keylen] = '\0';
+       /* Check if file trigger matches any installed file in this te */
+       rpmfi fi = rpmfilesFindPrefix(files, pfx);
+       while (rpmfiNext(fi) >= 0) {
+           if (RPMFILE_IS_INSTALLED(rpmfiFState(fi))) {
+               /* If yes then store it */
+               rpmdbAppendIterator(mi, rpmdbIndexIteratorPkgOffsets(ii),
+                               rpmdbIndexIteratorNumPkgs(ii));
+               break;
+           }
+       }
+       rpmfiFree(fi);
+    }
+    rpmdbIndexIteratorFree(ii);
+
+    if (rpmdbGetIteratorCount(mi)) {
+       /* Filter triggers and save only trans postun triggers into ts */
+       while ((trigH = rpmdbNextIterator(mi)) != NULL) {
+           int tix = 0;
+           rpmdsTriggers = rpmdsNew(trigH, RPMTAG_TRANSFILETRIGGERNAME, 0);
+           while ((rpmdsTrigger = rpmdsFilterTi(rpmdsTriggers, tix))) {
+               if ((rpmdsNext(rpmdsTrigger) >= 0) &&
+                   (rpmdsFlags(rpmdsTrigger) & RPMSENSE_TRIGGERPOSTUN)) {
+                   struct rpmtd_s priorities;
+
+                   headerGet(trigH, RPMTAG_TRANSFILETRIGGERPRIORITIES,
+                               &priorities, HEADERGET_MINMEM);
+                   rpmtdSetIndex(&priorities, tix);
+                   rpmtriggersAdd(ts->trigs2run, rpmdbGetIteratorOffset(mi),
+                                   tix, *rpmtdGetUint32(&priorities));
+               }
+               rpmdsFree(rpmdsTrigger);
+               tix++;
+           }
+           rpmdsFree(rpmdsTriggers);
+       }
+    }
+    rpmdbFreeIterator(mi);
+}
+
+int runPostUnTransFileTrigs(rpmts ts)
+{
+    int i;
+    Header trigH;
+    struct rpmtd_s installPrefixes;
+    rpmScript script;
+    rpmtriggers trigs = ts->trigs2run;
+    int nerrors = 0;
+
+    if (rpmChrootIn() != 0)
+       return -1;
+
+    rpmtriggersSortAndUniq(trigs);
+    /* Iterate over stored triggers */
+    for (i = 0; i < trigs->count; i++) {
+       /* Get header containing trigger script */
+       trigH = rpmdbGetHeaderAt(rpmtsGetRdb(ts),
+                               trigs->triggerInfo[i].hdrNum);
+
+       /* Maybe package with this trigger is already uninstalled */
+       if (trigH == NULL)
+           continue;
+
+       /* Prepare and run script */
+       script = rpmScriptFromTriggerTag(trigH,
+               triggertag(RPMSENSE_TRIGGERPOSTUN),
+               RPMSCRIPT_TRANSFILETRIGGER, trigs->triggerInfo[i].tix);
+
+       headerGet(trigH, RPMTAG_INSTPREFIXES, &installPrefixes,
+               HEADERGET_ALLOC|HEADERGET_ARGV);
+
+       nerrors += runScript(ts, NULL, trigH, installPrefixes.data, script, 0, 0);
+       rpmtdFreeData(&installPrefixes);
+       rpmScriptFree(script);
+       headerFree(trigH);
+    }
+
+    rpmChrootOut();
+
+    return nerrors;
+}
+
+/*
+ * Get files from next package from match iterator. If files are
+ * available in memory then don't read them from rpmdb.
+ */
+static rpmfiles rpmtsNextFiles(rpmts ts, rpmdbMatchIterator mi)
+{
+    Header h;
+    rpmte *te;
+    rpmfiles files = NULL;
+    rpmstrPool pool = ts->members->pool;
+    int ix;
+    unsigned int offset;
+
+    ix = rpmdbGetIteratorIndex(mi);
+    if (ix < rpmdbGetIteratorCount(mi)) {
+       offset = rpmdbGetIteratorOffsetFor(mi, ix);
+       if (packageHashGetEntry(ts->members->removedPackages, offset,
+                               &te, NULL, NULL)) {
+           /* Files are available in memory */
+           files  = rpmteFiles(te[0]);
+       }
+
+       if (packageHashGetEntry(ts->members->installedPackages, offset,
+                               &te, NULL, NULL)) {
+           /* Files are available in memory */
+           files  = rpmteFiles(te[0]);
+       }
+    }
+
+    if (files) {
+       rpmdbSetIteratorIndex(mi, ix + 1);
+    } else {
+       /* Files are not available in memory. Read them from rpmdb */
+       h = rpmdbNextIterator(mi);
+       if (h) {
+           files = rpmfilesNew(pool, h, RPMTAG_BASENAMES,
+                               RPMFI_FLAGS_FILETRIGGER);
+       }
+    }
+
+    return files;
+}
+
+
+typedef struct matchFilesIter_s {
+    rpmts ts;
+    rpmds rpmdsTrigger;
+    rpmfiles files;
+    rpmfi fi;
+    rpmfs fs;
+    const char *pfx;
+    rpmdbMatchIterator pi;
+    packageHash tranPkgs;
+} *matchFilesIter;
+
+static matchFilesIter matchFilesIterator(rpmds trigger, rpmfiles files, rpmte te)
+{
+    matchFilesIter mfi = xcalloc(1, sizeof(*mfi));
+    rpmdsInit(trigger);
+    mfi->rpmdsTrigger = trigger;
+    mfi->files = rpmfilesLink(files);
+    mfi->fs = rpmteGetFileStates(te);
+    return mfi;
+}
+
+static matchFilesIter matchDBFilesIterator(rpmds trigger, rpmts ts,
+                                           int inTransaction)
+{
+    matchFilesIter mfi = xcalloc(1, sizeof(*mfi));
+    rpmsenseFlags sense;
+
+    rpmdsSetIx(trigger, 0);
+    sense = rpmdsFlags(trigger);
+    rpmdsInit(trigger);
+
+    mfi->rpmdsTrigger = trigger;
+    mfi->ts = ts;
+
+    /* If inTransaction is set then filter out packages that aren't in transaction */
+    if (inTransaction) {
+       if (sense & RPMSENSE_TRIGGERIN)
+           mfi->tranPkgs = ts->members->installedPackages;
+       else
+           mfi->tranPkgs = ts->members->removedPackages;
+    }
+    return mfi;
+}
+
+static const char *matchFilesNext(matchFilesIter mfi)
+{
+    const char *matchFile = NULL;
+    int fx = 0;
+
+    /* Decide if we iterate over given files (mfi->files) */
+    if (!mfi->ts)
+       do {
+           /* Get next file from mfi->fi */
+           matchFile = NULL;
+           while (matchFile == NULL && rpmfiNext(mfi->fi) >= 0) {
+               if (!XFA_SKIPPING(rpmfsGetAction(mfi->fs, rpmfiFX(mfi->fi))))
+                   matchFile = rpmfiFN(mfi->fi);
+           }
+           if (matchFile)
+               break;
+
+           /* If we are done with current mfi->fi, create mfi->fi for next prefix */
+           fx = rpmdsNext(mfi->rpmdsTrigger);
+           mfi->pfx = rpmdsN(mfi->rpmdsTrigger);
+           rpmfiFree(mfi->fi);
+           mfi->fi = rpmfilesFindPrefix(mfi->files, mfi->pfx);
+
+       } while (fx >= 0);
+    /* or we iterate over files in rpmdb */
+    else
+       do {
+           matchFile = NULL;
+           while (matchFile == NULL && rpmfiNext(mfi->fi) >= 0) {
+               if (RPMFILE_IS_INSTALLED(rpmfiFState(mfi->fi)))
+                   matchFile = rpmfiFN(mfi->fi);
+           }
+           if (matchFile)
+               break;
+
+           /* If we are done with current mfi->fi, create mfi->fi for next package */
+           rpmfilesFree(mfi->files);
+           rpmfiFree(mfi->fi);
+           mfi->files = rpmtsNextFiles(mfi->ts, mfi->pi);
+           mfi->fi = rpmfilesFindPrefix(mfi->files, mfi->pfx);
+           if (mfi->files)
+               continue;
+
+           /* If we are done with all packages, go through packages with new prefix */
+           fx = rpmdsNext(mfi->rpmdsTrigger);
+           mfi->pfx = rpmdsN(mfi->rpmdsTrigger);
+           rpmdbFreeIterator(mfi->pi);
+           mfi->pi = rpmdbInitPrefixIterator(rpmtsGetRdb(mfi->ts),
+                                               RPMDBI_DIRNAMES, mfi->pfx, 0);
+
+           rpmdbFilterIterator(mfi->pi, mfi->tranPkgs, 0);
+           /* Only walk through each header with matches once */
+           rpmdbUniqIterator(mfi->pi);
+
+       } while (fx >= 0);
+
+
+    return matchFile;
+}
+
+static int matchFilesEmpty(matchFilesIter mfi)
+{
+    const char *matchFile;
+
+    /* Try to get the first file */
+    matchFile = matchFilesNext(mfi);
+
+    /* Rewind back this file */
+    rpmfiInit(mfi->fi, 0);
+
+    if (matchFile)
+       /* We have at least one file so iterator is not empty */
+       return 0;
+    else
+       /* No file in iterator */
+       return 1;
+}
+
+static matchFilesIter matchFilesIteratorFree(matchFilesIter mfi)
+{
+    rpmfiFree(mfi->fi);
+    rpmfilesFree(mfi->files);
+    rpmdbFreeIterator(mfi->pi);
+    free(mfi);
+    return NULL;
+}
+
+/*
+ * Run all file triggers in header h
+ * @param searchMode       0 match trigger prefixes against files in te
+ *                         1 match trigger prefixes against files in whole ts
+ *                         2 match trigger prefixes against files in whole
+ *                           rpmdb
+ */
+static int runHandleTriggersInPkg(rpmts ts, rpmte te, Header h,
+                               rpmsenseFlags sense, rpmscriptTriggerModes tm,
+                               int searchMode, int ti)
+{
+    int nerrors = 0;
+    rpmds rpmdsTriggers, rpmdsTrigger;
+    rpmfiles files = NULL;
+    matchFilesIter mfi = NULL;
+    rpmScript script;
+    struct rpmtd_s installPrefixes;
+    char *(*inputFunc)(void *);
+
+    rpmdsTriggers = rpmdsNew(h, triggerDsTag(tm), 0);
+    rpmdsTrigger = rpmdsFilterTi(rpmdsTriggers, ti);
+    /*
+     * Now rpmdsTrigger contains all dependencies belonging to one trigger
+     * with trigger index tix. Have a look at the first one to check flags.
+     */
+    if ((rpmdsNext(rpmdsTrigger) >= 0) &&
+       (rpmdsFlags(rpmdsTrigger) & sense)) {
+
+       switch (searchMode) {
+           case 0:
+               /* Create iterator over files in te that this trigger matches */
+               files = rpmteFiles(te);
+               mfi = matchFilesIterator(rpmdsTrigger, files, te);
+               break;
+           case 1:
+               /* Create iterator over files in ts that this trigger matches */
+               mfi = matchDBFilesIterator(rpmdsTrigger, ts, 1);
+               break;
+           case 2:
+               /* Create iterator over files in whole rpmd that this trigger matches */
+               mfi = matchDBFilesIterator(rpmdsTrigger, ts, 0);
+               break;
+       }
+
+       /* If this trigger matches any file then run trigger script */
+       if (!matchFilesEmpty(mfi)) {
+           script = rpmScriptFromTriggerTag(h, triggertag(sense), tm, ti);
+
+           headerGet(h, RPMTAG_INSTPREFIXES, &installPrefixes,
+                   HEADERGET_ALLOC|HEADERGET_ARGV);
+
+
+           /*
+            * As input function set function to get next file from
+            * matching file iterator. As parameter for this function
+            * set matching file iterator. Input function will be called
+            * during execution of trigger script in order to get data
+            * that will be passed as stdin to trigger script. To get
+            * these data from lua script function rpm.input() can be used.
+            */
+           inputFunc = (char *(*)(void *)) matchFilesNext;
+           rpmScriptSetNextFileFunc(script, inputFunc, mfi);
+
+           nerrors += runScript(ts, te, h, installPrefixes.data,
+                               script, 0, 0);
+           rpmtdFreeData(&installPrefixes);
+           rpmScriptFree(script);
+       }
+       rpmfilesFree(files);
+       matchFilesIteratorFree(mfi);
+    }
+    rpmdsFree(rpmdsTrigger);
+    rpmdsFree(rpmdsTriggers);
+
+    return nerrors;
+}
+
+/* Return true if any file in package (te) starts with pfx */
+static int matchFilesInPkg(rpmts ts, rpmte te, const char *pfx,
+                           rpmsenseFlags sense)
+{
+    int rc;
+    rpmfiles files = rpmteFiles(te);
+    rpmfi fi = rpmfilesFindPrefix(files, pfx);
+
+    rc = (fi != NULL);
+    rpmfilesFree(files);
+    rpmfiFree(fi);
+    return rc;
+}
+
+/* Return number of added/removed files starting with pfx in transaction */
+static int matchFilesInTran(rpmts ts, rpmte te, const char *pfx,
+                           rpmsenseFlags sense)
+{
+    int rc = 1;
+    rpmdbMatchIterator pi;
+
+    /* Get all files from rpmdb starting with pfx */
+    pi = rpmdbInitPrefixIterator(rpmtsGetRdb(ts), RPMDBI_DIRNAMES, pfx, 0);
+
+    if (sense & RPMSENSE_TRIGGERIN)
+       /* Leave in pi only files installed in ts */
+       rpmdbFilterIterator(pi, ts->members->installedPackages, 0);
+    else
+       /* Leave in pi only files removed in ts */
+       rpmdbFilterIterator(pi, ts->members->removedPackages, 0);
+
+    rc = rpmdbGetIteratorCount(pi);
+    rpmdbFreeIterator(pi);
+
+    return rc;
+}
+
+rpmRC runFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense,
+                       rpmscriptTriggerModes tm, int priorityClass)
+{
+    int nerrors = 0, i;
+    rpmdbIndexIterator ii;
+    const void *key;
+    char *pfx;
+    size_t keylen;
+    Header trigH;
+    int (*matchFunc)(rpmts, rpmte, const char*, rpmsenseFlags sense);
+    rpmTagVal priorityTag;
+    rpmtriggers triggers = rpmtriggersCreate(10);
+
+    /* Decide if we match triggers against files in te or in whole ts */
+    if (tm == RPMSCRIPT_FILETRIGGER) {
+       matchFunc = matchFilesInPkg;
+       priorityTag = RPMTAG_FILETRIGGERPRIORITIES;
+    } else {
+       matchFunc = matchFilesInTran;
+       priorityTag = RPMTAG_TRANSFILETRIGGERPRIORITIES;
+    }
+
+    ii = rpmdbIndexIteratorInit(rpmtsGetRdb(ts), triggerDsTag(tm));
+
+    /* Loop over all file triggers in rpmdb */
+    while ((rpmdbIndexIteratorNext(ii, &key, &keylen)) == 0) {
+       pfx = xmalloc(keylen + 1);
+       memcpy(pfx, key, keylen);
+       pfx[keylen] = '\0';
+
+       /* Check if file trigger is fired by any file in ts/te */
+       if (matchFunc(ts, te, pfx, sense)) {
+           for (i = 0; i < rpmdbIndexIteratorNumPkgs(ii); i++) {
+               struct rpmtd_s priorities;
+               unsigned int priority;
+               unsigned int offset = rpmdbIndexIteratorPkgOffset(ii, i);
+               unsigned int tix = rpmdbIndexIteratorTagNum(ii, i);
+
+               /*
+                * Don't handle transaction triggers installed in current
+                * transaction to avoid executing the same script two times.
+                * These triggers are handled in runImmedFileTriggers().
+                */
+               if (tm == RPMSCRIPT_TRANSFILETRIGGER &&
+                   (packageHashHasEntry(ts->members->removedPackages, offset) ||
+                   packageHashHasEntry(ts->members->installedPackages, offset)))
+                   continue;
+
+               /* Get priority of trigger from header */
+               trigH = rpmdbGetHeaderAt(rpmtsGetRdb(ts), offset);
+               headerGet(trigH, priorityTag, &priorities, HEADERGET_MINMEM);
+               rpmtdSetIndex(&priorities, tix);
+               priority = *rpmtdGetUint32(&priorities);
+               headerFree(trigH);
+
+               /* Store file trigger in array */
+               rpmtriggersAdd(triggers, offset, tix, priority);
+           }
+       }
+       free(pfx);
+    }
+    rpmdbIndexIteratorFree(ii);
+
+    /* Sort triggers by priority, offset, trigger index */
+    rpmtriggersSortAndUniq(triggers);
+
+    if (rpmChrootIn() != 0) {
+       rpmtriggersFree(triggers);
+       return RPMRC_FAIL;
+    }
+
+    /* Handle stored triggers */
+    for (i = 0; i < triggers->count; i++) {
+       if (priorityClass == 1) {
+           if (triggers->triggerInfo[i].priority < TRIGGER_PRIORITY_BOUND)
+               continue;
+       } else if (priorityClass == 2) {
+           if (triggers->triggerInfo[i].priority >= TRIGGER_PRIORITY_BOUND)
+               continue;
+       }
+
+       trigH = rpmdbGetHeaderAt(rpmtsGetRdb(ts), triggers->triggerInfo[i].hdrNum);
+       if (tm == RPMSCRIPT_FILETRIGGER)
+           nerrors += runHandleTriggersInPkg(ts, te, trigH, sense, tm, 0,
+                                               triggers->triggerInfo[i].tix);
+       else
+           nerrors += runHandleTriggersInPkg(ts, te, trigH, sense, tm, 1,
+                                               triggers->triggerInfo[i].tix);
+       headerFree(trigH);
+    }
+    rpmtriggersFree(triggers);
+    /* XXX an error here would require a full abort */
+    (void) rpmChrootOut();
+
+    return (nerrors == 0) ? RPMRC_OK : RPMRC_FAIL;
+}
+
+rpmRC runImmedFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense,
+                           rpmscriptTriggerModes tm, int priorityClass)
+{
+    int nerrors = 0;
+    int triggersCount, i;
+    Header trigH = rpmteHeader(te);
+    struct rpmtd_s priorities;
+    rpmTagVal priorityTag;
+    rpmtriggers triggers;
+
+    if (tm == RPMSCRIPT_FILETRIGGER) {
+       priorityTag = RPMTAG_FILETRIGGERPRIORITIES;
+    } else {
+       priorityTag = RPMTAG_TRANSFILETRIGGERPRIORITIES;
+    }
+    headerGet(trigH, priorityTag, &priorities, HEADERGET_MINMEM);
+
+    triggersCount = rpmtdCount(&priorities);
+    triggers = rpmtriggersCreate(triggersCount);
+
+    for (i = 0; i < triggersCount; i++) {
+       rpmtdSetIndex(&priorities, i);
+       /* Offset is not important, all triggers are from the same package */
+       rpmtriggersAdd(triggers, 0, i, *rpmtdGetUint32(&priorities));
+    }
+
+    /* Sort triggers by priority, offset, trigger index */
+    rpmtriggersSortAndUniq(triggers);
+
+    for (i = 0; i < triggersCount; i++) {
+       if (priorityClass == 1) {
+           if (triggers->triggerInfo[i].priority < TRIGGER_PRIORITY_BOUND)
+               continue;
+       } else if (priorityClass == 2) {
+           if (triggers->triggerInfo[i].priority >= TRIGGER_PRIORITY_BOUND)
+               continue;
+       }
+
+       nerrors += runHandleTriggersInPkg(ts, te, trigH, sense, tm, 2,
+                                           triggers->triggerInfo[i].tix);
+    }
+    rpmtriggersFree(triggers);
+    headerFree(trigH);
+
+    return (nerrors == 0) ? RPMRC_OK : RPMRC_FAIL;
+}
diff --git a/lib/rpmtriggers.h b/lib/rpmtriggers.h
new file mode 100644 (file)
index 0000000..5ae9edd
--- /dev/null
@@ -0,0 +1,84 @@
+#ifndef _RPMTRIGGERS_H
+#define _RPMTRIGGERS_H
+
+#include <rpm/rpmutil.h>
+#include "lib/rpmscript.h"
+
+struct triggerInfo_s {
+    unsigned int hdrNum;
+    unsigned int tix;
+    unsigned int priority;
+};
+
+typedef struct rpmtriggers_s {
+    struct triggerInfo_s *triggerInfo;
+    int count;
+    int alloced;
+} *rpmtriggers;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+RPM_GNUC_INTERNAL
+rpmtriggers rpmtriggersCreate(unsigned int hint);
+
+RPM_GNUC_INTERNAL
+rpmtriggers rpmtriggersFree(rpmtriggers triggers);
+
+/*
+ * Prepare post trans uninstall file triggers. After transcation uninstalled
+ * files are not saved anywhere. So we need during uninstalation of every
+ * package, in time when the files to uninstall are still available,
+ * to determine and store triggers that should be set off after transaction.
+ */
+RPM_GNUC_INTERNAL
+void rpmtriggersPrepPostUnTransFileTrigs(rpmts ts, rpmte te);
+
+/* Run triggers stored in ts */
+RPM_GNUC_INTERNAL
+int runPostUnTransFileTrigs(rpmts ts);
+
+/*
+ * It runs file triggers in other package(s) this package/transaction sets off.
+ * If tm is RPMSCRIPT_FILETRIGGERSCRIPT then it runs file triggers that are
+ * fired by files in transaction entry. If tm is RPMSCRIPT_TRANSFILETRIGGERSCRIPT
+ * then it runs file triggers that are fired by all files in transaction set.
+ * In that case te can be NULL.
+ *
+ * @param ts           transaction set
+ * @param te           transaction entry
+ * @param sense                defines which triggers should be set off (triggerin,
+ *                     triggerun, triggerpostun)
+ * @param tm           trigger mode, (filetrigger/transfiletrigger)
+ * @param priorityClass        1 to run triggers that should be executed before
+ *                     standard scriptlets
+ *                     2 to run triggers that should be executed after
+ *                     standard scriptlets
+ *                     0 to run all triggers
+ */
+RPM_GNUC_INTERNAL
+rpmRC runFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense,
+                       rpmscriptTriggerModes tm, int priorityClass);
+
+/* Run file triggers in this te other package(s) set off.
+ * @param ts           transaction set
+ * @param te           transaction entry
+ * @param sense                defines which triggers should be set off (triggerin,
+ *                     triggerun, triggerpostun)
+ * @param tm           trigger mode, (filetrigger/transfiletrigger)
+ * @param priorityClass        1 to run triggers that should be executed before
+ *                     standard scriptlets
+ *                     2 to run triggers that should be executed after
+ *                     standard scriptlets
+ *                     0 to run all triggers
+ */
+RPM_GNUC_INTERNAL
+rpmRC runImmedFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense,
+                           rpmscriptTriggerModes tm, int priorityClass);
+#ifdef __cplusplus
+}
+#endif
+#endif /* _RPMTRIGGERS_H */
+
index d3b893a1d8ad605dbf792f613475595725b5c117..49f1a369bc9c5f18139b7cb4af8f3bfa960d0ed6 100644 (file)
@@ -19,6 +19,7 @@
 #include <rpm/rpmds.h>
 #include <rpm/rpmfi.h>
 #include <rpm/rpmlog.h>
+#include <rpm/rpmsq.h>
 #include <rpm/rpmte.h>
 
 #include "rpmio/digest.h"
@@ -28,6 +29,7 @@
 #include "lib/rpmts_internal.h"
 #include "lib/rpmte_internal.h"
 #include "lib/misc.h"
+#include "lib/rpmtriggers.h"
 
 #include "debug.h"
 
@@ -39,6 +41,12 @@ struct rpmtsi_s {
     int oc;            /*!< iterator index. */
 };
 
+struct rpmtxn_s {
+    rpmlock lock;      /* transaction lock */
+    rpmtxnFlags flags; /* transaction flags */
+    rpmts ts;          /* parent transaction set reference */
+};
+
 static void loadKeyring(rpmts ts);
 
 int _rpmts_stats = 0;
@@ -97,16 +105,16 @@ int rpmtsOpenDB(rpmts ts, int dbmode)
 
 int rpmtsSuspendResumeDBLock(rpmts ts, int mode)
 {
-    return rpmdbSuspendResumeDBLock(ts->rdb, mode);
+    return 0;//rpmdbSuspendResumeDBLock(ts->rdb, mode);
 }
 
 int rpmtsInitDB(rpmts ts, int dbmode)
 {
-    rpmlock lock = rpmtsAcquireLock(ts);
+    rpmtxn txn = rpmtxnBegin(ts, RPMTXN_WRITE);
     int rc = -1;
-    if (lock)
+    if (txn)
            rc = rpmdbInit(ts->rootDir, dbmode);
-    rpmlockFree(lock);
+    rpmtxnEnd(txn);
     return rc;
 }
 
@@ -131,19 +139,19 @@ int rpmtsSetDBMode(rpmts ts, int dbmode)
 int rpmtsRebuildDB(rpmts ts)
 {
     int rc = -1;
-    rpmlock lock = NULL;
+    rpmtxn txn = NULL;
 
     /* Cannot do this on a populated transaction set */
     if (rpmtsNElements(ts) > 0)
        return -1;
 
-    lock = rpmtsAcquireLock(ts);
-    if (lock) {
+    txn = rpmtxnBegin(ts, RPMTXN_WRITE);
+    if (txn) {
        if (!(ts->vsflags & RPMVSF_NOHDRCHK))
            rc = rpmdbRebuild(ts->rootDir, ts, headerCheck);
        else
            rc = rpmdbRebuild(ts->rootDir, NULL, NULL);
-       rpmlockFree(lock);
+       rpmtxnEnd(txn);
     }
     return rc;
 }
@@ -151,10 +159,10 @@ int rpmtsRebuildDB(rpmts ts)
 int rpmtsVerifyDB(rpmts ts)
 {
     int rc = -1;
-    rpmlock lock = rpmtsAcquireLock(ts);
-    if (lock) {
+    rpmtxn txn = rpmtxnBegin(ts, RPMTXN_READ);
+    if (txn) {
        rc = rpmdbVerify(ts->rootDir);
-       rpmlockFree(lock);
+       rpmtxnEnd(txn);
     }
     return rc;
 }
@@ -273,7 +281,10 @@ static int loadKeyringFromFiles(rpmts ts)
     }
 
     for (char **f = files; *f; f++) {
+       int subkeysCount, i;
+       rpmPubkey *subkeys;
        rpmPubkey key = rpmPubkeyRead(*f);
+
        if (!key) {
            rpmlog(RPMLOG_ERR, _("%s: reading of public key failed.\n"), *f);
            continue;
@@ -282,7 +293,22 @@ static int loadKeyringFromFiles(rpmts ts)
            nkeys++;
            rpmlog(RPMLOG_DEBUG, "added key %s to keyring\n", *f);
        }
+       subkeys = rpmGetSubkeys(key, &subkeysCount);
        rpmPubkeyFree(key);
+
+       for (i = 0; i < subkeysCount; i++) {
+           rpmPubkey subkey = subkeys[i];
+
+           if (rpmKeyringAddKey(ts->keyring, subkey) == 0) {
+               rpmlog(RPMLOG_DEBUG,
+                   "added subkey %d of main key %s to keyring\n",
+                   i, *f);
+
+               nkeys++;
+           }
+           rpmPubkeyFree(subkey);
+       }
+       free(subkeys);
     }
 exit:
     free(pkpath);
@@ -311,6 +337,9 @@ static int loadKeyringFromDB(rpmts ts)
 
            if (rpmBase64Decode(key, (void **) &pkt, &pktlen) == 0) {
                rpmPubkey key = rpmPubkeyNew(pkt, pktlen);
+               int subkeysCount, i;
+               rpmPubkey *subkeys = rpmGetSubkeys(key, &subkeysCount);
+
                if (rpmKeyringAddKey(ts->keyring, key) == 0) {
                    char *nvr = headerGetAsString(h, RPMTAG_NVR);
                    rpmlog(RPMLOG_DEBUG, "added key %s to keyring\n", nvr);
@@ -318,6 +347,22 @@ static int loadKeyringFromDB(rpmts ts)
                    nkeys++;
                }
                rpmPubkeyFree(key);
+
+               for (i = 0; i < subkeysCount; i++) {
+                   rpmPubkey subkey = subkeys[i];
+
+                   if (rpmKeyringAddKey(ts->keyring, subkey) == 0) {
+                       char *nvr = headerGetAsString(h, RPMTAG_NVR);
+                       rpmlog(RPMLOG_DEBUG,
+                           "added subkey %d of main key %s to keyring\n",
+                           i, nvr);
+
+                       free(nvr);
+                       nkeys++;
+                   }
+                   rpmPubkeyFree(subkey);
+               }
+               free(subkeys);
                free(pkt);
            }
        }
@@ -343,7 +388,8 @@ static void loadKeyring(rpmts ts)
 }
 
 /* Build pubkey header. */
-static int makePubkeyHeader(rpmts ts, rpmPubkey key, Header * hdrp)
+static int makePubkeyHeader(rpmts ts, rpmPubkey key, rpmPubkey *subkeys,
+                           int subkeysCount, Header * hdrp)
 {
     Header h = headerNew();
     const char * afmt = "%{pubkeys:armor}";
@@ -364,6 +410,7 @@ static int makePubkeyHeader(rpmts ts, rpmPubkey key, Header * hdrp)
     char * r = NULL;
     char * evr = NULL;
     int rc = -1;
+    int i;
 
     if ((enc = rpmPubkeyBase64(key)) == NULL)
        goto exit;
@@ -374,12 +421,12 @@ static int makePubkeyHeader(rpmts ts, rpmPubkey key, Header * hdrp)
 
     /* Build header elements. */
     v = pgpHexStr(pubp->signid, sizeof(pubp->signid)); 
-    r = pgpHexStr(pubp->time, sizeof(pubp->time));
     userid = pubp->userid ? pubp->userid : "none";
-    keytime = pgpGrab(pubp->time, sizeof(pubp->time));
+    keytime = pubp->time;
 
     rasprintf(&n, "gpg(%s)", v+8);
     rasprintf(&u, "gpg(%s)", userid);
+    rasprintf(&r, "%x", keytime);
     rasprintf(&evr, "%d:%s-%s", pubp->version, v, r);
 
     headerPutString(h, RPMTAG_PUBKEYS, enc);
@@ -411,6 +458,27 @@ static int makePubkeyHeader(rpmts ts, rpmPubkey key, Header * hdrp)
     headerPutUint32(h, RPMTAG_BUILDTIME, &keytime, 1);
     headerPutString(h, RPMTAG_SOURCERPM, "(none)");
 
+    for (i = 0; i < subkeysCount; i++) {
+       char *v, *r, *n, *evr;
+       pgpDigParams pgpkey;
+
+       pgpkey = rpmPubkeyPgpDigParams(subkeys[i]);
+       v = pgpHexStr(pgpkey->signid, sizeof(pgpkey->signid));
+
+       rasprintf(&n, "gpg(%s)", v+8);
+       rasprintf(&r, "%x", pgpkey->time);
+       rasprintf(&evr, "%d:%s-%s", pubp->version, v, r);
+
+       headerPutString(h, RPMTAG_PROVIDENAME, n);
+       headerPutString(h, RPMTAG_PROVIDEVERSION, evr);
+       headerPutUint32(h, RPMTAG_PROVIDEFLAGS, &pflags, 1);
+
+       free(v);
+       free(r);
+       free(n);
+       free(evr);
+    }
+
     /* Reload the lot to immutable region and stomp sha1 digest on it */
     h = headerReload(h, RPMTAG_HEADERIMMUTABLE);
     if (h != NULL) {
@@ -446,14 +514,32 @@ exit:
     return rc;
 }
 
+rpmRC rpmtsImportHeader(rpmtxn txn, Header h, rpmFlags flags)
+{
+    rpmRC rc = RPMRC_FAIL;
+
+    if (txn && h && rpmtsOpenDB(txn->ts, (O_RDWR|O_CREAT)) == 0) {
+       if (rpmdbAdd(rpmtsGetRdb(txn->ts), h) == 0) {
+           rc = RPMRC_OK;
+       }
+    }
+    return rc;
+}
+
 rpmRC rpmtsImportPubkey(const rpmts ts, const unsigned char * pkt, size_t pktlen)
 {
     Header h = NULL;
     rpmRC rc = RPMRC_FAIL;             /* assume failure */
     rpmPubkey pubkey = NULL;
+    rpmPubkey *subkeys = NULL;
+    int subkeysCount = 0;
     rpmVSFlags oflags = rpmtsVSFlags(ts);
     rpmKeyring keyring;
-    int krc;
+    rpmtxn txn = rpmtxnBegin(ts, RPMTXN_WRITE);
+    int krc, i;
+
+    if (txn == NULL)
+       return rc;
 
     /* XXX keyring wont load if sigcheck disabled, force it temporarily */
     rpmtsSetVSFlags(ts, (oflags & ~_RPMVSF_NOSIGNATURES));
@@ -462,6 +548,10 @@ rpmRC rpmtsImportPubkey(const rpmts ts, const unsigned char * pkt, size_t pktlen
 
     if ((pubkey = rpmPubkeyNew(pkt, pktlen)) == NULL)
        goto exit;
+
+    if ((subkeys = rpmGetSubkeys(pubkey, &subkeysCount)) == NULL)
+       goto exit;
+
     krc = rpmKeyringAddKey(keyring, pubkey);
     if (krc < 0)
        goto exit;
@@ -470,7 +560,7 @@ rpmRC rpmtsImportPubkey(const rpmts ts, const unsigned char * pkt, size_t pktlen
     if (krc == 0) {
        rpm_tid_t tid = rpmtsGetTid(ts);
 
-       if (makePubkeyHeader(ts, pubkey, &h) != 0) 
+       if (makePubkeyHeader(ts, pubkey, subkeys, subkeysCount, &h) != 0)
            goto exit;
 
        headerPutUint32(h, RPMTAG_INSTALLTIME, &tid, 1);
@@ -478,10 +568,7 @@ rpmRC rpmtsImportPubkey(const rpmts ts, const unsigned char * pkt, size_t pktlen
 
        /* Add header to database. */
        if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)) {
-           if (rpmtsOpenDB(ts, (O_RDWR|O_CREAT)))
-               goto exit;
-           if (rpmdbAdd(rpmtsGetRdb(ts), h) != 0)
-               goto exit;
+           rc = rpmtsImportHeader(txn, h, 0);
        }
     }
     rc = RPMRC_OK;
@@ -490,7 +577,12 @@ exit:
     /* Clean up. */
     headerFree(h);
     rpmPubkeyFree(pubkey);
+    for (i = 0; i < subkeysCount; i++)
+       rpmPubkeyFree(subkeys[i]);
+    free(subkeys);
+
     rpmKeyringFree(keyring);
+    rpmtxnEnd(txn);
     return rc;
 }
 
@@ -593,7 +685,7 @@ void rpmtsEmpty(rpmts ts)
     tsmem->orderCount = 0;
     /* The pool cannot be emptied, there might be references to its contents */
     tsmem->pool = rpmstrPoolFree(tsmem->pool);
-    removedHashEmpty(tsmem->removedPackages);
+    packageHashEmpty(tsmem->removedPackages);
     return;
 }
 
@@ -642,7 +734,8 @@ rpmts rpmtsFree(rpmts ts)
 
     (void) rpmtsCloseDB(ts);
 
-    tsmem->removedPackages = removedHashFree(tsmem->removedPackages);
+    tsmem->removedPackages = packageHashFree(tsmem->removedPackages);
+    tsmem->installedPackages = packageHashFree(tsmem->installedPackages);
     tsmem->order = _free(tsmem->order);
     ts->members = _free(ts->members);
 
@@ -654,6 +747,7 @@ rpmts rpmtsFree(rpmts ts)
     }
     ts->rootDir = _free(ts->rootDir);
     ts->lockPath = _free(ts->lockPath);
+    ts->lock = rpmlockFree(ts->lock);
 
     ts->keyring = rpmKeyringFree(ts->keyring);
     ts->netsharedPaths = argvFree(ts->netsharedPaths);
@@ -661,6 +755,8 @@ rpmts rpmtsFree(rpmts ts)
 
     ts->plugins = rpmpluginsFree(ts->plugins);
 
+    rpmtriggersFree(ts->trigs2run);
+
     if (_rpmts_stats)
        rpmtsPrintStats(ts);
 
@@ -731,63 +827,6 @@ void rpmtsSetScriptFd(rpmts ts, FD_t scriptFd)
     }
 }
 
-struct selabel_handle * rpmtsSELabelHandle(rpmts ts)
-{
-#if WITH_SELINUX
-    if (ts != NULL) {
-       return ts->selabelHandle;
-    }
-#endif
-    return NULL;
-}
-
-rpmRC rpmtsSELabelInit(rpmts ts, int open_status)
-{
-#if WITH_SELINUX
-    const char * path = selinux_file_context_path();
-
-    if (ts == NULL || path == NULL) {
-       return RPMRC_FAIL;
-    }
-
-    if (open_status) {
-       selinux_status_close();
-       if (selinux_status_open(0) < 0) {
-           return RPMRC_FAIL;
-       }
-    } else if (!selinux_status_updated() && ts->selabelHandle) {
-       return RPMRC_OK;
-    }
-
-    struct selinux_opt opts[] = {
-       { .type = SELABEL_OPT_PATH, .value = path}
-    };
-
-    if (ts->selabelHandle) {
-       rpmtsSELabelFini(ts, 0);
-    }
-    ts->selabelHandle = selabel_open(SELABEL_CTX_FILE, opts, 1);
-
-    if (!ts->selabelHandle) {
-       return RPMRC_FAIL;
-    }
-#endif
-    return RPMRC_OK;
-}
-
-void rpmtsSELabelFini(rpmts ts, int close_status)
-{
-#if WITH_SELINUX
-    if (ts && ts->selabelHandle) {
-       selabel_close(ts->selabelHandle);
-       ts->selabelHandle = NULL;
-    }
-    if (close_status) {
-       selinux_status_close();
-    }
-#endif
-}
-
 rpm_tid_t rpmtsGetTid(rpmts ts)
 {
     rpm_tid_t tid = (rpm_tid_t)-1;  /* XXX -1 is time(2) error return. */
@@ -918,7 +957,14 @@ rpmop rpmtsOp(rpmts ts, rpmtsOpX opx)
 
 rpmPlugins rpmtsPlugins(rpmts ts)
 {
-    return (ts != NULL ? ts->plugins : NULL);
+    rpmPlugins plugins = NULL;
+
+    if (ts != NULL) {
+       if (ts->plugins == NULL)
+           ts->plugins = rpmpluginsNew(ts);
+       plugins = ts->plugins;
+    }
+    return plugins;
 }
 
 int rpmtsSetNotifyCallback(rpmts ts,
@@ -999,7 +1045,8 @@ rpmts rpmtsCreate(void)
     tsmem->pool = NULL;
     tsmem->delta = 5;
     tsmem->addedPackages = NULL;
-    tsmem->removedPackages = removedHashCreate(128, uintId, uintCmp, NULL, NULL);
+    tsmem->removedPackages = packageHashCreate(128, uintId, uintCmp, NULL, NULL);
+    tsmem->installedPackages = packageHashCreate(128, uintId, uintCmp, NULL, NULL);
     tsmem->orderAlloced = 0;
     tsmem->orderCount = 0;
     tsmem->order = NULL;
@@ -1008,11 +1055,13 @@ rpmts rpmtsCreate(void)
     ts->rootDir = NULL;
     ts->keyring = NULL;
 
-    ts->selabelHandle = NULL;
-
     ts->nrefs = 0;
 
-    ts->plugins = rpmpluginsNew(ts);
+    ts->plugins = NULL;
+
+    ts->trigs2run = rpmtriggersCreate(10);
+
+    ts->min_writes = rpmExpandNumeric("%{_minimize_writes}");
 
     return rpmtsLink(ts);
 }
@@ -1069,9 +1118,13 @@ rpmte rpmtsiNext(rpmtsi tsi, rpmElementTypes types)
 }
 
 #define RPMLOCK_PATH LOCALSTATEDIR "/rpm/.rpm.lock"
-rpmlock rpmtsAcquireLock(rpmts ts)
+rpmtxn rpmtxnBegin(rpmts ts, rpmtxnFlags flags)
 {
     static const char * const rpmlock_path_default = "%{?_rpmlock_path}";
+    rpmtxn txn = NULL;
+
+    if (ts == NULL)
+       return NULL;
 
     if (ts->lockPath == NULL) {
        const char *rootDir = rpmtsRootDir(ts);
@@ -1089,6 +1142,30 @@ rpmlock rpmtsAcquireLock(rpmts ts)
        (void) rpmioMkpath(dirname(t), 0755, getuid(), getgid());
        free(t);
     }
-    return rpmlockAcquire(ts->lockPath, _("transaction"));
+
+    if (ts->lock == NULL)
+       ts->lock = rpmlockNew(ts->lockPath, _("transaction"));
+
+    if (rpmlockAcquire(ts->lock)) {
+       txn = xcalloc(1, sizeof(*txn));
+       txn->lock = ts->lock;
+       txn->flags = flags;
+       txn->ts = rpmtsLink(ts);
+       if (txn->flags & RPMTXN_WRITE)
+           rpmsqBlock(SIG_BLOCK);
+    }
+    
+    return txn;
 }
 
+rpmtxn rpmtxnEnd(rpmtxn txn)
+{
+    if (txn) {
+       rpmlockRelease(txn->lock);
+       if (txn->flags & RPMTXN_WRITE)
+           rpmsqBlock(SIG_UNBLOCK);
+       rpmtsFree(txn->ts);
+       free(txn);
+    }
+    return NULL;
+}
index 059f46d247a98a737878aac2e7a44a61c6fd58b5..e09569a905d28b858f986c4335ae6372adb7462f 100644 (file)
@@ -34,9 +34,10 @@ enum rpmtransFlags_e {
     RPMTRANS_FLAG_NOTRIGGERS   = (1 <<  4),    /*!< from --notriggers */
     RPMTRANS_FLAG_NODOCS       = (1 <<  5),    /*!< from --excludedocs */
     RPMTRANS_FLAG_ALLFILES     = (1 <<  6),    /*!< from --allfiles */
-    /* bit 7 unused */
+    RPMTRANS_FLAG_NOPLUGINS    = (1 <<  7),    /*!< from --noplugins */
     RPMTRANS_FLAG_NOCONTEXTS   = (1 <<  8),    /*!< from --nocontexts */
-    /* bits 9-15 unused */
+    RPMTRANS_FLAG_NOCAPS       = (1 <<  9),    /*!< from --nocaps */
+    /* bits 10-15 unused */
     RPMTRANS_FLAG_NOTRIGGERPREIN= (1 << 16),   /*!< from --notriggerprein */
     RPMTRANS_FLAG_NOPRE                = (1 << 17),    /*!< from --nopre */
     RPMTRANS_FLAG_NOPOST       = (1 << 18),    /*!< from --nopost */
@@ -45,8 +46,9 @@ enum rpmtransFlags_e {
     RPMTRANS_FLAG_NOPREUN      = (1 << 21),    /*!< from --nopreun */
     RPMTRANS_FLAG_NOPOSTUN     = (1 << 22),    /*!< from --nopostun */
     RPMTRANS_FLAG_NOTRIGGERPOSTUN = (1 << 23), /*!< from --notriggerpostun */
-    /* bits 24-25 unused */
-    RPMTRANS_FLAG_NOCOLLECTIONS        = (1 << 26),    /*!< from --nocollections */
+    RPMTRANS_FLAG_NOPRETRANS   = (1 << 24),    /*!< from --nopretrans */
+    RPMTRANS_FLAG_NOPOSTTRANS  = (1 << 25),    /*!< from --noposttrans */
+    /* bit 26 unused */
     RPMTRANS_FLAG_NOMD5                = (1 << 27),    /*!< from --nomd5 */
     RPMTRANS_FLAG_NOFILEDIGEST = (1 << 27),    /*!< from --nofiledigest (alias to --nomd5) */
     /* bits 28-29 unused */
@@ -60,7 +62,9 @@ typedef rpmFlags rpmtransFlags;
   ( RPMTRANS_FLAG_NOPRE |      \
     RPMTRANS_FLAG_NOPOST |     \
     RPMTRANS_FLAG_NOPREUN |    \
-    RPMTRANS_FLAG_NOPOSTUN     \
+    RPMTRANS_FLAG_NOPOSTUN |   \
+    RPMTRANS_FLAG_NOPRETRANS | \
+    RPMTRANS_FLAG_NOPOSTTRANS \
   )
 
 #define        _noTransTriggers        \
@@ -93,11 +97,11 @@ enum rpmVSFlags_e {
     RPMVSF_NEEDPAYLOAD = (1 <<  1),
     /* bit(s) 2-7 unused */
     RPMVSF_NOSHA1HEADER        = (1 <<  8),
-    RPMVSF_NOMD5HEADER = (1 <<  9),    /* unimplemented */
+    RPMVSF_NOSHA256HEADER = (1 <<  9),
     RPMVSF_NODSAHEADER = (1 << 10),
-    RPMVSF_NORSAHEADER = (1 << 11),    /* unimplemented */
+    RPMVSF_NORSAHEADER = (1 << 11),
     /* bit(s) 12-15 unused */
-    RPMVSF_NOSHA1      = (1 << 16),    /* unimplemented */
+    RPMVSF_NOPAYLOAD   = (1 << 16),
     RPMVSF_NOMD5       = (1 << 17),
     RPMVSF_NODSA       = (1 << 18),
     RPMVSF_NORSA       = (1 << 19)
@@ -108,8 +112,8 @@ typedef rpmFlags rpmVSFlags;
 
 #define        _RPMVSF_NODIGESTS       \
   ( RPMVSF_NOSHA1HEADER |      \
-    RPMVSF_NOMD5HEADER |       \
-    RPMVSF_NOSHA1 |            \
+    RPMVSF_NOSHA256HEADER |    \
+    RPMVSF_NOPAYLOAD | \
     RPMVSF_NOMD5 )
 
 #define        _RPMVSF_NOSIGNATURES    \
@@ -120,13 +124,13 @@ typedef rpmFlags rpmVSFlags;
 
 #define        _RPMVSF_NOHEADER        \
   ( RPMVSF_NOSHA1HEADER |      \
-    RPMVSF_NOMD5HEADER |       \
+    RPMVSF_NOSHA256HEADER |    \
     RPMVSF_NODSAHEADER |       \
     RPMVSF_NORSAHEADER )
 
 #define        _RPMVSF_NOPAYLOAD       \
-  ( RPMVSF_NOSHA1 |            \
-    RPMVSF_NOMD5 |             \
+  ( RPMVSF_NOMD5 |             \
+    RPMVSF_NOPAYLOAD |         \
     RPMVSF_NODSA |             \
     RPMVSF_NORSA )
 
@@ -153,6 +157,12 @@ typedef    enum rpmtsOpX_e {
     RPMTS_OP_MAX               = 17
 } rpmtsOpX;
 
+enum rpmtxnFlags_e {
+    RPMTXN_READ                = (1 << 0),
+    RPMTXN_WRITE       = (1 << 1),
+};
+typedef rpmFlags rpmtxnFlags;
+
 /** \ingroup rpmts
  * Perform dependency resolution on the transaction set.
  *
@@ -274,6 +284,15 @@ int rpmtsVerifyDB(rpmts ts);
 rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag,
                        const void * keyp, size_t keylen);
 
+/** \ingroup rpmts
+ * Import a header into the rpmdb
+ * @param txn          transaction handle
+ * @param h            header
+ * @param flags                (unused)
+ * @return              RPMRC_OK/RPMRC_FAIL
+ */
+rpmRC rpmtsImportHeader(rpmtxn txn, Header h, rpmFlags flags);
+
 /** \ingroup rpmts
  * Import public key packet(s).
  * @todo Implicit --update policy for gpg-pubkey headers.
@@ -470,7 +489,7 @@ rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags);
 rpm_color_t rpmtsColor(rpmts ts);
 
 /** \ingroup rpmts
- * Retrieve prefered file color
+ * Retrieve preferred file color
  * @param ts           transaction set
  * @return             color bits
  */
@@ -485,7 +504,7 @@ rpm_color_t rpmtsPrefColor(rpmts ts);
 rpm_color_t rpmtsSetColor(rpmts ts, rpm_color_t color);
 
 /** \ingroup rpmts
- * Set prefered file color
+ * Set preferred file color
  * @param ts           transaction set
  * @param color                new color bits
  * @return             previous color bits
@@ -545,6 +564,16 @@ int rpmtsAddInstallElement(rpmts ts, Header h,
                const fnpyKey key, int upgrade,
                rpmRelocation * relocs);
 
+/** \ingroup rpmts
+ * Add package to be reinstalled to transaction set.
+ *
+ * @param ts           transaction set
+ * @param h            header
+ * @param key          package retrieval key (e.g. file name)
+ * @return             0 on success
+ */
+int rpmtsAddReinstallElement(rpmts ts, Header h, const fnpyKey key);
+
 /** \ingroup rpmts
  * Add package to be erased to transaction set.
  * @param ts           transaction set
@@ -554,6 +583,21 @@ int rpmtsAddInstallElement(rpmts ts, Header h,
  */
 int rpmtsAddEraseElement(rpmts ts, Header h, int dboffset);
 
+/** \ingroup rpmts
+ * Create a transaction (lock) handle
+ * @param ts           transaction set
+ * @param flags                flags
+ * @return             transaction handle
+ */
+rpmtxn rpmtxnBegin(rpmts ts, rpmtxnFlags flags);
+
+/** \ingroup rpmts
+ * Destroy transaction (lock) handle
+ * @param txn          transaction handle
+ * @return             NULL always
+ */
+rpmtxn rpmtxnEnd(rpmtxn txn);
+
 /** \ingroup rpmte
  * Destroy transaction element iterator.
  * @param tsi          transaction element iterator
index d4f25e17eb6e2bbfbf6c36532e558f0c8f1ebff1..1e166d63274b264cfd64efa38b5af4a94c624d1c 100644 (file)
@@ -8,13 +8,16 @@
 #include "lib/fprint.h"
 #include "lib/rpmlock.h"
 #include "lib/rpmdb_internal.h"
+#include "lib/rpmscript.h"
+#include "lib/rpmtriggers.h"
 
 typedef struct diskspaceInfo_s * rpmDiskSpaceInfo;
 
 /* Transaction set elements information */
 typedef struct tsMembers_s {
     rpmstrPool pool;           /*!< Global string pool */
-    removedHash removedPackages;       /*!< Set of packages being removed. */
+    packageHash removedPackages;       /*!< Set of packages being removed. */
+    packageHash installedPackages;     /*!< Set of installed packages */
     rpmal addedPackages;       /*!< Set of packages being installed. */
 
     rpmds rpmlib;              /*!< rpmlib() dependency set. */
@@ -24,6 +27,17 @@ typedef struct tsMembers_s {
     int delta;                 /*!< Delta for reallocation. */
 } * tsMembers;
 
+typedef struct tsTrigger_s {
+    unsigned int hdrNum;
+    int index;
+} tsTrigger;
+
+typedef struct tsTriggers_s {
+    tsTrigger *trigger;
+    int count;
+    int alloced;
+} tsTriggers;
+
 /** \ingroup rpmts
  * The set of packages to be installed/removed atomically.
  */
@@ -47,10 +61,9 @@ struct rpmts_s {
 
     tsMembers members;         /*!< Transaction set member info (order etc) */
 
-    struct selabel_handle * selabelHandle;     /*!< Handle to selabel */
-
     char * rootDir;            /*!< Path to top of install tree. */
     char * lockPath;           /*!< Transaction lock path */
+    rpmlock lock;              /*!< Transaction lock file */
     FD_t scriptFd;             /*!< Scriptlet stdout/stderr. */
     rpm_tid_t tid;             /*!< Transaction id. */
 
@@ -69,6 +82,10 @@ struct rpmts_s {
     rpmPlugins plugins;                /*!< Transaction plugins */
 
     int nrefs;                 /*!< Reference count. */
+
+    rpmtriggers trigs2run;   /*!< Transaction file triggers */
+
+    int min_writes;             /*!< macro minimize_writes used */
 };
 
 #ifdef __cplusplus
@@ -86,6 +103,11 @@ rpmstrPool rpmtsPool(rpmts ts);
 RPM_GNUC_INTERNAL
 tsMembers rpmtsMembers(rpmts ts);
 
+/* Return rpmdb iterator with removals optionally pruned out */
+RPM_GNUC_INTERNAL
+rpmdbMatchIterator rpmtsPrunedIterator(rpmts ts, rpmDbiTagVal tag,
+                                             const char * key, int prune);
+
 RPM_GNUC_INTERNAL
 rpmal rpmtsCreateAl(rpmts ts, rpmElementTypes types);
 
@@ -94,29 +116,11 @@ RPM_GNUC_INTERNAL
 int rpmtsSolve(rpmts ts, rpmds key);
 
 RPM_GNUC_INTERNAL
-rpmlock rpmtsAcquireLock(rpmts ts);
+rpmRC rpmtsSetupTransactionPlugins(rpmts ts);
 
-/** \ingroup rpmts
- * Get the selabel handle from the transaction set
- * @param ts           transaction set
- * @return             rpm selabel handle, or NULL if it hasn't been initialized yet
- */
-struct selabel_handle * rpmtsSELabelHandle(rpmts ts);
-
-/** \ingroup rpmts
- * Initialize selabel
- * @param ts           transaction set
- * @param open_status   if the func should open selinux status or just check it
- * @return             RPMRC_OK on success, RPMRC_FAIL otherwise
- */
-rpmRC rpmtsSELabelInit(rpmts ts, int open_status);
-
-/** \ingroup rpmts
- * Clean up selabel
- * @param ts           transaction set
- * @param close_status  whether we should close selinux status
- */
-void rpmtsSELabelFini(rpmts ts, int close_status);
+RPM_GNUC_INTERNAL
+rpmRC runScript(rpmts ts, rpmte te, Header h, ARGV_const_t prefixes,
+                      rpmScript script, int arg1, int arg2);
 
 #ifdef __cplusplus
 }
index 91ea949077d38402790d1a23d65093837a02b955..1948d183bc511b10a81a6a55f2ead1909a170b72 100644 (file)
@@ -64,10 +64,12 @@ typedef struct rpmts_s * rpmts;
 typedef struct rpmte_s * rpmte;
 typedef struct rpmds_s * rpmds;
 typedef struct rpmfi_s * rpmfi;
+typedef struct rpmfiles_s * rpmfiles;
 typedef struct rpmdb_s * rpmdb;
 typedef struct rpmdbMatchIterator_s * rpmdbMatchIterator;
 typedef struct rpmtsi_s * rpmtsi;
 typedef struct rpmps_s * rpmps;
+typedef struct rpmtxn_s * rpmtxn;
 
 typedef struct rpmdbIndexIterator_s * rpmdbIndexIterator;
 typedef const void * fnpyKey;
@@ -80,6 +82,7 @@ typedef struct rpmKeyring_s * rpmKeyring;
 typedef uint32_t rpmsid;
 typedef struct rpmstrPool_s * rpmstrPool;
 
+typedef struct rpmPlugin_s * rpmPlugin;
 typedef struct rpmPlugins_s * rpmPlugins;
 
 typedef struct rpmgi_s * rpmgi;
index 53a5a6e4dd84d3417e2696bd52dac0f75dfabe8e..119d8e58562c0b64479c67d3a4dc18db53c73622 100644 (file)
@@ -1,7 +1,9 @@
 #include "system.h"
 
+#include <pthread.h>
 #include <pwd.h>
 #include <grp.h>
+#include <netdb.h>
 #include <rpm/rpmlog.h>
 #include <rpm/rpmstring.h>
 
@@ -9,32 +11,6 @@
 #include "lib/rpmug.h"
 #include "debug.h"
 
-#define HASHTYPE strCache
-#define HTKEYTYPE const char *
-#include "lib/rpmhash.H"
-#include "lib/rpmhash.C"
-#undef HASHTYPE
-#undef HTKEYTYPE
-
-static strCache strStash = NULL;
-
-const char * rpmugStashStr(const char *str)
-{
-    const char *ret = NULL;
-    if (str) {
-       if (strStash == NULL) {
-           strStash = strCacheCreate(64, rstrhash, strcmp,
-                                     (strCacheFreeKey)rfree);
-       }
-       
-       if (!strCacheGetEntry(strStash, str, &ret)) {
-           strCacheAddEntry(strStash, xstrdup(str));
-           (void) strCacheGetEntry(strStash, str, &ret);
-       }
-    }
-    return ret;
-}
-
 /* 
  * These really ought to use hash tables. I just made the
  * guess that most files would be owned by root or the same person/group
@@ -55,7 +31,7 @@ int rpmugUid(const char * thisUname, uid_t * uid)
     if (!thisUname) {
        lastUnameLen = 0;
        return -1;
-    } else if (rstreq(thisUname, "root")) {
+    } else if (rstreq(thisUname, UID_0_USER)) {
        *uid = 0;
        return 0;
     }
@@ -98,7 +74,7 @@ int rpmugGid(const char * thisGname, gid_t * gid)
     if (thisGname == NULL) {
        lastGnameLen = 0;
        return -1;
-    } else if (rstreq(thisGname, "root")) {
+    } else if (rstreq(thisGname, GID_0_GROUP)) {
        *gid = 0;
        return 0;
     }
@@ -140,7 +116,7 @@ const char * rpmugUname(uid_t uid)
        lastUid = (uid_t) -1;
        return NULL;
     } else if (uid == (uid_t) 0) {
-       return "root";
+       return UID_0_USER;
     } else if (uid == lastUid) {
        return lastUname;
     } else {
@@ -171,7 +147,7 @@ const char * rpmugGname(gid_t gid)
        lastGid = (gid_t) -1;
        return NULL;
     } else if (gid == (gid_t) 0) {
-       return "root";
+       return GID_0_GROUP;
     } else if (gid == lastGid) {
        return lastGname;
     } else {
@@ -192,11 +168,27 @@ const char * rpmugGname(gid_t gid)
     }
 }
 
+static void loadLibs(void)
+{
+    (void) getpwnam(UID_0_USER);
+    endpwent();
+    (void) getgrnam(GID_0_GROUP);
+    endgrent();
+    (void) gethostbyname("localhost");
+}
+
+int rpmugInit(void)
+{
+    static pthread_once_t libsLoaded = PTHREAD_ONCE_INIT;
+
+    pthread_once(&libsLoaded, loadLibs);
+    return 0;
+}
+
 void rpmugFree(void)
 {
     rpmugUid(NULL, NULL);
     rpmugGid(NULL, NULL);
     rpmugUname(-1);
     rpmugGname(-1);
-    strStash = strCacheFree(strStash);
 }
index 35e5d631d104544db7217af0a4fd14ac7badb56a..22d64eb88ef707dfb44d9038300265cf659cacea 100644 (file)
@@ -3,8 +3,6 @@
 
 #include <sys/types.h>
 
-const char * rpmugStashStr(const char *str);
-
 int rpmugUid(const char * name, uid_t * uid);
 
 int rpmugGid(const char * name, gid_t * gid);
@@ -13,6 +11,8 @@ const char * rpmugUname(uid_t uid);
 
 const char * rpmugGname(gid_t gid);
 
+int rpmugInit(void);
+
 void rpmugFree(void);
 
 #endif /* _RPMUG_H */
index de3beeab46f22f99fec1ae2718f31899ecac2883..b3d08faa4a31354d821cb259106b182410e452fb 100644 (file)
@@ -36,7 +36,7 @@ int rpmvercmp(const char * a, const char * b)
        while (*one && !risalnum(*one) && *one != '~') one++;
        while (*two && !risalnum(*two) && *two != '~') two++;
 
-       /* handle the tilde separator, it sorts before everthing else */
+       /* handle the tilde separator, it sorts before everything else */
        if (*one == '~' || *two == '~') {
            if (*one != '~') return 1;
            if (*two != '~') return -1;
index 51690b857354e5c88bbe858560ef779763556634..4cb463c2f1eceb86922677e58f2c83f2bb490d23 100644 (file)
@@ -3,9 +3,11 @@
 
 /** \ingroup rpmvf
  * \file lib/rpmvf.h
- * @todo Add a more complete API...
+ *
+ * \brief Verify a package. The constants that enable/disable some sanity checks (mainly used at post (un)install)
  */
 #include <rpm/rpmtypes.h>
+#include <rpm/rpmutil.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -85,13 +87,14 @@ typedef rpmFlags rpmVerifyFlags;
 
 /** \ingroup rpmvf
  * Verify file attributes (including digest).
- * @todo gnorpm and python bindings prevent this from being static.
+ * @deprecated         use rpmfiVerify() / rpmfilesVerify() instead
  * @param ts           transaction set
  * @param fi           file info (with linked header and current file index)
  * @retval *res                bit(s) returned to indicate failure
  * @param omitMask     bit(s) to disable verify checks
  * @return             0 on success (or not installed), 1 on error
  */
+RPM_GNUC_DEPRECATED
 int rpmVerifyFile(const rpmts ts, rpmfi fi,
                rpmVerifyAttrs * res, rpmVerifyAttrs omitMask);
 
diff --git a/lib/rpmvs.c b/lib/rpmvs.c
new file mode 100644 (file)
index 0000000..f77bfb0
--- /dev/null
@@ -0,0 +1,456 @@
+#include "system.h"
+
+#include <rpm/rpmkeyring.h>
+#include "lib/rpmvs.h"
+#include "rpmio/digest.h"
+
+#include "debug.h"
+
+struct rpmvs_s {
+    struct rpmsinfo_s *sigs;
+    rpmRC *rcs;
+    char **results;
+    int nsigs;
+    int nalloced;
+};
+
+struct vfytag_s {
+    rpmTagVal tag;
+    rpmTagType tagtype;
+    rpm_count_t tagcount;
+    rpm_count_t tagsize;
+};
+
+static const struct vfytag_s rpmvfytags[] = {
+    {  RPMSIGTAG_SIZE,                 RPM_BIN_TYPE,           0,      0, },
+    {  RPMSIGTAG_PGP,                  RPM_BIN_TYPE,           0,      0, },
+    {  RPMSIGTAG_MD5,                  RPM_BIN_TYPE,           0,      16, },
+    {  RPMSIGTAG_GPG,                  RPM_BIN_TYPE,           0,      0, },
+    {  RPMSIGTAG_PGP5,                 RPM_BIN_TYPE,           0,      0, },
+    {  RPMSIGTAG_PAYLOADSIZE,          RPM_INT32_TYPE,         1,      4, },
+    {  RPMSIGTAG_RESERVEDSPACE,        RPM_BIN_TYPE,           0,      0, },
+    {  RPMTAG_DSAHEADER,               RPM_BIN_TYPE,           0,      0, },
+    {  RPMTAG_RSAHEADER,               RPM_BIN_TYPE,           0,      0, },
+    {  RPMTAG_SHA1HEADER,              RPM_STRING_TYPE,        1,      41, },
+    {  RPMSIGTAG_LONGSIZE,             RPM_INT64_TYPE,         1,      8, },
+    {  RPMSIGTAG_LONGARCHIVESIZE,      RPM_INT64_TYPE,         1,      8, },
+    {  RPMTAG_SHA256HEADER,            RPM_STRING_TYPE,        1,      65, },
+    {  RPMTAG_PAYLOADDIGEST,           RPM_STRING_ARRAY_TYPE,  0,      0, },
+    { 0 } /* sentinel */
+};
+
+struct vfyinfo_s {
+    rpmTagVal tag;
+    struct rpmsinfo_s vi;
+};
+
+static const struct vfyinfo_s rpmvfyitems[] = {
+    {  RPMSIGTAG_SIZE,
+       { RPMSIG_OTHER_TYPE,            0,
+       (RPMSIG_HEADER|RPMSIG_PAYLOAD), 0, }, },
+    {  RPMSIGTAG_PGP,
+       { RPMSIG_SIGNATURE_TYPE,                RPMVSF_NORSA,
+       (RPMSIG_HEADER|RPMSIG_PAYLOAD), 0, }, },
+    {  RPMSIGTAG_MD5,
+       { RPMSIG_DIGEST_TYPE,           RPMVSF_NOMD5,
+       (RPMSIG_HEADER|RPMSIG_PAYLOAD), PGPHASHALGO_MD5, }, },
+    {  RPMSIGTAG_GPG,
+       { RPMSIG_SIGNATURE_TYPE,                RPMVSF_NODSA,
+       (RPMSIG_HEADER|RPMSIG_PAYLOAD), 0, }, },
+    {  RPMSIGTAG_PGP5,
+       { RPMSIG_SIGNATURE_TYPE,                RPMVSF_NORSA,
+       (RPMSIG_HEADER|RPMSIG_PAYLOAD), 0, }, },
+    {  RPMSIGTAG_PAYLOADSIZE,
+       { RPMSIG_OTHER_TYPE,            0,
+       (RPMSIG_PAYLOAD),               0, }, },
+    {  RPMSIGTAG_RESERVEDSPACE,
+       { RPMSIG_OTHER_TYPE,            0,
+       0,                              0, }, },
+    {  RPMTAG_DSAHEADER,
+       { RPMSIG_SIGNATURE_TYPE,                RPMVSF_NODSAHEADER,
+       (RPMSIG_HEADER),                0, }, },
+    {  RPMTAG_RSAHEADER,
+       { RPMSIG_SIGNATURE_TYPE,                RPMVSF_NORSAHEADER,
+       (RPMSIG_HEADER),                0, }, },
+    {  RPMTAG_SHA1HEADER,
+       { RPMSIG_DIGEST_TYPE,           RPMVSF_NOSHA1HEADER,
+       (RPMSIG_HEADER),                PGPHASHALGO_SHA1, }, },
+    {  RPMSIGTAG_LONGSIZE,
+       { RPMSIG_OTHER_TYPE,            0,
+       (RPMSIG_HEADER|RPMSIG_PAYLOAD), 0, }, },
+    {  RPMSIGTAG_LONGARCHIVESIZE,
+       { RPMSIG_OTHER_TYPE,            0,
+       (RPMSIG_HEADER|RPMSIG_PAYLOAD), 0, }, },
+    {  RPMTAG_SHA256HEADER,
+       { RPMSIG_DIGEST_TYPE,           RPMVSF_NOSHA256HEADER,
+       (RPMSIG_HEADER),                PGPHASHALGO_SHA256, }, },
+    {  RPMTAG_PAYLOADDIGEST,
+       { RPMSIG_DIGEST_TYPE,           RPMVSF_NOPAYLOAD,
+       (RPMSIG_PAYLOAD),               PGPHASHALGO_SHA256, }, },
+    { 0 } /* sentinel */
+};
+
+static const char *rangeName(int range);
+static const char * rpmSigString(rpmRC res);
+static rpmRC rpmVerifySignature(rpmKeyring keyring, struct rpmsinfo_s *sinfo,
+                              DIGEST_CTX ctx, char ** result);
+
+static int sinfoLookup(rpmTagVal tag)
+{
+    const struct vfyinfo_s *start = &rpmvfyitems[0];
+    int ix = -1;
+    for (const struct vfyinfo_s *si = start; si->tag; si++) {
+       if (tag == si->tag) {
+           ix = si - start;
+           break;
+       }
+    }
+    return ix;
+}
+
+static int validHex(const char *str, size_t slen)
+{
+    int valid = 0; /* Assume invalid */
+    const char *b;
+
+    /* Our hex data is always even sized and at least sha-1 long */
+    if (slen % 2 || slen < 40)
+       goto exit;
+
+    for (b = str ; *b != '\0'; b++) {
+       if (strchr("0123456789abcdefABCDEF", *b) == NULL)
+           goto exit;
+    }
+    valid = 1;
+
+exit:
+    return valid;
+}
+
+static rpmRC rpmsinfoInit(rpmtd td, const char *origin,
+                     struct rpmsinfo_s *sinfo, char **msg)
+{
+    rpmRC rc = RPMRC_FAIL;
+    const void *data = NULL;
+    const struct vfytag_s *tinfo;
+    const struct vfyinfo_s *vinfo;
+    rpm_count_t dlen = 0;
+    int ix;
+
+    if ((ix = sinfoLookup(td->tag)) == -1) {
+       /* anything unknown just falls through for now */
+       rc = RPMRC_OK;
+       goto exit;
+    }
+    vinfo = &rpmvfyitems[ix];
+    tinfo = &rpmvfytags[ix];
+    assert(tinfo->tag == vinfo->tag);
+
+    *sinfo = rpmvfyitems[ix].vi; /* struct assignment */
+
+    if (tinfo->tagtype && tinfo->tagtype != td->type) {
+       rasprintf(msg, _("%s tag %u: invalid type %u"),
+                       origin, td->tag, td->type);
+       goto exit;
+    }
+
+    if (tinfo->tagcount && tinfo->tagcount != td->count) {
+       rasprintf(msg, _("%s: tag %u: invalid count %u"),
+                       origin, td->tag, td->count);
+       goto exit;
+    }
+
+    switch (td->type) {
+    case RPM_STRING_TYPE:
+    case RPM_STRING_ARRAY_TYPE:
+       data = rpmtdGetString(td);
+       if (data)
+           dlen = strlen(data);
+       break;
+    case RPM_BIN_TYPE:
+       data = td->data;
+       dlen = td->count;
+       break;
+    }
+
+    /* MD5 has data length of 16, everything else is (much) larger */
+    if (sinfo->hashalgo && (data == NULL || dlen < 16)) {
+       rasprintf(msg, _("%s tag %u: invalid data %p (%u)"),
+                       origin, td->tag, data, dlen);
+       goto exit;
+    }
+
+    if (td->type == RPM_STRING_TYPE && td->size == 0)
+       td->size = dlen + 1;
+
+    if (tinfo->tagsize && (td->flags & RPMTD_IMMUTABLE) &&
+               tinfo->tagsize != td->size) {
+       rasprintf(msg, _("%s tag %u: invalid size %u"),
+                       origin, td->tag, td->size);
+       goto exit;
+    }
+
+    if (sinfo->type == RPMSIG_SIGNATURE_TYPE) {
+       if (pgpPrtParams(data, dlen, PGPTAG_SIGNATURE, &sinfo->sig)) {
+           rasprintf(msg, _("%s tag %u: invalid OpenPGP signature"),
+                   origin, td->tag);
+           goto exit;
+       }
+       sinfo->hashalgo = pgpDigParamsAlgo(sinfo->sig, PGPVAL_HASHALGO);
+       sinfo->keyid = pgpGrab(sinfo->sig->signid+4, 4);
+    } else if (sinfo->type == RPMSIG_DIGEST_TYPE) {
+       if (td->type == RPM_BIN_TYPE) {
+           sinfo->dig = pgpHexStr(data, dlen);
+       } else {
+           if (!validHex(data, dlen)) {
+               rasprintf(msg, _("%s: tag %u: invalid hex"), origin, td->tag);
+               goto exit;
+           }
+           sinfo->dig = xstrdup(data);
+       }
+    }
+
+    if (sinfo->hashalgo)
+       sinfo->id = (td->tag << 16) | rpmtdGetIndex(td);
+
+    rc = RPMRC_OK;
+
+exit:
+    return rc;
+}
+
+static void rpmsinfoFini(struct rpmsinfo_s *sinfo)
+{
+    if (sinfo) {
+       if (sinfo->type == RPMSIG_SIGNATURE_TYPE)
+           pgpDigParamsFree(sinfo->sig);
+       else if (sinfo->type == RPMSIG_DIGEST_TYPE)
+           free(sinfo->dig);
+       free(sinfo->descr);
+       memset(sinfo, 0, sizeof(*sinfo));
+    }
+}
+
+static int rpmsinfoDisabled(const struct rpmsinfo_s *sinfo, rpmVSFlags vsflags)
+{
+    if (!(sinfo->type & RPMSIG_VERIFIABLE_TYPE))
+       return 1;
+    if (vsflags & sinfo->disabler)
+       return 1;
+    if ((vsflags & RPMVSF_NEEDPAYLOAD) && (sinfo->range & RPMSIG_PAYLOAD))
+       return 1;
+    return 0;
+}
+
+static void rpmvsReserve(struct rpmvs_s *vs, int n)
+{
+    if (vs->nsigs + n >= vs->nalloced) {
+       vs->nalloced = (vs->nsigs * 2) + n;
+       vs->rcs = xrealloc(vs->rcs, vs->nalloced * sizeof(*vs->rcs));
+       vs->results = xrealloc(vs->results, vs->nalloced * sizeof(*vs->results));
+       vs->sigs = xrealloc(vs->sigs, vs->nalloced * sizeof(*vs->sigs));
+    }
+}
+
+const char *rpmsinfoDescr(struct rpmsinfo_s *sinfo)
+{
+    if (sinfo->descr == NULL) {
+       char *t;
+       switch (sinfo->type) {
+       case RPMSIG_DIGEST_TYPE:
+           rasprintf(&sinfo->descr, _("%s%s %s"),
+                   rangeName(sinfo->range),
+                   pgpValString(PGPVAL_HASHALGO, sinfo->hashalgo),
+                   _("digest"));
+           break;
+       case RPMSIG_SIGNATURE_TYPE:
+           t = sinfo->sig ? pgpIdentItem(sinfo->sig) : NULL;
+           rasprintf(&sinfo->descr, _("%s%s"),
+                   rangeName(sinfo->range), t ? t : _("signature"));
+           free(t);
+           break;
+       }
+    }
+    return sinfo->descr;
+}
+
+char *rpmsinfoMsg(struct rpmsinfo_s *sinfo, rpmRC rc, const char *emsg)
+{
+    char *msg = NULL;
+    if (emsg) {
+       rasprintf(&msg, "%s: %s (%s)",
+               rpmsinfoDescr(sinfo), rpmSigString(rc), emsg);
+    } else {
+       rasprintf(&msg, "%s: %s", rpmsinfoDescr(sinfo), rpmSigString(rc));
+    }
+    return msg;
+}
+
+void rpmvsAppend(struct rpmvs_s *sis, hdrblob blob, rpmTagVal tag)
+{
+    struct rpmtd_s td;
+    rpmRC rc = hdrblobGet(blob, tag, &td);
+
+    if (rc == RPMRC_OK) {
+       const char *o = (blob->il > blob->ril) ? _("header") : _("package");
+       int ix;
+
+       rpmvsReserve(sis, rpmtdCount(&td));
+
+       while ((ix = rpmtdNext(&td)) >= 0) {
+           sis->results[sis->nsigs] = NULL;
+           sis->rcs[sis->nsigs] = rpmsinfoInit(&td, o,
+                                               &sis->sigs[sis->nsigs],
+                                               &sis->results[sis->nsigs]);
+           sis->nsigs++;
+       }
+       rpmtdFreeData(&td);
+    }
+}
+
+struct rpmvs_s *rpmvsCreate(hdrblob blob, rpmVSFlags vsflags)
+{
+    struct rpmvs_s *sis = xcalloc(1, sizeof(*sis));
+
+    rpmvsReserve(sis, 2); /* XXX bump this up later */
+
+    for (const struct vfyinfo_s *si = &rpmvfyitems[0]; si->tag; si++) {
+       if (rpmsinfoDisabled(&si->vi, vsflags))
+           continue;
+       rpmvsAppend(sis, blob, si->tag);
+    }
+    return sis;
+}
+
+struct rpmvs_s *rpmvsFree(struct rpmvs_s *sis)
+{
+    if (sis) {
+       free(sis->rcs);
+       for (int i = 0; i < sis->nsigs; i++) {
+           rpmsinfoFini(&sis->sigs[i]);
+           free(sis->results[i]);
+       }
+       free(sis->sigs);
+       free(sis->results);
+       free(sis);
+    }
+    return NULL;
+}
+
+void rpmvsInitDigests(struct rpmvs_s *sis, int range, rpmDigestBundle bundle)
+{
+    for (int i = 0; i < sis->nsigs; i++) {
+       struct rpmsinfo_s *sinfo = &sis->sigs[i];
+       if (sinfo->range & range) {
+           if (sis->rcs[i] == RPMRC_OK)
+               rpmDigestBundleAddID(bundle, sinfo->hashalgo, sinfo->id, 0);
+       }
+    }
+}
+
+int rpmvsVerifyItems(rpmPlugins plugins, struct rpmvs_s *sis, int range, rpmDigestBundle bundle,
+                      rpmKeyring keyring, rpmsinfoCb cb, void *cbdata)
+{
+    int failed = 0;
+
+    for (int i = 0; i < sis->nsigs; i++) {
+       struct rpmsinfo_s *sinfo = &sis->sigs[i];
+
+       if (sinfo->range == range) {
+           if (sis->rcs[i] == RPMRC_OK) {
+               DIGEST_CTX ctx = rpmDigestBundleDupCtx(bundle, sinfo->id);
+               sis->results[i] = _free(sis->results[i]);
+               sis->rcs[i] = rpmVerifySignature(keyring, sinfo, ctx, &sis->results[i]);
+               /* Run verify hook for all plugins */
+               sis->rcs[i] = rpmpluginsCallVerify(plugins, keyring, sinfo->id, sinfo->sig, ctx, sis->rcs[i]);
+               rpmDigestFinal(ctx, NULL, NULL, 0);
+               rpmDigestBundleFinal(bundle, sinfo->id, NULL, NULL, 0);
+           }
+
+           if (cb)
+               sis->rcs[i] = cb(sinfo, sis->rcs[i], sis->results[i], cbdata);
+
+           if (sis->rcs[i] != RPMRC_OK)
+               failed++;
+       }
+    }
+
+    return failed;
+}
+
+static const char * rpmSigString(rpmRC res)
+{
+    const char * str;
+    switch (res) {
+    case RPMRC_OK:             str = "OK";             break;
+    case RPMRC_FAIL:           str = "BAD";            break;
+    case RPMRC_NOKEY:          str = "NOKEY";          break;
+    case RPMRC_NOTTRUSTED:     str = "NOTTRUSTED";     break;
+    default:
+    case RPMRC_NOTFOUND:       str = "UNKNOWN";        break;
+    }
+    return str;
+}
+
+static const char *rangeName(int range)
+{
+    switch (range) {
+    case RPMSIG_HEADER:                                return _("Header ");
+    case RPMSIG_PAYLOAD:                       return _("Payload ");
+    }
+    /* trad. output for (RPMSIG_HEADER|RPMSIG_PAYLOAD) range is "" */
+    return "";
+}
+
+static rpmRC verifyDigest(struct rpmsinfo_s *sinfo, DIGEST_CTX digctx,
+                         char **msg)
+{
+    rpmRC res = RPMRC_FAIL; /* assume failure */
+    char * dig = NULL;
+    size_t diglen = 0;
+    DIGEST_CTX ctx = rpmDigestDup(digctx);
+
+    if (rpmDigestFinal(ctx, (void **)&dig, &diglen, 1) || diglen == 0)
+       goto exit;
+
+    if (strcasecmp(sinfo->dig, dig) == 0) {
+       res = RPMRC_OK;
+    } else {
+       rasprintf(msg, "Expected %s != %s", sinfo->dig, dig);
+    }
+
+exit:
+    free(dig);
+    return res;
+}
+
+/**
+ * Verify DSA/RSA signature.
+ * @param keyring      pubkey keyring
+ * @param sinfo                OpenPGP signature parameters
+ * @param hashctx      digest context
+ * @retval msg         verbose success/failure text
+ * @return             RPMRC_OK on success
+ */
+static rpmRC
+verifySignature(rpmKeyring keyring, struct rpmsinfo_s *sinfo,
+               DIGEST_CTX hashctx, char **msg)
+{
+    rpmRC res = rpmKeyringVerifySig(keyring, sinfo->sig, hashctx);
+
+    return res;
+}
+
+static rpmRC
+rpmVerifySignature(rpmKeyring keyring, struct rpmsinfo_s *sinfo,
+                  DIGEST_CTX ctx, char ** result)
+{
+    rpmRC res = RPMRC_FAIL;
+
+    if (sinfo->type == RPMSIG_DIGEST_TYPE)
+       res = verifyDigest(sinfo, ctx, result);
+    else if (sinfo->type == RPMSIG_SIGNATURE_TYPE)
+       res = verifySignature(keyring, sinfo, ctx, result);
+
+    return res;
+}
diff --git a/lib/rpmvs.h b/lib/rpmvs.h
new file mode 100644 (file)
index 0000000..f96f202
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _RPMVS_H
+#define _RPMVS_H
+
+#include <rpm/rpmtypes.h>
+#include <rpm/rpmts.h> /* for rpmVSFlags */
+#include "lib/header_internal.h"
+
+enum {
+    RPMSIG_UNKNOWN_TYPE                = 0,
+    RPMSIG_DIGEST_TYPE         = (1 << 0),
+    RPMSIG_SIGNATURE_TYPE      = (1 << 1),
+    RPMSIG_OTHER_TYPE          = (1 << 2),
+};
+
+#define RPMSIG_VERIFIABLE_TYPE (RPMSIG_DIGEST_TYPE|RPMSIG_SIGNATURE_TYPE)
+
+/* siginfo range bits */
+enum {
+    RPMSIG_HEADER      = (1 << 0),
+    RPMSIG_PAYLOAD     = (1 << 1),
+};
+
+struct rpmsinfo_s {
+    /* static data */
+    int type;
+    int disabler;
+    int range;
+    /* parsed data */
+    int hashalgo;
+    int id;
+    unsigned int keyid;
+    union {
+       pgpDigParams sig;
+       char *dig;
+    };
+    char *descr;
+};
+
+typedef rpmRC (*rpmsinfoCb)(struct rpmsinfo_s *sinfo, rpmRC sigres, const char *result, void *cbdata);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+RPM_GNUC_INTERNAL
+const char *rpmsinfoDescr(struct rpmsinfo_s *sinfo);
+
+RPM_GNUC_INTERNAL
+char *rpmsinfoMsg(struct rpmsinfo_s *sinfo, rpmRC rc, const char *emsg);
+
+RPM_GNUC_INTERNAL
+struct rpmvs_s *rpmvsCreate(hdrblob blob, rpmVSFlags vsflags);
+
+RPM_GNUC_INTERNAL
+struct rpmvs_s *rpmvsFree(struct rpmvs_s *sis);
+
+RPM_GNUC_INTERNAL
+void rpmvsAppend(struct rpmvs_s *sis, hdrblob blob, rpmTagVal tag);
+
+RPM_GNUC_INTERNAL
+void rpmvsInitDigests(struct rpmvs_s *sis, int range, rpmDigestBundle bundle);
+
+RPM_GNUC_INTERNAL
+int rpmvsVerifyItems(rpmPlugins plugins, struct rpmvs_s *sis, int range, rpmDigestBundle bundle,
+                       rpmKeyring keyring, rpmsinfoCb cb, void *cbdata);
+
+RPM_GNUC_INTERNAL
+rpmRC rpmpkgRead(rpmPlugins plugins, rpmKeyring keyring, rpmVSFlags flags, FD_t fd,
+                           rpmsinfoCb cb, void *cbdata, Header *hdrp);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RPMVS_H */
index 1c532707268725615a3688cf613e32bc3dd09ee6..6f04962e8ac68f294d0c636046c09c1ca7fc28e0 100644 (file)
 #include <rpm/rpmstring.h>
 #include <rpm/rpmfileutil.h>
 #include <rpm/rpmlog.h>
-#include <rpm/rpmkeyring.h>
+#include <rpm/rpmmacro.h>
 
 #include "lib/rpmlead.h"
-#include "lib/signature.h"
 #include "lib/header_internal.h"
+#include "lib/signature.h"
 
 #include "debug.h"
 
-/* Dumb wrapper around headerPut() for signature header */
-static int sighdrPut(Header h, rpmTagVal tag, rpmTagType type,
-                     rpm_data_t p, rpm_count_t c)
-{
-    struct rpmtd_s sigtd;
-    rpmtdReset(&sigtd);
-    sigtd.tag = tag;
-    sigtd.type = type;
-    sigtd.data = p;
-    sigtd.count = c;
-    return headerPut(h, &sigtd, HEADERPUT_DEFAULT);
-}
-
 /**
- * Print package size.
- * @todo rpmio: use fdSize rather than fstat(2) to get file size.
+ * Print package size (debug purposes only)
  * @param fd                   package file handle
- * @param siglen               signature header size
- * @param pad                  signature padding
- * @param datalen              length of header+payload
- * @return                     rpmRC return code
+ * @param sigh                 signature header
  */
-static inline rpmRC printSize(FD_t fd, size_t siglen, size_t pad, rpm_loff_t datalen)
+static void printSize(FD_t fd, Header sigh)
 {
     struct stat st;
     int fdno = Fileno(fd);
+    size_t siglen = headerSizeof(sigh, HEADER_MAGIC_YES);
+    size_t pad = (8 - (siglen % 8)) % 8; /* 8-byte pad */
+    struct rpmtd_s sizetag;
+    rpm_loff_t datalen = 0;
 
-    if (fstat(fdno, &st) < 0)
-       return RPMRC_FAIL;
+    /* Print package component sizes. */
+    if (headerGet(sigh, RPMSIGTAG_LONGSIZE, &sizetag, HEADERGET_DEFAULT)) {
+       rpm_loff_t *tsize = rpmtdGetUint64(&sizetag);
+       datalen = (tsize) ? *tsize : 0;
+    } else if (headerGet(sigh, RPMSIGTAG_SIZE, &sizetag, HEADERGET_DEFAULT)) {
+       rpm_off_t *tsize = rpmtdGetUint32(&sizetag);
+       datalen = (tsize) ? *tsize : 0;
+    }
+    rpmtdFreeData(&sizetag);
 
     rpmlog(RPMLOG_DEBUG,
                "Expected size: %12" PRIu64 \
                " = lead(%d)+sigs(%zd)+pad(%zd)+data(%" PRIu64 ")\n",
                RPMLEAD_SIZE+siglen+pad+datalen,
                RPMLEAD_SIZE, siglen, pad, datalen);
-    rpmlog(RPMLOG_DEBUG,
-               "  Actual size: %12" PRIu64 "\n", (rpm_loff_t) st.st_size);
 
-    return RPMRC_OK;
+    if (fstat(fdno, &st) == 0) {
+       rpmlog(RPMLOG_DEBUG,
+               "  Actual size: %12" PRIu64 "\n", (rpm_loff_t) st.st_size);
+    }
 }
 
-rpmRC rpmReadSignature(FD_t fd, Header * sighp, sigType sig_type, char ** msg)
+rpmRC rpmReadSignature(FD_t fd, Header * sighp, char ** msg)
 {
     char *buf = NULL;
-    int32_t block[4];
-    int32_t il;
-    int32_t dl;
-    int32_t * ei = NULL;
-    entryInfo pe;
-    unsigned int nb, uc;
-    int32_t ril = 0;
-    struct indexEntry_s entry;
-    struct entryInfo_s info;
-    unsigned char * dataStart;
-    unsigned char * dataEnd = NULL;
+    struct hdrblob_s blob;
     Header sigh = NULL;
     rpmRC rc = RPMRC_FAIL;             /* assume failure */
-    int xx;
-    int i;
 
     if (sighp)
        *sighp = NULL;
 
-    if (sig_type != RPMSIGTYPE_HEADERSIG)
-       goto exit;
-
-    memset(block, 0, sizeof(block));
-    if ((xx = Freadall(fd, block, sizeof(block))) != sizeof(block)) {
-       rasprintf(&buf, _("sigh size(%d): BAD, read returned %d\n"), 
-                 (int)sizeof(block), xx);
-       goto exit;
-    }
-    if (memcmp(block, rpm_header_magic, sizeof(rpm_header_magic))) {
-       rasprintf(&buf, _("sigh magic: BAD\n"));
+    if (hdrblobRead(fd, 1, 1, RPMTAG_HEADERSIGNATURES, &blob, &buf) != RPMRC_OK)
        goto exit;
-    }
-    il = ntohl(block[2]);
-    if (il < 0 || il > 32) {
-       rasprintf(&buf, 
-                 _("sigh tags: BAD, no. of tags(%d) out of range\n"), il);
-       goto exit;
-    }
-    dl = ntohl(block[3]);
-    if (dl < 0 || dl > 8192) {
-       rasprintf(&buf, 
-                 _("sigh data: BAD, no. of  bytes(%d) out of range\n"), dl);
-       goto exit;
-    }
-
-    memset(&entry, 0, sizeof(entry));
-    memset(&info, 0, sizeof(info));
-
-    nb = (il * sizeof(struct entryInfo_s)) + dl;
-    uc = sizeof(il) + sizeof(dl) + nb;
-    ei = xmalloc(uc);
-    ei[0] = block[2];
-    ei[1] = block[3];
-    pe = (entryInfo) &ei[2];
-    dataStart = (unsigned char *) (pe + il);
-    if ((xx = Freadall(fd, pe, nb)) != nb) {
-       rasprintf(&buf,
-                 _("sigh blob(%d): BAD, read returned %d\n"), (int)nb, xx);
-       goto exit;
-    }
     
-    /* Check (and convert) the 1st tag element. */
-    xx = headerVerifyInfo(1, dl, pe, &entry.info, 0);
-    if (xx != -1) {
-       rasprintf(&buf, _("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
-                 0, entry.info.tag, entry.info.type,
-                 entry.info.offset, entry.info.count);
-       goto exit;
-    }
-
-    /* Is there an immutable header region tag? */
-    if (entry.info.tag == RPMTAG_HEADERSIGNATURES) {
-       /* Is the region tag sane? */
-       if (!(entry.info.type == REGION_TAG_TYPE &&
-             entry.info.count == REGION_TAG_COUNT)) {
-           rasprintf(&buf,
-               _("region tag: BAD, tag %d type %d offset %d count %d\n"),
-               entry.info.tag, entry.info.type,
-               entry.info.offset, entry.info.count);
-           goto exit;
-       }
-       
-       /* Is the trailer within the data area? */
-       if (entry.info.offset + REGION_TAG_COUNT > dl) {
-           rasprintf(&buf, 
-               _("region offset: BAD, tag %d type %d offset %d count %d\n"),
-               entry.info.tag, entry.info.type,
-               entry.info.offset, entry.info.count);
-           goto exit;
-       }
-
-       /* Is there an immutable header region tag trailer? */
-       dataEnd = dataStart + entry.info.offset;
-       (void) memcpy(&info, dataEnd, REGION_TAG_COUNT);
-       /* XXX Really old packages have HEADER_IMAGE, not HEADER_SIGNATURES. */
-       if (info.tag == htonl(RPMTAG_HEADERIMAGE)) {
-           rpmTagVal stag = htonl(RPMTAG_HEADERSIGNATURES);
-           info.tag = stag;
-           memcpy(dataEnd, &stag, sizeof(stag));
-       }
-       dataEnd += REGION_TAG_COUNT;
-
-       xx = headerVerifyInfo(1, il * sizeof(*pe), &info, &entry.info, 1);
-       if (xx != -1 ||
-           !((entry.info.tag == RPMTAG_HEADERSIGNATURES || entry.info.tag == RPMTAG_HEADERIMAGE)
-          && entry.info.type == REGION_TAG_TYPE
-          && entry.info.count == REGION_TAG_COUNT))
-       {
-           rasprintf(&buf,
-               _("region trailer: BAD, tag %d type %d offset %d count %d\n"),
-               entry.info.tag, entry.info.type,
-               entry.info.offset, entry.info.count);
-           goto exit;
-       }
-       memset(&info, 0, sizeof(info));
-
-       /* Is the no. of tags in the region less than the total no. of tags? */
-       ril = entry.info.offset/sizeof(*pe);
-       if ((entry.info.offset % sizeof(*pe)) || ril > il) {
-           rasprintf(&buf, _("region size: BAD, ril(%d) > il(%d)\n"), ril, il);
-           goto exit;
-       }
-    }
-
-    /* Sanity check signature tags */
-    memset(&info, 0, sizeof(info));
-    for (i = 1; i < il; i++) {
-       xx = headerVerifyInfo(1, dl, pe+i, &entry.info, 0);
-       if (xx != -1) {
-           rasprintf(&buf, 
-               _("sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
-               i, entry.info.tag, entry.info.type,
-               entry.info.offset, entry.info.count);
-           goto exit;
-       }
-    }
-
     /* OK, blob looks sane, load the header. */
-    sigh = headerImport(ei, uc, 0);
-    if (sigh == NULL) {
-       rasprintf(&buf, _("sigh load: BAD\n"));
+    if (hdrblobImport(&blob, 0, &sigh, &buf) != RPMRC_OK)
        goto exit;
-    }
 
-    {  size_t sigSize = headerSizeof(sigh, HEADER_MAGIC_YES);
-       size_t pad = (8 - (sigSize % 8)) % 8; /* 8-byte pad */
-       ssize_t trc;
-       struct rpmtd_s sizetag;
-       rpm_loff_t archSize = 0;
-
-       /* Position at beginning of header. */
-       if (pad && (trc = Freadall(fd, block, pad)) != pad) {
-           rasprintf(&buf,
-                     _("sigh pad(%zd): BAD, read %zd bytes\n"), pad, trc);
-           goto exit;
-       }
-
-       /* Print package component sizes. */
-       if (headerGet(sigh, RPMSIGTAG_LONGSIZE, &sizetag, HEADERGET_DEFAULT)) {
-           rpm_loff_t *tsize = rpmtdGetUint64(&sizetag);
-           archSize = (tsize) ? *tsize : 0;
-       } else if (headerGet(sigh, RPMSIGTAG_SIZE, &sizetag, HEADERGET_DEFAULT)) {
-           rpm_off_t *tsize = rpmtdGetUint32(&sizetag);
-           archSize = (tsize) ? *tsize : 0;
-       }
-       rpmtdFreeData(&sizetag);
-       rc = printSize(fd, sigSize, pad, archSize);
-       if (rc != RPMRC_OK) {
-           rasprintf(&buf,
-                  _("sigh sigSize(%zd): BAD, fstat(2) failed\n"), sigSize);
-           goto exit;
-       }
-    }
-    ei = NULL; /* XXX will be freed with header */
+    printSize(fd, sigh);
+    rc = RPMRC_OK;
 
 exit:
     if (sighp && sigh && rc == RPMRC_OK)
        *sighp = headerLink(sigh);
     headerFree(sigh);
-    free(ei);
 
     if (msg != NULL) {
        *msg = buf;
@@ -255,7 +91,7 @@ exit:
 
 int rpmWriteSignature(FD_t fd, Header sigh)
 {
-    static uint8_t buf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+    static const uint8_t zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
     int sigSize, pad;
     int rc;
 
@@ -266,276 +102,128 @@ int rpmWriteSignature(FD_t fd, Header sigh)
     sigSize = headerSizeof(sigh, HEADER_MAGIC_YES);
     pad = (8 - (sigSize % 8)) % 8;
     if (pad) {
-       if (Fwrite(buf, sizeof(buf[0]), pad, fd) != pad)
+       if (Fwrite(zeros, sizeof(zeros[0]), pad, fd) != pad)
            rc = 1;
     }
     rpmlog(RPMLOG_DEBUG, "Signature: size(%d)+pad(%d)\n", sigSize, pad);
     return rc;
 }
 
-Header rpmNewSignature(void)
-{
-    Header sigh = headerNew();
-    return sigh;
-}
-
-Header rpmFreeSignature(Header sigh)
-{
-    return headerFree(sigh);
-}
-
-static int makeHDRDigest(Header sigh, const char * file, rpmTagVal sigTag)
-{
-    Header h = NULL;
-    FD_t fd = NULL;
-    char * SHA1 = NULL;
-    int ret = -1;      /* assume failure. */
-
-    switch (sigTag) {
-    case RPMSIGTAG_SHA1:
-       fd = Fopen(file, "r.fdio");
-       if (fd == NULL || Ferror(fd))
-           goto exit;
-       h = headerRead(fd, HEADER_MAGIC_YES);
-       if (h == NULL)
-           goto exit;
-
-       if (headerIsEntry(h, RPMTAG_HEADERIMMUTABLE)) {
-           DIGEST_CTX ctx;
-           struct rpmtd_s utd;
-       
-           if (!headerGet(h, RPMTAG_HEADERIMMUTABLE, &utd, HEADERGET_DEFAULT)
-               ||  utd.data == NULL)
-           {
-               rpmlog(RPMLOG_ERR, 
-                               _("Immutable header region could not be read. "
-                               "Corrupted package?\n"));
-               goto exit;
-           }
-           ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
-           (void) rpmDigestUpdate(ctx, rpm_header_magic, sizeof(rpm_header_magic));
-           (void) rpmDigestUpdate(ctx, utd.data, utd.count);
-           (void) rpmDigestFinal(ctx, (void **)&SHA1, NULL, 1);
-           rpmtdFreeData(&utd);
-       } else {
-           rpmlog(RPMLOG_ERR, _("Cannot sign RPM v3 packages\n"));
-           goto exit;
-       }
-
-       if (SHA1 == NULL)
-           goto exit;
-       if (!sighdrPut(sigh, RPMSIGTAG_SHA1, RPM_STRING_TYPE, SHA1, 1))
-           goto exit;
-       ret = 0;
-       break;
-    default:
-       break;
-    }
-
-exit:
-    free(SHA1);
-    headerFree(h);
-    if (fd != NULL) (void) Fclose(fd);
-    return ret;
-}
-
-int rpmGenDigest(Header sigh, const char * file, rpmTagVal sigTag)
+rpmRC rpmGenerateSignature(char *SHA256, char *SHA1, uint8_t *MD5,
+                       rpm_loff_t size, rpm_loff_t payloadSize, FD_t fd)
 {
-    struct stat st;
-    uint8_t * pkt = NULL;
-    size_t pktlen;
-    int ret = -1;      /* assume failure. */
-
-    switch (sigTag) {
-    case RPMSIGTAG_SIZE: {
-       rpm_off_t size;
-       if (stat(file, &st) != 0)
-           break;
-       size = st.st_size;
-       if (!sighdrPut(sigh, sigTag, RPM_INT32_TYPE, &size, 1))
-           break;
-       ret = 0;
-       } break;
-    case RPMSIGTAG_LONGSIZE: {
-       rpm_loff_t size;
-       if (stat(file, &st) != 0)
-           break;
-       size = st.st_size;
-       if (!sighdrPut(sigh, sigTag, RPM_INT64_TYPE, &size, 1))
-           break;
-       ret = 0;
-       } break;
-    case RPMSIGTAG_MD5:
-       pktlen = 16;
-       pkt = xcalloc(pktlen, sizeof(*pkt));
-       if (rpmDoDigest(PGPHASHALGO_MD5, file, 0, pkt, NULL)
-        || !sighdrPut(sigh, sigTag, RPM_BIN_TYPE, pkt, pktlen))
-           break;
-       ret = 0;
-       break;
-    case RPMSIGTAG_SHA1:
-       ret = makeHDRDigest(sigh, file, sigTag);
-       break;
-    default:
-       break;
-    }
-    free(pkt);
-
-    return ret;
-}
-
-static const char * rpmSigString(rpmRC res)
-{
-    const char * str;
-    switch (res) {
-    case RPMRC_OK:             str = "OK";             break;
-    case RPMRC_FAIL:           str = "BAD";            break;
-    case RPMRC_NOKEY:          str = "NOKEY";          break;
-    case RPMRC_NOTTRUSTED:     str = "NOTRUSTED";      break;
-    default:
-    case RPMRC_NOTFOUND:       str = "UNKNOWN";        break;
-    }
-    return str;
-}
-
-static rpmRC
-verifyMD5Digest(rpmtd sigtd, DIGEST_CTX md5ctx, char **msg)
-{
-    rpmRC res = RPMRC_FAIL; /* assume failure */
-    uint8_t * md5sum = NULL;
-    size_t md5len = 0;
-    char *md5;
-    const char *title = _("MD5 digest:");
-    *msg = NULL;
-    DIGEST_CTX ctx = rpmDigestDup(md5ctx);
-
-    if (ctx == NULL) {
-       rasprintf(msg, "%s %s\n", title, rpmSigString(res));
+    Header sig = headerNew();
+    struct rpmtd_s td;
+    rpmRC rc = RPMRC_OK;
+    char *reservedSpace;
+    int spaceSize = 32; /* always reserve a bit of space */
+    int gpgSize = rpmExpandNumeric("%{__gpg_reserved_space}");
+    rpm_off_t size32 = size;
+    rpm_off_t payloadSize32 = payloadSize;
+
+    /* Prepare signature */
+    if (SHA256) {
+       rpmtdReset(&td);
+       td.tag = RPMSIGTAG_SHA256;
+       td.count = 1;
+       td.type = RPM_STRING_TYPE;
+       td.data = SHA256;
+       headerPut(sig, &td, HEADERPUT_DEFAULT);
+    }
+
+    if (SHA1) {
+       rpmtdReset(&td);
+       td.tag = RPMSIGTAG_SHA1;
+       td.count = 1;
+       td.type = RPM_STRING_TYPE;
+       td.data = SHA1;
+       headerPut(sig, &td, HEADERPUT_DEFAULT);
+    }
+
+    if (MD5) {
+       rpmtdReset(&td);
+       td.tag = RPMSIGTAG_MD5;
+       td.count = 16;
+       td.type = RPM_BIN_TYPE;
+       td.data = MD5;
+       headerPut(sig, &td, HEADERPUT_DEFAULT);
+    }
+
+    rpmtdReset(&td);
+    td.count = 1;
+    td.type = RPM_INT32_TYPE;
+
+    td.tag = RPMSIGTAG_PAYLOADSIZE;
+    td.data = &payloadSize32;
+    headerPut(sig, &td, HEADERPUT_DEFAULT);
+
+    td.tag = RPMSIGTAG_SIZE;
+    td.data = &size32;
+    headerPut(sig, &td, HEADERPUT_DEFAULT);
+
+    if (size >= UINT32_MAX || payloadSize >= UINT32_MAX) {
+       /*
+        * Put the 64bit size variants into the header, but
+        * modify spaceSize so that the resulting header has
+        * the same size. Note that this only works if all tags
+        * with a lower number than RPMSIGTAG_RESERVEDSPACE are
+        * already added and no tag with a higher number is
+        * added yet.
+        */
+       rpm_loff_t p = payloadSize;
+       rpm_loff_t s = size;
+       int newsigSize, oldsigSize;
+
+       oldsigSize = headerSizeof(sig, HEADER_MAGIC_YES);
+
+       headerDel(sig, RPMSIGTAG_PAYLOADSIZE);
+       headerDel(sig, RPMSIGTAG_SIZE);
+
+       td.type = RPM_INT64_TYPE;
+
+       td.tag = RPMSIGTAG_LONGARCHIVESIZE;
+       td.data = &p;
+       headerPut(sig, &td, HEADERPUT_DEFAULT);
+
+       td.tag = RPMSIGTAG_LONGSIZE;
+       td.data = &s;
+       headerPut(sig, &td, HEADERPUT_DEFAULT);
+
+       newsigSize = headerSizeof(sig, HEADER_MAGIC_YES);
+       spaceSize -= newsigSize - oldsigSize;
+    }
+
+    if (gpgSize > 0)
+       spaceSize += gpgSize;
+
+    if (spaceSize > 0) {
+       reservedSpace = xcalloc(spaceSize, sizeof(char));
+       rpmtdReset(&td);
+       td.tag = RPMSIGTAG_RESERVEDSPACE;
+       td.count = spaceSize;
+       td.type = RPM_BIN_TYPE;
+       td.data = reservedSpace;
+       headerPut(sig, &td, HEADERPUT_DEFAULT);
+       free(reservedSpace);
+    }
+
+    /* Reallocate the signature into one contiguous region. */
+    sig = headerReload(sig, RPMTAG_HEADERSIGNATURES);
+    if (sig == NULL) { /* XXX can't happen */
+       rpmlog(RPMLOG_ERR, _("Unable to reload signature header.\n"));
+       rc = RPMRC_FAIL;
        goto exit;
     }
 
-    (void) rpmDigestFinal(ctx, (void **)&md5sum, &md5len, 0);
-
-    md5 = pgpHexStr(md5sum, md5len);
-    if (md5len != sigtd->count || memcmp(md5sum, sigtd->data, md5len)) {
-       char *hex = rpmtdFormat(sigtd, RPMTD_FORMAT_STRING, NULL);
-       rasprintf(msg, "%s %s Expected(%s) != (%s)\n", title,
-                 rpmSigString(res), hex, md5);
-       free(hex);
-    } else {
-       res = RPMRC_OK;
-       rasprintf(msg, "%s %s (%s)\n", title, rpmSigString(res), md5);
-    }
-    free(md5);
-
-exit:
-    md5sum = _free(md5sum);
-    return res;
-}
-
-/**
- * Verify header immutable region SHA1 digest.
- * @retval msg         verbose success/failure text
- * @param sha1ctx
- * @return             RPMRC_OK on success
- */
-static rpmRC
-verifySHA1Digest(rpmtd sigtd, DIGEST_CTX sha1ctx, char **msg)
-{
-    rpmRC res = RPMRC_FAIL; /* assume failure */
-    char * SHA1 = NULL;
-    const char *title = _("Header SHA1 digest:");
-    const char *sig = sigtd->data;
-    *msg = NULL;
-    DIGEST_CTX ctx = rpmDigestDup(sha1ctx);
-
-    if (ctx == NULL) {
-       rasprintf(msg, "%s %s\n", title, rpmSigString(res));
+    /* Write the signature section into the package. */
+    if (rpmWriteSignature(fd, sig)) {
+       rc = RPMRC_FAIL;
        goto exit;
     }
 
-    (void) rpmDigestFinal(ctx, (void **)&SHA1, NULL, 1);
-
-    if (SHA1 == NULL || !rstreq(SHA1, sig)) {
-       rasprintf(msg, "%s %s Expected(%s) != (%s)\n", title,
-                 rpmSigString(res), sig, SHA1 ? SHA1 : "(nil)");
-    } else {
-       res = RPMRC_OK;
-       rasprintf(msg, "%s %s (%s)\n", title, rpmSigString(res), SHA1);
-    }
-
 exit:
-    SHA1 = _free(SHA1);
-    return res;
-}
-
-/**
- * Verify DSA/RSA signature.
- * @param keyring      pubkey keyring
- * @param sig          OpenPGP signature parameters
- * @param hashctx      digest context
- * @param isHdr                header-only signature?
- * @retval msg         verbose success/failure text
- * @return             RPMRC_OK on success
- */
-static rpmRC
-verifySignature(rpmKeyring keyring, pgpDigParams sig, DIGEST_CTX hashctx,
-               int isHdr, char **msg)
-{
-
-    rpmRC res = rpmKeyringVerifySig(keyring, sig, hashctx);
-
-    char *sigid = pgpIdentItem(sig);
-    rasprintf(msg, "%s%s: %s\n", isHdr ? _("Header ") : "", sigid, 
-               rpmSigString(res));
-    free(sigid);
-    return res;
+    headerFree(sig);
+    return rc;
 }
 
-rpmRC
-rpmVerifySignature(rpmKeyring keyring, rpmtd sigtd, pgpDigParams sig,
-                  DIGEST_CTX ctx, char ** result)
-{
-    rpmRC res = RPMRC_NOTFOUND;
-    char *msg = NULL;
-    int hdrsig = 0;
 
-    if (sigtd->data == NULL || sigtd->count <= 0 || ctx == NULL)
-       goto exit;
-
-    switch (sigtd->tag) {
-    case RPMSIGTAG_MD5:
-       res = verifyMD5Digest(sigtd, ctx, &msg);
-       break;
-    case RPMSIGTAG_SHA1:
-       res = verifySHA1Digest(sigtd, ctx, &msg);
-       break;
-    case RPMSIGTAG_RSA:
-    case RPMSIGTAG_DSA:
-       hdrsig = 1;
-       /* fallthrough */
-    case RPMSIGTAG_PGP5:       /* XXX legacy */
-    case RPMSIGTAG_PGP:
-    case RPMSIGTAG_GPG:
-       if (sig != NULL)
-           res = verifySignature(keyring, sig, ctx, hdrsig, &msg);
-       break;
-    default:
-       break;
-    }
-
-exit:
-    if (res == RPMRC_NOTFOUND) {
-       rasprintf(&msg,
-                 _("Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"),
-                 sigtd->tag, sigtd->data, sigtd->count, ctx, sig);
-       res = RPMRC_FAIL;
-    }
-
-    if (result) {
-       *result = msg;
-    } else {
-       free(msg);
-    }
-    return res;
-}
index 18bbdc7099d84f7c8d0c617b88bbabea7ca93662..85dccd1d3afd5d9ee90e156e62269b4657c44607 100644 (file)
@@ -5,36 +5,21 @@
  * \file lib/signature.h
  * Generate and verify signatures.
  */
-
-#include <rpm/header.h>
-
-/** \ingroup signature
- * Signature types stored in rpm lead.
- */
-typedef        enum sigType_e {
-    RPMSIGTYPE_HEADERSIG= 5    /*!< Header style signature */
-} sigType;
+#include <rpm/rpmtypes.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/** \ingroup signature
- * Return new, empty (signature) header instance.
- * @return             signature header
- */
-Header rpmNewSignature(void);
-
 /** \ingroup signature
  * Read (and verify header+payload size) signature header.
  * If an old-style signature is found, we emulate a new style one.
  * @param fd           file handle
  * @retval sighp       address of (signature) header (or NULL)
- * @param sig_type     type of signature header to read (from lead)
  * @retval msg         failure msg
  * @return             rpmRC return code
  */
-rpmRC rpmReadSignature(FD_t fd, Header *sighp, sigType sig_type, char ** msg);
+rpmRC rpmReadSignature(FD_t fd, Header *sighp, char ** msg);
 
 /** \ingroup signature
  * Write signature header.
@@ -45,38 +30,16 @@ rpmRC rpmReadSignature(FD_t fd, Header *sighp, sigType sig_type, char ** msg);
 int rpmWriteSignature(FD_t fd, Header h);
 
 /** \ingroup signature
- * Generate digest(s) from a header+payload file, save in signature header.
- * @param sigh         signature header
- * @param file         header+payload file name
- * @param sigTag       type of digest(s) to add
- * @return             0 on success, -1 on failure
+ * Generate signature and write to file
+ * @param SHA256       SHA256 digest
+ * @param SHA1         SHA1 digest
+ * @param MD5          MD5 digest
+ * @param size         size of header
+ * @param payloadSize  size of archive
+ * @param fd           output file
  */
-int rpmGenDigest(Header sigh, const char * file, rpmTagVal sigTag);
-
-/** \ingroup signature
- * Verify a signature from a package.
- *
- * @param keyring      keyring handle
- * @param sigtd                signature tag data container
- * @param sig          signature/pubkey parameters
- * @retval result      detailed text result of signature verification
- *                     (malloc'd)
- * @return             result of signature verification
- */
-rpmRC rpmVerifySignature(rpmKeyring keyring, rpmtd sigtd, pgpDigParams sig,
-                        DIGEST_CTX ctx, char ** result);
-
-/** \ingroup signature
- * Destroy signature header from package.
- * @param h            signature header
- * @return             NULL always
- */
-Header rpmFreeSignature(Header h);
-
-/* Dumb wrapper around pgpPrtParams() to log some error messages on failure */
-RPM_GNUC_INTERNAL
-int parsePGPSig(rpmtd sigtd, const char *type, const char *fn,
-                pgpDigParams *sig);
+rpmRC rpmGenerateSignature(char *SHA256, char *SHA1, uint8_t *MD5,
+                       rpm_loff_t size, rpm_loff_t payloadSize, FD_t fd);
 
 #ifdef __cplusplus
 }
index 563c1b43ceed5688ef9b48677fd6eb30295ebd7f..00b500c26253d6f38da66cce31d243799666c113 100644 (file)
@@ -272,6 +272,7 @@ static char * strtolocale(char *str)
        locisutf8 = 0;
     if (locisutf8 == strisutf8) {
        wstr = _free(wstr);
+        cc = _free(cc);
        return str;
     }
     str = _free((char *)str);
@@ -300,28 +301,65 @@ static char * strtolocale(char *str)
     return (char *)cc;
 }
 
+typedef enum tMode_e {
+    NORMALTRIGGER     = 0,
+    FILETRIGGER       = 1,
+    TRANSFILETRIGGER  = 2,
+} tMode;
+
 /**
  * Retrieve trigger info.
+ * @param mode         type of trigger (see tMode_e)
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
-static int triggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
+static int triggercondsTagFor(tMode mode, Header h, rpmtd td,
+                               headerGetFlags hgflags)
 {
     uint32_t * indices;
     int i, j;
     char ** conds;
     struct rpmtd_s nametd, indextd, flagtd, versiontd, scripttd;
     int hgeflags = HEADERGET_MINMEM;
+    rpmTagVal triggername, triggerindex, triggerflags;
+    rpmTagVal triggerversion, triggerscripts;
+
+    switch (mode) {
+       case NORMALTRIGGER:
+           triggername = RPMTAG_TRIGGERNAME;
+           triggerindex = RPMTAG_TRIGGERINDEX;
+           triggerflags = RPMTAG_TRIGGERFLAGS;
+           triggerversion = RPMTAG_TRIGGERVERSION;
+           triggerscripts = RPMTAG_TRIGGERSCRIPTS;
+           break;
+       case FILETRIGGER:
+           triggername = RPMTAG_FILETRIGGERNAME;
+           triggerindex = RPMTAG_FILETRIGGERINDEX;
+           triggerflags = RPMTAG_FILETRIGGERFLAGS;
+           triggerversion = RPMTAG_FILETRIGGERVERSION;
+           triggerscripts = RPMTAG_FILETRIGGERSCRIPTS;
+           break;
+       case TRANSFILETRIGGER:
+           triggername = RPMTAG_TRANSFILETRIGGERNAME;
+           triggerindex = RPMTAG_TRANSFILETRIGGERINDEX;
+           triggerflags = RPMTAG_TRANSFILETRIGGERFLAGS;
+           triggerversion = RPMTAG_TRANSFILETRIGGERVERSION;
+           triggerscripts = RPMTAG_TRANSFILETRIGGERSCRIPTS;
+           break;
+       default:
+           return 0;
+    }
 
-    if (!headerGet(h, RPMTAG_TRIGGERNAME, &nametd, hgeflags)) {
+    if (!headerGet(h, triggername, &nametd, hgeflags)) {
        return 0;
     }
 
-    headerGet(h, RPMTAG_TRIGGERINDEX, &indextd, hgeflags);
-    headerGet(h, RPMTAG_TRIGGERFLAGS, &flagtd, hgeflags);
-    headerGet(h, RPMTAG_TRIGGERVERSION, &versiontd, hgeflags);
-    headerGet(h, RPMTAG_TRIGGERSCRIPTS, &scripttd, hgeflags);
+    headerGet(h, triggerindex, &indextd, hgeflags);
+    headerGet(h, triggerflags, &flagtd, hgeflags);
+    headerGet(h, triggerversion, &versiontd, hgeflags);
+    headerGet(h, triggerscripts, &scripttd, hgeflags);
 
     td->type = RPM_STRING_ARRAY_TYPE;
     td->flags = RPMTD_ALLOCED | RPMTD_PTR_ALLOCED;
@@ -370,24 +408,63 @@ static int triggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
     return 1;
 }
 
+static int triggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggercondsTagFor(NORMALTRIGGER, h, td, hgflags);
+}
+
+static int filetriggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggercondsTagFor(FILETRIGGER, h, td, hgflags);
+}
+
+static int transfiletriggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggercondsTagFor(TRANSFILETRIGGER, h, td, hgflags);
+}
+
 /**
  * Retrieve trigger type info.
+ * @param mode         type of trigger (see tMode_e)
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
-static int triggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
+static int triggertypeTagFor(tMode mode, Header h, rpmtd td,
+                               headerGetFlags hgflags)
 {
     int i;
     char ** conds;
     struct rpmtd_s indices, flags, scripts;
+    rpmTagVal triggerindex, triggerflags, triggerscripts;
+
+    switch (mode) {
+       case NORMALTRIGGER:
+           triggerindex = RPMTAG_TRIGGERINDEX;
+           triggerflags = RPMTAG_TRIGGERFLAGS;
+           triggerscripts = RPMTAG_TRIGGERSCRIPTS;
+           break;
+       case FILETRIGGER:
+           triggerindex = RPMTAG_FILETRIGGERINDEX;
+           triggerflags = RPMTAG_FILETRIGGERFLAGS;
+           triggerscripts = RPMTAG_FILETRIGGERSCRIPTS;
+           break;
+       case TRANSFILETRIGGER:
+           triggerindex = RPMTAG_TRANSFILETRIGGERINDEX;
+           triggerflags = RPMTAG_TRANSFILETRIGGERFLAGS;
+           triggerscripts = RPMTAG_TRANSFILETRIGGERSCRIPTS;
+           break;
+       default:
+          return 0;
+    }
 
-    if (!headerGet(h, RPMTAG_TRIGGERINDEX, &indices, HEADERGET_MINMEM)) {
+    if (!headerGet(h, triggerindex, &indices, HEADERGET_MINMEM)) {
        return 0;
     }
 
-    headerGet(h, RPMTAG_TRIGGERFLAGS, &flags, HEADERGET_MINMEM);
-    headerGet(h, RPMTAG_TRIGGERSCRIPTS, &scripts, HEADERGET_MINMEM);
+    headerGet(h, triggerflags, &flags, HEADERGET_MINMEM);
+    headerGet(h, triggerscripts, &scripts, HEADERGET_MINMEM);
 
     td->flags = RPMTD_ALLOCED | RPMTD_PTR_ALLOCED;
     td->count = rpmtdCount(&scripts);
@@ -423,20 +500,38 @@ static int triggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
     return 1;
 }
 
+static int triggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggertypeTagFor(NORMALTRIGGER, h, td, hgflags);
+}
+
+static int filetriggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggertypeTagFor(FILETRIGGER, h, td, hgflags);
+}
+
+static int transfiletriggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggertypeTagFor(TRANSFILETRIGGER, h, td, hgflags);
+}
+
 /**
  * Retrieve installed file paths.
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int instfilenamesTag(Header h, rpmtd td, headerGetFlags hgflags)
 {
     return fnTag(h, RPMTAG_BASENAMES, 1, td);
 }
+
 /**
  * Retrieve file paths.
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int filenamesTag(Header h, rpmtd td, headerGetFlags hgflags)
@@ -448,6 +543,7 @@ static int filenamesTag(Header h, rpmtd td, headerGetFlags hgflags)
  * Retrieve original file paths (wrt relocation).
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int origfilenamesTag(Header h, rpmtd td, headerGetFlags hgflags)
@@ -498,6 +594,7 @@ static char *makeFClass(rpmfi fi)
  * Retrieve/generate file classes.
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int fileclassTag(Header h, rpmtd td, headerGetFlags hgflags)
@@ -528,6 +625,7 @@ static int fileclassTag(Header h, rpmtd td, headerGetFlags hgflags)
  * Retrieve file provides.
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int fileprovideTag(Header h, rpmtd td, headerGetFlags hgflags)
@@ -539,6 +637,7 @@ static int fileprovideTag(Header h, rpmtd td, headerGetFlags hgflags)
  * Retrieve file requires.
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int filerequireTag(Header h, rpmtd td, headerGetFlags hgflags)
@@ -560,6 +659,7 @@ static const char * const _macro_i18ndomains = "%{?_i18ndomains}";
  * @param h            header
  * @param tag          tag
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int i18nTag(Header h, rpmTag tag, rpmtd td, headerGetFlags hgflags)
@@ -655,6 +755,7 @@ static int localeTag(Header h, rpmTag tag, rpmtd td)
  * Retrieve summary text.
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int summaryTag(Header h, rpmtd td, headerGetFlags hgflags)
@@ -666,6 +767,7 @@ static int summaryTag(Header h, rpmtd td, headerGetFlags hgflags)
  * Retrieve description text.
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int descriptionTag(Header h, rpmtd td, headerGetFlags hgflags)
@@ -687,6 +789,7 @@ static int changelogtextTag(Header h, rpmtd td)
  * Retrieve group text.
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int groupTag(Header h, rpmtd td, headerGetFlags hgflags)
@@ -733,6 +836,7 @@ static int get64(Header h, rpmtd td, rpmTag newtag, rpmTag oldtag)
  * Retrieve file sizes as 64bit regardless of how they're stored.
  * @param h            header
  * @retval td          tag data container
+ * @param hgflags      header get flags
  * @return             1 on success
  */
 static int longfilesizesTag(Header h, rpmtd td, headerGetFlags hgflags)
@@ -799,7 +903,7 @@ typedef rpmFlags nevraFlags;
 static int getNEVRA(Header h, rpmtd td, nevraFlags flags)
 {
     const char *val = NULL;
-    char *res = NULL;
+    char *res = xstrdup("");
 
     if ((flags & NEVRA_NAME)) {
        val = headerGetString(h, RPMTAG_NAME);
@@ -906,11 +1010,63 @@ static int depnevrsTag(Header h, rpmtd td, headerGetFlags hgflags,
     return (ndeps > 0);
 }
 
+#define RPMSENSE_STRONG (1 << 27)
+
+static int depnevrsTagFiltered(Header h, rpmtd td, headerGetFlags hgflags,
+                       rpmTagVal tag, int strong)
+{
+    rpmds ds = rpmdsNew(h, tag, 0);
+    int ndeps = rpmdsCount(ds);
+
+    if (ndeps > 0) {
+       char **deps = xmalloc(sizeof(*deps) * ndeps);
+       ndeps = 0;
+       while (rpmdsNext(ds) >= 0) {
+           if ((rpmdsFlags(ds) & RPMSENSE_STRONG) == (strong ? RPMSENSE_STRONG : 0))
+               deps[ndeps++] = rpmdsNewDNEVR(NULL, ds);
+       }
+       if (ndeps) {
+           td->data = deps;
+           td->type = RPM_STRING_ARRAY_TYPE;
+           td->count = ndeps;
+           td->flags |= (RPMTD_ALLOCED | RPMTD_PTR_ALLOCED);
+       } else {
+           _free(deps);
+        }
+    }
+    rpmdsFree(ds);
+    return (ndeps > 0);
+}
+
 static int requirenevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
 {
     return depnevrsTag(h, td, hgflags, RPMTAG_REQUIRENAME);
 }
 
+static int recommendnevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return depnevrsTag(h, td, hgflags, RPMTAG_RECOMMENDNAME) ||
+           depnevrsTagFiltered(h, td, hgflags, RPMTAG_OLDSUGGESTSNAME, 1);
+}
+
+static int suggestnevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return depnevrsTag(h, td, hgflags, RPMTAG_SUGGESTNAME) ||
+           depnevrsTagFiltered(h, td, hgflags, RPMTAG_OLDSUGGESTSNAME, 0);
+}
+
+static int supplementnevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return depnevrsTag(h, td, hgflags, RPMTAG_SUPPLEMENTNAME) ||
+           depnevrsTagFiltered(h, td, hgflags, RPMTAG_OLDENHANCESNAME, 1);
+}
+
+static int enhancenevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return depnevrsTag(h, td, hgflags, RPMTAG_ENHANCENAME) ||
+           depnevrsTagFiltered(h, td, hgflags, RPMTAG_OLDENHANCESNAME, 0);
+}
+
 static int providenevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
 {
     return depnevrsTag(h, td, hgflags, RPMTAG_PROVIDENAME);
@@ -957,7 +1113,11 @@ static const struct headerTagFunc_s rpmHeaderTagExtensions[] = {
     { RPMTAG_FILEPROVIDE,      fileprovideTag },
     { RPMTAG_FILEREQUIRE,      filerequireTag },
     { RPMTAG_TRIGGERCONDS,     triggercondsTag },
+    { RPMTAG_FILETRIGGERCONDS, filetriggercondsTag },
+    { RPMTAG_TRANSFILETRIGGERCONDS,    transfiletriggercondsTag },
     { RPMTAG_TRIGGERTYPE,      triggertypeTag },
+    { RPMTAG_FILETRIGGERTYPE,  filetriggertypeTag },
+    { RPMTAG_TRANSFILETRIGGERTYPE,     transfiletriggertypeTag },
     { RPMTAG_LONGFILESIZES,    longfilesizesTag },
     { RPMTAG_LONGARCHIVESIZE,  longarchivesizeTag },
     { RPMTAG_LONGSIZE,         longsizeTag },
@@ -975,6 +1135,10 @@ static const struct headerTagFunc_s rpmHeaderTagExtensions[] = {
     { RPMTAG_EPOCHNUM,         epochnumTag },
     { RPMTAG_INSTFILENAMES,    instfilenamesTag },
     { RPMTAG_REQUIRENEVRS,     requirenevrsTag },
+    { RPMTAG_RECOMMENDNEVRS,   recommendnevrsTag},
+    { RPMTAG_SUGGESTNEVRS,     suggestnevrsTag},
+    { RPMTAG_SUPPLEMENTNEVRS,  supplementnevrsTag},
+    { RPMTAG_ENHANCENEVRS,     enhancenevrsTag},
     { RPMTAG_PROVIDENEVRS,     providenevrsTag },
     { RPMTAG_OBSOLETENEVRS,    obsoletenevrsTag },
     { RPMTAG_CONFLICTNEVRS,    conflictnevrsTag },
index 0c26968038189ec9c666b9f1cc5235de6b23054f..68b252991f3deebc5ddabc38640fb580f791d260 100644 (file)
@@ -4,6 +4,8 @@
 
 #include "system.h"
 
+#include <pthread.h>
+
 #include <rpm/header.h>
 #include <rpm/rpmstring.h>
 #include "debug.h"
@@ -23,26 +25,11 @@ struct headerTagTableEntry_s {
 
 #include "lib/tagtbl.C"
 
-static const int rpmTagTableSize = sizeof(rpmTagTable) / sizeof(rpmTagTable[0]) - 1;
+#define TABLESIZE (sizeof(rpmTagTable) / sizeof(rpmTagTable[0]) - 1)
+static const int rpmTagTableSize = TABLESIZE;
 
-/**
- */
-typedef struct headerTagIndices_s * headerTagIndices;
-
-struct headerTagIndices_s {
-    int (*loadIndex) (headerTagTableEntry ** ipp, int * np,
-                int (*cmp) (const void * avp, const void * bvp));
-                                        /*!< load sorted tag index. */
-    headerTagTableEntry * byName;      /*!< header tags sorted by name. */
-    int byNameSize;                    /*!< no. of entries. */
-    int (*byNameCmp) (const void * avp, const void * bvp);                             /*!< compare entries by name. */
-    rpmTagVal (*tagValue) (const char * name); /* return value from name. */
-    headerTagTableEntry * byValue;     /*!< header tags sorted by value. */
-    int byValueSize;                   /*!< no. of entries. */
-    int (*byValueCmp) (const void * avp, const void * bvp);                            /*!< compare entries by value. */
-    const char * (*tagName) (rpmTagVal value); /* Return name from value. */
-    rpmTagType (*tagType) (rpmTagVal value);   /* Return type from value. */
-};
+static headerTagTableEntry tagsByName[TABLESIZE]; /*!< tags sorted by name. */
+static headerTagTableEntry tagsByValue[TABLESIZE]; /*!< tags sorted by value. */
 
 /**
  * Compare tag table entries by name.
@@ -74,56 +61,76 @@ static int tagCmpValue(const void * avp, const void * bvp)
     return ret;
 }
 
-/**
- * Load/sort a tag index.
- * @retval *ipp                tag index
- * @retval *np         no. of tags
- * @param cmp          sort compare routine
- * @return             0 always
- */
-static int tagLoadIndex(headerTagTableEntry ** ipp, int * np,
-               int (*cmp) (const void * avp, const void * bvp))
+static pthread_once_t tagsLoaded = PTHREAD_ONCE_INIT;
+
+/* Initialize tag by-value and by-name lookup tables */
+static void loadTags(void)
 {
-    headerTagTableEntry tte, *ip;
-    int n = 0;
-
-    ip = xcalloc(rpmTagTableSize, sizeof(*ip));
-    n = 0;
-    for (tte = (headerTagTableEntry)rpmTagTable; tte->name != NULL; tte++) {
-       ip[n] = tte;
-       n++;
+    for (int i = 0; i < rpmTagTableSize; i++) {
+       tagsByValue[i] = &rpmTagTable[i];
+       tagsByName[i] = &rpmTagTable[i];
     }
-assert(n == rpmTagTableSize);
 
-    if (n > 1)
-       qsort(ip, n, sizeof(*ip), cmp);
-    *ipp = ip;
-    *np = n;
-    return 0;
+    qsort(tagsByValue, rpmTagTableSize, sizeof(*tagsByValue), tagCmpValue);
+    qsort(tagsByName, rpmTagTableSize, sizeof(*tagsByName), tagCmpName);
 }
 
+static headerTagTableEntry entryByTag(rpmTagVal tag)
+{
+    headerTagTableEntry entry = NULL;
+    int i, comparison;
+    int l = 0;
+    int u = rpmTagTableSize;
 
-/* forward refs */
-static const char * _tagName(rpmTagVal tag);
-static rpmTagType _tagType(rpmTagVal tag);
-static rpmTagVal _tagValue(const char * tagstr);
+    while (l < u) {
+       i = (l + u) / 2;
+       comparison = (tag - tagsByValue[i]->val);
 
-static struct headerTagIndices_s _rpmTags = {
-    tagLoadIndex,
-    NULL, 0, tagCmpName, _tagValue,
-    NULL, 0, tagCmpValue, _tagName, _tagType,
-};
+       if (comparison < 0) {
+           u = i;
+       } else if (comparison > 0) {
+           l = i + 1;
+       } else {
+           /* Make sure that the bsearch retrieve is stable. */
+           while (i > 0 && tag == tagsByValue[i-1]->val) {
+               i--;
+           }
+           entry = tagsByValue[i];
+           break;
+       }
+    }
+    return entry;
+}
+
+static headerTagTableEntry entryByName(const char *tag)
+{
+    headerTagTableEntry entry = NULL;
+    int i, comparison;
+    int l = 0;
+    int u = rpmTagTableSize;
 
-static headerTagIndices const rpmTags = &_rpmTags;
+    while (l < u) {
+       i = (l + u) / 2;
+       comparison = rstrcasecmp(tag, tagsByName[i]->shortname);
 
-static const char * _tagName(rpmTagVal tag)
+       if (comparison < 0) {
+           u = i;
+       } else if (comparison > 0) {
+           l = i + 1;
+       } else {
+           entry = tagsByName[i];
+           break;
+       }
+    }
+    return entry;
+}
+
+const char * rpmTagGetName(rpmTagVal tag)
 {
     const char *name = "(unknown)";
     const struct headerTagTableEntry_s *t;
-    int comparison, i, l, u;
 
-    if (_rpmTags.byValue == NULL)
-       tagLoadIndex(&_rpmTags.byValue, &_rpmTags.byValueSize, tagCmpValue);
+    pthread_once(&tagsLoaded, loadTags);
 
     switch (tag) {
     case RPMDBI_PACKAGES:
@@ -138,119 +145,54 @@ static const char * _tagName(rpmTagVal tag)
        break;
 
     default:
-       if (_rpmTags.byValue == NULL)
-           break;
-       l = 0;
-       u = _rpmTags.byValueSize;
-       while (l < u) {
-           i = (l + u) / 2;
-           t = _rpmTags.byValue[i];
-       
-           comparison = (tag - t->val);
-
-           if (comparison < 0)
-               u = i;
-           else if (comparison > 0)
-               l = i + 1;
-           else {
-               /* Make sure that the bsearch retrieve is stable. */
-               while (i > 0 && tag == _rpmTags.byValue[i-1]->val) {
-                   i--;
-               }
-               t = _rpmTags.byValue[i];
-               if (t->shortname != NULL)
-                   name = t->shortname;
-               break;
-           }
-       }
+       t = entryByTag(tag);
+       if (t && t->shortname)
+           name = t->shortname;
        break;
     }
     return name;
 }
 
-static rpmTagType _tagType(rpmTagVal tag)
+rpmTagType rpmTagGetType(rpmTagVal tag)
 {
     const struct headerTagTableEntry_s *t;
-    int comparison, i, l, u;
-
-    if (_rpmTags.byValue == NULL)
-       tagLoadIndex(&_rpmTags.byValue, &_rpmTags.byValueSize, tagCmpValue);
-    if (_rpmTags.byValue) {
-       l = 0;
-       u = _rpmTags.byValueSize;
-       while (l < u) {
-           i = (l + u) / 2;
-           t = _rpmTags.byValue[i];
-       
-           comparison = (tag - t->val);
-
-           if (comparison < 0)
-               u = i;
-           else if (comparison > 0)
-               l = i + 1;
-           else {
-               /* Make sure that the bsearch retrieve is stable. */
-               while (i > 0 && t->val == _rpmTags.byValue[i-1]->val) {
-                   i--;
-               }
-               t = _rpmTags.byValue[i];
-               /* XXX this is dumb */
-               return (rpmTagType)(t->type | t->retype);
-           }
-       }
+    rpmTagType tagtype = RPM_NULL_TYPE;
+
+    pthread_once(&tagsLoaded, loadTags);
+
+    t = entryByTag(tag);
+    if (t) {
+       /* XXX this is dumb */
+       tagtype = (rpmTagType)(t->type | t->retype);
     }
-    return RPM_NULL_TYPE;
+    return tagtype;
 }
 
-static rpmTagVal _tagValue(const char * tagstr)
+rpmTagVal rpmTagGetValue(const char * tagstr)
 {
     const struct headerTagTableEntry_s *t;
-    int comparison, i, l, u;
+    rpmTagType tagval = RPMTAG_NOT_FOUND;
+
+    pthread_once(&tagsLoaded, loadTags);
 
     if (!rstrcasecmp(tagstr, "Packages"))
        return RPMDBI_PACKAGES;
 
-    if (_rpmTags.byName == NULL)
-       tagLoadIndex(&_rpmTags.byName, &_rpmTags.byNameSize, tagCmpName);
-    if (_rpmTags.byName == NULL)
-       return RPMTAG_NOT_FOUND;
-
-    l = 0;
-    u = _rpmTags.byNameSize;
-    while (l < u) {
-       i = (l + u) / 2;
-       t = _rpmTags.byName[i];
+    t = entryByName(tagstr);
+    if (t)
+       tagval = t->val;
        
-       comparison = rstrcasecmp(tagstr, t->shortname);
-
-       if (comparison < 0)
-           u = i;
-       else if (comparison > 0)
-           l = i + 1;
-       else
-           return t->val;
-    }
-    return RPMTAG_NOT_FOUND;
-}
-
-const char * rpmTagGetName(rpmTagVal tag)
-{
-    return ((*rpmTags->tagName)(tag));
-}
-
-rpmTagType rpmTagGetType(rpmTagVal tag)
-{
-    return ((*rpmTags->tagType)(tag));
+    return tagval;
 }
 
 rpmTagType rpmTagGetTagType(rpmTagVal tag)
 {
-    return (rpmTagType)((*rpmTags->tagType)(tag) & RPM_MASK_TYPE);
+    return (rpmTagGetType(tag) & RPM_MASK_TYPE);
 }
 
 rpmTagReturnType rpmTagGetReturnType(rpmTagVal tag)
 {
-    return ((*rpmTags->tagType)(tag) & RPM_MASK_RETURN_TYPE);
+    return (rpmTagGetType(tag) & RPM_MASK_RETURN_TYPE);
 }
 
 rpmTagClass rpmTagTypeGetClass(rpmTagType type)
@@ -285,30 +227,25 @@ rpmTagClass rpmTagGetClass(rpmTagVal tag)
     return rpmTagTypeGetClass(rpmTagGetTagType(tag));
 }
 
-rpmTagVal rpmTagGetValue(const char * tagstr)
-{
-    return ((*rpmTags->tagValue)(tagstr));
-}
-
 int rpmTagGetNames(rpmtd tagnames, int fullname)
 {
     const char **names;
     const char *name;
 
-    if (_rpmTags.byName == NULL)
-       tagLoadIndex(&_rpmTags.byName, &_rpmTags.byNameSize, tagCmpName);
-    if (tagnames == NULL ||_rpmTags.byName == NULL)
+    pthread_once(&tagsLoaded, loadTags);
+
+    if (tagnames == NULL || tagsByName == NULL)
        return 0;
 
     rpmtdReset(tagnames);
-    tagnames->count = _rpmTags.byNameSize;
+    tagnames->count = rpmTagTableSize;
     tagnames->data = names = xmalloc(tagnames->count * sizeof(*names));
     tagnames->type = RPM_STRING_ARRAY_TYPE;
     tagnames->flags = RPMTD_ALLOCED | RPMTD_IMMUTABLE;
 
     for (int i = 0; i < tagnames->count; i++) {
-       name = fullname ? _rpmTags.byName[i]->name : 
-                         _rpmTags.byName[i]->shortname;
+       name = fullname ? tagsByName[i]->name :
+                         tagsByName[i]->shortname;
        names[i] = name;
     }
     return tagnames->count;
index fa17d34b74652b78559ff77fb67313bd666f2abe..6af1d1662e625c7c42137af997777472f05d8c07 100644 (file)
@@ -4,6 +4,9 @@
 
 #include "system.h"
 
+#include <inttypes.h>
+#include <libgen.h>
+
 #include <rpm/rpmlib.h>                /* rpmMachineScore, rpmReadPackageFile */
 #include <rpm/rpmmacro.h>      /* XXX for rpmExpand */
 #include <rpm/rpmlog.h>
@@ -11,6 +14,7 @@
 #include <rpm/rpmds.h>
 #include <rpm/rpmfileutil.h>
 #include <rpm/rpmstring.h>
+#include <rpm/rpmsq.h>
 
 #include "lib/fprint.h"
 #include "lib/misc.h"
@@ -21,6 +25,7 @@
 #include "lib/rpmte_internal.h"        /* only internal apis */
 #include "lib/rpmts_internal.h"
 #include "rpmio/rpmhook.h"
+#include "lib/rpmtriggers.h"
 
 #include "lib/rpmplugins.h"
 
@@ -63,6 +68,45 @@ struct diskspaceInfo_s {
 #define        adj_fs_blocks(_nb)      (((_nb) * 21) / 20)
 #define BLOCK_ROUND(size, block) (((size) + (block) - 1) / (block))
 
+static char *getMntPoint(const char *dirName, dev_t dev)
+{
+    char mntPoint[PATH_MAX];
+    char *resolved_path = realpath(dirName, mntPoint);
+    char *end = NULL;
+    struct stat sb;
+    char *res = NULL;
+
+    if (!resolved_path) {
+       strncpy(mntPoint, dirName, PATH_MAX);
+       mntPoint[PATH_MAX-1] = '\0';
+    }
+
+    while (end != mntPoint) {
+       end = strrchr(mntPoint, '/');
+       if (end == mntPoint) { /* reached "/" */
+           stat("/", &sb);
+           if (dev != sb.st_dev) {
+               res = xstrdup(mntPoint);
+           } else {
+               res = xstrdup("/");
+           }
+           break;
+       } else if (end) {
+           *end = '\0';
+       } else { /* dirName doesn't start with / - should not happen */
+           res = xstrdup(dirName);
+           break;
+       }
+       stat(mntPoint, &sb);
+       if (dev != sb.st_dev) {
+           *end = '/';
+           res = xstrdup(mntPoint);
+           break;
+       }
+    }
+    return res;
+}
+
 static int rpmtsInitDSI(const rpmts ts)
 {
     if (rpmtsFilterFlags(ts) & RPMPROB_FILTER_DISKSPACE)
@@ -77,8 +121,6 @@ static rpmDiskSpaceInfo rpmtsCreateDSI(const rpmts ts, dev_t dev,
 {
     rpmDiskSpaceInfo dsi;
     struct stat sb;
-    char * resolved_path;
-    char mntPoint[PATH_MAX];
     int rc;
 
 #if STATFS_IN_SYS_STATVFS
@@ -119,11 +161,7 @@ static rpmDiskSpaceInfo rpmtsCreateDSI(const rpmts ts, dev_t dev,
     dsi->bneeded = 0;
     dsi->ineeded = 0;
 #ifdef STATFS_HAS_F_BAVAIL
-# ifdef ST_RDONLY
     dsi->bavail = (sfb.f_flag & ST_RDONLY) ? 0 : sfb.f_bavail;
-# else
-    dsi->bavail = sfb.f_bavail;
-# endif
 #else
 /* FIXME: the statfs struct doesn't have a member to tell how many blocks are
  * available for non-superusers.  f_blocks - f_bfree is probably too big, but
@@ -137,34 +175,16 @@ static rpmDiskSpaceInfo rpmtsCreateDSI(const rpmts ts, dev_t dev,
        ? sfb.f_ffree : -1;
 
     /* Find mount point belonging to this device number */
-    resolved_path = realpath(dirName, mntPoint);
-    if (!resolved_path) {
-       strncpy(mntPoint, dirName, PATH_MAX);
-       mntPoint[PATH_MAX-1] = '\0';
-    }
-    char * end = NULL;
-    while (end != mntPoint) {
-       end = strrchr(mntPoint, '/');
-       if (end == mntPoint) { /* reached "/" */
-           stat("/", &sb);
-           if (dsi->dev != sb.st_dev) {
-               dsi->mntPoint = xstrdup(mntPoint);
-           } else {
-               dsi->mntPoint = xstrdup("/");
-           }
-           break;
-       } else if (end) {
-           *end = '\0';
-       } else { /* dirName doesn't start with / - should not happen */
-           dsi->mntPoint = xstrdup(dirName);
-           break;
-       }
-       stat(mntPoint, &sb);
-       if (dsi->dev != sb.st_dev) {
-           *end = '/';
-           dsi->mntPoint = xstrdup(mntPoint);
-           break;
-       }
+    dsi->mntPoint = getMntPoint(dirName, dsi->dev);
+
+    /* normalize block size to 4096 bytes if it is too big. */
+    if (dsi->bsize > 4096) {
+       uint64_t old_size = dsi->bavail * dsi->bsize;
+       rpmlog(RPMLOG_DEBUG,
+               "dubious blocksize % " PRId64 " on %s, normalizing to 4096\n",
+               dsi->bsize, dsi->mntPoint);
+       dsi->bsize = 4096; /* Assume 4k block size */
+       dsi->bavail = old_size / dsi->bsize;
     }
 
     rpmlog(RPMLOG_DEBUG,
@@ -291,17 +311,21 @@ static uint64_t countFiles(rpmts ts)
     uint64_t fc = 0;
     rpmtsi pi = rpmtsiInit(ts);
     rpmte p;
-    while ((p = rpmtsiNext(pi, 0)) != NULL)
-       fc += rpmfiFC(rpmteFI(p));
+    rpmfiles files;
+    while ((p = rpmtsiNext(pi, 0)) != NULL) {
+       files = rpmteFiles(p);
+       fc += rpmfilesFC(files);
+       rpmfilesFree(files);
+    }
     rpmtsiFree(pi);
     return fc;
 }
 
-static int handleRemovalConflict(rpmfi fi, int fx, rpmfi ofi, int ofx)
+static int handleRemovalConflict(rpmfiles fi, int fx, rpmfiles ofi, int ofx)
 {
     int rConflicts = 0; /* Removed files don't conflict, normally */
-    rpmFileTypes ft = rpmfiWhatis(rpmfiFModeIndex(fi, fx));
-    rpmFileTypes oft = rpmfiWhatis(rpmfiFModeIndex(ofi, ofx));
+    rpmFileTypes ft = rpmfiWhatis(rpmfilesFMode(fi, fx));
+    rpmFileTypes oft = rpmfiWhatis(rpmfilesFMode(ofi, ofx));
     struct stat sb;
     char *fn = NULL;
 
@@ -312,7 +336,7 @@ static int handleRemovalConflict(rpmfi fi, int fx, rpmfi ofi, int ofx)
     } else if (oft == LINK) {
        /* We can't correctly handle directory symlink changing to directory */
        if (ft == XDIR) {
-           fn = rpmfiFNIndex(fi, fx);
+           fn = rpmfilesFN(fi, fx);
            if (stat(fn, &sb) == 0 && S_ISDIR(sb.st_mode))
                rConflicts = 1;
        }
@@ -324,7 +348,7 @@ static int handleRemovalConflict(rpmfi fi, int fx, rpmfi ofi, int ofx)
      */
     if (rConflicts) {
        if (fn == NULL)
-           fn = rpmfiFNIndex(fi, fx);
+           fn = rpmfilesFN(fi, fx);
        if (lstat(fn, &sb) || rpmfiWhatis(sb.st_mode) == ft)
            rConflicts = 0;
     }
@@ -342,15 +366,15 @@ static int handleRemovalConflict(rpmfi fi, int fx, rpmfi ofi, int ofx)
  * unnecessary with careful packaging.
  */
 static int handleColorConflict(rpmts ts,
-                              rpmfs fs, rpmfi fi, int fx,
-                              rpmfs ofs, rpmfi ofi, int ofx)
+                              rpmfs fs, rpmfiles fi, int fx,
+                              rpmfs ofs, rpmfiles ofi, int ofx)
 {
     int rConflicts = 1;
     rpm_color_t tscolor = rpmtsColor(ts);
 
     if (tscolor != 0) {
-       rpm_color_t fcolor = rpmfiFColorIndex(fi, fx) & tscolor;
-       rpm_color_t ofcolor = rpmfiFColorIndex(ofi, ofx) & tscolor;
+       rpm_color_t fcolor = rpmfilesFColor(fi, fx) & tscolor;
+       rpm_color_t ofcolor = rpmfilesFColor(ofi, ofx) & tscolor;
 
        if (fcolor != 0 && ofcolor != 0 && fcolor != ofcolor) {
            rpm_color_t prefcolor = rpmtsPrefColor(ts);
@@ -377,22 +401,24 @@ static int handleColorConflict(rpmts ts,
  * @param ts           transaction set
  * @param p            current transaction element
  * @param fi           file info set
- * @param shared       shared file info
- * @param sharedCount  no. of shared elements
- * @param reportConflicts
+ * @param fx           file index
+ * @param otherHeader  header containing the matching file
+ * @param otherFi      matching file info set
+ * @param ofx          matching file index
+ * @param beingRemoved  file being removed (installed otherwise)
  */
 /* XXX only ts->{probs,rpmdb} modified */
-static void handleInstInstalledFile(const rpmts ts, rpmte p, rpmfi fi, int fx,
-                                  Header otherHeader, rpmfi otherFi, int ofx,
+static void handleInstInstalledFile(const rpmts ts, rpmte p, rpmfiles fi, int fx,
+                                  Header otherHeader, rpmfiles otherFi, int ofx,
                                   int beingRemoved)
 {
     rpmfs fs = rpmteGetFileStates(p);
-    int isCfgFile = ((rpmfiFFlagsIndex(otherFi, ofx) | rpmfiFFlagsIndex(fi, fx)) & RPMFILE_CONFIG);
+    int isCfgFile = ((rpmfilesFFlags(otherFi, ofx) | rpmfilesFFlags(fi, fx)) & RPMFILE_CONFIG);
 
     if (XFA_SKIPPING(rpmfsGetAction(fs, fx)))
        return;
 
-    if (rpmfiCompareIndex(otherFi, ofx, fi, fx)) {
+    if (rpmfilesCompare(otherFi, ofx, fi, fx)) {
        int rConflicts = 1;
        char rState = RPMFILE_STATE_REPLACED;
 
@@ -421,20 +447,22 @@ static void handleInstInstalledFile(const rpmts ts, rpmte p, rpmfi fi, int fx,
                rState = RPMFILE_STATE_WRONGCOLOR;
        }
 
+
        if (rConflicts) {
-               char *path = rpmfiFNIndex(fi, fx);
+               char *path = rpmfilesFN(fi, fx);
                /* Call file conflict hook for all plugins */
                rpmpluginsCallFileConflict(ts->plugins, ts, path, otherHeader, otherFi, rConflicts);
        }
-       
+
        /* Somebody used The Force, lets shut up... */
        if (rpmtsFilterFlags(ts) & RPMPROB_FILTER_REPLACEOLDFILES) {
            rConflicts = 0;
        }
 
+
        if (rConflicts) {
            char *altNEVR = headerGetAsString(otherHeader, RPMTAG_NEVRA);
-           char *fn = rpmfiFNIndex(fi, fx);
+           char *fn = rpmfilesFN(fi, fx);
            rpmteAddProblem(p, RPMPROB_FILE_CONFLICT, altNEVR, fn,
                            headerGetInstance(otherHeader));
            free(fn);
@@ -449,34 +477,42 @@ static void handleInstInstalledFile(const rpmts ts, rpmte p, rpmfi fi, int fx,
        }
     }
 
-    /* Determine config file dispostion, skipping missing files (if any). */
+    /* Determine config file disposition, skipping missing files (if any). */
     if (isCfgFile) {
        int skipMissing = ((rpmtsFlags(ts) & RPMTRANS_FLAG_ALLFILES) ? 0 : 1);
        rpmFileAction action;
-       action = rpmfiDecideFateIndex(otherFi, ofx, fi, fx, skipMissing);
+       action = rpmfilesDecideFate(otherFi, ofx, fi, fx, skipMissing);
        rpmfsSetAction(fs, fx, action);
     }
-    rpmfiSetFReplacedSizeIndex(fi, fx, rpmfiFSizeIndex(otherFi, ofx));
+
+    /* Skip already existing files - if 'minimize_writes' is set. */
+    if ((!isCfgFile) && (rpmfsGetAction(fs, fx) == FA_UNKNOWN)  && ts->min_writes) {
+       if (rpmfileContentsEqual(otherFi, ofx, fi, fx)) {
+          rpmfsSetAction(fs, fx, FA_TOUCH);
+       }
+    }
+
+    rpmfilesSetFReplacedSize(fi, fx, rpmfilesFSize(otherFi, ofx));
 }
 
 /**
  * Update disk space needs on each partition for this package's files.
  */
 /* XXX only ts->{probs,di} modified */
-static void handleOverlappedFiles(rpmts ts, fingerPrintCache fpc, rpmte p, rpmfi fi)
+static void handleOverlappedFiles(rpmts ts, fingerPrintCache fpc, rpmte p, rpmfiles fi)
 {
     rpm_loff_t fixupSize = 0;
     int i, j;
     rpmfs fs = rpmteGetFileStates(p);
     rpmfs otherFs;
-    rpm_count_t fc = rpmfiFC(fi);
+    rpm_count_t fc = rpmfilesFC(fi);
     int reportConflicts = !(rpmtsFilterFlags(ts) & RPMPROB_FILTER_REPLACENEWFILES);
-    fingerPrint * fpList = rpmfiFps(fi);
+    fingerPrint * fpList = rpmfilesFps(fi);
 
     for (i = 0; i < fc; i++) {
        struct fingerPrint_s * fiFps;
        int otherPkgNum, otherFileNum;
-       rpmfi otherFi;
+       rpmfiles otherFi;
        rpmte otherTe;
        rpmfileAttrs FFlags;
        struct rpmffi_s * recs;
@@ -485,7 +521,7 @@ static void handleOverlappedFiles(rpmts ts, fingerPrintCache fpc, rpmte p, rpmfi
        if (XFA_SKIPPING(rpmfsGetAction(fs, i)))
            continue;
 
-       FFlags = rpmfiFFlagsIndex(fi, i);
+       FFlags = rpmfilesFFlags(fi, i);
 
        fixupSize = 0;
 
@@ -513,7 +549,7 @@ static void handleOverlappedFiles(rpmts ts, fingerPrintCache fpc, rpmte p, rpmfi
         * that were just installed.
         * If both this and the other package are being removed, then each
         * file removal from preceding packages needs to be skipped so that
-        * the file removal occurs only on the last occurence of an overlapped
+        * the file removal occurs only on the last occurrence of an overlapped
         * file in the transaction set.
         *
         */
@@ -535,7 +571,6 @@ static void handleOverlappedFiles(rpmts ts, fingerPrintCache fpc, rpmte p, rpmfi
 
        for (otherPkgNum = j - 1; otherPkgNum >= 0; otherPkgNum--) {
            otherTe = recs[otherPkgNum].p;
-           otherFi = rpmteFI(otherTe);
            otherFileNum = recs[otherPkgNum].fileno;
            otherFs = rpmteGetFileStates(otherTe);
 
@@ -544,8 +579,10 @@ static void handleOverlappedFiles(rpmts ts, fingerPrintCache fpc, rpmte p, rpmfi
                continue;
 
            /* XXX Happens iff fingerprint for incomplete package install. */
-           if (rpmfsGetAction(otherFs, otherFileNum) != FA_UNKNOWN)
+           if (rpmfsGetAction(otherFs, otherFileNum) != FA_UNKNOWN) {
+               otherFi = rpmteFiles(otherTe);
                break;
+           }
        }
 
        switch (rpmteType(p)) {
@@ -555,7 +592,7 @@ static void handleOverlappedFiles(rpmts ts, fingerPrintCache fpc, rpmte p, rpmfi
                rpmFileAction action;
                if (rpmfsGetAction(fs, i) != FA_UNKNOWN)
                    break;
-               if (rpmfiConfigConflictIndex(fi, i)) {
+               if (rpmfilesConfigConflict(fi, i)) {
                    /* Here is a non-overlapped pre-existing config file. */
                    action = (FFlags & RPMFILE_NOREPLACE) ?
                              FA_ALTNAME : FA_BACKUP;
@@ -568,7 +605,7 @@ static void handleOverlappedFiles(rpmts ts, fingerPrintCache fpc, rpmte p, rpmfi
 
 assert(otherFi != NULL);
            /* Mark added overlapped non-identical files as a conflict. */
-           if (rpmfiCompareIndex(otherFi, otherFileNum, fi, i)) {
+           if (rpmfilesCompare(otherFi, otherFileNum, fi, i)) {
                int rConflicts;
 
                /* If enabled, resolve colored conflicts to preferred type */
@@ -576,7 +613,7 @@ assert(otherFi != NULL);
                                                otherFs, otherFi, otherFileNum);
 
                if (rConflicts && reportConflicts) {
-                   char *fn = rpmfiFNIndex(fi, i);
+                   char *fn = rpmfilesFN(fi, i);
                    rpmteAddProblem(p, RPMPROB_NEW_FILE_CONFLICT,
                                    rpmteNEVRA(otherTe), fn, 0);
                    free(fn);
@@ -587,10 +624,13 @@ assert(otherFi != NULL);
                if (oaction != FA_UNKNOWN && !XFA_SKIPPING(oaction)) {
                    rpmfileAttrs oflags;
                    /* ...but ghosts aren't really created so... */
-                   oflags = rpmfiFFlagsIndex(otherFi, otherFileNum);
+                   oflags = rpmfilesFFlags(otherFi, otherFileNum);
                    if (!(oflags & RPMFILE_GHOST)) {
                        rpmfsSetAction(fs, i, FA_SKIP);
                    }
+               /* if the other file is color skipped then skip this file too */
+               } else if (oaction == FA_SKIPCOLOR) {
+                   rpmfsSetAction(fs, i, FA_SKIPCOLOR);
                }
            }
 
@@ -599,9 +639,9 @@ assert(otherFi != NULL);
                break;
 
            /* Try to get the disk accounting correct even if a conflict. */
-           fixupSize = rpmfiFSizeIndex(otherFi, otherFileNum);
+           fixupSize = rpmfilesFSize(otherFi, otherFileNum);
 
-           if (rpmfiConfigConflictIndex(fi, i)) {
+           if (rpmfilesConfigConflict(fi, i)) {
                /* Here is an overlapped  pre-existing config file. */
                rpmFileAction action;
                action = (FFlags & RPMFILE_NOREPLACE) ? FA_ALTNAME : FA_SKIP;
@@ -627,12 +667,14 @@ assert(otherFi != NULL);
            }
            if (XFA_SKIPPING(rpmfsGetAction(fs, i)))
                break;
-           if (rpmfiFStateIndex(fi, i) != RPMFILE_STATE_NORMAL)
+           if (rpmfilesFState(fi, i) != RPMFILE_STATE_NORMAL) {
+               rpmfsSetAction(fs, i, FA_SKIP);
                break;
+           }
                
            /* Pre-existing modified config files need to be saved. */
-           if (rpmfiConfigConflictIndex(fi, i)) {
-               rpmfsSetAction(fs, i, FA_BACKUP);
+           if (rpmfilesConfigConflict(fi, i)) {
+               rpmfsSetAction(fs, i, FA_SAVE);
                break;
            }
        
@@ -640,10 +682,11 @@ assert(otherFi != NULL);
            rpmfsSetAction(fs, i, FA_ERASE);
            break;
        }
+       rpmfilesFree(otherFi);
 
        /* Update disk space info for a file. */
        rpmtsUpdateDSI(ts, fpEntryDev(fpc, fiFps), fpEntryDir(fpc, fiFps),
-                      rpmfiFSizeIndex(fi, i), rpmfiFReplacedSizeIndex(fi, i),
+                      rpmfilesFSize(fi, i), rpmfilesFReplacedSize(fi, i),
                       fixupSize, rpmfsGetAction(fs, i));
 
     }
@@ -654,7 +697,6 @@ assert(otherFi != NULL);
  * @param tspool       transaction string pool
  * @param p            current transaction element
  * @param h            installed header
- * @param ps           problem set
  */
 static void ensureOlder(rpmstrPool tspool, const rpmte p, const Header h)
 {
@@ -677,9 +719,9 @@ static void ensureOlder(rpmstrPool tspool, const rpmte p, const Header h)
  * netshardpath and though should be excluded.
  * @param ts            transaction set
  * @param fi            file info set
- * @returns pointer to matching path or NULL
+ * @returns 1 if path is net shared path, otherwise 0
  */
-static char ** matchNetsharedpath(const rpmts ts, rpmfi fi)
+static int matchNetsharedpath(const rpmts ts, rpmfi fi)
 {
     char ** nsp;
     const char * dn, * bn;
@@ -717,29 +759,25 @@ static char ** matchNetsharedpath(const rpmts ts, rpmfi fi)
 
        break;
     }
-    return nsp;
+    return (nsp != NULL && *nsp != NULL);
 }
 
-static void skipEraseFiles(const rpmts ts, rpmte p)
+static void skipEraseFiles(const rpmts ts, rpmfiles files, rpmfs fs)
 {
-    rpmfi fi = rpmteFI(p);
-    rpmfs fs = rpmteGetFileStates(p);
     int i;
-    char ** nsp;
     /*
      * Skip net shared paths.
      * Net shared paths are not relative to the current root (though
      * they do need to take package relocations into account).
      */
     if (ts->netsharedPaths) {
-       fi = rpmfiInit(fi, 0);
+       rpmfi fi = rpmfilesIter(files, RPMFI_ITER_FWD);
        while ((i = rpmfiNext(fi)) >= 0)
        {
-           nsp = matchNetsharedpath(ts, fi);
-           if (nsp && *nsp) {
+           if (matchNetsharedpath(ts, fi))
                rpmfsSetAction(fs, i, FA_SKIPNETSHARED);
-           }
        }
+       rpmfiFree(fi);
     }
 }
 
@@ -747,9 +785,10 @@ static void skipEraseFiles(const rpmts ts, rpmte p)
 /**
  * Skip any files that do not match install policies.
  * @param ts           transaction set
- * @param fi           file info set
+ * @param files                file info set
+ * @param fs           file states
  */
-static void skipInstallFiles(const rpmts ts, rpmte p)
+static void skipInstallFiles(const rpmts ts, rpmfiles files, rpmfs fs)
 {
     rpm_color_t tscolor = rpmtsColor(ts);
     rpm_color_t FColor;
@@ -759,8 +798,7 @@ static void skipInstallFiles(const rpmts ts, rpmte p)
     char * dff;
     int dc;
     int i, j, ix;
-    rpmfi fi = rpmteFI(p);
-    rpmfs fs = rpmteGetFileStates(p);
+    rpmfi fi = rpmfilesIter(files, RPMFI_ITER_FWD);
 
     if (!noDocs)
        noDocs = rpmExpandNumeric("%{_excludedocs}");
@@ -772,13 +810,13 @@ static void skipInstallFiles(const rpmts ts, rpmte p)
 
     fi = rpmfiInit(fi, 0);
     while ((i = rpmfiNext(fi)) >= 0) {
-       char ** nsp;
        const char *flangs;
 
        ix = rpmfiDX(fi);
        drc[ix]++;
 
        /* Don't bother with skipped files */
+       /* XXX FIXME: --excludepath on %license should not be permitted */
        if (XFA_SKIPPING(rpmfsGetAction(fs, i))) {
            drc[ix]--; dff[ix] = 1;
            continue;
@@ -798,14 +836,21 @@ static void skipInstallFiles(const rpmts ts, rpmte p)
         * they do need to take package relocations into account).
         */
        if (ts->netsharedPaths) {
-           nsp = matchNetsharedpath(ts, fi);
-           if (nsp && *nsp) {
+           if (matchNetsharedpath(ts, fi)) {
                drc[ix]--;      dff[ix] = 1;
                rpmfsSetAction(fs, i, FA_SKIPNETSHARED);
                continue;
            }
        }
 
+       /*
+        * In general, excluding license files is not permitted. In case
+        * of SKIPNETSHARED and SKIPCOLOR the file is expected to be
+        * there via other means however so that is ok.
+        */
+       if (rpmfiFFlags(fi) & RPMFILE_LICENSE)
+           continue;
+
        /*
         * Skip i18n language specific files.
         */
@@ -851,7 +896,8 @@ static void skipInstallFiles(const rpmts ts, rpmte p)
     }
 
     /* Skip (now empty) directories that had skipped files. */
-    for (j = 0; j < dc; j++) {
+    /* Iterate over dirs in reversed order to solve subdirs at first */
+    for (j = dc - 1; j >= 0; j--) {
        const char * dn, * bn;
        size_t dnlen, bnlen;
 
@@ -859,7 +905,7 @@ static void skipInstallFiles(const rpmts ts, rpmte p)
        if (!dff[j]) continue;  /* dir was not emptied here. */
        
        /* Find parent directory and basename. */
-       dn = rpmfiDNIndex(fi, j); dnlen = strlen(dn) - 1;
+       dn = rpmfilesDN(files, j); dnlen = strlen(dn) - 1;
        bn = dn + dnlen;        bnlen = 0;
        while (bn > dn && bn[-1] != '/') {
                bnlen++;
@@ -892,12 +938,18 @@ static void skipInstallFiles(const rpmts ts, rpmte p)
                continue;
            rpmlog(RPMLOG_DEBUG, "excluding directory %s\n", dn);
            rpmfsSetAction(fs, i, FA_SKIPNSTATE);
+           ix = rpmfiDX(fi);
+           /* Decrease count of files for parent directory */
+           drc[ix]--;
+           /* Mark directory because something was removed from them */
+           dff[ix] = 1;
            break;
        }
     }
 
     free(drc);
     free(dff);
+    rpmfiFree(fi);
 }
 
 #undef HASHTYPE
@@ -932,6 +984,7 @@ rpmdbMatchIterator rpmFindBaseNamesInDB(rpmts ts, uint64_t fileCount)
     tsMembers tsmem = rpmtsMembers(ts);
     rpmstrPool tspool = rpmtsPool(ts);
     rpmtsi pi;  rpmte p;
+    rpmfiles files;
     rpmfi fi;
     rpmdbMatchIterator mi;
     int oc = 0;
@@ -945,12 +998,13 @@ rpmdbMatchIterator rpmFindBaseNamesInDB(rpmts ts, uint64_t fileCount)
 
     pi = rpmtsiInit(ts);
     while ((p = rpmtsiNext(pi, 0)) != NULL) {
-       (void) rpmdbCheckSignals();
+       (void) rpmsqPoll();
 
        rpmtsNotify(ts, NULL, RPMCALLBACK_TRANS_PROGRESS, oc++, tsmem->orderCount);
 
        /* Gather all installed headers with matching basename's. */
-       fi = rpmfiInit(rpmteFI(p), 0);
+       files = rpmteFiles(p);
+       fi = rpmfilesIter(files, RPMFI_ITER_FWD);
        while (rpmfiNext(fi) >= 0) {
            size_t keylen;
 
@@ -965,7 +1019,9 @@ rpmdbMatchIterator rpmFindBaseNamesInDB(rpmts ts, uint64_t fileCount)
                keylen++;       /* XXX "/" fixup. */
            rpmdbExtendIterator(mi, baseName, keylen);
            rpmStringSetAddEntry(baseNames, baseNameId);
-        }
+       }
+       rpmfiFree(fi);
+       rpmfilesFree(files);
     }
     rpmtsiFree(pi);
     rpmStringSetFree(baseNames);
@@ -986,7 +1042,7 @@ void checkInstalledFiles(rpmts ts, uint64_t fileCount, fingerPrintCache fpc)
 {
     tsMembers tsmem = rpmtsMembers(ts);
     rpmte p;
-    rpmfi fi;
+    rpmfiles fi;
     rpmfs fs;
     int j;
     unsigned int fileNum;
@@ -1015,15 +1071,15 @@ void checkInstalledFiles(rpmts ts, uint64_t fileCount, fingerPrintCache fpc)
        fingerPrint *fpp = NULL;
        unsigned int installedPkg;
        int beingRemoved = 0;
-       rpmfi otherFi = NULL;
+       rpmfiles otherFi = NULL;
        rpmte *removedPkg = NULL;
 
        /* Is this package being removed? */
        installedPkg = rpmdbGetIteratorOffset(mi);
-       if (removedHashGetEntry(tsmem->removedPackages, installedPkg,
+       if (packageHashGetEntry(tsmem->removedPackages, installedPkg,
                                &removedPkg, NULL, NULL)) {
            beingRemoved = 1;
-           otherFi = rpmfiLink(rpmteFI(removedPkg[0]));
+           otherFi = rpmteFiles(removedPkg[0]);
        }
 
        h = headerLink(h);
@@ -1057,7 +1113,7 @@ void checkInstalledFiles(rpmts ts, uint64_t fileCount, fingerPrintCache fpc)
                fpLookup(fpc, dirName, baseName, &fpp);
                fpIx = 0;
            } else {
-               fpp = rpmfiFps(otherFi);
+               fpp = rpmfilesFps(otherFi);
                fpIx = fileNum;
            }
 
@@ -1066,7 +1122,7 @@ void checkInstalledFiles(rpmts ts, uint64_t fileCount, fingerPrintCache fpc)
 
            for (j = 0; j < numRecs; j++) {
                p = recs[j].p;
-               fi = rpmteFI(p);
+               fi = rpmteFiles(p);
                fs = rpmteGetFileStates(p);
 
                /* Determine the fate of each file. */
@@ -1074,7 +1130,7 @@ void checkInstalledFiles(rpmts ts, uint64_t fileCount, fingerPrintCache fpc)
                case TR_ADDED:
                    if (!otherFi) {
                        /* XXX What to do if this fails? */
-                       otherFi = rpmfiNew(ts, h, RPMTAG_BASENAMES, RPMFI_KEEPHEADER);
+                       otherFi = rpmfilesNew(NULL, h, RPMTAG_BASENAMES, RPMFI_KEEPHEADER);
                    }
                    handleInstInstalledFile(ts, p, fi, recs[j].fileno,
                                            h, otherFi, fileNum, beingRemoved);
@@ -1086,13 +1142,14 @@ void checkInstalledFiles(rpmts ts, uint64_t fileCount, fingerPrintCache fpc)
                    }
                    break;
                }
+               rpmfilesFree(fi);
            }
 
            newheader = rpmdbNextIterator(mi);
 
        } while (newheader==h);
 
-       otherFi = rpmfiFree(otherFi);
+       otherFi = rpmfilesFree(otherFi);
        if (!beingRemoved) {
            rpmtdFreeData(&ostates);
            rpmtdFreeData(&bnames);
@@ -1146,7 +1203,7 @@ static rpmps checkProblems(rpmts ts)
        if (!(probFilter & RPMPROB_FILTER_REPLACEPKG)) {
            Header h;
            rpmdbMatchIterator mi;
-           mi = rpmtsInitIterator(ts, RPMDBI_NAME, rpmteN(p), 0);
+           mi = rpmtsPrunedIterator(ts, RPMDBI_NAME, rpmteN(p), 1);
            rpmdbSetIteratorRE(mi, RPMTAG_EPOCH, RPMMIRE_STRCMP, rpmteE(p));
            rpmdbSetIteratorRE(mi, RPMTAG_VERSION, RPMMIRE_STRCMP, rpmteV(p));
            rpmdbSetIteratorRE(mi, RPMTAG_RELEASE, RPMMIRE_STRCMP, rpmteR(p));
@@ -1180,92 +1237,16 @@ static int runTransScripts(rpmts ts, pkgGoal goal)
     int rc = 0;
     rpmte p;
     rpmtsi pi = rpmtsiInit(ts);
-    while ((p = rpmtsiNext(pi, TR_ADDED)) != NULL) {
-       rc += rpmteProcess(p, goal);
-    }
-    rpmtsiFree(pi);
-    return rc;
-}
-
-static int rpmtsSetupCollections(rpmts ts)
-{
-    /* seenCollectionsPost and TEs are basically a key-value pair. each item in
-     * seenCollectionsPost is a collection that has been seen from any package,
-     * and the associated index in the TEs is the last transaction element
-     * where that collection was seen. */
-    ARGV_t seenCollectionsPost = NULL;
-    rpmte *TEs = NULL;
-    int numSeenPost = 0;
-
-    /* seenCollectionsPre is a list of collections that have been seen from
-     * only removed packages */
-    ARGV_t seenCollectionsPre = NULL;
-    int numSeenPre = 0;
-
-    ARGV_const_t collname;
-    int installing = 1;
-    int i;
-
-    rpmte p;
-    rpmtsi pi = rpmtsiInit(ts);
-    while ((p = rpmtsiNext(pi, 0)) != NULL) {
-       /* detect when we switch from installing to removing packages, and
-        * update the lastInCollectionAdd lists */
-       if (installing && rpmteType(p) == TR_REMOVED) {
-           installing = 0;
-           for (i = 0; i < numSeenPost; i++) {
-               rpmteAddToLastInCollectionAdd(TEs[i], seenCollectionsPost[i]);
-           }
-       }
-
-       rpmteSetupCollectionPlugins(p);
-
-       for (collname = rpmteCollections(p); collname && *collname; collname++) {
-           /* figure out if we've seen this collection in post before */
-           for (i = 0; i < numSeenPost && strcmp(*collname, seenCollectionsPost[i]); i++) {
-           }
-           if (i < numSeenPost) {
-               /* we've seen the collection, update the index */
-               TEs[i] = p;
-           } else {
-               /* haven't seen the collection yet, add it */
-               argvAdd(&seenCollectionsPost, *collname);
-               TEs = xrealloc(TEs, sizeof(*TEs) * (numSeenPost + 1));
-               TEs[numSeenPost] = p;
-               numSeenPost++;
-           }
+    rpmElementTypes types = TR_ADDED;
+    int i = 0;
+    if (goal == PKG_TRANSFILETRIGGERUN)
+       types = TR_REMOVED;
 
-           /* figure out if we've seen this collection in pre remove before */
-           if (installing == 0) {
-               for (i = 0; i < numSeenPre && strcmp(*collname, seenCollectionsPre[i]); i++) {
-               }
-               if (i >= numSeenPre) {
-                   /* haven't seen this collection, add it */
-                   rpmteAddToFirstInCollectionRemove(p, *collname);
-                   argvAdd(&seenCollectionsPre, *collname);
-                   numSeenPre++;
-               }
-           }
-       }
+    while ((p = rpmtsiNext(pi, types)) != NULL) {
+       rc += rpmteProcess(p, goal, i++);
     }
     rpmtsiFree(pi);
-
-    /* we've looked at all the rpmte's, update the lastInCollectionAny lists */
-    for (i = 0; i < numSeenPost; i++) {
-       rpmteAddToLastInCollectionAny(TEs[i], seenCollectionsPost[i]);
-       if (installing == 1) {
-           /* lastInCollectionAdd is only updated above if packages were
-            * removed. if nothing is removed in the transaction, we need to
-            * update that list here */
-           rpmteAddToLastInCollectionAdd(TEs[i], seenCollectionsPost[i]);
-       }
-    }
-
-    argvFree(seenCollectionsPost);
-    argvFree(seenCollectionsPre);
-    _free(TEs);
-
-    return 0;
+    return rc;
 }
 
 static int rpmtsSetup(rpmts ts, rpmprobFilterFlags ignoreSet)
@@ -1279,21 +1260,7 @@ static int rpmtsSetup(rpmts ts, rpmprobFilterFlags ignoreSet)
        (void) rpmtsSetFlags(ts, (rpmtsFlags(ts) | _noTransTriggers));
 
     if (rpmtsFlags(ts) & (RPMTRANS_FLAG_JUSTDB | RPMTRANS_FLAG_TEST))
-       (void) rpmtsSetFlags(ts, (rpmtsFlags(ts) | _noTransScripts | _noTransTriggers | RPMTRANS_FLAG_NOCOLLECTIONS));
-
-    /* if SELinux isn't enabled or it is a test run, don't bother... */
-    if (!is_selinux_enabled() || (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)) {
-        rpmtsSetFlags(ts, (rpmtsFlags(ts) | RPMTRANS_FLAG_NOCONTEXTS));
-    }
-
-    if (rpmtsFlags(ts) & RPMTRANS_FLAG_NOCONTEXTS) {
-       rpmlog(RPMLOG_DEBUG, "Selinux disabled.\n");
-    } else {
-       if (rpmtsSELabelInit(ts, 1)) {
-           rpmlog(RPMLOG_WARNING, "Failed to open SELinux handle.\n");
-           rpmtsSetFlags(ts, (rpmtsFlags(ts) | RPMTRANS_FLAG_NOCONTEXTS));
-       }
-    }
+       (void) rpmtsSetFlags(ts, (rpmtsFlags(ts) | _noTransScripts | _noTransTriggers));
 
     /* 
      * Make sure the database is open RDWR for package install/erase.
@@ -1315,9 +1282,6 @@ static int rpmtsSetup(rpmts ts, rpmprobFilterFlags ignoreSet)
 
 static int rpmtsFinish(rpmts ts)
 {
-    if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOCONTEXTS)) {
-       rpmtsSELabelFini(ts, 1);
-    }
     return rpmChrootSet(NULL);
 }
 
@@ -1326,7 +1290,6 @@ static int rpmtsPrepare(rpmts ts)
     tsMembers tsmem = rpmtsMembers(ts);
     rpmtsi pi;
     rpmte p;
-    rpmfi fi;
     int rc = 0;
     uint64_t fileCount = countFiles(ts);
     const char *dbhome = NULL;
@@ -1336,16 +1299,21 @@ static int rpmtsPrepare(rpmts ts)
 
     rpmlog(RPMLOG_DEBUG, "computing %" PRIu64 " file fingerprints\n", fileCount);
 
-    /* Skip netshared paths, not our i18n files, and excluded docs */
+    /* Reset actions, set skip for netshared paths and excluded files */
     pi = rpmtsiInit(ts);
     while ((p = rpmtsiNext(pi, 0)) != NULL) {
-       if (rpmfiFC(rpmteFI(p)) == 0)
-           continue;
-       if (rpmteType(p) == TR_ADDED) {
-           skipInstallFiles(ts, p);
-       } else {
-           skipEraseFiles(ts, p);
+       rpmfiles files = rpmteFiles(p);
+       if (rpmfilesFC(files) > 0) {
+           rpmfs fs = rpmteGetFileStates(p);
+           /* Ensure clean state, this could get called more than once. */
+           rpmfsResetActions(fs);
+           if (rpmteType(p) == TR_ADDED) {
+               skipInstallFiles(ts, files, fs);
+           } else {
+               skipEraseFiles(ts, files, fs);
+           }
        }
+       rpmfilesFree(files);
     }
     rpmtsiFree(pi);
 
@@ -1368,13 +1336,14 @@ static int rpmtsPrepare(rpmts ts)
 
     pi = rpmtsiInit(ts);
     while ((p = rpmtsiNext(pi, 0)) != NULL) {
-       if ((fi = rpmteFI(p)) == NULL)
+       rpmfiles files = rpmteFiles(p);;
+       if (files == NULL)
            continue;   /* XXX can't happen */
 
        (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_FINGERPRINT), 0);
        /* check files in ts against each other and update disk space
           needs on each partition for this package. */
-       handleOverlappedFiles(ts, fpc, p, fi);
+       handleOverlappedFiles(ts, fpc, p, files);
 
        /* Check added package has sufficient space on each partition used. */
        if (rpmteType(p) == TR_ADDED) {
@@ -1391,6 +1360,7 @@ static int rpmtsPrepare(rpmts ts)
            rpmtsCheckDSIProblems(ts, p);
        }
        (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_FINGERPRINT), 0);
+       rpmfilesFree(files);
     }
     rpmtsiFree(pi);
     rpmtsNotify(ts, NULL, RPMCALLBACK_TRANS_STOP, 6, tsmem->orderCount);
@@ -1403,7 +1373,7 @@ static int rpmtsPrepare(rpmts ts)
     if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_TEST|RPMTRANS_FLAG_BUILD_PROBS))) {
        pi = rpmtsiInit(ts);
        while ((p = rpmtsiNext(pi, 0)) != NULL) {
-           rpmteSetFI(p, NULL);
+           rpmteCleanFiles(p);
        }
        rpmtsiFree(pi);
     }
@@ -1421,6 +1391,7 @@ static int rpmtsProcess(rpmts ts)
 {
     rpmtsi pi; rpmte p;
     int rc = 0;
+    int i = 0;
 
     pi = rpmtsiInit(ts);
     while ((p = rpmtsiNext(pi, 0)) != NULL) {
@@ -1429,49 +1400,114 @@ static int rpmtsProcess(rpmts ts)
        rpmlog(RPMLOG_DEBUG, "========== +++ %s %s-%s 0x%x\n",
                rpmteNEVR(p), rpmteA(p), rpmteO(p), rpmteColor(p));
 
-       if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOCONTEXTS)) {
-           rpmtsSELabelInit(ts, 0);
-       }
-
-       failed = rpmteProcess(p, rpmteType(p));
+       failed = rpmteProcess(p, rpmteType(p), i++);
        if (failed) {
            rpmlog(RPMLOG_ERR, "%s: %s %s\n", rpmteNEVRA(p),
                   rpmteTypeString(p), failed > 1 ? _("skipped") : _("failed"));
            rc++;
        }
-       (void) rpmdbSync(rpmtsGetRdb(ts));
     }
     rpmtsiFree(pi);
     return rc;
 }
 
-static rpmRC rpmtsSetupTransactionPlugins(rpmts ts)
+rpmRC rpmtsSetupTransactionPlugins(rpmts ts)
 {
     rpmRC rc = RPMRC_OK;
-    char *plugins = NULL, *plugin = NULL;
-    const char *delims = ",";
-
-    plugins = rpmExpand("%{?__transaction_plugins}", NULL);
-    if (!plugins || rstreq(plugins, "")) {
-       goto exit;
-    }
+    ARGV_t files = NULL;
+    int nfiles = 0;
+    char *dsoPath = NULL;
 
-    plugin = strtok(plugins, delims);
-    while(plugin != NULL) {
-       rpmlog(RPMLOG_DEBUG, "plugin is %s\n", plugin);
-       if (!rpmpluginsPluginAdded(ts->plugins, (const char*)plugin)) {
-           if (rpmpluginsAddPlugin(ts->plugins, "transaction",
-                                   (const char*)plugin) == RPMRC_FAIL) {
-               /* any configured plugin failing to load is a failure */
+    /*
+     * Assume allocated equals initialized. There are some oddball cases
+     * (verification of non-installed package) where this is not true
+     * currently but that's not a new issue.
+     */
+    if ((rpmtsFlags(ts) & RPMTRANS_FLAG_NOPLUGINS) || rpmPluginsGetCount(rpmtsPlugins(ts)) != 0)
+       return RPMRC_OK;
+
+    dsoPath = rpmExpand("%{__plugindir}/*.so", NULL);
+    if (rpmGlob(dsoPath, &nfiles, &files) == 0) {
+       rpmPlugins tsplugins = rpmtsPlugins(ts);
+       for (int i = 0; i < nfiles; i++) {
+           char *bn = basename(files[i]);
+           bn[strlen(bn)-strlen(".so")] = '\0';
+           if (rpmpluginsAddPlugin(tsplugins, "transaction", bn) == RPMRC_FAIL)
+           {
+           /* any configured plugin failing to load is a failure */
                // temporally make the loading policy relaxed: no failures
+               //refer to commit id: 3959da1846227711d97c17495aa4779e653a1b3a
                //rc = RPMRC_FAIL;
            }
        }
-       plugin = strtok(NULL, delims);
+       files = argvFree(files);
     }
+    free(dsoPath);
+
+    return rc;
+}
+/**
+ * Run a scriptlet with args.
+ *
+ * Run a script with an interpreter. If the interpreter is not specified,
+ * /bin/sh will be used. If the interpreter is /bin/sh, then the args from
+ * the header will be ignored, passing instead arg1 and arg2.
+ *
+ * @param ts           transaction set
+ * @param te           transaction element
+ * @param prefixes     install prefixes
+ * @param script       scriptlet from header
+ * @param arg1         no. instances of package installed after scriptlet exec
+ *                     (-1 is no arg)
+ * @param arg2         ditto, but for the target package
+ * @return             0 on success
+ */
+rpmRC runScript(rpmts ts, rpmte te, Header h, ARGV_const_t prefixes,
+                      rpmScript script, int arg1, int arg2)
+{
+    rpmte xte = te;
+    rpmRC stoprc, rc = RPMRC_OK;
+    rpmTagVal stag = rpmScriptTag(script);
+    FD_t sfd = NULL;
+    int warn_only = (stag != RPMTAG_PREIN &&
+                    stag != RPMTAG_PREUN &&
+                    stag != RPMTAG_PRETRANS &&
+                    stag != RPMTAG_VERIFYSCRIPT);
+
+    /* Fake up a transaction element for triggers from rpmdb */
+    if (te == NULL) {
+       te = rpmteNew(ts, h, TR_REMOVED, NULL, NULL);
+       rpmteSetHeader(te, h);
+    }
+
+    sfd = rpmtsNotify(ts, te, RPMCALLBACK_SCRIPT_START, stag, 0);
+    if (sfd == NULL)
+       sfd = rpmtsScriptFd(ts);
+
+    rpmswEnter(rpmtsOp(ts, RPMTS_OP_SCRIPTLETS), 0);
+    rc = rpmScriptRun(script, arg1, arg2, sfd,
+                     prefixes, warn_only, rpmtsPlugins(ts));
+    rpmswExit(rpmtsOp(ts, RPMTS_OP_SCRIPTLETS), 0);
+
+    /* Map warn-only errors to "notfound" for script stop callback */
+    stoprc = (rc != RPMRC_OK && warn_only) ? RPMRC_NOTFOUND : rc;
+    rpmtsNotify(ts, te, RPMCALLBACK_SCRIPT_STOP, stag, stoprc);
+
+    /*
+     * Notify callback for all errors. "total" abused for warning/error,
+     * rc only reflects whether the condition prevented install/erase
+     * (which is only happens with %prein and %preun scriptlets) or not.
+     */
+    if (rc != RPMRC_OK) {
+       if (warn_only) {
+           rc = RPMRC_OK;
+       }
+       rpmtsNotify(ts, te, RPMCALLBACK_SCRIPT_ERROR, stag, rc);
+    }
+
+    if (te != xte)
+       rpmteFree(te);
 
-exit:
-    free(plugins);
     return rc;
 }
 
@@ -1479,9 +1515,11 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
 {
     int rc = -1; /* assume failure */
     tsMembers tsmem = rpmtsMembers(ts);
-    rpmlock lock = NULL;
+    rpmtxn txn = NULL;
     rpmps tsprobs = NULL;
     int TsmPreDone = 0; /* TsmPre hook hasn't been called */
+    /* Ignore SIGPIPE for the duration of transaction */
+    rpmsqAction_t oact = rpmsqSetAction(SIGPIPE, RPMSQ_IGN);
     
     /* Force default 022 umask during transaction for consistent results */
     mode_t oldmask = umask(022);
@@ -1494,7 +1532,7 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
 
     /* If we are in test mode, then there's no need for transaction lock. */
     if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)) {
-       if (!(lock = rpmtsAcquireLock(ts))) {
+       if (!(txn = rpmtxnBegin(ts, RPMTXN_WRITE))) {
            goto exit;
        }
     }
@@ -1504,24 +1542,20 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
        goto exit;
     }
 
-    if (rpmtsSetupTransactionPlugins(ts) == RPMRC_FAIL) {
-       goto exit;
-    }
-
-    rpmtsSetupCollections(ts);
-
     /* Check package set for problems */
     tsprobs = checkProblems(ts);
 
     /* Run pre transaction hook for all plugins */
     TsmPreDone = 1;
-    if (rpmpluginsCallTsmPre(ts->plugins, ts) == RPMRC_FAIL) {
+    if (rpmpluginsCallTsmPre(rpmtsPlugins(ts), ts) == RPMRC_FAIL) {
        goto exit;
     }
 
-    /* Run pre-transaction scripts, but only if there are no known
-     * problems up to this point and not disabled otherwise. */
-    if (!((rpmtsFlags(ts) & (RPMTRANS_FLAG_BUILD_PROBS|RPMTRANS_FLAG_NOPRE))
+    /* Run %pretrans scripts, but only if there are no known problems up to
+     * this point and not disabled otherwise. This is evil as it runs before
+     * fingerprinting and problem checking and is best avoided.
+     */
+    if (!((rpmtsFlags(ts) & (RPMTRANS_FLAG_BUILD_PROBS|RPMTRANS_FLAG_NOPRETRANS))
          || (rpmpsNumProblems(tsprobs)))) {
        rpmlog(RPMLOG_DEBUG, "running pre-transaction scripts\n");
        runTransScripts(ts, PKG_PRETRANS);
@@ -1553,24 +1587,47 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
     if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_TEST|RPMTRANS_FLAG_BUILD_PROBS)))
        tsmem->pool = rpmstrPoolFree(tsmem->pool);
 
+    /* Run %transfiletriggerun scripts unless disabled */
+    if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_BUILD_PROBS|RPMTRANS_FLAG_NOPRETRANS|
+       RPMTRANS_FLAG_NOTRIGGERUN))) {
+
+       runFileTriggers(ts, NULL, RPMSENSE_TRIGGERUN,
+                       RPMSCRIPT_TRANSFILETRIGGER, 0);
+       runTransScripts(ts, PKG_TRANSFILETRIGGERUN);
+    }
+
     /* Actually install and remove packages, get final exit code */
     rc = rpmtsProcess(ts) ? -1 : 0;
 
-    /* Run post-transaction scripts unless disabled */
-    if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_NOPOST))) {
+    /* Run %posttrans scripts unless disabled */
+    if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_NOPOSTTRANS))) {
        rpmlog(RPMLOG_DEBUG, "running post-transaction scripts\n");
        runTransScripts(ts, PKG_POSTTRANS);
     }
 
+    /* Run %transfiletriggerpostun scripts unless disabled */
+    if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERIN))) {
+       runFileTriggers(ts, NULL, RPMSENSE_TRIGGERIN, RPMSCRIPT_TRANSFILETRIGGER, 0);
+    }
+    if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERPOSTUN))) {
+       runPostUnTransFileTrigs(ts);
+    }
+
+    /* Run %transfiletriggerin scripts unless disabled */
+    if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_NOPOSTTRANS|RPMTRANS_FLAG_NOTRIGGERIN))) {
+       runTransScripts(ts, PKG_TRANSFILETRIGGERIN);
+    }
 exit:
     /* Run post transaction hook for all plugins */
     if (TsmPreDone) /* If TsmPre hook has been called, call the TsmPost hook */
-       rpmpluginsCallTsmPost(ts->plugins, ts, rc);
+       rpmpluginsCallTsmPost(rpmtsPlugins(ts), ts, rc);
 
     /* Finish up... */
     (void) umask(oldmask);
     (void) rpmtsFinish(ts);
     rpmpsFree(tsprobs);
-    rpmlockFree(lock);
+    rpmtxnEnd(txn);
+    /* Restore SIGPIPE *after* unblocking signals in rpmtxnEnd() */
+    rpmsqSetAction(SIGPIPE, oact);
     return rc;
 }
index 3dcec10f7a8917b8d42b059aa1b9c6d4206ea4ab..5528ba95ebb64022bd8ce934bed0dffe32f0eef5 100644 (file)
@@ -53,25 +53,22 @@ static int cap_compare(cap_t acap, cap_t bcap)
 }
 #endif
        
-int rpmVerifyFile(const rpmts ts, const rpmfi fi,
-               rpmVerifyAttrs * res, rpmVerifyAttrs omitMask)
+rpmVerifyAttrs rpmfilesVerify(rpmfiles fi, int ix, rpmVerifyAttrs omitMask)
 {
-    rpm_mode_t fmode = rpmfiFMode(fi);
-    rpmfileAttrs fileAttrs = rpmfiFFlags(fi);
-    rpmVerifyAttrs flags = rpmfiVFlags(fi);
-    const char * fn = rpmfiFN(fi);
+    rpm_mode_t fmode = rpmfilesFMode(fi, ix);
+    rpmfileAttrs fileAttrs = rpmfilesFFlags(fi, ix);
+    rpmVerifyAttrs flags = rpmfilesVFlags(fi, ix);
+    const char * fn = rpmfilesFN(fi, ix);
     struct stat sb;
-    int rc;
-
-    *res = RPMVERIFY_NONE;
+    rpmVerifyAttrs vfy = RPMVERIFY_NONE;
 
     /*
      * Check to see if the file was installed - if not pretend all is OK.
      */
-    switch (rpmfiFState(fi)) {
+    switch (rpmfilesFState(fi, ix)) {
     case RPMFILE_STATE_NETSHARED:
     case RPMFILE_STATE_NOTINSTALLED:
-       return 0;
+       goto exit;
        break;
     case RPMFILE_STATE_REPLACED:
        /* For replaced files we can only verify if it exists at all */
@@ -92,8 +89,23 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi,
     }
 
     if (fn == NULL || lstat(fn, &sb) != 0) {
-       *res |= RPMVERIFY_LSTATFAIL;
-       return 1;
+       vfy |= RPMVERIFY_LSTATFAIL;
+       goto exit;
+    }
+
+    /* If we expected a directory but got a symlink to one, follow the link */
+    if (S_ISDIR(fmode) && S_ISLNK(sb.st_mode)) {
+       struct stat dsb;
+       /* ...if it actually points to a directory  */
+       if (stat(fn, &dsb) == 0 && S_ISDIR(dsb.st_mode)) {
+           uid_t fuid;
+           /* ...and is by a legit user, to match fsmVerify() behavior */
+           if (sb.st_uid == 0 ||
+                       (rpmugUid(rpmfilesFUser(fi, ix), &fuid) == 0 &&
+                        sb.st_uid == fuid)) {
+               sb = dsb; /* struct assignment */
+           }
+       }
     }
 
     /* Links have no mode, other types have no linkto */
@@ -122,19 +134,19 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi,
        size_t diglen;
 
        /* XXX If --nomd5, then prelinked library sizes are not corrected. */
-       if ((digest = rpmfiFDigest(fi, &algo, &diglen))) {
+       if ((digest = rpmfilesFDigest(fi, ix, &algo, &diglen))) {
            unsigned char fdigest[diglen];
            rpm_loff_t fsize;
 
-           rc = rpmDoDigest(algo, fn, 0, fdigest, &fsize);
-           sb.st_size = fsize;
-           if (rc) {
-               *res |= (RPMVERIFY_READFAIL|RPMVERIFY_FILEDIGEST);
-           } else if (memcmp(fdigest, digest, diglen)) {
-               *res |= RPMVERIFY_FILEDIGEST;
+           if (rpmDoDigest(algo, fn, 0, fdigest, &fsize)) {
+               vfy |= (RPMVERIFY_READFAIL|RPMVERIFY_FILEDIGEST);
+           } else {
+               sb.st_size = fsize;
+               if (memcmp(fdigest, digest, diglen))
+                   vfy |= RPMVERIFY_FILEDIGEST;
            }
        } else {
-           *res |= RPMVERIFY_FILEDIGEST;
+           vfy |= RPMVERIFY_FILEDIGEST;
        } 
     } 
 
@@ -143,18 +155,18 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi,
        int size = 0;
 
        if ((size = readlink(fn, linkto, sizeof(linkto)-1)) == -1)
-           *res |= (RPMVERIFY_READLINKFAIL|RPMVERIFY_LINKTO);
+           vfy |= (RPMVERIFY_READLINKFAIL|RPMVERIFY_LINKTO);
        else {
-           const char * flink = rpmfiFLink(fi);
+           const char * flink = rpmfilesFLink(fi, ix);
            linkto[size] = '\0';
            if (flink == NULL || !rstreq(linkto, flink))
-               *res |= RPMVERIFY_LINKTO;
+               vfy |= RPMVERIFY_LINKTO;
        }
     } 
 
     if (flags & RPMVERIFY_FILESIZE) {
-       if (sb.st_size != rpmfiFSize(fi))
-           *res |= RPMVERIFY_FILESIZE;
+       if (sb.st_size != rpmfilesFSize(fi, ix))
+           vfy |= RPMVERIFY_FILESIZE;
     } 
 
     if (flags & RPMVERIFY_MODE) {
@@ -176,7 +188,7 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi,
        }
 
        if (metamode != filemode)
-           *res |= RPMVERIFY_MODE;
+           vfy |= RPMVERIFY_MODE;
 
 #if WITH_ACL
        /*
@@ -186,7 +198,7 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi,
        acl_t facl = acl_get_file(fn, ACL_TYPE_ACCESS);
        if (facl) {
            if (acl_equiv_mode(facl, NULL) == 1) {
-               *res |= RPMVERIFY_MODE;
+               vfy |= RPMVERIFY_MODE;
            }
            acl_free(facl);
        }
@@ -197,12 +209,12 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi,
        if (S_ISCHR(fmode) != S_ISCHR(sb.st_mode)
         || S_ISBLK(fmode) != S_ISBLK(sb.st_mode))
        {
-           *res |= RPMVERIFY_RDEV;
+           vfy |= RPMVERIFY_RDEV;
        } else if (S_ISDEV(fmode) && S_ISDEV(sb.st_mode)) {
            rpm_rdev_t st_rdev = (sb.st_rdev & 0xffff);
-           rpm_rdev_t frdev = (rpmfiFRdev(fi) & 0xffff);
+           rpm_rdev_t frdev = (rpmfilesFRdev(fi, ix) & 0xffff);
            if (st_rdev != frdev)
-               *res |= RPMVERIFY_RDEV;
+               vfy |= RPMVERIFY_RDEV;
        } 
     }
 
@@ -213,7 +225,7 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi,
         * capabilities at all but suffices for now... 
         */
        cap_t cap, fcap;
-       cap = cap_from_text(rpmfiFCaps(fi));
+       cap = cap_from_text(rpmfilesFCaps(fi, ix));
        if (!cap) {
            cap = cap_from_text("=");
        }
@@ -223,32 +235,71 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi,
        }
        
        if (cap_compare(cap, fcap) != 0)
-           *res |= RPMVERIFY_CAPS;
+           vfy |= RPMVERIFY_CAPS;
 
        cap_free(fcap);
        cap_free(cap);
     }
 #endif
 
-    if ((flags & RPMVERIFY_MTIME) && (sb.st_mtime != rpmfiFMtime(fi))) {
-       *res |= RPMVERIFY_MTIME;
+    if ((flags & RPMVERIFY_MTIME) && (sb.st_mtime != rpmfilesFMtime(fi, ix))) {
+       vfy |= RPMVERIFY_MTIME;
     }
 
     if (flags & RPMVERIFY_USER) {
        const char * name = rpmugUname(sb.st_uid);
-       const char * fuser = rpmfiFUser(fi);
-       if (name == NULL || fuser == NULL || !rstreq(name, fuser))
-           *res |= RPMVERIFY_USER;
+       const char * fuser = rpmfilesFUser(fi, ix);
+       uid_t uid;
+       int namematch = 0;
+       int idmatch = 0;
+
+       if (name && fuser)
+          namematch =  rstreq(name, fuser);
+       if (fuser && rpmugUid(fuser, &uid) == 0)
+           idmatch = (uid == sb.st_uid);
+
+       if (namematch != idmatch) {
+           rpmlog(RPMLOG_WARNING,
+                   _("Duplicate username or UID for user %s\n"), fuser);
+       }
+
+       if (!(namematch || idmatch))
+           vfy |= RPMVERIFY_USER;
     }
 
     if (flags & RPMVERIFY_GROUP) {
        const char * name = rpmugGname(sb.st_gid);
-       const char * fgroup = rpmfiFGroup(fi);
-       if (name == NULL || fgroup == NULL || !rstreq(name, fgroup))
-           *res |= RPMVERIFY_GROUP;
+       const char * fgroup = rpmfilesFGroup(fi, ix);
+       gid_t gid;
+       int namematch = 0;
+       int idmatch = 0;
+
+       if (name && fgroup)
+           namematch = rstreq(name, fgroup);
+       if (fgroup && rpmugGid(fgroup, &gid) == 0)
+           idmatch = (gid == sb.st_gid);
+
+       if (namematch != idmatch) {
+           rpmlog(RPMLOG_WARNING,
+                   _("Duplicate groupname or GID for group %s\n"), fgroup);
+       }
+
+       if (!(namematch || idmatch))
+           vfy |= RPMVERIFY_GROUP;
     }
 
-    return 0;
+exit:
+    return vfy;
+}
+
+int rpmVerifyFile(const rpmts ts, const rpmfi fi,
+               rpmVerifyAttrs * res, rpmVerifyAttrs omitMask)
+{
+    rpmVerifyAttrs vfy = rpmfiVerify(fi, omitMask);
+    if (res)
+       *res = vfy;
+
+    return (vfy & RPMVERIFY_LSTATFAIL) ? 1 : 0;
 }
 
 /**
@@ -314,7 +365,7 @@ char * rpmVerifyString(uint32_t verifyResult, const char *pad)
 char * rpmFFlagsString(uint32_t fflags, const char *pad)
 {
     char *fmt = NULL;
-    rasprintf(&fmt, "%s%s%s%s%s%s%s%s",
+    rasprintf(&fmt, "%s%s%s%s%s%s%s%s%s",
                (fflags & RPMFILE_DOC) ? "d" : pad,
                (fflags & RPMFILE_CONFIG) ? "c" : pad,
                (fflags & RPMFILE_SPECFILE) ? "s" : pad,
@@ -322,22 +373,43 @@ char * rpmFFlagsString(uint32_t fflags, const char *pad)
                (fflags & RPMFILE_NOREPLACE) ? "n" : pad,
                (fflags & RPMFILE_GHOST) ? "g" : pad,
                (fflags & RPMFILE_LICENSE) ? "l" : pad,
-               (fflags & RPMFILE_README) ? "r" : pad);
+               (fflags & RPMFILE_README) ? "r" : pad,
+               (fflags & RPMFILE_ARTIFACT) ? "a" : pad);
     return fmt;
 }
 
+static const char * stateStr(rpmfileState fstate)
+{
+    switch (fstate) {
+    case RPMFILE_STATE_NORMAL:
+       return NULL;
+    case RPMFILE_STATE_NOTINSTALLED:
+       return rpmIsVerbose() ? _("not installed") : NULL;
+    case RPMFILE_STATE_NETSHARED:
+       return rpmIsVerbose() ? _("net shared") : NULL;
+    case RPMFILE_STATE_WRONGCOLOR:
+       return rpmIsVerbose() ? _("wrong color") : NULL;
+    case RPMFILE_STATE_REPLACED:
+       return _("replaced");
+    case RPMFILE_STATE_MISSING:
+       return _("no state");
+    }
+    return _("unknown state");
+}
+
 /**
  * Check file info from header against what's actually installed.
  * @param ts           transaction set
  * @param h            header to verify
  * @param omitMask     bits to disable verify checks
- * @param ghosts       should ghosts be verified?
+ * @param skipAttr     skip files with these attrs (eg %ghost)
  * @return             0 no problems, 1 problems found
  */
-static int verifyHeader(rpmts ts, Header h, rpmVerifyAttrs omitMask, int ghosts)
+static int verifyHeader(rpmts ts, Header h, rpmVerifyAttrs omitMask,
+                       rpmfileAttrs skipAttrs)
 {
     rpmVerifyAttrs verifyResult = 0;
-    int ec = 0;                /* assume no problems */
+    rpmVerifyAttrs verifyAll = 0; /* assume no problems */
     rpmfi fi = rpmfiNew(ts, h, RPMTAG_BASENAMES, RPMFI_FLAGS_VERIFY);
 
     if (fi == NULL)
@@ -347,17 +419,17 @@ static int verifyHeader(rpmts ts, Header h, rpmVerifyAttrs omitMask, int ghosts)
     while (rpmfiNext(fi) >= 0) {
        rpmfileAttrs fileAttrs = rpmfiFFlags(fi);
        char *buf = NULL, *attrFormat;
+       const char *fstate = NULL;
        char ac;
-       int rc;
 
-       /* If not verifying %ghost, skip ghost files. */
-       if ((fileAttrs & RPMFILE_GHOST) && !ghosts)
+       /* Skip on attributes (eg from --noghost) */
+       if (skipAttrs & fileAttrs)
            continue;
 
-       rc = rpmVerifyFile(ts, fi, &verifyResult, omitMask);
+       verifyResult = rpmfiVerify(fi, omitMask);
 
        /* Filter out timestamp differences of shared files */
-       if (rc == 0 && (verifyResult & RPMVERIFY_MTIME)) {
+       if (verifyResult & RPMVERIFY_MTIME) {
            rpmdbMatchIterator mi;
            mi = rpmtsInitIterator(ts, RPMDBI_BASENAMES, rpmfiFN(fi), 0);
            if (rpmdbGetIteratorCount(mi) > 1) 
@@ -365,9 +437,13 @@ static int verifyHeader(rpmts ts, Header h, rpmVerifyAttrs omitMask, int ghosts)
            rpmdbFreeIterator(mi);
        }
 
+       /* State is only meaningful for installed packages */
+       if (headerGetInstance(h))
+           fstate = stateStr(rpmfiFState(fi));
+
        attrFormat = rpmFFlagsString(fileAttrs, "");
        ac = rstreq(attrFormat, "") ? ' ' : attrFormat[0];
-       if (rc) {
+       if (verifyResult & RPMVERIFY_LSTATFAIL) {
            if (!(fileAttrs & (RPMFILE_MISSINGOK|RPMFILE_GHOST)) || rpmIsVerbose()) {
                rasprintf(&buf, _("missing   %c %s"), ac, rpmfiFN(fi));
                if ((verifyResult & RPMVERIFY_LSTATFAIL) != 0 &&
@@ -377,25 +453,30 @@ static int verifyHeader(rpmts ts, Header h, rpmVerifyAttrs omitMask, int ghosts)
                    rstrcat(&buf, app);
                    free(app);
                }
-               ec = rc;
            }
-       } else if (verifyResult || rpmIsVerbose()) {
+       } else if (verifyResult || fstate || rpmIsVerbose()) {
            char *verifyFormat = rpmVerifyString(verifyResult, ".");
            rasprintf(&buf, "%s  %c %s", verifyFormat, ac, rpmfiFN(fi));
            free(verifyFormat);
-
-           if (verifyResult) ec = 1;
        }
        free(attrFormat);
 
        if (buf) {
+           if (fstate)
+               buf = rstrscat(&buf, " (", fstate, ")", NULL);
            rpmlog(RPMLOG_NOTICE, "%s\n", buf);
            buf = _free(buf);
        }
+
+       /* Filter out missing %ghost/%missingok errors from final result */
+       if (fileAttrs & (RPMFILE_MISSINGOK|RPMFILE_GHOST))
+           verifyResult &= ~RPMVERIFY_LSTATFAIL;
+
+       verifyAll |= verifyResult;
     }
     rpmfiFree(fi);
        
-    return ec;
+    return (verifyAll != 0) ? 1 : 0;
 }
 
 /**
@@ -440,7 +521,6 @@ static int verifyDependencies(rpmts ts, Header h)
 int showVerifyPackage(QVA_t qva, rpmts ts, Header h)
 {
     rpmVerifyAttrs omitMask = ((qva->qva_flags & VERIFY_ATTRS) ^ VERIFY_ATTRS);
-    int ghosts = (qva->qva_fflags & RPMFILE_GHOST);
     int ec = 0;
     int rc;
 
@@ -449,7 +529,7 @@ int showVerifyPackage(QVA_t qva, rpmts ts, Header h)
            ec = rc;
     }
     if (qva->qva_flags & VERIFY_FILES) {
-       if ((rc = verifyHeader(ts, h, omitMask, ghosts)) != 0)
+       if ((rc = verifyHeader(ts, h, omitMask, qva->qva_fflags)) != 0)
            ec = rc;
     }
     if (qva->qva_flags & VERIFY_SCRIPT) {
diff --git a/luaext/linit.c b/luaext/linit.c
deleted file mode 100644 (file)
index 6f10b26..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "lua.h"
-#include "lauxlib.h"
-#include "linit.h"
-
-LUA_API int luaopen_init(lua_State *L)
-{
-#include "linit.lch"
-    return 0;
-}
diff --git a/luaext/linit.h b/luaext/linit.h
deleted file mode 100644 (file)
index 04cbb2d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef LINIT_H
-#define LINIT_H
-
-int luaopen_init(lua_State *L);
-
-#endif
diff --git a/luaext/linit.lch b/luaext/linit.lch
deleted file mode 100644 (file)
index 56ced87..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* code automatically generated by bin2c -- DO NOT EDIT */
-{
-/* #include'ing this file in a C program is equivalent to calling
-  lua_dofile(L,"local/linit.lua");
-*/
-/* local/linit.lua */
-static const unsigned char B1[]={
- 10,114,101,120, 46,110,101,119, 32, 61, 32,114,101,120, 46,110,101,119, 80, 79,
- 83, 73, 88, 10, 10,117,116,105,108, 32, 61, 32,123,125, 10, 10,102,117,110, 99,
-116,105,111,110, 32,117,116,105,108, 46,103,114,101,112, 40,101,120,112,114, 44,
- 32,102,105,108,101,110, 97,109,101, 41, 10,  9,105,102, 32,110,111,116, 32,112,
-111,115,105,120, 46,115,116, 97,116, 40,102,105,108,101,110, 97,109,101, 44, 32,
- 34,109,111,100,101, 34, 41, 32,116,104,101,110, 10,  9,  9,114,101,116,117,114,
-110, 32,110,105,108, 10,  9,101,110,100, 10,  9,108,111, 99, 97,108, 32,108,105,
-110,101,115, 32, 61, 32,123,125, 10,  9,108,111, 99, 97,108, 32,112, 97,116, 32,
- 61, 32,114,101,120, 46,110,101,119, 40,101,120,112,114, 41, 10,  9,108,111, 99,
- 97,108, 32,112,111,115, 32, 61, 32, 49, 10,  9,102,111,114, 32,108,105,110,101,
- 32,105,110, 32,105,111, 46,108,105,110,101,115, 40,102,105,108,101,110, 97,109,
-101, 41, 32,100,111, 10,  9,  9,105,102, 32,112, 97,116, 58,109, 97,116, 99,104,
- 40,108,105,110,101, 41, 32,116,104,101,110, 10,  9,  9,  9,116, 97, 98,108,101,
- 46,105,110,115,101,114,116, 40,108,105,110,101,115, 44, 32,112,111,115, 44, 32,
-108,105,110,101, 41, 10,  9,  9,101,110,100, 10,  9,  9,112,111,115, 32, 61, 32,
-112,111,115, 32, 43, 32, 49, 10,  9,101,110,100, 10,  9,105,102, 32,116, 97, 98,
-108,101, 46,103,101,116,110, 40,108,105,110,101,115, 41, 32, 61, 61, 32, 48, 32,
-116,104,101,110, 10,  9,  9,114,101,116,117,114,110, 32,110,105,108, 10,  9,101,
-110,100, 10,  9,114,101,116,117,114,110, 32,108,105,110,101,115, 10,101,110,100,
- 10, 10,102,117,110, 99,116,105,111,110, 32,117,116,105,108, 46,105,103,114,101,
-112, 40,101,120,112,114, 44, 32,102,105,108,101,110, 97,109,101, 41, 10,  9,114,
-101,116,117,114,110, 32,105,112, 97,105,114,115, 40,114,101,120, 46,103,114,101,
-112, 40,101,120,112,114, 44, 32,102,105,108,101,110, 97,109,101, 41, 41, 10,101,
-110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,117,116,105,108, 46, 98,103,
-114,101,112, 40,101,120,112,114, 44, 32,102,105,108,101,110, 97,109,101, 41, 10,
-  9,105,102, 32,110,111,116, 32,112,111,115,105,120, 46,115,116, 97,116, 40,102,
-105,108,101,110, 97,109,101, 44, 32, 34,109,111,100,101, 34, 41, 32,116,104,101,
-110, 10,  9,  9,114,101,116,117,114,110, 32,110,105,108, 10,  9,101,110,100, 10,
-  9,108,111, 99, 97,108, 32,112, 97,116, 32, 61, 32,114,101,120, 46,110,101,119,
- 40,101,120,112,114, 41, 10,  9,102,111,114, 32,108,105,110,101, 32,105,110, 32,
-105,111, 46,108,105,110,101,115, 40,102,105,108,101,110, 97,109,101, 41, 32,100,
-111, 10,  9,  9,105,102, 32,112, 97,116, 58,109, 97,116, 99,104, 40,108,105,110,
-101, 41, 32,116,104,101,110, 10,  9,  9,  9,114,101,116,117,114,110, 32,116,114,
-117,101, 10,  9,  9,101,110,100, 10,  9,101,110,100, 10,  9,114,101,116,117,114,
-110, 32,102, 97,108,115,101, 10,101,110,100, 10, 10,
-};
-
- lua_dobuffer(L,(const char*)B1,sizeof(B1),"local/linit.lua");
-}
index 65ba9b7c1a7c1470f42d560d702ce710bbe86198..0a7c26c71a177c1dd16b20bbcf71501f74eba913 100644 (file)
@@ -335,10 +335,22 @@ static int Pexec(lua_State *L)                    /** exec(path,[args]) */
        const char *path = luaL_checkstring(L, 1);
        int i,n=lua_gettop(L);
        char **argv;
+       int flag, fdno, open_max;
 
        if (!have_forked)
            return luaL_error(L, "exec not permitted in this context");
 
+       open_max = sysconf(_SC_OPEN_MAX);
+       if (open_max == -1) {
+           open_max = 1024;
+       }
+       for (fdno = 3; fdno < open_max; fdno++) {
+           flag = fcntl(fdno, F_GETFD);
+           if (flag == -1 || (flag & FD_CLOEXEC))
+               continue;
+           fcntl(fdno, F_SETFD, FD_CLOEXEC);
+       }
+
        argv = malloc((n+1)*sizeof(char*));
        if (argv==NULL) return luaL_error(L,"not enough memory");
        argv[0] = (char*)path;
@@ -361,22 +373,22 @@ static int Pfork(lua_State *L)                    /** fork() */
 
 static int Pwait(lua_State *L)                 /** wait([pid]) */
 {
-       pid_t pid = luaL_optint(L, 1, -1);
+       pid_t pid = luaL_optinteger(L, 1, -1);
        return pushresult(L, waitpid(pid, NULL, 0), NULL);
 }
 
 
 static int Pkill(lua_State *L)                 /** kill(pid,[sig]) */
 {
-       pid_t pid = luaL_checkint(L, 1);
-       int sig = luaL_optint(L, 2, SIGTERM);
+       pid_t pid = luaL_checkinteger(L, 1);
+       int sig = luaL_optinteger(L, 2, SIGTERM);
        return pushresult(L, kill(pid, sig), NULL);
 }
 
 
 static int Psleep(lua_State *L)                        /** sleep(seconds) */
 {
-       unsigned int seconds = luaL_checkint(L, 1);
+       unsigned int seconds = luaL_checkinteger(L, 1);
        lua_pushnumber(L, sleep(seconds));
        return 1;
 }
@@ -529,7 +541,7 @@ static int Pgetprocessid(lua_State *L)              /** getprocessid([selector]) */
 
 static int Pttyname(lua_State *L)              /** ttyname(fd) */
 {
-       int fd=luaL_optint(L, 1, 0);
+       int fd=luaL_optinteger(L, 1, 0);
        lua_pushstring(L, ttyname(fd));
        return 1;
 }
@@ -819,10 +831,29 @@ static int Pmkstemp(lua_State *L)
        return 2;
 }
 
+static int Predirect2null(lua_State *L)
+{
+    int target_fd, fd, r, e;
+
+    if (!have_forked)
+       return luaL_error(L, "silence_file_descriptor not permitted in this context");
+
+    target_fd = luaL_checkinteger(L, 1);
+
+    r = fd = open("/dev/null", O_WRONLY);
+    if (fd >= 0 && fd != target_fd) {
+       r = dup2(fd, target_fd);
+       e = errno;
+       (void) close(fd);
+       errno = e;
+    }
+    return pushresult(L, r, NULL);
+}
+
 static const luaL_Reg R[] =
 {
        {"access",              Paccess},
-/*     {"chdir",               Pchdir},
+       {"chdir",               Pchdir},
        {"chmod",               Pchmod},
        {"chown",               Pchown},
        {"ctermid",             Pctermid},
@@ -860,7 +891,8 @@ static const luaL_Reg R[] =
        {"utime",               Putime},
        {"wait",                Pwait},
        {"setenv",              Psetenv},
-       {"unsetenv",            Punsetenv},*/
+       {"unsetenv",            Punsetenv},
+       {"redirect2null",       Predirect2null},
        {NULL,                  NULL}
 };
 
@@ -880,7 +912,7 @@ static int exit_override(lua_State *L)
     if (!have_forked)
        return luaL_error(L, "exit not permitted in this context");
 
-    exit(luaL_optint(L, 1, EXIT_SUCCESS));
+    exit(luaL_optinteger(L, 1, EXIT_SUCCESS));
 }
 
 static const luaL_Reg os_overrides[] =
index ed86d9f8960cfc7d2571fbdb3e3c848c843a9db8..3c46e2d4f1e74994b3926105567b6d19e7cb55fb 100644 (file)
@@ -50,7 +50,7 @@ static int rwxrwxrwx(mode_t *mode, const char *p)
        {
                if (*p == modesel[count].rwx) tmp_mode |= modesel[count].bits;  /* set a bit */
                else if (*p == '-') tmp_mode &= ~modesel[count].bits;                   /* clear a bit */
-               else if (*p=='s') switch(count)
+               else if (*p=='s') switch (count)
                {
                        case 2: /* turn on suid flag */
                        tmp_mode |= S_ISUID | S_IXUSR;
diff --git a/macros.debug b/macros.debug
new file mode 100644 (file)
index 0000000..ee0cc9e
--- /dev/null
@@ -0,0 +1,47 @@
+# macros to include to generate debuginfo
+# Note don't define/enable a feature here if it is already the default in
+# macros.in. Otherwise it cannot simply be --undefined on the command line
+# in the tests (it needs to be undefined multiple times then).
+
+%_enable_debug_packages 1
+%_include_minidebuginfo 1
+%_include_gdb_index            1
+
+# Expanded at end of %install scriptlet
+
+%__arch_install_post %{nil}
+
+%__os_install_post \
+    %{_rpmconfigdir}/brp-compress \
+    %{!?__debug_package:\
+    %{_rpmconfigdir}/brp-strip %{__strip} \
+    %{_rpmconfigdir}/brp-strip-comment-note %{__strip} %{__objdump} \
+    } \
+    %{_rpmconfigdir}/brp-strip-static-archive %{__strip} \
+%{nil}
+
+%__spec_install_post\
+    %{?__debug_package:%{__debug_install_post}}\
+    %{__arch_install_post}\
+    %{__os_install_post}\
+%{nil}
+
+%install %{?_enable_debug_packages:%{?buildsubdir:%{debug_package}}}\
+%%install\
+%{nil}
+
+# Should missing buildids terminate a build?
+%_missing_build_ids_terminate_build    1
+
+# Number of debugging information entries (DIEs) above which
+# dwz will stop considering file for multifile optimizations
+# and enter a low memory mode, in which it will optimize
+# in about half the memory needed otherwise.
+%_dwz_low_mem_die_limit                 10000000
+# Number of DIEs above which dwz will stop processing
+# a file altogether.
+%_dwz_max_die_limit             50000000
+
+%_find_debuginfo_dwz_opts --run-dwz\\\
+   --dwz-low-mem-die-limit %{_dwz_low_mem_die_limit}\\\
+   --dwz-max-die-limit %{_dwz_max_die_limit}
index e285ce16a840c8defbd0a77f1dda8715374a76f9..17a438d644951dd4babbdad2968c3c0eb38a3963 100644 (file)
--- a/macros.in
+++ b/macros.in
@@ -6,15 +6,6 @@
 # should be added to /etc/rpm/macros, while per-user configuration should
 # be added to ~/.rpmmacros.
 #
-#==============================================================================
-# Macro naming conventions (preliminary):
-#
-#      Macros that begin with an underscore are "local" in the sense that
-#      they (if used) will not be exported in rpm headers. Some macros
-#      that don't start with an underscore (but look like they should)
-#      are compatible with macros generated by rpm-2.5.x and will be made
-#      more consistent in a future release.
-#
 
 #==============================================================================
 # ---- A macro that expands to nothing.
@@ -68,6 +59,8 @@
 %__ssh                 @__SSH@
 %__tar                 @__TAR@
 %__unzip               @__UNZIP@
+%__zstd                        @__ZSTD@
+%__gem                 @__GEM@
 %__git                 @__GIT@
 %__hg                  @__HG@
 %__bzr                 @__BZR@
 # %if ! %{with static}
 # ...
 # %endif
-# %ifdef %{with static}
+# %if %{with static}
 # ...
 # %endif
 # %{?with_static: ... }
 #
 #      The directory where rpm's configuration and scripts live
 %_rpmconfigdir         %{getconfdir}
+#       The directory where rpm's macro files live
+%_rpmmacrodir          %{_rpmconfigdir}/macros.d
 
 #      The directory where sources/patches will be unpacked and built.
 %_builddir             %{_topdir}/BUILD
 #      A spec file can %%define _find_debuginfo_opts to pass options to
 #      the script.  See the script for details.
 #
+
+%_find_debuginfo_opts %{?_rpm_strip_disable:--strip-disable}
+%_find_debuginfo_strip_opts %{?_rpm_strip_option:\'--strip-option=%{_rpm_strip_option}\'}
+%_find_debuginfo_ko_strip_opts %{?_rpm_ko_strip_option:\'--strip-ko-option=%{_rpm_ko_strip_option}\'}
+
 %__debug_install_post   \
-   %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\
+    %{_rpmconfigdir}/find-debuginfo.sh \\\
+    %{?_smp_mflags} \\\
+    %{?_missing_build_ids_terminate_build:--strict-build-id} \\\
+    %{?_no_recompute_build_ids:-n} \\\
+    %{?_include_minidebuginfo:-m} \\\
+    %{?_include_gdb_index:-i} \\\
+    %{?_unique_build_ids:--build-id-seed "%{VERSION}-%{RELEASE}"} \\\
+    %{?_unique_debug_names:--unique-debug-suffix "-%{VERSION}-%{RELEASE}.%{_arch}"} \\\
+    %{?_unique_debug_srcs:--unique-debug-src-base "%{name}-%{VERSION}-%{RELEASE}.%{_arch}"} \\\
+    %{?_find_debuginfo_dwz_opts} \\\
+    %{?_find_debuginfo_opts} \\\
+    %{?_find_debuginfo_strip_opts} \\\
+    %{?_find_debuginfo_ko_strip_opts} \\\
+    %{?_debugsource_packages:-S debugsourcefiles.list} \\\
+    "%{_builddir}/%{?buildsubdir}"\\\
+    %{?_install_debug_manifest} \
 %{nil}
 
 #      Template for debug information sub-package.
-%debug_package \
-%global __debug_package 1\
+%_debuginfo_template \
+%package debuginfo\
+Summary: Debug information for package %{name}\
+Group: Development/Debug\
+AutoReq: 0\
+AutoProv: 1\
+%description debuginfo\
+This package provides debug information for package %{name}.\
+Debug information is useful when developing applications that use this\
+package or when debugging this package.\
+%files debuginfo -f debugfiles.list\
+%{nil}
+
+%_debugsource_template \
 %package debugsource\
 Summary: Debug sources for package %{name}\
 Group: Development/Debug\
@@ -194,13 +221,29 @@ AutoReqProv: 0\
 This package provides debug sources for package %{name}.\
 Debug sources are useful when developing applications that use this\
 package or when debugging this package.\
-%files debugsource -f debugsources.list\
+%files debugsource -f debugsourcefiles.list\
 %defattr(-,root,root)\
+%manifest %{name}-debugsource.manifest \
+%{nil}
+
+%debug_package \
+%ifnarch noarch\
+%global __debug_package 1\
+%_debuginfo_template\
+%{?_debugsource_packages:%_debugsource_template}\
+%endif\
 %{nil}
 
 %_defaultdocdir                %{_datadir}/doc/packages
+%_docdir_fmt           %%{NAME}
 %_defaultlicensedir    %{_datadir}/licenses
-%_docdir_fmt          %%{NAME}
+
+# Following macros for filtering auto deps must not be used in spec files.
+# Their purpouse is to set up global filtering for all packages. If you need
+# to set up specific filtering for your package use %__requires_exclude_from
+# and %__provides_exclude_from instead.
+%__global_requires_exclude_from                %{?_docdir:%{_docdir}}
+%__global_provides_exclude_from                %{?_docdir:%{_docdir}}
 
 #      The path to the gzip executable (legacy, use %{__gzip} instead).
 %_gzipbin              %{__gzip}
@@ -209,6 +252,15 @@ package or when debugging this package.\
 #      Any older entry is not packaged in binary packages.
 %_changelog_trimtime   0
 
+#      If true, set the SOURCE_DATE_EPOCH environment variable
+#      to the timestamp of the topmost changelog entry
+%source_date_epoch_from_changelog 0
+
+#      If true, make sure that timestamps in built rpms
+#      are not later than the value of SOURCE_DATE_EPOCH.
+#      Is ignored when SOURCE_DATE_EPOCH is not set.
+%clamp_mtime_to_source_date_epoch 0
+
 #      The directory where newly built binary packages will be written.
 %_rpmdir               %{_topdir}/RPMS
 
@@ -231,7 +283,7 @@ package or when debugging this package.\
 %_buildrootdir         %{_topdir}/BUILDROOT
 
 #      Build root path, where %install installs the package during build.
-%buildroot             %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
+%buildroot             %{_buildrootdir}/%{NAME}-%{VERSION}-%{RELEASE}.%{_arch}
 
 #      Directory where temporaray files can be created.
 %_tmppath              %{_var}/tmp
@@ -275,6 +327,16 @@ package or when debugging this package.\
 #
 #%bugurl
 
+#      Configurable distribution tag, same as Disttag: tag in a specfile.
+#      The tag will be used to supply reliable information to tools like
+#      rpmfind.
+#
+# Note: You should not configure with disturl (or build packages with
+# the Disttag: tag) unless you are willing to supply content in a
+# yet-to-be-determined format at the tag specified.
+#
+#%disttag
+
 #      Boolean (i.e. 1 == "yes", 0 == "no") that controls whether files
 #      marked as %doc should be installed.
 #%_excludedocs
@@ -337,25 +399,29 @@ package or when debugging this package.\
 #      Compression type and level for source/binary package payloads.
 #              "w9.gzdio"      gzip level 9 (default).
 #              "w9.bzdio"      bzip2 level 9.
-#              "w7.xzdio"      xz level 7, xz's default.
-#              "w7.lzdio"      lzma-alone level 7, lzma's default
+#              "w6.xzdio"      xz level 6, xz's default.
+#              "w7T16.xzdio"   xz level 7 using 16 thread (xz only)
+#              "w6.lzdio"      lzma-alone level 6, lzma's default
+#              "w3.zstdio"     zstd level 3, zstd's default
+#              "w.ufdio"       uncompressed
 #
 #%_source_payload      w9.gzdio
-%_binary_payload       w5.lzdio
+#%_binary_payload      w9.gzdio
+%_binary_payload       w19.zstdio
 
 #      Algorithm to use for generating file checksum digests on build.
 #      If not specified or 0, MD5 is used.
-#      WARNING: non-MD5 is backwards incompatible, don't enable lightly!
-#      The supported algorithms may depend on NSS version, as of NSS
-#      3.11.99.5 the following are supported:
-#      1       MD5 (default)
+#      WARNING: non-MD5 is backwards incompatible with rpm < 4.6!
+#      The supported algorithms may depend on the underlying crypto
+#      implementation but generally at least the following are supported:
+#      1       MD5
 #      2       SHA1
-#      8       SHA256
+#      8       SHA256 (default)
 #      9       SHA384
 #      10      SHA512
 #
-#%_source_filedigest_algorithm 1
-#%_binary_filedigest_algorithm 1
+%_source_filedigest_algorithm  8
+%_binary_filedigest_algorithm  8
 
 #      Configurable vendor information, same as Vendor: in a specfile.
 #
@@ -366,6 +432,7 @@ package or when debugging this package.\
 
 #      Default patch flags
 #%_default_patch_flags -s
+%_default_patch_flags --no-backup-if-mismatch
 
 #==============================================================================
 # ---- Build configuration macros.
@@ -388,10 +455,22 @@ package or when debugging this package.\
 # Note: The default value should be 0 for legacy compatibility.
 %_missing_doc_files_terminate_build    1
 
+#
+# Should empty %files manifest file terminate a build?
+#
+# Note: The default value should be 0 for legacy compatibility.
+%_empty_manifest_terminate_build       0
+
 #
 # Should binaries in noarch packages terminate a build?
 %_binaries_in_noarch_packages_terminate_build  1
 
+# Should invalid utf8 encoding in package metadata terminate a build?
+%_invalid_encoding_terminates_build 0
+
+# Should invalid version format in requires, provides, ... terminate a build?
+%_wrong_version_format_terminate_build 0
+
 #
 # Should rpm try to download missing sources at build-time?
 # Enabling this is dangerous as long as rpm has no means to validate
@@ -429,6 +508,78 @@ package or when debugging this package.\
 #
 #%_missing_build_ids_terminate_build   1
 
+#
+# Include minimal debug information in build binaries.
+# Requires _enable_debug_packages.
+#
+#%_include_minidebuginfo       1
+
+#
+# Include a .gdb_index section in the .debug files.
+# Requires _enable_debug_packages and gdb-add-index installed.
+#
+#%_include_gdb_index   1
+
+#
+# Defines how and if build_id links are generated for ELF files.
+# The following settings are supported:
+#
+# - none
+#   No build_id links are generated.
+#
+# - alldebug
+#   build_id links are generated only when the __debug_package global is
+#   defined. This will generate build_id links in the -debuginfo package
+#   for both the main file as /usr/lib/debug/.build-id/xx/yyy and for
+#   the .debug file as /usr/lib/debug/.build-id/xx/yyy.debug.
+#   This is the old style build_id links as generated by the original
+#   find-debuginfo.sh script.
+#
+# - separate
+#   build_id links are generate for all binary packages. If this is a
+#   main package (the __debug_package global isn't set) then the
+#   build_id link is generated as /usr/lib/.build-id/xx/yyy. If this is
+#   a -debuginfo package (the __debug_package global is set) then the
+#   build_id link is generated as /usr/lib/debug/.build-id/xx/yyy.
+#
+# - compat
+#   Same as for "separate" but if the __debug_package global is set then
+#   the -debuginfo package will have a compatibility link for the main
+#   ELF /usr/lib/debug/.build-id/xx/yyy -> /usr/lib/.build-id/xx/yyy
+%_build_id_links alldebug
+
+# Whether build-ids should be made unique between package version/releases
+# when generating debuginfo packages. If set to 1 this will pass
+# --build-id-seed "%{VERSION}-%{RELEASE}" to find-debuginfo.sh which will
+# pass it onto debugedit --build-id-seed to be used to prime the build-id
+# note hash.
+%_unique_build_ids     1
+
+# Do not recompute build-ids but keep whatever is in the ELF file already.
+# Cannot be used together with _unique_build_ids (which forces recomputation).
+# Defaults to undefined (unset).
+#%_no_recompute_build_ids 1
+
+# Whether .debug files should be made unique between package version,
+# release and architecture. If set to 1 this will pass
+# --unique-debug-suffix "-%{VERSION}-%{RELEASE}.%{_arch} find-debuginfo.sh
+# to create debuginfo files which end in -<ver>-<rel>.<arch>.debug
+# Requires _unique_build_ids.
+#%_unique_debug_names  0
+
+# Whether the /usr/debug/src/<package> directories should be unique between
+# package version, release and architecture. If set to 1 this will pass
+# --unique-debug-src-base "%{name}-%{VERSION}-%{RELEASE}.%{_arch}" to
+# find-debuginfo.sh to name the directory under /usr/debug/src as
+# <name>-<ver>-<rel>.<arch>.
+%_unique_debug_srcs    1
+
+# Whether rpm should put debug source files into its own subpackage
+%_debugsource_packages 1
+
+# Whether rpm should create extra debuginfo packages for each subpackage
+%_debuginfo_subpackages 1
+
 #
 # Use internal dependency generator rather than external helpers?
 %_use_internal_dependency_generator    1
@@ -441,8 +592,8 @@ package or when debugging this package.\
 %__docdir_path %{_datadir}/doc:%{_datadir}/man:%{_datadir}/info:%{_datadir}/gtk-doc/html:%{?_docdir}:%{?_mandir}:%{?_infodir}:%{?_javadocdir}:/usr/doc:/usr/man:/usr/info:/usr/X11R6/man
 
 # maxnum,cuttime,minnum
-# 2009/03/01 (SLES11 GA)
-%_binarychangelogtrim 0,1235862000,10
+# 2014/10/13 (SLES12 GA)
+%_binarychangelogtrim 0,1413151200,10
 
 #
 # Path to scripts to autogenerate package dependencies,
@@ -454,11 +605,11 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
 # Note: Used iff _use_internal_dependency_generator is zero.
 #%__find_provides      %{_rpmconfigdir}/rpmdeps --provides
 #%__find_requires      %{_rpmconfigdir}/rpmdeps --requires
-%__find_provides       %{__set_helper_env}%{_rpmconfigdir}/find-provides %name
-%__find_requires       %{__set_helper_env}%{_rpmconfigdir}/find-requires %name
+%__find_provides       %{_rpmconfigdir}/find-provides %name
+%__find_requires       %{_rpmconfigdir}/find-requires %name
 #%__find_conflicts     ???
 #%__find_obsoletes     ???
-%__find_supplements    %{__set_helper_env}%{_rpmconfigdir}/find-supplements %name
+%__find_supplements    %{_rpmconfigdir}/find-supplements %name
 #%__find_enhances      ???
 
 # 
@@ -482,8 +633,24 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
 #
 %_fileattrsdir         %{_rpmconfigdir}/fileattrs
 
+# This macro defines how much space (in bytes) in package should be
+# reserved for gpg signatures during building of a package. If this space is
+# big enough for gpg signatures to fit into it then signing of the packages is
+# very quick because it is not necessary to rewrite the whole package to make
+# some space for gpg signatures.
+%__gpg_reserved_space 4096
+
 #==============================================================================
 # ---- Database configuration macros.
+#
+# Select backend database. The following values are supported:
+# bdb Berkeley DB
+# lmdb Lightning Memory-mapped Database
+# ndb new data base format
+#
+%_db_backend         bdb
+
+#
 #      Macros used to configure Berkley db parameters.
 #
 # rpmdb macro configuration values are a colon (or white space) separated
@@ -532,13 +699,12 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
 #      Macro(s) to hold the arguments passed to GPG/PGP for package
 #      signing and verification.
 #
-%__gpg_check_password_cmd      %{__gpg} \
-       gpg --batch --no-verbose --passphrase-fd 3 -u "%{_gpg_name}" -so -
 
 %__gpg_sign_cmd                        %{__gpg} \
-       gpg --batch --no-verbose --no-armor --passphrase-fd 3 \
+       gpg --no-verbose --no-armor \
        %{?_gpg_digest_algo:--digest-algo %{_gpg_digest_algo}} \
        --no-secmem-warning \
+       %{?_gpg_sign_cmd_extra_args:%{_gpg_sign_cmd_extra_args}} \
        -u "%{_gpg_name}" -sbo %{__signature_filename} %{__plaintext_filename}
 
 # XXX rpm >= 4.1 verifies signatures internally
@@ -605,12 +771,25 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
 %_vsflags_rebuilddb    0xc0c00
 %_vsflags_verify       %{__vsflags}
 
+# Set to 1 to minimize writing (at the cost of more reads) to
+# conserve eg SSD disks.
+%_minimize_writes      0
+
+# Set to 1 to flush file IO during transactions (at a severe cost in
+# performance for rotational disks)
+#%_flush_io    0
+
 #
 # Default output format string for rpm -qa
 #
 # XXX  Note: escaped %% for use in headerFormat()
 %_query_all_fmt                %%{nvra}
 
+#
+# Default for coloring output
+# valid values are always never and auto
+%_color_output never
+
 #
 # Default path to the file used for transaction fcntl lock.
 %_rpmlock_path %{_dbpath}/.rpm.lock
@@ -644,9 +823,9 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
   export RPM_SOURCE_DIR RPM_BUILD_DIR RPM_OPT_FLAGS RPM_ARCH RPM_OS\
   RPM_DOC_DIR=\"%{_docdir}\"\
   export RPM_DOC_DIR\
-  RPM_PACKAGE_NAME=\"%{name}\"\
-  RPM_PACKAGE_VERSION=\"%{version}\"\
-  RPM_PACKAGE_RELEASE=\"%{release}\"\
+  RPM_PACKAGE_NAME=\"%{NAME}\"\
+  RPM_PACKAGE_VERSION=\"%{VERSION}\"\
+  RPM_PACKAGE_RELEASE=\"%{RELEASE}\"\
   export RPM_PACKAGE_NAME RPM_PACKAGE_VERSION RPM_PACKAGE_RELEASE\
   LANG=C\
   export LANG\
@@ -655,6 +834,8 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
   export RPM_BUILD_ROOT}\
   %{?_javaclasspath:CLASSPATH=\"%{_javaclasspath}\"\
   export CLASSPATH}\
+  PKG_CONFIG_PATH=\"${PKG_CONFIG_PATH}:%{_libdir}/pkgconfig:%{_datadir}/pkgconfig\"\
+  export PKG_CONFIG_PATH\
   \
   %{verbose:set -x}%{!verbose:exec > /dev/null}\
   umask 022\
@@ -662,7 +843,7 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
 
 
 #%___build_body                %{nil}
-%___build_post         exit 0
+%___build_post         exit $?
 
 %___build_template     #!%{___build_shell}\
 %{___build_pre}\
@@ -675,7 +856,6 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
 #==============================================================================
 # ---- Scriptlet templates.
 #      Macro(s) that expand to a command and script that is executed.
-#      CAVEAT: All macro expansions must fit in a BUFSIZ (8192 byte) buffer.
 #
 %__spec_prep_shell     %{___build_shell}
 %__spec_prep_args      %{___build_args}
@@ -814,6 +994,15 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
 %_infodir              %{_datadir}/info
 %_mandir               %{_datadir}/man
 
+%_hal_prefix           /hal
+%_hal_bindir           %{_hal_prefix}/bin
+%_hal_sbindir          %{_hal_prefix}/sbin
+%_hal_libdir           %{_hal_prefix}/%{_lib}
+%_hal_includedir       %{_hal_prefix}/include
+%_hal_sysconfdir       %{_hal_prefix}%{_sysconfdir}
+%_hal_datadir          %{_hal_prefix}/share
+%_hal_licensedir       %{_hal_prefix}/share/licenses
+
 #==============================================================================
 # ---- config.guess platform macros.
 #      Macro(s) similar to the tokens used by configure.
@@ -843,9 +1032,6 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
 # directory structure (--prefix, --libdir etc) and compiler flags
 # such as CFLAGS.
 #
-# The configure macro should be invoked as %configure (rather than %{configure})
-# because the rest of the arguments will be expanded using %*.
-#
 %_configure ./configure
 %configure \
   CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \
@@ -869,14 +1055,24 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
        --infodir=%{_infodir} \\\
        --disable-dependency-tracking
 
+#------------------------------------------------------------------------------
+# Tested features of make
+# Output synchronization for parallel make:
+%_make_output_sync %(! %{__make} --version -O >/dev/null 2>&1 || echo -O)
+
+#------------------------------------------------------------------------------
+# The "make" analogue, hiding the _smp_mflags magic from specs
+%make_build %{__make} %{_make_output_sync} %{?_smp_mflags}
+
 #------------------------------------------------------------------------------
 # The make install analogue of %configure for modern autotools:
-%make_install %{__make} install DESTDIR=%{?buildroot}
+%make_install %{__make} install DESTDIR=%{?buildroot} INSTALL="%{__install} -p"
 
 #------------------------------------------------------------------------------
 # Former make install analogue, kept for compatibility and for old/broken
 #  packages that don't support DESTDIR properly.
 %makeinstall \
+  echo "warning: %%makeinstall is deprecated, try %%make_install instead" 1>&2\
   %{__make} \\\
        prefix=%{?buildroot:%{buildroot}}%{_prefix} \\\
        exec_prefix=%{?buildroot:%{buildroot}}%{_exec_prefix} \\\
@@ -894,61 +1090,6 @@ posix.setenv("RPMBUILD_SOURCEDIR",rpm.expand("%?_sourcedir"));
   install
 
 #------------------------------------------------------------------------------
-# The GNUconfigure macro does the following:
-#       update config.guess and config.sub.
-#       regenerate all autoconf/automake files
-#       optionally change to a directory (make the directory if requested).
-#       run configure with correct prefix, platform, and CFLAGS.
-#       optionally restore current directory.
-#
-# Based on autogen.sh from GNOME and orginal GNUconfigure
-#
-%GNUconfigure(MCs:)      \
-  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS; \
-  LDFLAGS="${LDFLAGS:-%{-s:-s}}"  ; export LDFLAGS; \
-  %{-C:_mydir="`pwd`"; %{-M: %{__mkdir} -p %{-C*};} cd %{-C*}} \
-  dirs="`find ${_mydir} -name configure.in -print`"; export dirs; \
-    for coin in `echo ${dirs}` \
-do \
-  dr=`dirname ${coin}`; \
-if test -f ${dr}/NO-AUTO-GEN; then \
- : \
-else \
-     macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < ${coin}`; \
-    ( cd ${dr}; \
-      aclocalinclude="${ACLOCAL_FLAGS}"; \
-      for k in ${macrodirs}; do \
-        if test -d ${k}; then \
-          aclocalinclude="${aclocalinclude} -I ${k}"; \
-        ##else \
-        ##  echo "**Warning**: No such directory \`${k}'.  Ignored." \
-        fi \
-      done \
-      if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then \
-        if grep "sed.*POTFILES" configure.in >/dev/null; then \
-          : do nothing -- we still have an old unmodified configure.in \
-        else \
-          test -r ${dr}/aclocal.m4 || touch ${dr}/aclocal.m4; \
-          echo "no" | gettextize --force --copy; \
-          test -r ${dr}/aclocal.m4 && %{__chmod} u+w ${dr}/aclocal.m4; \
-        fi \
-      fi \
-      if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then \
-        %{__libtoolize} --force --copy; \
-      fi \
-      aclocal ${aclocalinclude}; \
-      if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then \
-        %{__autoheader}; \
-      fi \
-      echo "Running automake --gnu ${am_opt} ..."; \
-      %{__automake} --add-missing --gnu ${am_opt}; \
-      %{__autoconf}; \
-    ); \
-  fi \
-done \
-  %{-C:${_mydir}}%{!-C:.}/configure --prefix=%{_prefix} --exec-prefix=%{_exec_prefix} --bindir=%{_bindir} --sbindir=%{_sbindir} --sysconfdir=%{_sysconfdir} --datadir=%{_datadir} --includedir=%{_includedir} --libdir=%{_libdir} --libexecdir=%{_libexecdir} --localstatedir=%{_localstatedir} --sharedstatedir=%{_sharedstatedir} --mandir=%{_mandir} --infodir=%{_infodir} %* ; \
-  %{-C:cd ${_mydir}; unset _mydir}
-
 %patches %{lua: for i, p in ipairs(patches) do print(p.." ") end}
 %sources %{lua: for i, s in ipairs(sources) do print(s.." ") end}
 
@@ -974,7 +1115,8 @@ done \
 #      %{perl_sitearch}/Image
 #      %dir %{perl_sitearch}/auto/Image
 #
-%requires_eq() %(LC_ALL="C" echo '%*' | xargs -r rpm -q --qf 'Requires: %%{name} = %%{epoch}:%%{version}\\n' | sed -e 's/ (none):/ /' -e 's/ 0:/ /' | grep -v "is not")
+%requires_eq() %(echo '%*' | LC_ALL=C xargs -r rpm -q --qf 'Requires: %%{name} = %%{epoch}:%%{version}\\n' | sed -e 's/ (none):/ /' -e 's/ 0:/ /' | grep -v "is not")
+%requires_ge() %(echo '%*' | LC_ALL=C xargs -r rpm -q --qf 'Requires: %%{name} >= %%{epoch}:%%{version}\\n' | sed -e 's/ (none):/ /' -e 's/ 0:/ /' | grep -v "is not")
 %perl_sitearch %(eval "`%{__perl} -V:installsitearch`"; echo $installsitearch)
 %perl_sitelib  %(eval "`%{__perl} -V:installsitelib`"; echo $installsitelib)
 %perl_vendorarch %(eval "`%{__perl} -V:installvendorarch`"; echo $installvendorarch)
@@ -985,46 +1127,12 @@ done \
 #------------------------------------------------------------------------------
 # Useful python macros for determining python version and paths
 #
-%python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; import sys; sys.stdout.write(get_python_lib())")
-%python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; import sys; sys.stdout.write(get_python_lib(1))")
-%python_version %(%{__python} -c "import sys; sys.stdout.write(sys.version[:3])")
-
-# More useful perl macros (from Raul Dias <rsd@swi.com.br>)
-#
-%perl_version          %(perl -V:version | sed "s!.*='!!;s!'.*!!")
-%perl_man1ext          %(perl -V:man1ext | sed "s!.*='!!;s!'.*!!")
-%perl_man3ext          %(perl -V:man3ext | sed "s!.*='!!;s!'.*!!")
-%perl_man1dir          %(perl -V:man1dir | sed "s!.*='!!;s!'.*!!")
-%perl_man3dir          %(perl -V:man3dir | sed "s!.*='!!;s!'.*!!")
-%perl_installman1dir   %(perl -V:installman1dir | sed "s!.*='!!;s!'.*!!")
-%perl_installman3dir   %(perl -V:installman3dir | sed "s!.*='!!;s!'.*!!")
-%perl_installarchlib   %(perl -V:installarchlib | sed "s!.*='!!;s!'.*!!")
-%perl_prefix           %{buildroot}
+%python_sitelib %(%{__python} -Es %{_rpmconfigdir}/python-macro-helper sitelib)
+%python_sitearch %(%{__python} -Es %{_rpmconfigdir}/python-macro-helper sitearch)
+%python_version %(%{__python} -Es %{_rpmconfigdir}/python-macro-helper version)
 
 #------------------------------------------------------------------------------
-# Python specific macro definitions (originally from PLD).
-#
-%py_ver                        %(python -c "import sys; v=sys.version_info[:2]; print '%%d.%%d'%%v" 2>/dev/null || echo PYTHON-NOT-FOUND)
-%py_prefix             %(python -c "import sys; print sys.prefix" 2>/dev/null || echo PYTHON-NOT-FOUND)
-%py_libdir             %{py_prefix}/%{_lib}/python%{py_ver}
-%py_incdir             %{py_prefix}/include/python%{py_ver}
-%py_sitedir            %{py_libdir}/site-packages
-%py_compile(O) \
-find %1 -name '*.pyc' -exec rm -f {} \\; \
-python -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 \
-%{-O: \
-find %1 -name '*.pyo' -exec rm -f {} \\; \
-python -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 \
-}
-%py_requires(d) \
-%define minver %py_ver \
-%define maxver %(python -c "import sys; a,b=sys.version_info[:2]; print '%%d.%%d'%%(a,b+1)" 2>/dev/null || echo PYTHON-NOT-FOUND) \
-BuildRequires: python %{-d:python-devel} \
-PreReq: python >= %minver, python < %maxver
-
-
-#------------------------------------------------------------------------------
-# arch macro for all Intel i?86 compatibile processors
+# arch macro for all Intel i?86 compatible processors
 #  (Note: This macro (and it's analogues) will probably be obsoleted when
 #   rpm can use regular expressions against target platforms in macro
 #   conditionals.
@@ -1033,9 +1141,27 @@ PreReq: python >= %minver, python < %maxver
 
 #------------------------------------------------------------------------------
 # arch macro for all supported ARM processors
-%arm   armv3l armv4b armv4l armv4tl armv5b armv5l armv5teb armv5tel armv5tejl armv6l armv7l armv7hl
-%arml  armv3l armv4l armv5l armv5tel armv6l armv7l armv7hl
-%armb  armv4b armv5b armv5teb
+%arm   armv3l armv4b armv4l armv4tl armv5tl armv5tel armv5tejl armv6l armv6hl armv7l armv7hl armv7hnl
+
+#------------------------------------------------------------------------------
+# arch macro for 32-bit MIPS processors
+%mips32        mips mipsel mipsr6 mipsr6el
+
+#------------------------------------------------------------------------------
+# arch macro for 64-bit MIPS processors
+%mips64        mips64 mips64el mips64r6 mips64r6el
+
+#------------------------------------------------------------------------------
+# arch macro for big endian MIPS processors
+%mipseb        mips mipsr6 mips64 mips64r6
+
+#------------------------------------------------------------------------------
+# arch macro for little endian MIPS processors
+%mipsel        mipsel mipsr6el mips64el mips64r6el
+
+#------------------------------------------------------------------------------
+# arch macro for all supported MIPS processors
+%mips  %{mips32} %{mips64}
 
 #------------------------------------------------------------------------------
 # arch macro for all supported Sparc processors
@@ -1047,7 +1173,7 @@ PreReq: python >= %minver, python < %maxver
 
 #------------------------------------------------------------------------------
 # arch macro for all supported PowerPC 64 processors
-%power64       ppc64 ppc64p7
+%power64       ppc64 ppc64p7 ppc64le
 
 #------------------------------------------------------------------------
 # Use in %install to generate locale specific file lists. For example,
@@ -1067,24 +1193,24 @@ PreReq: python >= %minver, python < %maxver
 # for any special local needs use %__urlhelper_localopts in system-wide
 # or per-user macro configuration.
 %__urlhelpercmd         @__CURL@
-%__urlhelperopts        --silent --show-error --fail --location -o
+%__urlhelperopts        --silent --show-error --fail --globoff --location -o
 %__urlhelper_proxyopts   %{?_httpproxy:--proxy %{_httpproxy}%{?_httpport::%{_httpport}}}%{!?_httpproxy:%{nil}}
 %_urlhelper             %{__urlhelpercmd} %{?__urlhelper_localopts} %{?__urlhelper_proxyopts} %{__urlhelperopts}
 
-#------------------------------------------------------------------------------
-# Collection specific macros
+# Transaction plugin macros
 %__plugindir           %{_libdir}/rpm-plugins
-%__collection_font     %{__plugindir}/exec.so /usr/bin/fc-cache
-%__collection_java     %{__plugindir}/exec.so /usr/bin/rebuild-gcj-db
-%__collection_sepolicy         %{__plugindir}/sepolicy.so
-%__collection_sepolicy_flags   1
+#%__transaction_systemd_inhibit        %{__plugindir}/systemd_inhibit.so
+#%__transaction_selinux                %{__plugindir}/selinux.so
+#%__transaction_syslog         %{__plugindir}/syslog.so
+#%__transaction_ima            %{__plugindir}/ima.so
+#%__transaction_prioreset      %{__plugindir}/prioreset.so
 
 #------------------------------------------------------------------------------
 # transaction specific macros
-%__transaction_plugins     msm
-%__plugindir                           %{_libdir}/rpm-plugins
-%__transaction_msm                     %{__plugindir}/msm.so
-%__transaction_msm_default_policy      %{_libdir}/rpm-plugins/msm-device-sec-policy
+#%__transaction_plugins     msm
+#%__plugindir                          %{_libdir}/rpm-plugins
+#%__transaction_msm                    %{__plugindir}/msm.so
+#%__transaction_msm_default_policy     %{_libdir}/rpm-plugins/msm-device-sec-policy
 #------------------------------------------------------------------------------
 # Macros for further automated spec %setup and patch application
 
@@ -1098,13 +1224,18 @@ PreReq: python >= %minver, python < %maxver
 # Plain patch (-m is unused)
 %__scm_setup_patch(q) %{nil}
 %__scm_apply_patch(qp:m:)\
-%{__patch} %{-p:-p%{-p*}} %{-q:-s}
+%{__patch} %{-p:-p%{-p*}} %{-q:-s} --fuzz=%{_default_patch_fuzz} %{_default_patch_flags}
+
+# Plain patch with backups for gendiff
+%__scm_setup_gendiff(q) %{nil}
+%__scm_apply_gendiff(qp:m:)\
+%{__patch} %{-p:-p%{-p*}} %{-q:-s} --fuzz=%{_default_patch_fuzz} %{_default_patch_flags} -b --suffix ".%{2}"
 
 # Mercurial (aka hg)
 %__scm_setup_hg(q)\
 %{__hg} init %{-q} .\
 %{__hg} add %{-q} .\
-%{__hg} commit %{-q} --user "%{__scm_author}" -m "%{name}-%{version} base"
+%{__hg} commit %{-q} --user "%{__scm_author}" -m "%{NAME}-%{VERSION} base"
 
 %__scm_apply_hg(qp:m:)\
 %{__hg} import - %{-p:-p%{-p*}} %{-q} -m %{-m*} --user "%{__scm_author}"
@@ -1116,23 +1247,30 @@ PreReq: python >= %minver, python < %maxver
 %{__git} config user.email "%{__scm_usermail}"\
 %{__git} add .\
 %{__git} commit %{-q} -a\\\
-       --author "%{__scm_author}" -m "%{name}-%{version} base"
+       --author "%{__scm_author}" -m "%{NAME}-%{VERSION} base"
 
 %__scm_apply_git(qp:m:)\
-%{__git} apply %{-p:-p%{-p*}} -\
-%{__git} commit %{-q} -a -m %{-m*} --author "%{__scm_author}"
+%{__git} apply --index %{-p:-p%{-p*}} -\
+%{__git} commit %{-q} -m %{-m*} --author "%{__scm_author}"
+
+# Git, using "git am" (-m is unused)
+%__scm_setup_git_am(q)\
+%{expand:%__scm_setup_git %{-q}}
+
+%__scm_apply_git_am(qp:m:)\
+%{__git} am %{-q} %{-p:-p%{-p*}}
 
 # Quilt
 %__scm_setup_quilt(q) %{nil}
 %__scm_apply_quilt(qp:m:)\
-%{__quilt} import %{-p:-p%{-p*}} %{1} && %{__quilt} push
+%{__quilt} import %{-p:-p%{-p*}} %{1} && %{__quilt} push %{-q}
 
 # Bzr
 %__scm_setup_bzr(q)\
 %{__bzr} init %{-q}\
 %{__bzr} whoami --branch "%{__scm_author}"\
 %{__bzr} add .\
-%{__bzr} commit %{-q} -m "%{name}-%{version} base"
+%{__bzr} commit %{-q} -m "%{NAME}-%{VERSION} base"
 
 # bzr doesn't seem to have its own command to apply patches?
 %__scm_apply_bzr(qp:m:)\
@@ -1141,13 +1279,23 @@ PreReq: python >= %minver, python < %maxver
 
 # Single patch application
 %apply_patch(qp:m:)\
-%{uncompress:%{1}} | %{expand:%__scm_apply_%{__scm} %{-q} %{-p:-p%{-p*}} %{-m:-m%{-m*}}}
+%{lua:\
+local file = rpm.expand("%{1}")\
+local num = rpm.expand("%{2}")\
+if posix.access(file, "r") then\
+    local options = rpm.expand("%{-q} %{-p:-p%{-p*}} %{-m:-m%{-m*}}")\
+    local scm_apply = rpm.expand("%__scm_apply_%{__scm}")\
+    print(rpm.expand("%{uncompress:"..file.."} | "..scm_apply.." "..options.."  "..file.." "..num.."\\n"))\
+else\
+    print("echo 'Cannot read "..file.."'; exit 1;".."\\n")\
+end}
 
 # Automatically apply all patches
 %autopatch(vp:)\
 %{lua:\
+local options = rpm.expand("%{!-v:-q} %{-p:-p%{-p*}} ")\
 for i, p in ipairs(patches) do\
-    print(rpm.expand("%apply_patch -m %{basename:"..p.."}  "..rpm.expand("%{!-v:-q} %{-p:-p%{-p*}} ")..p.."\\n"))\
+    print(rpm.expand("%apply_patch -m %{basename:"..p.."}  "..options..p.." "..i.."\\n"))\
 end}
 
 # One macro to (optionally) do it all.
@@ -1158,7 +1306,7 @@ end}
 %autosetup(a:b:cDn:TvNS:p:)\
 %setup %{-a} %{-b} %{-c} %{-D} %{-n} %{-T} %{!-v:-q}\
 %{-S:%global __scm %{-S*}}\
-%{-S:%{expand:%__scm_setup_%{-S*} %{!-v:-q}}}\
+%{expand:%__scm_setup_%{__scm} %{!-v:-q}}\
 %{!-N:%autopatch %{-v} %{-p:-p%{-p*}}}
 
 # \endverbatim
@@ -1181,4 +1329,3 @@ end}
 /usr/sbin/groupadd -o -r %{1} 2>/dev/null || :\
 /usr/sbin/useradd -o -r -g %{1} -d %{2} -s %{3} -c %{4} %{1} 2>/dev/null || :\
 %{nil}
-
index 77fbd93e7c82edbf2cc594d05f64f23043e4617b..8de22c8b0e6361c4b4ccb0e6bd876e16459ec24a 100644 (file)
@@ -17,7 +17,9 @@
    Boston, MA 02111-1307, USA.  */
 
 # include "system.h"
+# include <ctype.h>
 # include <stdlib.h>
+# include <string.h>
 
 /* Find the first occurrence of C in S or the final NUL byte.  */
 static inline char *
index 39f059d801088494394dd9f95342b83ee47a40ea..5c6f53d400c3546975bcc45f77be083b003ca46c 100644 (file)
@@ -1139,4 +1139,3 @@ bail:
        __set_errno (oerrno);
        return (ret);
 }
-
index 0c059cf0c3f1594c7f73188cc421fd764ce9fe60..30ad0ee8eb535da9122e8ddc49cc71d3b831c98e 100644 (file)
@@ -204,4 +204,3 @@ int  Fts_set (FTS * sp, FTSENT * p, int instr) __THROW
 #endif
 
 #endif /* fts.h */
-
index ef7e16fdafe243ab5e368763bd4cda18c5872c1f..a31ce6d0294f39b0bc0eddee6d3d46c23ff53a01 100755 (executable)
@@ -1,7 +1,7 @@
 #! /bin/sh
 # mkinstalldirs --- make directory hierarchy
 
-scriptversion=2006-05-11.19
+scriptversion=2016-01-11.22; # UTC
 
 # Original author: Noah Friedman <friedman@prep.ai.mit.edu>
 # Created: 1993-05-16
@@ -81,9 +81,9 @@ case $dirmode in
       echo "mkdir -p -- $*"
       exec mkdir -p -- "$@"
     else
-      # On NextStep and OpenStep, the `mkdir' command does not
+      # On NextStep and OpenStep, the 'mkdir' command does not
       # recognize any option.  It will interpret all options as
-      # directories to create, and then abort because `.' already
+      # directories to create, and then abort because '.' already
       # exists.
       test -d ./-p && rmdir ./-p
       test -d ./--version && rmdir ./--version
@@ -157,5 +157,6 @@ exit $errstatus
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
 # End:
diff --git a/packaging/db-4.8.30-integration.dif b/packaging/db-4.8.30-integration.dif
deleted file mode 100644 (file)
index dbfb293..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
---- db/db/db.c.orig    2010-04-12 20:25:22.000000000 +0000
-+++ db/db/db.c 2011-05-12 11:38:59.000000000 +0000
-@@ -646,6 +646,8 @@ __env_mpool(dbp, fname, flags)
-                       MAKE_INMEM(dbp);
-               return (ret);
-       }
-+      if (LF_ISSET(DB_NOFSYNC) && mpf->mfp)
-+          F_SET(mpf->mfp, MP_NOFSYNC);
-       /*
-        * Set the open flag.  We use it to mean that the dbp has gone
---- db/db/db_iface.c.orig      2010-04-12 20:25:22.000000000 +0000
-+++ db/db/db_iface.c   2011-05-12 11:21:32.000000000 +0000
-@@ -1230,6 +1230,7 @@ __db_open_arg(dbp, txn, fname, dname, ty
- #define       OKFLAGS                                                         \
-       (DB_AUTO_COMMIT | DB_CREATE | DB_EXCL | DB_FCNTL_LOCKING |      \
-       DB_MULTIVERSION | DB_NOMMAP | DB_NO_AUTO_COMMIT | DB_RDONLY |   \
-+      DB_NOFSYNC |                                                    \
-       DB_RDWRMASTER | DB_READ_UNCOMMITTED | DB_THREAD | DB_TRUNCATE)
-       if ((ret = __db_fchk(env, "DB->open", flags, OKFLAGS)) != 0)
-               return (ret);
---- db/dbinc/mp.h.orig 2010-04-12 20:25:22.000000000 +0000
-+++ db/dbinc/mp.h      2011-05-12 12:01:32.000000000 +0000
-@@ -467,6 +467,7 @@ struct __mpoolfile {
- #define       MP_FAKE_UOC             0x080   /* Unlink_on_close field: fake flag. */
- #define       MP_NOT_DURABLE          0x100   /* File is not durable. */
- #define       MP_TEMP                 0x200   /* Backing file is a temporary. */
-+#define       MP_NOFSYNC              0x400   /* Don't fsync */
-       u_int32_t  flags;
- };
---- db/dbinc_auto/api_flags.in.orig    2011-05-12 11:40:57.000000000 +0000
-+++ db/dbinc_auto/api_flags.in 2011-05-12 11:55:10.000000000 +0000
-@@ -83,6 +83,7 @@
- #define       DB_NOORDERCHK                           0x00000002
- #define       DB_NOPANIC                              0x00000800
- #define       DB_NO_AUTO_COMMIT                       0x00001000
-+#define       DB_NOFSYNC                              0x00040000
- #define       DB_ODDFILESIZE                          0x00000080
- #define       DB_ORDERCHKONLY                         0x00000004
- #define       DB_OVERWRITE                            0x00001000
---- db/dist/s_config.orig      2010-04-12 20:25:23.000000000 +0000
-+++ db/dist/s_config   2011-05-12 12:00:34.000000000 +0000
-@@ -8,7 +8,8 @@ trap 'rm -f aclocal.m4 ; exit 0' 0 1 2 3
- . ./RELEASE
- echo "autoconf: building aclocal.m4..."
--cat aclocal/*.m4 aclocal_java/*.m4 > aclocal.m4
-+cat aclocal/*.m4 aclocal_java/*.m4 > acinclude.m4
-+aclocal
- echo "autoconf: running autoheader to build config.hin..."
- rm -f config.hin
---- db/mp/mp_sync.c.orig       2010-04-12 20:25:34.000000000 +0000
-+++ db/mp/mp_sync.c    2011-05-12 11:36:58.000000000 +0000
-@@ -578,7 +578,7 @@ done:      /*
-       if (ret == 0 && required_write) {
-               if (dbmfp == NULL)
-                       ret = __memp_sync_files(env);
--              else
-+              else if (!F_ISSET(dbmfp->mfp, MP_NOFSYNC))
-                       ret = __os_fsync(env, dbmfp->fhp);
-       }
-@@ -665,7 +665,7 @@ __memp_sync_file(env, mfp, argp, countp,
-                           "%s: unable to flush", (char *)
-                           R_ADDR(dbmp->reginfo, mfp->path_off));
-               }
--      } else
-+      } else if (!F_ISSET(dbmfp->mfp, MP_NOFSYNC))
-               ret = __os_fsync(env, dbmfp->fhp);
-       /*
-@@ -801,6 +801,8 @@ __memp_mf_sync(dbmp, mfp, locked)
-       COMPQUIET(hp, NULL);
-       env = dbmp->env;
-+      if (F_ISSET(mfp, MP_NOFSYNC))
-+          return 0;
-       /*
-        * We need to be holding the hash lock: we're using the path name
-        * and __memp_nameop might try and rename the file.
diff --git a/packaging/device-sec-policy b/packaging/device-sec-policy
deleted file mode 100644 (file)
index 83c0c46..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-<config>
-  <sw_source name="root" rankkey="/10020/10000.root">
-    <origin>
-      <keyinfo>
-mQENBE6MJTABCAC6pAFNW9tCbLQtgmwxzNf7ftSL5RrsjVTlPtpyeFLhxSmqmeHr
-KB10C6Co1zYB/fW8zvGXU613g3WEo4SKlS2lnOVBxviet0qn58zwCQASbdFYtckk
-thtkxiSInoKbj4n/Z+hHB9dvcyqcWqp2IFQEDDpxgP4KuzCvvj6W+e9EtYsdGt9P
-ZHsVjIAe0w+j7Hs4Q7FYWD+mdQAjgBsLlc16Ci8EPYnvBL/xdbJ3Ryfi59tTdfGG
-HnwpjM2J1WshooyvsOtHZU+T1nHtuegEzdRMVFo502Lkb60dJRsREE2iyPWFX2TE
-ZdaQqUMmkPaROUlWhGBSWIKbOVARwWBn94KDABEBAAG0CXJvb3QudGVzdIkBPgQT
-AQIAKAUCTowlMAIbAwUJA8JnAAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ
-TTk+Qq2l7P210wgApKVLpdve9jDsy/y//gSAGvfA4fXFuGhHkH5+QW7L+QkUAo0Z
-vv0KB0Pw5qZjV+k8jlq3Q3f/vcIEKxc40d0coa3m+bUlL2vy0+0gLSTiZ4MNFAk5
-LvJgEj+7ks75/qtJVWfCZeXo9NiugSoW9D+jNflmfstd8k2wT2ucH7IJHHzK1lGm
-vZHXeJeSULRHiibVyK5cG+NH/1Akuxkgo2jOzqhLjhp4/UiJlyAD0k/J4ULfmWp8
-C9/sIhWBoS5OcrtMVQtUMTx85I2dEC/01hnfLUk8mi5VscLu3xQoJ9hNrMEgji6H
-S+MmxcPGnVziEA0Z7VNN6DpuG/xZ1i9fgXXVfLkBDQROjCUwAQgA6fyD7eqaoah/
-za0X+Xv3o1y52UHmeHMmyzM/W4UlVsd01h7KzSHWyQKHi0i0pxRtUj+pkV+r+QjV
-BiAowq2HVpyXsmre29PEgAuIVv6/pZjfZEWFKjSDsvdXpS+mT+J6LjRxYh7ZbGvv
-SR3hMiMocWYENj13XDRw5USGhC0UxlmmMfjQfWJ6eHeQTiyZWW+CZUAJ2IbEkPVP
-nBDH/fTuVMfOo4g0HwqUSJmwV47BPLec1ArSaPG1YgKX1Y+UYoNfUvo/ieiF59At
-A8UbjQMzZggIfkvJsDL8U5n4ojFL8Rs/aMYuH76OlA4wuKPAnBSt+fVBnjaAAadf
-FCy/CHZt/wARAQABiQElBBgBAgAPBQJOjCUwAhsMBQkDwmcAAAoJEE05PkKtpez9
-S7IH/j44MxOP6dAycQAreWVAzdMiw82DjP7c6jMxYZj8ss1x++iO5GW82qm0WJ6h
-IOEdll+wBhPX0acKvE4KrlNzfsB2WzDRwOyiZfuSQI0J3Jrytj8zyCVKwHTsI8VC
-RkOzaMYsEqmPc+ve+wxxcwWXC0EtoyhMRjRZlMy55IeJcEfM8bcE4wcsyotsura6
-o1fmU223Xj1k5xXxDvXalPUoXnhvsev7kMBnIQRac194qkSkTzVXGLGu5Ng7Bfxl
-BMhf6RSk31+Q43ASbn4ralnswMhsHSatJIeasbHyvsTJzMnfEoSdpb8/dQI8KnHf
-tRrR5cbqmVr8tkFjS/QK6TWfNMM=
-</keyinfo>
-    </origin>
-    <package name="unknown-sw-source"/>
-    <package name="ac-domain-system">
-      <provide>
-        <ac_domain name="_" policy="shared"/>
-        <ac_domain name="Isolated"/>
-      </provide>
-    </package>
-    <package name="root"/>
-    <sw_source name="_default_" rankkey="/10020/11000/10000._default_">
-      <allow>
-        <ac_domain match="*"/>
-      </allow>
-    </sw_source>
-  </sw_source>
-</config>
diff --git a/packaging/find-docs.sh b/packaging/find-docs.sh
deleted file mode 100644 (file)
index afe4e22..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-usage () {
-cat << EOF
-Usage: $0 TOP_DIR
-
-EOF
-exit 1
-}
-
-if [ -z "$1" ] ; then usage
-elif [ $1 = / ] ; then echo $0: expects non-/ argument for '$1' 1>&2
-elif [ ! -d $1 ] ; then
- echo $0: $1: no such directory
- exit 1
-else TOP_DIR="`echo $1|sed -e 's:/$::'`"
-fi
-shift
-
-DOC_NAME=documentation.list
-touch $DOC_NAME
-
-find $TOP_DIR -type f -o -type l | sed '
-s:'"$TOP_DIR"'::
-s:\(.*/man/man./.*\.[0-9]\):%doc \1:
-s:\(.*/man/*/man./.*\.[0-9]\):%doc \1:
-s:\(.*/gtk-doc/html/.*\):%doc \1:
-s:\(.*/info/.*\info.*\):%doc \1:
-s:^\([^%].*\)::
-/^$/d' >> $DOC_NAME
-
-
-exit 0
diff --git a/packaging/find-provides.ksyms b/packaging/find-provides.ksyms
deleted file mode 100755 (executable)
index c8f2ccd..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#! /bin/sh
-
-IFS=$'\n'
-
-case "$1" in
-kernel-module-*)    ;; # Fedora kernel module package names start with
-                      # kernel-module.
-kernel*)           kernel_flavor=${1#kernel-} ;;
-esac
-
-trap 'rm -f "$tmp"' EXIT
-tmp=$(mktemp)
-while read f; do
-    test -e "$f" || continue
-    case "$f" in
-    *.debug)
-        continue
-        ;;
-    */lib/modules/*/*.ko | */lib/modules/*/*.ko.gz | */boot/vmlinu[xz]*)
-        ;;
-    *)
-        continue
-    esac
-    unzip=false
-    case "$f" in
-    *.gz | */boot/vmlinuz*)
-        unzip=true
-    esac
-    if $unzip && gzip -cd "$f" >"$tmp"; then
-        f=$tmp
-    fi
-    flavor=$(/usr/sbin/modinfo -F vermagic "$f")
-    flavor=${flavor%% *}
-    flavor=${flavor##*-}
-    if test -z "$flavor"; then
-        flavor=$kernel_flavor
-    fi
-    nm "$f" \
-    | sed -r -ne "s/^0*([0-9a-f]+) A __crc_(.+)/ksym($flavor:\\2) = \\1/p"
-done \
-| sort -u
diff --git a/packaging/librpm-tizen.changes b/packaging/librpm-tizen.changes
deleted file mode 100644 (file)
index 1422f07..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-* Wed Nov 01 2023 Biao Wang <biao716.wang@samsung.com> tizen-tools/4.11.0.1.tizen20140530-20231101
-- Port to python3.x version
-
-* Wed Jul 23 2014 Markus Lehtonen <markus.lehtonen@linux.intel.com> tizen-tools/4.11.0.1.tizen20140530-20140723
-- Rebase on latest Tizen 3.0
-- packaging: enable lua 5.2 for openSUSE
-- rpm-packaging: enable customized autoreq
-
-* Thu Mar 06 2014 Markus Lehtonen <markus.lehtonen@linux.intel.com> tizen-tools/4.11.0.1.tizen20130618-20140306
-- Fix build against Lua 5.2
-
-* Tue Oct 01 2013 Markus Lehtonen <markus.lehtonen@linux.intel.com> 4.11.0.1.tizen20130618
-- lua: fall through failed lua scripts
-- lua: Enable Lua
-- Ignore bad expressions in %if conditionals
-
-* Wed Aug 21 2013 Markus Lehtonen <markus.lehtonen@linux.intel.com> 4.11.0.1.tizen20130618
-- fix segmentation fault error while parsing spec
-- Bump the log level of "unexpanded script" msg
-- Prevent execution of arbitrary scripts
-
-* Tue Jun 18 2013 Markus Lehtonen <markus.lehtonen@linux.intel.com> 4.11.0.1.tizen20130618
-- Version bump to latest from Tizen 3.0
-
-* Thu Mar 07 2013 Markus Lehtonen <markus.lehtonen@linux.intel.com> 4.11.0.1.tizen20130304
-- Version bump to latest from Tizen
-
-* Wed Feb 27 2013 Markus Lehtonen <markus.lehtonen@linux.intel.com> 4.10.91.tizen20121215
-- Enable lua
-- update package Provide info
-- Add a provide tag to make gbs depend on new changes
-- packaging: fix Makefile
-- Install Tizen macros
-
-* Mon Feb 25 2013 Markus Lehtonen <markus.lehtonen@linux.intel.com> 4.10.91.tizen20121215
-- packaging: Disable autoreq, too
-- Ignore unknown internal scripts
-
-* Thu Feb 22 2013 Qiang Zhang <qiang.z.zhang@intel.com> 4.10.91.tizen20121215
-- packaging: fix build for CentOS
-
-* Thu Feb 21 2013 Markus Lehtonen <markus.lehtonen@linux.intel.com> 4.10.91.tizen20121215
-- packaging: Drop bdb sources
-- packaging: fix build for Fedora (18)
-- packaging: disable autoprov
diff --git a/packaging/librpm-tizen.spec b/packaging/librpm-tizen.spec
deleted file mode 100644 (file)
index 9911f85..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-# Use custom autoreq script for filtering out all librpm* stuff
-# (basically everything that the package would auto-provide) in order to make
-# the package installable
-%define _use_internal_dependency_generator 0
-%define __find_requires bash -c "/usr/lib/rpm/find-requires | grep -v librpm"
-
-%define rpmlibdir %{_prefix}/lib
-%define rpmhome %{rpmlibdir}/rpm
-
-Name:           librpm-tizen
-Summary:        The RPM libraries for git-buildpackage
-License:        GPL-2.0+
-Group:          Development/Tools/Building
-Version:        4.11.0.1.tizen20231101
-Release:        0
-Url:            http://www.rpm.org
-BuildRequires:  binutils
-BuildRequires:  bzip2
-BuildRequires:  file-devel
-BuildRequires:  findutils
-BuildRequires:  gcc
-BuildRequires:  glibc-devel
-BuildRequires:  gzip
-BuildRequires:  libtool
-%if 0%{?suse_version}
-BuildRequires:  pkgconfig(lua)
-%else
-BuildRequires:  lua-devel
-%endif
-BuildRequires:  make
-BuildRequires:  patch
-%if 0%{?fedora} || 0%{?centos_ver} || 0%{?centos_version}
-BuildRequires:  popt-devel
-%else
-BuildRequires:  pkgconfig(popt)
-%endif
-BuildRequires:  pkgconfig(zlib)
-BuildRequires:  pkgconfig(nss)
-BuildRequires:  pkg-config
-BuildRequires:  pkgconfig(python3)
-# Disable security
-%if 0
-BuildRequires:  uthash-devel
-BuildRequires:  pkgconfig(libxml-2.0)
-BuildRequires:  pkgconfig(libsmack)
-%endif
-%if 0%{?suse_version}
-BuildRequires:  fdupes
-%endif
-%if 0%{?fedora} || 0%{?centos_ver} >= 7
-BuildRequires:  libdb-devel
-%else
-BuildRequires:  db-devel
-%endif
-
-Source4:       rpm-tizen_macros
-Source8:       rpmconfigcheck
-Source13:      find-docs.sh
-Source22:      device-sec-policy
-Source23:      find-provides.ksyms
-Source1001:    rpm.manifest
-Source0:        rpm-%{version}.tar.gz
-AutoProv:       No
-
-Provides:       rpm-tizen = %{version}-tizen20140723
-#
-# avoid bootstrapping problem
-%define _binary_payload w9.bzdio
-#
-# Python module name
-%define python_mod_name rpm_tizen
-
-%description
-RPM Package Manager is the main tool for managing the software packages
-of Tizen.
-
-RPM can be used to install and remove software packages. With rpm, it
-is easy to update packages.  RPM keeps track of all these manipulations
-in a central database. This way it is possible to get an overview of
-all installed packages.  RPM also supports database queries.
-
-This is a special stripped-down version of RPM, only intended to be used by the
-git-buildpackage tool. This package doesn't interfere with the RPM libraries of
-the host system and it only contains rpmlib and rpm-python.
-
-%prep
-%setup -q -n rpm-%{version}
-cp %{SOURCE1001} .
-rm -rf sqlite
-if [ -s %{_sysconfdir}/rpm/tizen_macros ]; then
-    cp -a %{_sysconfdir}/rpm/tizen_macros %{SOURCE4}
-fi
-cp -a %{SOURCE4} tizen_macros
-rm -f m4/libtool.m4
-rm -f m4/lt*.m4
-
-%build
-CPPFLAGS="$CPPFLAGS `pkg-config --cflags nss`"
-export CPPFLAGS
-export CFLAGS="%{optflags} -ffunction-sections"
-export LDFLAGS="${LDFLAGS} -Wl,-Bsymbolic-functions -ffunction-sections"
-%ifarch armv5tel
-export CFLAGS="-g -O0 -fno-strict-aliasing -ffunction-sections"
-%endif
-
-autoreconf -i -f
-%configure \
-    --libdir=%{_libdir}/%{name} \
-    --disable-dependency-tracking \
-    --with-lua \
-    --without-acl \
-    --without-cap \
-    --enable-shared \
-    --enable-python \
-    --without-msm \
-    --with-external-db \
-    PYTHON_MODULENAME=%{python_mod_name}
-
-make %{?_smp_mflags}
-
-%install
-# Install into a temporary location
-make install DESTDIR="`pwd`/tmp_install"
-
-# And only copy the files that we want
-install -d %{buildroot}%{_libdir}/%{name}
-install -d %{buildroot}%{python3_sitearch}
-cp -ax tmp_install/%{_libdir}/%{name}  %{buildroot}%{_libdir}/
-cp -ax tmp_install/%{python3_sitearch}/%{python_mod_name} %{buildroot}%{python3_sitearch}/
-
-# Install extra sources
-install -m644 %{SOURCE4} %{buildroot}%{_libdir}/%{name}/rpm/tizen_macros
-install -d %{buildroot}%{_libdir}/%{name}/rpm/tizen
-ln -s ../tizen_macros %{buildroot}%{_libdir}/%{name}/rpm/tizen/macros
-
-# Delete unwanted development files etc.
-find %{buildroot} -name "*.la" | xargs rm -f --
-find %{buildroot}/%{_libdir}/%{name} -name "*.so" | xargs rm -f --
-rm -rf "%{buildroot}%{_libdir}/%{name}/pkgconfig"
-rm -rf "%{buildroot}%{_libdir}/%{name}/rpm-plugins"
-
-# Compile python modules (Fedora does this automatically) and find duplicates
-%if 0%{?suse_version}
-%py3_compile %{buildroot}/%{python3_sitearch}/%{python_mod_name}/
-%py3_compile -O %{buildroot}/%{python3_sitearch}/%{python_mod_name}/
-
-%fdupes %{buildroot}/%{python3_sitearch}/
-%endif
-
-%files
-%defattr(-,root,root,-)
-%dir %{_libdir}/%{name}
-%dir %{python3_sitearch}/%{python_mod_name}/
-%{_libdir}/%{name}/*.so.*
-%{_libdir}/%{name}/rpm
-%{python3_sitearch}/%{python_mod_name}/*
diff --git a/packaging/rpm-tizen_macros b/packaging/rpm-tizen_macros
deleted file mode 100644 (file)
index e7648f9..0000000
+++ /dev/null
@@ -1,305 +0,0 @@
-# directories
-%_infodir               %{_prefix}/share/info
-%_mandir                %{_prefix}/share/man
-%_sysconfdir            /etc
-%_localstatedir         /var
-%_defaultdocdir         %{_usr}/share/doc/packages
-%_unitdir_user /usr/lib/systemd/user
-%_unitdir /usr/lib/systemd/system
-
-# package build macros
-# %make_install           make install DESTDIR=%{?buildroot}
-# %makeinstall            make DESTDIR=%{?buildroot:%{buildroot}} install
-%rb_arch                %(echo %{_host_cpu}-linux | sed -e "s/i686/i586/" -e "s/armv5tel/armv4l/" -e "s/hppa2.0/hppa/")
-%rb_ver                 %(/usr/bin/ruby -e 'puts VERSION.sub(/\\\.\\\d$/, "")')
-
-# external kernel module helper macro(s)
-%kernel_devel_uname_r %(/bin/rpm -q --provides $(/bin/rpm -q --whatprovides kernel-devel-uname-r) | sed -ne 's,kernel-devel-uname-r = ,, p')
-%kernel_release %(/bin/rpm -q --queryformat '%{RPMTAG_VERSION}-%{RPMTAG_RELEASE}' $(/bin/rpm -q --whatprovides kernel))
-%kernel_name    %(/bin/rpm -q --queryformat '%{RPMTAG_NAME}' $(/bin/rpm -q --whatprovides kernel))
-
-# this script calls all scripts in /usr/lib/rpm/brp-tizen.d
-%__os_install_post  \
-       /usr/lib/rpm/brp-compress \
-       /usr/lib/rpm/brp-tizen  \
-       %{!?disable_docs_package:/usr/lib/rpm/tizen/find-docs.sh %{buildroot}} \
-%{nil}
-
-# macro: %configure_kernel_source
-#
-#
-%configure_kernel_source() \
-       if test -d /usr/src/linux ; then \
-           pushd /usr/src/linux \
-           test -f .config || cp arch/%_arch/defconfig.default .config \
-           yes "" | make oldconfig \
-           make dep \
-           popd \
-       fi \
-       %nil
-
-%install_info(:-:) \
-    ALL_ARGS=(%{**}) \
-    NUM_ARGS=${#ALL_ARGS[@]} \
-    if test -x /sbin/install-info ; then \
-       if test -e "${ALL_ARGS[$((NUM_ARGS-1))]}" ; then \
-           /sbin/install-info "${ALL_ARGS[@]}" \
-       fi \
-    fi ; 
-
-%install_info_delete(:-:) \
-    ALL_ARGS=(%{**}) \
-    NUM_ARGS=${#ALL_ARGS[@]} \
-    if test -x /sbin/install-info ; then \
-       if ! test -e "${ALL_ARGS[$((NUM_ARGS-1))]}" ; then \
-           /sbin/install-info --quiet --delete "${ALL_ARGS[@]}" \
-       fi ; \
-    fi ; 
-
-# find-supplements.ksyms parses this macro directly out of the spec file:
-%supplements_kernel_module() \
-    %{expand:%(if ! rpm -q kernel-syms > /dev/null; then echo "%fail Please add the kernel-syms package to BuildRequires"; fi)}
-
-%do_profiling 1
-%cflags_profile_generate -fprofile-generate
-%cflags_profile_feedback -fprofile-use
-
-
-
-# Tizen
-#
-%configure \
-  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \
-  CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \
-  FFLAGS="${FFLAGS:-%optflags -I%_fmoddir}" ; export FFLAGS ; \
-  ./configure --build=%{_build} --host=%{_host} \\\
-        --program-prefix=%{?_program_prefix} \\\
-        --prefix=%{_prefix} \\\
-        --exec-prefix=%{_exec_prefix} \\\
-        --bindir=%{_bindir} \\\
-        --sbindir=%{_sbindir} \\\
-        --sysconfdir=%{_sysconfdir} \\\
-        --datadir=%{_datadir} \\\
-        --includedir=%{_includedir} \\\
-        --libdir=%{_libdir} \\\
-        --libexecdir=%{_libexecdir} \\\
-        --localstatedir=%{_localstatedir} \\\
-        --sharedstatedir=%{_sharedstatedir} \\\
-        --mandir=%{_mandir} \\\
-        --infodir=%{_infodir}
-
-
-%reconfigure \
-  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \
-  CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \
-  FFLAGS="${FFLAGS:-%optflags -I%_fmoddir}" ; export FFLAGS ; \
-  autoreconf -v --install --force || exit 1 \
-  ./configure --build=%{_build} --host=%{_host} \\\
-        --program-prefix=%{?_program_prefix} \\\
-        --prefix=%{_prefix} \\\
-        --exec-prefix=%{_exec_prefix} \\\
-        --bindir=%{_bindir} \\\
-        --sbindir=%{_sbindir} \\\
-        --sysconfdir=%{_sysconfdir} \\\
-        --datadir=%{_datadir} \\\
-        --includedir=%{_includedir} \\\
-        --libdir=%{_libdir} \\\
-        --libexecdir=%{_libexecdir} \\\
-        --localstatedir=%{_localstatedir} \\\
-        --sharedstatedir=%{_sharedstatedir} \\\
-        --mandir=%{_mandir} \\\
-        --infodir=%{_infodir}
-
-%autogen \
-  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \
-  CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \
-  FFLAGS="${FFLAGS:-%optflags -I%_fmoddir}" ; export FFLAGS ; \
-  ./autogen.sh --build=%{_build} --host=%{_host} \\\
-        --program-prefix=%{?_program_prefix} \\\
-        --prefix=%{_prefix} \\\
-        --exec-prefix=%{_exec_prefix} \\\
-        --bindir=%{_bindir} \\\
-        --sbindir=%{_sbindir} \\\
-        --sysconfdir=%{_sysconfdir} \\\
-        --datadir=%{_datadir} \\\
-        --includedir=%{_includedir} \\\
-        --libdir=%{_libdir} \\\
-        --libexecdir=%{_libexecdir} \\\
-        --localstatedir=%{_localstatedir} \\\
-        --sharedstatedir=%{_sharedstatedir} \\\
-        --mandir=%{_mandir} \\\
-        --infodir=%{_infodir}
-
-
-%makeinstall \
-  %{__make} \\\
-        prefix=%{?buildroot:%{buildroot}}%{_prefix} \\\
-        exec_prefix=%{?buildroot:%{buildroot}}%{_exec_prefix} \\\
-        bindir=%{?buildroot:%{buildroot}}%{_bindir} \\\
-        sbindir=%{?buildroot:%{buildroot}}%{_sbindir} \\\
-        sysconfdir=%{?buildroot:%{buildroot}}%{_sysconfdir} \\\
-        datadir=%{?buildroot:%{buildroot}}%{_datadir} \\\
-        includedir=%{?buildroot:%{buildroot}}%{_includedir} \\\
-        libdir=%{?buildroot:%{buildroot}}%{_libdir} \\\
-        libexecdir=%{?buildroot:%{buildroot}}%{_libexecdir} \\\
-        localstatedir=%{?buildroot:%{buildroot}}%{_localstatedir} \\\
-        sharedstatedir=%{?buildroot:%{buildroot}}%{_sharedstatedir} \\\
-        mandir=%{?buildroot:%{buildroot}}%{_mandir} \\\
-        infodir=%{?buildroot:%{buildroot}}%{_infodir} \\\
-  install
-
-
-%make_install \
-  %{__make} \\\
-        DESTDIR=%{?buildroot:%{buildroot}} \\\
-        INSTALL_ROOT=%{?buildroot:%{buildroot}} \\\
-  install  \
-  rm -f %{?buildroot:%{buildroot}}%{_infodir}/dir \
-  find %{?buildroot:%{buildroot}} -regex ".*\\.la$" | xargs rm -f -- \
-  %{!?keepstatic:find %{?buildroot:%{buildroot}} -regex ".*\\.a$" | xargs rm -f --}
-
-%_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\
-        && RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"; \\\
-        [ "$RPM_BUILD_NCPUS" -gt 1 ] && echo "-j$RPM_BUILD_NCPUS")
-
-%lang_package(n:f:) \
-%package %{-n:-n %{-n*}-}locale \
-Summary: Translations and Locale for package %{name}\
-Group: System/Localization\
-Requires: %{-n:%{-n*}}%{!-n:%{name}} = %{version} \
-Provides: %{-n:%{-n*}}%{!-n:%{name}}-lang-all = %{version} \
-BuildArch:  noarch \
-%description %{-n:-n %{-n*}-}locale\
-This package provides translations for package %{name}.\
-%files %{-n:-n %{-n*}-}locale -f %{-f:%{-f*}.lang} %{!-f:%{name}.lang}\
-%defattr(-,root,root,-)\
-%{nil}
-
-%docs_package \
-%package docs \
-Summary: Documentation for package %{name}\
-Group: Documentation\
-AutoReqProv: 0\
-%description docs\
-This package provides documentation for package %{name}.\
-%files docs -f documentation.list\
-%defattr(-,root,root,-)\
-%{nil}
-
-# Bad hack to set $LANG to C during all RPM builds
-%prep \
-%%prep\
-LANG=C\
-export LANG\
-unset DISPLAY\
-%{nil}
-
-%build %%build\
-LANG=C\
-export LANG\
-unset DISPLAY\
-CFLAGS="%optflags" ; export CFLAGS ; \
-CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \
-FFLAGS="${FFLAGS:-%optflags -I%_fmoddir}" ; export FFLAGS ; \
-LD_AS_NEEDED=1; export LD_AS_NEEDED ; \
-%{nil}
-
-%install %{?_enable_debug_packages:%{?buildsubdir:%{debug_package}}}\
-%%install\
-LANG=C\
-export LANG\
-unset DISPLAY\
-rm -rf %{?buildroot:%{buildroot}} \
-mkdir -p %{?buildroot:%{buildroot}} \
-%{nil}
-
-
-%clean %%clean\
-rm -rf %{?buildroot:%{buildroot}} \
-%{nil}
-
-%find_lang      /usr/lib/rpm/find-lang.sh %{buildroot}
-%find_docs      /usr/lib/rpm/tizen/find-docs.sh %{buildroot}
-
-
-
-#==============================================================================
-# ---- default .desktop directories per the desktop-entry freedesktop.org spec
-
-%_desktopdir    %{_datadir}/applications
-
-#==============================================================================
-# ---- Generic auto req/prov filtering macros
-#
-# http://fedoraproject.org/wiki/PackagingDrafts/AutoProvidesAndRequiresFiltering
-
-# prevent anything matching from being scanned for provides
-%filter_provides_in(P) %{expand: \
-%global __filter_prov_cmd %{?__filter_prov_cmd} %{__grep} -v %{-P} '%*' | \
-}
-
-# prevent anything matching from being scanned for requires
-%filter_requires_in(P) %{expand: \
-%global __filter_req_cmd %{?__filter_req_cmd} %{__grep} -v %{-P} '%*' | \
-}
-
-# filter anything matching out of the provides stream
-%filter_from_provides() %{expand: \
-%global __filter_from_prov %{?__filter_from_prov} | %{__sed} -e '%*' \
-}
-
-# filter anything matching out of the requires stream
-%filter_from_requires() %{expand: \
-%global __filter_from_req %{?__filter_from_req} | %{__sed} -e '%*' \
-}
-
-# actually set up the filtering bits
-%filter_setup %{expand: \
-%global _use_internal_dependency_generator 0 \
-%global __deploop() while read FILE; do /usr/lib/rpm/rpmdeps -%{1} ${FILE}; done | /bin/sort -u \
-%global __find_provides /bin/sh -c "%{?__filter_prov_cmd} %{__deploop P} %{?__filter_from_prov}" \
-%global __find_requires /bin/sh -c "%{?__filter_req_cmd}  %{__deploop R} %{?__filter_from_req}" \
-}
-
-%remove_docs \
-  rm -rf %{?buildroot:%{buildroot}}%{_infodir} \
-  rm -rf %{?buildroot:%{buildroot}}%{_defaultdocdir} \
-  rm -rf %{?buildroot:%{buildroot}}%{_datadir}/doc/%{name} \
-  rm -rf %{?buildroot:%{buildroot}}%{_datadir}/doc/%{name}-%{version} \
-  rm -rf %{?buildroot:%{buildroot}}%{_datadir}/gtk-doc \
-  rm -rf %{?buildroot:%{buildroot}}%{_datadir}/doc \
-  rm -rf %{?buildroot:%{buildroot}}%{_datadir}/man \
-  find %{?buildroot:%{buildroot}} -regex ".*/man/man./.*\.[0-9]" | xargs rm -f -- \
-  find %{?buildroot:%{buildroot}} -regex ".*/man/../man./.*\.[0-9]" | xargs rm -f -- \
-  find %{?buildroot:%{buildroot}} -regex ".*/man/man./.*\.[0-9]pm" | xargs rm -f --
-
-
-%install_service() \
-mkdir -p %{buildroot}/%{_unitdir}/%{1} \
-ln -s ../%{2}  %{buildroot}/%{_unitdir}/%{1}/%{2}  \
-%{nil}
-
-
-%_fontsdir               %{_usr}/share/fonts
-%_ttfontsdir             %{_fontsdir}/truetype
-%_miscfontsdir           %{_fontsdir}/misc
-%_fontsconfdir           %{_sysconfdir}/fonts
-%_fontsconfddir          %{_fontsconfdir}/conf.d
-%_fontsconfavaildir      %{_datadir}/%{name}/conf.avail
-
-%devel_package \
-%package devel \
-Summary: Development files for package %{name}\
-Group: Development\
-%description devel\
-This package provides header files and other developer releated files for package %{name}.\
-%files devel \
-%{_includedir}/*\
-%{_libdir}/pkgconfig/*.pc\
-%{_libdir}/*.so\
-%{nil}
-
-%devel_desc This package contains all necessary include files and libraries needed \
-to develop applications that require %{name}.\
-%{nil}
-
diff --git a/packaging/rpm.changes b/packaging/rpm.changes
deleted file mode 100644 (file)
index c654c5e..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-* Wed Jan 29 2014 Patrick McCarty <patrick.mccarty@linux.intel.com> 940f59b
-- Add three new RPM macros to use in packages with build dependencies on a
-  platform's kernel and/or kernel-devel package. The macros are
-  '%kernel_devel_uname_r', '%kernel_release', and '%kernel_name'.
-
-* Fri Jan 17 2014 Mikko Ylinen <mikko.ylinen@intel.com> accepted/tizen/generic/20140106.135159@e9e247d
-- MSM: fix access type length and validation
-- Security plugin: change policy to advisory
-- Security plugin: adding support for l access type
-
-* Tue Dec 03 2013 Rusty Lynch <rusty.lynch@intel.com> accepted/tizen/20131115.212447@d460069
-- Security plugin: removing exec label restriction
-
-* Fri Nov 15 2013 Rusty Lynch <rusty.lynch@intel.com> accepted/tizen/20131108.201843@93d4902
-- Fix rpmlint error
-- PTREL-155: fix build python-rpm
-- armv7l:fix faulty line in rpmrc.in
-- msm: check libxml/{xmlreader,tree}.h
-- Security plugin: Removing definition of System domain from default device policy
-
-* Wed Sep 25 2013 Jacek Bukarewicz <j.bukarewicz@samsung.com> accepted/tizen/20130916.211819@a771cdf
-- Introduction of -locale and -docs subpackages. Moved package to another group
-- update changes
-
-* Mon Sep 16 2013 Anas Nashif <anas.nashif@intel.com> accepted/tizen/20130913.024734@b487cf5
-- remove --target from %configure macros
-
-* Mon Sep 02 2013 Anas Nashif <anas.nashif@intel.com> submit/tizen/20130820.223822@6ebf41a
-- Security plugin: adding checking of return code for dbus policy verification
-
-* Wed Aug 21 2013 Anas Nashif <anas.nashif@intel.com> submit/tizen/20130820.223822@6ec9c11
-- Security plugin: small fixes
-- Security plugin: removing disable-dchecks option
-- update changes and release
-
-* Mon Aug 05 2013 Anas Nashif <anas.nashif@intel.com> accepted/tizen/20130710.214747@675aeea
-- Security plugin: support for --root option
-- Security plugin: pkg_name allocation in conflict
-- Security plugin: allowing multiple domains definition
-- resetting manifest requested domain to floor
-- update changelog
-
-* Wed Jun 12 2013 Anas Nashif <anas.nashif@intel.com> accepted/tizen/20130520.094313@a3c78e0
-- update macros from project conf
-- Security plugin: Adding configuration option --disable-dchecks
-- Security-plugin: Fix the null pointer comparison  possibility in msmXattrSupport
-- Set license using %license
-- Fix 32bit kernel builds by not using eu-strip
-- Cleaning up code identation
-- Fix the missing path prefix for Plugin init hook
-- Fixes to rpm security plugin  - stricter control over smack64exec label assigment  - strciter control over dbus interface labels
-- Add VCS tag into .src.rpm
-- add find-provides.ksyms
-
-* Fri Mar 29 2013 Anas Nashif <anas.nashif@intel.com> submit/trunk/20130322.180734@fcbf4ed
-- find-provides.ksyms added for kernel packages and symbols
-
-* Fri Mar 29 2013 Anas Nashif <anas.nashif@intel.com> submit/trunk/20130322.180734@fcbf4ed
-- init message test [Elena Reshetova]
-- Adding Isolated domain to policy [Elena Reshetova]
-- Changing smack load path [Elena Reshetova]
-
-* Fri Mar 22 2013 Anas Nashif <anas.nashif@intel.com> submit/trunk/20130318.200853@1a584da
-- Fixed package groups
-
-* Mon Mar 18 2013 Anas Nashif <anas.nashif@intel.com> accepted/trunk/20130309.052847@1a584da
-- Adding a new attribute tag to manifest [Elena Reshetova]
-
-* Mon Mar 04 2013 Anas Nashif <anas.nashif@intel.com> submit/trunk/20130207.030314@31fe202
-- Fixed package groups
-- add macro no_lang_C
-- update find-lang
-- Call ldconfig
-- Include %{VCS} in rpm -q --info output
-
-* Wed Feb 06 2013 Anas Nashif <anas.nashif@intel.com> submit/trunk/20130206.154747@e2d13a6
-- Call ldconfig
-
-* Wed Feb 06 2013 Anas Nashif <anas.nashif@intel.com> submit/trunk/20130203.005409@caedd28
-- Move libs back to main package
-
-* Sat Feb 02 2013 Anas Nashif <anas.nashif@intel.com> rpm-4.11.0-release@531803c
-- Update to 4.11.0.1
-
-* Tue Jan 29 2013 Markus Lehtonen <markus.lehtonen@linux.intel.com> accepted/trunk/20130119.012137@c917b46
-- Temporally making loading of a configured plugin optional [Elena Reshetova]
-
-* Thu Jan 17 2013 Anas Nashif <anas.nashif@intel.com> submit/trunk/20130117.002510@77a88bd
-- fixing error in cleanup if magic db can't be loaded [Elena Reshetova]
-
-* Wed Jan 16 2013 Anas Nashif <anas.nashif@intel.com> accepted/trunk/20130114.165627@8999b08
-- Enable security plugin/Smack
-
-* Mon Jan 14 2013 Anas Nashif <anas.nashif@intel.com> accepted/trunk/20121215.193208@ed3861a
-- Move build related files to rpm-build
-
-* Sat Dec 15 2012 Anas Nashif <anas.nashif@intel.com> submit/trunk/20121215.171010@735e3f1
-- cleanup macros
-
-* Sat Dec 15 2012 Anas Nashif <anas.nashif@intel.com> rpm-4.11.0-beta1@be4c7d8
-- Update to 4.11 beta1
-
diff --git a/packaging/rpm.manifest b/packaging/rpm.manifest
deleted file mode 100644 (file)
index 017d22d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<manifest>
- <request>
-    <domain name="_"/>
- </request>
-</manifest>
diff --git a/packaging/rpmconfigcheck b/packaging/rpmconfigcheck
deleted file mode 100644 (file)
index 97bba74..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#! /bin/bash
-# Copyright (c) 2002 SuSE GmbH Nuernberg, Germany.
-#
-# Author: Michael Schroeder <feedback@suse.de>
-#
-# /etc/init.d/rpmconfigcheck
-# /usr/sbin/rcrpmconfigcheck
-#
-# Script to scan for unresolved .rpmnew, .rpmorig, and .rpmsave files
-#
-### BEGIN INIT INFO
-# Provides: rpmconfigcheck
-# Required-Start: $remote_fs
-# Required-Stop: $null
-# Default-Start: 2 3 5
-# Default-Stop:
-# Description: rpm config file scan
-### END INIT INFO
-
-. /etc/rc.status
-
-# First reset status of this service
-rc_reset
-
-configcheckfile=/var/adm/rpmconfigcheck
-packages=/var/lib/rpm/Packages
-
-test -z "$1" && set start
-
-case "$1" in
-    start|restart|try-restart|reload|force-reload)
-       if test -s $packages -a \( ! -e $configcheckfile -o -s $configcheckfile -o ! $packages -ot $configcheckfile \) ; then
-           echo -n "Searching for unresolved configuration files"
-           if test ! -e $configcheckfile -o ! $packages -ot $configcheckfile ; then
-               test -e $configcheckfile && mv -f $configcheckfile $configcheckfile.old
-               rpm -qalc | sort | perl -lne '-e "$_.rpmnew" and print "$_.rpmnew"; -e "$_.rpmorig" and print "$_.rpmorig"; -e "$_.rpmsave" and print "$_.rpmsave"' > $configcheckfile
-           else
-               mv -f $configcheckfile $configcheckfile.old
-               while read l; do
-                   test -e $l && echo $l
-               done < $configcheckfile.old > $configcheckfile
-               true
-           fi
-           rc_status -v
-           if test -s $configcheckfile; then
-               echo "Please check the following files (see /var/adm/rpmconfigcheck):"
-               sed -e 's/^/    /' < $configcheckfile
-               touch $configcheckfile.old
-               cat $configcheckfile $configcheckfile.old | sort | uniq -d > $configcheckfile.dup
-               cat $configcheckfile $configcheckfile.dup | sort | uniq -u > $configcheckfile.new
-               if test -s $configcheckfile.new ; then
-                   (
-                   echo "----------------------------------------------------------------------"
-                   echo "----------------------------------------------------------------------"
-                   echo "rpmconfigcheck"
-                   date
-                   echo "----------------------------------------"
-                   echo "This is a warning message."
-                   echo "rpmconfigcheck has found the following new unresolved config files"
-                   echo "(all files are listed in /var/adm/rpmconfigcheck):"
-                   cat $configcheckfile.new
-                   echo "----------------------------------------"
-                   ) >> /var/log/update-messages
-               fi
-           fi
-           rm -f $configcheckfile.old $configcheckfile.dup $configcheckfile.new
-       fi
-       ;;
-    stop)
-       ;;
-    status)
-       rc_failed 4
-       rc_status -v
-       ;;
-     *)
-       echo "Usage: $0 {start}"
-       exit 1
-       ;;
-esac
-rc_exit
index 20c564e2a3c6b9da3afefb412bdcbe9652795a53..e84431a40d1eed8ab318af2171bd4b01520ccf1c 100644 (file)
 %_oldincludedir                @oldincludedir@
 %_infodir              @infodir@
 %_mandir               @mandir@
-%_initddir             %{_sysconfdir}/init.d
+%_initddir             %{_sysconfdir}/rc.d/init.d
 # Deprecated misspelling, present for backwards compatibility.
 %_initrddir            %{_initddir}
+%_rundir               @RUNDIR@
 
 %_defaultdocdir                %{_datadir}/doc
 
+# Maximum number of CPU's to use when building, 0 for unlimited.
+#%_smp_ncpus_max 0
 %_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\
        && RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"; \\\
-       [ "$RPM_BUILD_NCPUS" -gt 1 ] && echo "-j$RPM_BUILD_NCPUS")
+        ncpus_max=%{?_smp_ncpus_max}; \\\
+        if [ -n "$ncpus_max" ] && [ "$ncpus_max" -gt 0 ] && [ "$RPM_BUILD_NCPUS" -gt "$ncpus_max" ]; then RPM_BUILD_NCPUS="$ncpus_max"; fi; \\\
+        if [ "$RPM_BUILD_NCPUS" -gt 1 ]; then echo "-j$RPM_BUILD_NCPUS"; fi)
 
 #==============================================================================
 # ---- Build policy macros.
@@ -63,6 +68,8 @@
 %__os_install_post    \
     %{_rpmconfigdir}/brp-compress \
     %{_rpmconfigdir}/brp-strip %{__strip} \
+    %{_rpmconfigdir}/brp-strip-static-archive %{__strip} \
+    %{_rpmconfigdir}/brp-strip-comment-note %{__strip} %{__objdump} \
 %{nil}
 
 %__spec_install_post\
index 8002d9c40e21e048121f5a036bebdadd0a4783ee..e713640268b48259e7a18c19fa33273c1a0ed2b4 100644 (file)
@@ -1,6 +1,7 @@
 # Makefile for rpm library.
 
 include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
 
 AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -I$(top_builddir)/include/
 AM_CPPFLAGS += -I$(top_srcdir)/misc
@@ -13,16 +14,33 @@ AM_LDFLAGS = -avoid-version -module -shared
 
 pluginsdir = $(libdir)/rpm-plugins
 
-plugins_LTLIBRARIES = exec.la
-
-exec_la_SOURCES = plugin.h exec.c
-exec_la_LIBADD = $(top_builddir)/lib/librpm.la $(top_builddir)/rpmio/librpmio.la
+plugins_LTLIBRARIES =
 
 if SELINUX
-sepolicy_la_SOURCES = plugin.h sepolicy.c
-sepolicy_la_LIBADD = $(top_builddir)/lib/librpm.la $(top_builddir)/rpmio/librpmio.la @WITH_SELINUX_LIB@ @WITH_SEMANAGE_LIB@
+selinux_la_SOURCES = selinux.c
+selinux_la_LIBADD = $(top_builddir)/lib/librpm.la $(top_builddir)/rpmio/librpmio.la @WITH_SELINUX_LIB@
+plugins_LTLIBRARIES += selinux.la
+endif
+
+if DBUS
+systemd_inhibit_la_SOURCES = systemd_inhibit.c
+systemd_inhibit_la_CPPFLAGS = $(AM_CPPFLAGS) @DBUS_CFLAGS@
+systemd_inhibit_la_LIBADD = $(top_builddir)/lib/librpm.la $(top_builddir)/rpmio/librpmio.la @DBUS_LIBS@
+plugins_LTLIBRARIES += systemd_inhibit.la
+endif
+
+prioreset_la_SOURCES = prioreset.c
+prioreset_la_LIBADD = $(top_builddir)/lib/librpm.la $(top_builddir)/rpmio/librpmio.la
+plugins_LTLIBRARIES += prioreset.la
+
+syslog_la_SOURCES = syslog.c
+syslog_la_LIBADD = $(top_builddir)/lib/librpm.la $(top_builddir)/rpmio/librpmio.la
+plugins_LTLIBRARIES += syslog.la
 
-plugins_LTLIBRARIES += sepolicy.la
+if IMA
+ima_la_sources = ima.c
+ima_la_LIBADD = $(top_builddir)/lib/librpm.la $(top_builddir)/rpmio/librpmio.la
+plugins_LTLIBRARIES += ima.la
 endif
 
 if MSM
diff --git a/plugins/exec.c b/plugins/exec.c
deleted file mode 100644 (file)
index 49a4cae..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "plugin.h"
-
-#include <sys/wait.h>
-
-static char * options;
-static char * name;
-
-rpmPluginHook PLUGIN_HOOKS = \
-       PLUGINHOOK_INIT | \
-       PLUGINHOOK_CLEANUP | \
-       PLUGINHOOK_COLL_POST_ANY;
-
-rpmRC PLUGINHOOK_INIT_FUNC(rpmts ts, const char *name, const char *opts)
-{
-    options = strdup(opts);
-    name = strdup(name);
-    return RPMRC_OK;
-}
-
-rpmRC PLUGINHOOK_CLEANUP_FUNC(void)
-{
-    options = _free(options);
-    name = _free(name);
-    return RPMRC_OK;
-}
-
-rpmRC PLUGINHOOK_COLL_POST_ANY_FUNC(void)
-{
-    rpmRC rc = RPMRC_FAIL;
-
-    if (rpmChrootIn()) {
-       goto exit;
-    }
-
-    if (options) {
-       int status = system(options);
-       if (!WIFEXITED(status) || WEXITSTATUS(status)) {
-           rpmlog(RPMLOG_ERR, "%s collection action failed\n", name);
-           goto exit;
-       }
-    }
-
-    rc = RPMRC_OK;
-
-  exit:
-    if (rpmChrootOut()) {
-       rc = RPMRC_FAIL;
-    }
-
-    return rc;
-}
diff --git a/plugins/ima.c b/plugins/ima.c
new file mode 100644 (file)
index 0000000..fe6d3ad
--- /dev/null
@@ -0,0 +1,80 @@
+#include "system.h"
+
+#include <errno.h>
+#include <sys/xattr.h>
+
+#include <rpm/rpmfi.h>
+#include <rpm/rpmte.h>
+#include <rpm/rpmfiles.h>
+#include <rpm/rpmtypes.h>
+#include <rpm/rpmlog.h>
+#include <rpmio/rpmstring.h>
+
+#include "lib/rpmfs.h"
+#include "lib/rpmplugin.h"
+#include "lib/rpmte_internal.h"
+
+#define XATTR_NAME_IMA "security.ima"
+
+/*
+ * check_zero_hdr: Check the signature for a zero header
+ *
+ * Check whether the given signature has a header with all zeros
+ *
+ * Returns -1 in case the signature is too short to compare
+ * (invalid signature), 0 in case the header is not only zeroes,
+ * and 1 if it is only zeroes.
+ */
+static int check_zero_hdr(const unsigned char *fsig, size_t siglen)
+{
+       /*
+        * Every signature has a header signature_v2_hdr as defined in
+        * Linux's (4.5) security/integrity/integtrity.h. The following
+        * 9 bytes represent this header in front of the signature.
+        */
+       static const uint8_t zero_hdr[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+       if (siglen < sizeof(zero_hdr))
+               return -1;
+       return (memcmp(fsig, &zero_hdr, sizeof(zero_hdr)) == 0);
+}
+
+static rpmRC ima_fsm_file_prepare(rpmPlugin plugin, rpmfi fi,
+                                  const char *path,
+                                  const char *dest,
+                                  mode_t file_mode, rpmFsmOp op)
+{
+       const unsigned char * fsig = NULL;
+       size_t len;
+       int rc = RPMRC_OK;
+       rpmFileAction action = XFO_ACTION(op);
+
+       /* Ignore skipped files and unowned directories */
+       if (XFA_SKIPPING(action) || (op & FAF_UNOWNED))
+           goto exit;
+
+       /* Don't install signatures for (mutable) files marked
+        * as config files unless they are also executable.
+        */
+       if (rpmfiFFlags(fi) & RPMFILE_CONFIG) {
+           if (!(rpmfiFMode(fi) & (S_IXUSR|S_IXGRP|S_IXOTH)))
+               goto exit;
+       }
+
+       fsig = rpmfiFSignature(fi, &len);
+       if (fsig && (check_zero_hdr(fsig, len) == 0)) {
+           if (lsetxattr(path, XATTR_NAME_IMA, fsig, len, 0) < 0) {
+               rpmlog(RPMLOG_ERR,
+                       "ima: could not apply signature on '%s': %s\n",
+                       path, strerror(errno));
+               rc = RPMRC_FAIL;
+           }
+       }
+
+exit:
+       return rc;
+}
+
+struct rpmPluginHooks_s ima_hooks = {
+       .fsm_file_prepare = ima_fsm_file_prepare,
+};
index 2290ac2711c73f1bd9396f19c674975c3d643cc5..4fe1c1a8ebf4b297ae913fde71e11a0c665b4a24 100644 (file)
 #include "rpmio/rpmlog.h"
 #include "rpm/rpmfileutil.h"
 
-#include "msm.h"
-
-/*hooks that are used in msm plugin */
-
-rpmPluginHook PLUGIN_HOOKS = \
-       PLUGINHOOK_INIT | \
-       PLUGINHOOK_CLEANUP | \
-        PLUGINHOOK_TSM_PRE | \
-        PLUGINHOOK_TSM_POST | \
-        PLUGINHOOK_PSM_PRE | \
-        PLUGINHOOK_PSM_POST | \
-        PLUGINHOOK_FSM_COMMIT | \
-        PLUGINHOOK_FSM_INIT | \
-        PLUGINHOOK_FILE_CONFLICT | \
-        PLUGINHOOK_VERIFY;
+#include "lib/rpmfs.h"
+#include "lib/rpmplugin.h"
+#include "lib/rpmte_internal.h"
 
+#include "msm.h"
 
 typedef struct fileconflict {
     const char *path;
@@ -213,7 +202,7 @@ static packagecontext *msmAddTE(rpmte te)
 /* Implementation of hooks */
 /* Hooks are listed in the call sequence inside rpm code */
 
-rpmRC PLUGINHOOK_INIT_FUNC(rpmts _ts, const char *name, const char *opts)
+rpmRC msm_plugin_init(rpmPlugin plugin, rpmts _ts)
 {
     ts = _ts;
 
@@ -263,7 +252,7 @@ rpmRC PLUGINHOOK_INIT_FUNC(rpmts _ts, const char *name, const char *opts)
     return RPMRC_OK;
 }
 
-rpmRC PLUGINHOOK_FILE_CONFLICT_FUNC(rpmts ts, char* path,
+rpmRC msm_plugin_fsm_file_conflict(rpmts ts, char* path,
                                      Header oldHeader, rpmfi oldFi, 
                                      int rpmrc)
 {
@@ -310,7 +299,7 @@ rpmRC PLUGINHOOK_FILE_CONFLICT_FUNC(rpmts ts, char* path,
     return rpmrc;
 }
 
-rpmRC PLUGINHOOK_TSM_PRE_FUNC(rpmts ts)
+rpmRC msm_plugin_tsm_pre(rpmPlugin plugin, rpmts ts)
 {
     if (!dsp) {
         rpmlog(RPMLOG_ERR, "Device security policy is missing. Unable to proceed\n");
@@ -320,7 +309,7 @@ rpmRC PLUGINHOOK_TSM_PRE_FUNC(rpmts ts)
     return RPMRC_OK;
 }
 
-rpmRC PLUGINHOOK_VERIFY_FUNC(rpmKeyring keyring, rpmtd sigtd, pgpDigParams sig, DIGEST_CTX ctx, int rpmrc)
+rpmRC msm_plugin_psm_verify(rpmKeyring keyring, int sigTagId, pgpDigParams sig, DIGEST_CTX ctx, int rpmrc)
 {
     current = NULL;
 
@@ -339,7 +328,7 @@ rpmRC PLUGINHOOK_VERIFY_FUNC(rpmKeyring keyring, rpmtd sigtd, pgpDigParams sig,
         rpmlog(RPMLOG_ERR, "Invalid signature, cannot search sw source\n");
         goto exit;
     }
-    if (sigtd->tag != RPMSIGTAG_RSA) {
+    if (sigTagId != RPMSIGTAG_RSA) {
         /* Not RSA, revert to unknown sw source. */
         rpmlog(RPMLOG_DEBUG, "not an RSA signature, cannot search sw source\n");
         goto exit;
@@ -366,7 +355,7 @@ rpmRC PLUGINHOOK_VERIFY_FUNC(rpmKeyring keyring, rpmtd sigtd, pgpDigParams sig,
     return rpmrc;
 }
 
-rpmRC PLUGINHOOK_PSM_PRE_FUNC(rpmte te)
+rpmRC msm_plugin_psm_pre(rpmPlugin plugin, rpmte te)
 {
     packagecontext *ctx = NULL;
     manifest_x *mfx = NULL;
@@ -595,7 +584,7 @@ rpmRC PLUGINHOOK_PSM_PRE_FUNC(rpmte te)
     return rc;
 }
 
-rpmRC PLUGINHOOK_FSM_INIT_FUNC(const char* path, mode_t mode)
+rpmRC msm_plugin_fsm_file_init(const char* path, mode_t mode)
 {
     /* Check if there any conflicts that prevent file being written to the disk */
 
@@ -617,12 +606,12 @@ rpmRC PLUGINHOOK_FSM_INIT_FUNC(const char* path, mode_t mode)
     msmFreePointer((void**)&dupPath);
 
     if (fc) {
-        //rpmlog(RPMLOG_DEBUG, "rpmteN(ctx->te) %s fc->pkg_name: %s\n", rpmteN(ctx->te), fc->pkg_name);
+        //rpmlog(RPMLOG_ERR, "rpmteN(ctx->te) %s fc->pkg_name: %s\n", rpmteN(ctx->te), fc->pkg_name);
         /* There is a conflict, see if we are not allowed to overwrite */
         if ((!current || 
-           (strcmp(current->rankkey, fc->sw_source->rankkey) >= 0)) &&
+           (strcmp(current->rankkey, fc->sw_source->rankkey) > 0)) &&
            (strcmp(rpmteN(ctx->te), fc->pkg_name))) {
-            rpmlog(RPMLOG_ERR, "%s has file conflict in %s from sw source %s\n",
+            rpmlog(RPMLOG_ERR, "%s has file security conflict in %s from sw source %s\n",
                    rpmteN(ctx->te), fc->path, fc->sw_source->name);
             return RPMRC_FAIL;
         }
@@ -635,7 +624,7 @@ rpmRC PLUGINHOOK_FSM_INIT_FUNC(const char* path, mode_t mode)
     return RPMRC_OK;
 }
 
-rpmRC PLUGINHOOK_FSM_COMMIT_FUNC(const char* path, mode_t mode, int type)
+rpmRC msm_plugin_fsm_file_commit(const char* path, mode_t mode, int type)
 {
     /* Setup xattrs for the given path */
 
@@ -673,7 +662,7 @@ rpmRC PLUGINHOOK_FSM_COMMIT_FUNC(const char* path, mode_t mode, int type)
     return RPMRC_OK;
 }
 
-rpmRC PLUGINHOOK_PSM_POST_FUNC(rpmte te, int rpmrc)
+rpmRC msm_plugin_psm_post(rpmPlugin plugin, rpmte te, int rpmrc)
 {
 
     packagecontext *ctx = context;
@@ -721,7 +710,7 @@ rpmRC PLUGINHOOK_PSM_POST_FUNC(rpmte te, int rpmrc)
     return rpmrc;
 }
 
-rpmRC PLUGINHOOK_TSM_POST_FUNC(rpmts ts, int rpmrc)
+rpmRC msm_plugin_tsm_post(rpmPlugin plugin, rpmts ts, int rpmrc)
 {
     packagecontext *ctx = context;
     msmFreeInternalHashes(); // free hash structures first
@@ -736,7 +725,7 @@ rpmRC PLUGINHOOK_TSM_POST_FUNC(rpmts ts, int rpmrc)
     return RPMRC_OK;
 }
 
-rpmRC PLUGINHOOK_CLEANUP_FUNC(void)
+rpmRC msm_plugin_cleanup(rpmPlugin plugin)
 {
 
     ts = NULL;
@@ -755,7 +744,26 @@ rpmRC PLUGINHOOK_CLEANUP_FUNC(void)
     }
 
     msmFreePointer((void**)&ownSmackLabel);
-    if (cookie) magic_close(cookie);
+    if (cookie)
+       {
+               magic_close(cookie);
+               cookie = NULL;
+       }
 
     return RPMRC_OK;
 }
+
+/*hooks that are used in msm plugin */
+struct rpmPluginHooks_s msm_hooks = {
+    .init =                                    msm_plugin_init,
+    .cleanup =                         msm_plugin_cleanup,
+    .tsm_pre =                         msm_plugin_tsm_pre,
+    .tsm_post =                                msm_plugin_tsm_post,
+    .psm_pre =                         msm_plugin_psm_pre,
+    .psm_post =                                msm_plugin_psm_post,
+       .psm_verify     =                       msm_plugin_psm_verify,
+       .fsm_file_init =                msm_plugin_fsm_file_init,
+       .fsm_file_commit =              msm_plugin_fsm_file_commit,
+       .fsm_file_conflict =    msm_plugin_fsm_file_conflict,
+};
+
index b7dc9190baaea59228e707a8ea9ac31ece841c89..66011b5b88ec06503cc789240d318d45caff0e23 100644 (file)
 #include <errno.h>
 #include <string.h>
 
-#include <sys/capability.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <pwd.h>
 #include <grp.h>
-#include <attr/xattr.h>
+#include <sys/xattr.h>
 #include <uthash.h>
 #include <magic.h>
 #include "rpmio/rpmlog.h"
@@ -179,9 +178,14 @@ static int msmSetSmackProvide(struct smack_accesses *smack_accesses, provide_x *
                 rpmlog(RPMLOG_DEBUG, "%s ac_domain %s provided in %s for %s\n", (ac_domain->allowed ? "allowing" : "not allowing"), 
                        ac_domain->name, ac_domain->sw_source->name, sw_source->name);
            }
+/* FIXME(José Bollo): I'm removing this call that has the effect to create rules having the
+sw_source->name as subject. I'm thinking that this behaviour is not expected.
+It is solving the bug https://bugs.tizen.org/jira/browse/PTREL-638.
+
            if (smack_accesses)
                ret = msmSetSmackRules(smack_accesses, provide->ac_domains, sw_source->name);
            else 
+*/
                 ret = 0;
        }
     }
@@ -843,7 +847,7 @@ static int msmCheckDomainRequestOrPermit(manifest_x *mfx, const char* domain)
         // FIXME: maybe this should be changed to a command-line option that
         // would be used during the image build?
         rpmlog(RPMLOG_WARNING, "The domain '%s' has not been yet defined by "\
-               "any package\n");
+               "any package\n", domain);
 
     //now check that this ac_domain can be requested
     if (mfx->defines) {
@@ -984,6 +988,7 @@ package_x *msmCreatePackage(const char *name, sw_source_x *sw_source, provide_x
 int msmSetupSmackRules(struct smack_accesses *smack_accesses, const char* package_name, int flag, int SmackEnabled)
 {
     int ret = 0;
+    int empty = 0;
     char * buffer = calloc(strlen(SMACK_RULES_PATH) + strlen(package_name) + 1, sizeof(char));
     if (!buffer) return -1;    
     strncpy(buffer, SMACK_RULES_PATH, strlen(SMACK_RULES_PATH));
@@ -1030,10 +1035,13 @@ int msmSetupSmackRules(struct smack_accesses *smack_accesses, const char* packag
        ret = smack_accesses_save(smack_accesses, fileno(fd));
        rpmlog(RPMLOG_DEBUG, "ret in installation %d\n", ret);
         if (!ret) {
+            empty = !ftell(fd);
             if (SmackEnabled == 1) 
                 ret = smack_accesses_apply(smack_accesses);
         }
        fclose(fd);
+        if (empty)
+            unlink(buffer); /* status not checked because it dont care */
     }    
     free(buffer);
     if (ret)
diff --git a/plugins/prioreset.c b/plugins/prioreset.c
new file mode 100644 (file)
index 0000000..d4f158a
--- /dev/null
@@ -0,0 +1,50 @@
+#include "system.h"
+
+#include <errno.h>
+#include <sys/resource.h>
+#if defined(__linux__)
+#include <sys/syscall.h>        /* For ionice */
+#endif
+
+#include <rpm/rpmlog.h>
+#include "lib/rpmplugin.h"
+
+#include "debug.h"
+
+/*
+ * In general we want scriptlets to run with the same priority as rpm
+ * itself. However on legacy SysV init systems, properties of the
+ * parent process can be inherited by the actual daemons on restart,
+ * so you can end up with eg nice/ionice'd mysql or httpd, ouch.
+ * This plugin resets the scriptlet process priorities after forking, and
+ * can be used to counter that effect. Should not be used with systemd
+ * because the it's not needed there, and the effect is counter-productive.
+ */
+
+static rpmRC prioreset_scriptlet_fork_post(rpmPlugin plugin, const char *path, int type)
+{
+        /* Call for resetting nice priority. */
+        int ret = setpriority(PRIO_PROCESS, 0, 0);
+        if (ret == -1) {
+            rpmlog(RPMLOG_WARNING, _("Unable to reset nice value: %s"),
+                strerror(errno));
+        }
+
+        /* Call for resetting IO priority. */
+        #if defined(__linux__)
+        /* Defined at include/linux/ioprio.h */
+        const int _IOPRIO_WHO_PROCESS = 1;
+        const int _IOPRIO_CLASS_NONE = 0;
+        ret = syscall(SYS_ioprio_set, _IOPRIO_WHO_PROCESS, 0, _IOPRIO_CLASS_NONE);
+        if (ret == -1) {
+            rpmlog(RPMLOG_WARNING, _("Unable to reset I/O priority: %s"),
+                strerror(errno));
+        }
+        #endif
+
+    return RPMRC_OK;
+}
+
+struct rpmPluginHooks_s prioreset_hooks = {
+    .scriptlet_fork_post = prioreset_scriptlet_fork_post,
+};
diff --git a/plugins/selinux.c b/plugins/selinux.c
new file mode 100644 (file)
index 0000000..3c9d9e4
--- /dev/null
@@ -0,0 +1,196 @@
+#include "system.h"
+
+#include <selinux/selinux.h>
+#include <selinux/context.h>
+#include <selinux/label.h>
+#include <selinux/avc.h>
+#include <rpm/rpmlog.h>
+#include <rpm/rpmts.h>
+#include "lib/rpmplugin.h"
+
+#include "debug.h"
+
+static struct selabel_handle * sehandle = NULL;
+
+static void sehandle_fini(int close_status)
+{
+    if (sehandle) {
+       selabel_close(sehandle);
+       sehandle = NULL;
+    }
+    if (close_status) {
+       selinux_status_close();
+    }
+}
+
+static rpmRC sehandle_init(int open_status)
+{
+    const char * path = selinux_file_context_path();
+    struct selinux_opt opts[] = {
+       { .type = SELABEL_OPT_PATH, .value = path }
+    };
+    
+    if (path == NULL)
+       return RPMRC_FAIL;
+
+    if (open_status) {
+       selinux_status_close();
+       if (selinux_status_open(0) < 0) {
+           return RPMRC_FAIL;
+       }
+    } else if (!selinux_status_updated() && sehandle) {
+       return RPMRC_OK;
+    }
+
+    if (sehandle)
+       sehandle_fini(0);
+
+    sehandle = selabel_open(SELABEL_CTX_FILE, opts, 1);
+
+    rpmlog(RPMLOG_DEBUG, "selabel_open: (%s) %s\n",
+          path, (sehandle == NULL ? strerror(errno) : ""));
+
+    return (sehandle != NULL) ? RPMRC_OK : RPMRC_FAIL;
+}
+
+static rpmRC selinux_tsm_pre(rpmPlugin plugin, rpmts ts)
+{
+    rpmRC rc = RPMRC_OK;
+
+    /* If SELinux isn't enabled on the system, dont mess with it */
+    if (!is_selinux_enabled()) {
+       rpmtsSetFlags(ts, (rpmtsFlags(ts) | RPMTRANS_FLAG_NOCONTEXTS));
+    }
+
+    /* If not enabled or a test-transaction, dont bother with labels */
+    if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_NOCONTEXTS|RPMTRANS_FLAG_TEST))) {
+       rc = sehandle_init(1);
+    }
+
+    return rc;
+}
+
+static rpmRC selinux_tsm_post(rpmPlugin plugin, rpmts ts, int rc)
+{
+    if (sehandle) {
+       sehandle_fini(1);
+    }
+    return RPMRC_OK;
+}
+
+static rpmRC selinux_psm_pre(rpmPlugin plugin, rpmte te)
+{
+    rpmRC rc = RPMRC_OK;
+
+    if (sehandle) {
+       /* reload the labels if policy changed underneath */
+       rc = sehandle_init(0);
+    }
+    return rc;
+}
+
+static rpmRC selinux_scriptlet_fork_post(rpmPlugin plugin,
+                                                const char *path, int type)
+{
+    rpmRC rc = RPMRC_FAIL;
+    int xx;
+#ifndef HAVE_SETEXECFILECON
+    security_context_t mycon = NULL, fcon = NULL, newcon = NULL;
+    context_t con = NULL;
+
+    if (sehandle == NULL)
+       return RPMRC_OK;
+
+    /* Figure the context to for next exec() */
+    if (getcon(&mycon) < 0)
+       goto exit;
+    if (getfilecon(path, &fcon) < 0)
+       goto exit;
+    if (security_compute_create(mycon, fcon, string_to_security_class("process"), &newcon) < 0)
+       goto exit;
+
+    if (rstreq(mycon, newcon)) {
+       /* No default transition, use rpm_script_t for now. */
+       const char * script_type = "rpm_script_t";
+
+       con = context_new(mycon);
+       if (!con)
+           goto exit;
+       if (context_type_set(con, script_type))
+           goto exit;
+       freecon(newcon);
+       newcon = xstrdup(context_str(con));
+    }
+
+    if ((xx = setexeccon(newcon)) == 0)
+       rc = RPMRC_OK;
+
+    if (rpmIsDebug()) {
+       rpmlog(RPMLOG_DEBUG, "setexeccon: (%s, %s) %s\n",
+              path, newcon, (xx < 0 ? strerror(errno) : ""));
+    }
+
+exit:
+    context_free(con);
+    freecon(newcon);
+    freecon(fcon);
+    freecon(mycon);
+
+#else
+    if (sehandle == NULL)
+       return RPMRC_OK;
+
+    if ((xx = setexecfilecon(path, "rpm_script_t") == 0))
+       rc = RPMRC_OK;
+
+    if (rpmIsDebug()) {
+       rpmlog(RPMLOG_DEBUG, "setexecfilecon: (%s) %s\n",
+              path, (xx < 0 ? strerror(errno) : ""));
+    }
+#endif
+    /* If selinux is not enforcing, we don't care either */
+    if (rc && security_getenforce() < 1)
+       rc = RPMRC_OK;
+
+    return rc;
+}
+
+static rpmRC selinux_fsm_file_prepare(rpmPlugin plugin, rpmfi fi,
+                                       const char *path, const char *dest,
+                                       mode_t file_mode, rpmFsmOp op)
+{
+    rpmRC rc = RPMRC_FAIL; /* assume failure */
+    rpmFileAction action = XFO_ACTION(op);
+
+    if (sehandle && !XFA_SKIPPING(action)) {
+       security_context_t scon = NULL;
+       if (selabel_lookup_raw(sehandle, &scon, dest, file_mode) == 0) {
+           int conrc = lsetfilecon(path, scon);
+
+           if (rpmIsDebug()) {
+               rpmlog(RPMLOG_DEBUG, "lsetfilecon: (%s, %s) %s\n",
+                      path, scon, (rc < 0 ? strerror(errno) : ""));
+           }
+
+           if (conrc == 0 || (conrc < 0 && errno == EOPNOTSUPP))
+               rc = RPMRC_OK;
+           freecon(scon);
+       } else {
+           /* No context for dest is not our headache */
+           if (errno == ENOENT)
+               rc = RPMRC_OK;
+       }
+    } else {
+       rc = RPMRC_OK;
+    }
+
+    return rc;
+}
+
+struct rpmPluginHooks_s selinux_hooks = {
+    .tsm_pre = selinux_tsm_pre,
+    .tsm_post = selinux_tsm_post,
+    .psm_pre = selinux_psm_pre,
+    .scriptlet_fork_post = selinux_scriptlet_fork_post,
+    .fsm_file_prepare = selinux_fsm_file_prepare,
+};
diff --git a/plugins/sepolicy.c b/plugins/sepolicy.c
deleted file mode 100644 (file)
index 86bf198..0000000
+++ /dev/null
@@ -1,655 +0,0 @@
-#include "plugin.h"
-
-#include <errno.h>
-#include <selinux/selinux.h>
-#include <semanage/semanage.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include <rpm/rpmpol.h>
-#include <rpm/rpmfileutil.h>
-#include <rpm/rpmmacro.h>
-#include <rpm/rpmbase64.h>
-
-#include "lib/rpmte_internal.h"
-#include "lib/rpmts_internal.h"        /* rpmtsSELabelFoo() */
-
-rpmPluginHook PLUGIN_HOOKS = \
-       PLUGINHOOK_INIT | \
-       PLUGINHOOK_CLEANUP | \
-       PLUGINHOOK_OPENTE | \
-       PLUGINHOOK_COLL_POST_ADD | \
-       PLUGINHOOK_COLL_PRE_REMOVE;
-
-typedef enum sepolAction {
-    SEPOL_ACTION_IGNORE,
-    SEPOL_ACTION_INSTALL,
-    SEPOL_ACTION_REMOVE
-} sepolAction;
-
-typedef struct sepol {
-    char *data;                        /*!< policy data */
-    char *name;                        /*!< policy names */
-    ARGV_t types;              /*!< policy types */
-    uint32_t flags;            /*!< policy flags */
-    sepolAction action;                /*!< install/remove/ignore */
-    struct sepol *next;                /*!< next in linked list */
-} sepol;
-
-typedef struct sepoltrans {
-    int execsemodule;          /*!< 0 = use libsemanage to install policy; non-zero = use semodule */
-    semanage_handle_t *sh;     /*!< handle to libsemanage, only used when execsemodule is zero */
-    char *semodulepath;                /*!< path to semodule binary */
-    ARGV_t semodargs;          /*!< argument list to pass to semodule, only used when execsemodule is non-zero */
-    ARGV_t filelist;           /*!< list of temporary files that have been written to disk during the transaction */
-    int changes;               /*!< number of changes made during the transaction */
-} sepoltrans;
-
-
-static char * name;
-static rpmts ts;
-
-static sepol * policiesHead;
-static sepol * policiesTail;
-
-
-static sepol *sepolNew(rpmte te);
-static sepol *sepolFree(sepol * pol);
-static int sepolHasType(const sepol * pol, const char *type);
-
-static rpmRC sepolPreparePolicies(sepol * pols, const char *policytype);
-static rpmRC sepolWritePolicy(const sepol * pol, char **path);
-static rpmRC sepolLoadPolicies(const sepol * pols);
-
-static sepoltrans *sepoltransNew(void);
-static sepoltrans *sepoltransFree(sepoltrans * pt);
-
-static rpmRC sepoltransInstall(sepoltrans * pt, const sepol * pol);
-static rpmRC sepoltransRemove(sepoltrans * pt, const sepol * pol);
-static rpmRC sepoltransCommit(sepoltrans * pt);
-
-
-static sepol *sepolNew(rpmte te)
-{
-    sepol *head = NULL;
-    sepol *ret = NULL;
-    sepolAction action;
-    Header h;
-    struct rpmtd_s policies, names, types, typesidx, flags;
-    int i, j;
-    int count;
-
-    rpmtdReset(&policies);
-    rpmtdReset(&names);
-    rpmtdReset(&types);
-    rpmtdReset(&typesidx);
-    rpmtdReset(&flags);
-
-    h = rpmteHeader(te);
-    if (!h) {
-       goto exit;
-    }
-
-    if (!headerIsEntry(h, RPMTAG_POLICIES)) {
-       goto exit;
-    }
-
-    if (!headerGet(h, RPMTAG_POLICIES, &policies, HEADERGET_MINMEM)) {
-       goto exit;
-    }
-
-    count = rpmtdCount(&policies);
-    if (count <= 0) {
-       goto exit;
-    }
-
-    if (!headerGet(h, RPMTAG_POLICYNAMES, &names, HEADERGET_MINMEM)
-       || rpmtdCount(&names) != count) {
-       goto exit;
-    }
-
-    if (!headerGet(h, RPMTAG_POLICYFLAGS, &flags, HEADERGET_MINMEM)
-       || rpmtdCount(&flags) != count) {
-       goto exit;
-    }
-
-    if (!headerGet(h, RPMTAG_POLICYTYPES, &types, HEADERGET_MINMEM)) {
-       goto exit;
-    }
-
-    if (!headerGet(h, RPMTAG_POLICYTYPESINDEXES, &typesidx, HEADERGET_MINMEM)
-       || rpmtdCount(&types) != rpmtdCount(&typesidx)) {
-       goto exit;
-    }
-
-    action = (rpmteType(te) == TR_ADDED) ? SEPOL_ACTION_INSTALL : SEPOL_ACTION_REMOVE;
-
-    for (i = 0; i < count; i++) {
-       sepol *pol = xcalloc(1, sizeof(*pol));
-       pol->next = head;
-       head = pol;
-
-       pol->data = xstrdup(rpmtdNextString(&policies));
-       pol->name = xstrdup(rpmtdNextString(&names));
-       pol->flags = *rpmtdNextUint32(&flags);
-       pol->action = action;
-
-       for (j = 0; j < rpmtdCount(&types); j++) {
-           uint32_t index = ((uint32_t *) typesidx.data)[j];
-           if (index < 0 || index >= count) {
-               goto exit;
-           }
-           if (index != i) {
-               continue;
-           }
-           argvAdd(&pol->types, rpmtdNextString(&types));
-       }
-       argvSort(pol->types, NULL);
-    }
-
-    ret = head;
-
-  exit:
-    headerFree(h);
-
-    rpmtdFreeData(&policies);
-    rpmtdFreeData(&names);
-    rpmtdFreeData(&types);
-    rpmtdFreeData(&typesidx);
-    rpmtdFreeData(&flags);
-
-    if (!ret) {
-       sepolFree(head);
-    }
-
-    return ret;
-}
-
-static sepol *sepolFree(sepol * pol)
-{
-    while (pol) {
-       sepol *next = pol->next;
-
-       pol->data = _free(pol->data);
-       pol->name = _free(pol->name);
-       pol->types = argvFree(pol->types);
-       pol->next = NULL;
-       _free(pol);
-
-       pol = next;
-    }
-
-    return NULL;
-}
-
-int sepolHasType(const sepol * pol, const char *type)
-{
-    if (!pol || !type) {
-       return 0;
-    }
-
-    return (argvSearch(pol->types, type, NULL) != NULL) ||
-          (argvSearch(pol->types, RPMPOL_TYPE_DEFAULT, NULL) != NULL);
-}
-
-static rpmRC sepolPreparePolicies(sepol * pols, const char *policytype)
-{
-    sepol *pol;
-    rpmRC rc = RPMRC_OK;
-
-    for (pol = pols; pol; pol = pol->next) {
-       if (!sepolHasType(pol, policytype)) {
-           pol->action = SEPOL_ACTION_IGNORE;
-       }
-    }
-
-    return rc;
-}
-
-static rpmRC sepolWritePolicy(const sepol * pol, char **path)
-{
-    char *tmppath = NULL;
-    FD_t fd = NULL;
-    char *policy = NULL;
-    size_t policylen;
-    rpmRC rc = RPMRC_FAIL;
-
-    if (rpmBase64Decode(pol->data, (void **) &policy, &policylen) != 0) {
-       rpmlog(RPMLOG_ERR, _("Failed to decode policy for %s\n"),
-              pol->name);
-       goto exit;
-    }
-
-    fd = rpmMkTempFile(NULL, &tmppath);
-    if (fd == NULL || Ferror(fd)) {
-       rpmlog(RPMLOG_ERR, _("Failed to create temporary file for %s: %s\n"),
-              pol->name, strerror(errno));
-       goto exit;
-    }
-
-    if (!Fwrite(policy, sizeof(*policy), policylen, fd)) {
-       rpmlog(RPMLOG_ERR, _("Failed to write %s policy to file %s\n"),
-              pol->name, tmppath);
-       goto exit;
-    }
-
-    *path = tmppath;
-    rc = RPMRC_OK;
-
-  exit:
-    if (fd)
-       Fclose(fd);
-    _free(policy);
-    if (rc != RPMRC_OK)
-       _free(tmppath);
-
-    return rc;
-}
-
-static rpmRC sepolLoadPolicies(const sepol * pols)
-{
-    const sepol *pol;
-    rpmRC rc = RPMRC_FAIL;
-    sepoltrans *pt = sepoltransNew();
-
-    if (pt == NULL)
-       goto exit;
-
-    for (pol = pols; pol; pol = pol->next) {
-       switch (pol->action) {
-       case SEPOL_ACTION_REMOVE:
-           rc = sepoltransRemove(pt, pol);
-           break;
-       case SEPOL_ACTION_INSTALL:
-           rc = sepoltransInstall(pt, pol);
-           break;
-       case SEPOL_ACTION_IGNORE:
-       default:
-           rc = RPMRC_OK;
-           break;
-       }
-
-       if (rc != RPMRC_OK)
-           goto exit;
-    }
-
-    rc = sepoltransCommit(pt);
-
-exit:
-    sepoltransFree(pt);
-
-    return rc;
-}
-
-static sepoltrans *sepoltransNew(void)
-{
-    sepoltrans *pt = xcalloc(1, sizeof(*pt));
-    pt->semodulepath = rpmExpand("%{__semodule}", NULL);
-    pt->execsemodule = (!rpmChrootDone() && access(pt->semodulepath, X_OK) == 0);
-    pt->changes = 0;
-
-    if (pt->execsemodule) {
-       argvAdd(&pt->semodargs, "semodule");
-    } else {
-       pt->sh = semanage_handle_create();
-       if (!pt->sh) {
-           rpmlog(RPMLOG_ERR, _("Failed to create semanage handle\n"));
-           goto err;
-       }
-       semanage_set_create_store(pt->sh, 1);
-       semanage_set_check_contexts(pt->sh, 0);
-       if (semanage_connect(pt->sh) < 0) {
-           rpmlog(RPMLOG_ERR, _("Failed to connect to policy handler\n"));
-           goto err;
-       }
-       if (semanage_begin_transaction(pt->sh) < 0) {
-           rpmlog(RPMLOG_ERR, _("Failed to begin policy transaction: %s\n"),
-                  errno ? strerror(errno) : "");
-           goto err;
-       }
-       semanage_set_reload(pt->sh, !rpmChrootDone());
-    }
-
-    return pt;
-
-  err:
-    if (pt->sh) {
-       if (semanage_is_connected(pt->sh)) {
-           semanage_disconnect(pt->sh);
-       }
-       semanage_handle_destroy(pt->sh);
-    }
-    free(pt);
-
-    return NULL;
-}
-
-static sepoltrans *sepoltransFree(sepoltrans * pt)
-{
-    ARGV_t file;
-
-    if (!pt) {
-       return NULL;
-    }
-
-    for (file = pt->filelist; file && *file; file++) {
-       if (unlink(*file) < 0) {
-           rpmlog(RPMLOG_WARNING, _("Failed to remove temporary policy file %s: %s\n"),
-                  *file, strerror(errno));
-       }
-    }
-    argvFree(pt->filelist);
-
-    if (pt->execsemodule) {
-       argvFree(pt->semodargs);
-    } else {
-       semanage_disconnect(pt->sh);
-       semanage_handle_destroy(pt->sh);
-    }
-
-    free(pt->semodulepath);
-    memset(pt, 0, sizeof(*pt)); /* trash and burn */
-
-    free(pt);
-    return NULL;
-}
-
-static rpmRC sepoltransInstall(sepoltrans * pt, const sepol * pol)
-{
-    rpmRC rc = RPMRC_OK;
-    char *path = NULL;
-
-    rc = sepolWritePolicy(pol, &path);
-    if (rc != RPMRC_OK) {
-       return rc;
-    }
-    argvAdd(&pt->filelist, path);
-
-    if (pt->execsemodule) {
-       const char *flag = (pol->flags & RPMPOL_FLAG_BASE) ? "-b" : "-i";
-       if (argvAdd(&pt->semodargs, flag) < 0 || argvAdd(&pt->semodargs, path) < 0) {
-           rc = RPMRC_FAIL;
-       }
-    } else {
-       if (pol->flags & RPMPOL_FLAG_BASE) {
-           if (semanage_module_install_base_file(pt->sh, path) < 0) {
-               rc = RPMRC_FAIL;
-           }
-       } else {
-           if (semanage_module_install_file(pt->sh, path) < 0) {
-               rc = RPMRC_FAIL;
-           }
-       }
-    }
-
-    if (rc != RPMRC_OK) {
-       rpmlog(RPMLOG_ERR, _("Failed to install policy module: %s (%s)\n"),
-              pol->name, path);
-    } else {
-       pt->changes++;
-    }
-
-    _free(path);
-
-    return rc;
-}
-
-static rpmRC sepoltransRemove(sepoltrans * pt, const sepol * pol)
-{
-    rpmRC rc = RPMRC_OK;
-
-    if (pol->flags & RPMPOL_FLAG_BASE) {
-       return RPMRC_FAIL;
-    }
-
-    if (pt->execsemodule) {
-       if (argvAdd(&pt->semodargs, "-r") < 0 || argvAdd(&pt->semodargs, pol->name) < 0) {
-           rc = RPMRC_FAIL;
-       }
-    } else {
-       if (semanage_module_remove(pt->sh, (char *) pol->name) < 0) {
-           rc = RPMRC_FAIL;
-       }
-    }
-
-    if (rc != RPMRC_OK) {
-       rpmlog(RPMLOG_ERR, _("Failed to remove policy module: %s\n"),
-              pol->name);
-    } else {
-       pt->changes++;
-    }
-
-    return rc;
-}
-
-static rpmRC sepoltransCommit(sepoltrans * pt)
-{
-    rpmRC rc = RPMRC_OK;
-
-    if (pt->changes == 0) {
-       return rc;
-    }
-
-    if (pt->execsemodule) {
-       int status;
-       pid_t pid = fork();
-       int fd;
-
-       switch (pid) {
-       case -1:
-           rpmlog(RPMLOG_ERR, _("Failed to fork process: %s\n"),
-                  strerror(errno));
-           rc = RPMRC_FAIL;
-           break;
-       case 0:
-           fd = open("/dev/null", O_RDWR);
-           dup2(fd, STDIN_FILENO);
-           dup2(fd, STDOUT_FILENO);
-           dup2(fd, STDERR_FILENO);
-           execv(pt->semodulepath, pt->semodargs);
-           rpmlog(RPMLOG_ERR, _("Failed to execute %s: %s\n"),
-                  pt->semodulepath, strerror(errno));
-           exit(1);
-       default:
-           waitpid(pid, &status, 0);
-           if (!WIFEXITED(status)) {
-               rpmlog(RPMLOG_ERR, _("%s terminated abnormally\n"),
-                      pt->semodulepath);
-               rc = RPMRC_FAIL;
-           } else if (WEXITSTATUS(status)) {
-               rpmlog(RPMLOG_ERR, _("%s failed with exit code %i\n"),
-                      pt->semodulepath, WEXITSTATUS(status));
-               rc = RPMRC_FAIL;
-           }
-       }
-    } else {
-       if (semanage_commit(pt->sh) < 0) {
-           rpmlog(RPMLOG_ERR, _("Failed to commit policy changes\n"));
-           rc = RPMRC_FAIL;
-       }
-    }
-
-    return rc;
-}
-
-static rpmRC sepolRelabelFiles(void)
-{
-    rpmRC rc = RPMRC_OK;
-    pid_t pid;
-    int fd;
-    int status;
-    char *restoreconPath = rpmExpand("%{__restorecon}", NULL);
-
-    if (!restoreconPath) {
-       rpmlog(RPMLOG_ERR, _("Failed to expand restorecon path"));
-       return RPMRC_FAIL;
-    }
-
-    /* execute restorecon -R / */
-    pid = fork();
-    switch (pid) {
-    case -1:
-       rpmlog(RPMLOG_ERR, _("Failed to fork process: %s\n"),
-              strerror(errno));
-       rc = RPMRC_FAIL;
-       break;
-    case 0:
-       fd = open("/dev/null", O_RDWR);
-       dup2(fd, STDIN_FILENO);
-       dup2(fd, STDOUT_FILENO);
-       dup2(fd, STDERR_FILENO);
-       execl(restoreconPath, "restorecon", "-R", "/", NULL);
-       rpmlog(RPMLOG_ERR, _("Failed to execute %s: %s\n"), restoreconPath,
-              strerror(errno));
-       exit(1);
-    default:
-       waitpid(pid, &status, 0);
-       if (!WIFEXITED(status)) {
-           rpmlog(RPMLOG_ERR, _("%s terminated abnormally\n"),
-                  restoreconPath);
-           rc = RPMRC_FAIL;
-       } else if (WEXITSTATUS(status)) {
-           rpmlog(RPMLOG_ERR, _("%s failed with exit code %i\n"),
-                  restoreconPath, WEXITSTATUS(status));
-           rc = RPMRC_FAIL;
-       }
-    }
-
-    _free(restoreconPath);
-
-    return rc;
-}
-
-static rpmRC sepolGo(void)
-{
-    semanage_handle_t *sh;
-    int existingPolicy;
-    char *policytype = NULL;
-    rpmRC rc = RPMRC_FAIL;
-
-    static int performed = 0;
-    if (performed) {
-       return RPMRC_OK;
-    }
-    performed = 1;
-
-    if (rpmChrootIn()) {
-       goto exit;
-    }
-
-    if (selinux_getpolicytype(&policytype) < 0) {
-       goto exit;
-    }
-
-    sepolPreparePolicies(policiesHead, policytype);
-
-    /* determine if this is the first time installing policy */
-    sh = semanage_handle_create();
-    existingPolicy = (semanage_is_managed(sh) == 1);
-    semanage_handle_destroy(sh);
-
-    /* now load the policies */
-    rc = sepolLoadPolicies(policiesHead);
-
-    /* re-init selinux and re-read the files contexts, since things may have changed */
-    selinux_reset_config();
-    if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_NOCONTEXTS)) {
-       if (rpmtsSELabelInit(ts, 0) == RPMRC_OK) {
-           /* if this was the first time installing policy, every package before
-            * policy was installed will be mislabeled (e.g. semodule). So, relabel
-            * the entire filesystem if this is the case */
-           if (!existingPolicy) {
-               if (sepolRelabelFiles() != RPMRC_OK) {
-                   rpmlog(RPMLOG_WARNING, _("Failed to relabel filesystem. Files may be mislabeled\n"));
-               }
-           }
-       } else {
-           rpmlog(RPMLOG_WARNING, _("Failed to reload file contexts. Files may be mislabeled\n"));
-       }
-    }
-
-  exit:
-    if (rpmChrootOut()) {
-       rc = RPMRC_FAIL;
-    }
-
-    _free(policytype);
-
-    return rc;
-}
-
-static rpmRC sepolAddTE(rpmte te)
-{
-    sepol *pol;
-    sepol *polTail;
-
-    if (!rpmteHasCollection(te, name)) {
-       return RPMRC_OK;
-    }
-
-    pol = sepolNew(te);
-    if (!pol) {
-       /* something's wrong with the policy information, either missing or
-        * corrupt. abort */
-       rpmlog(RPMLOG_ERR, _("Failed to extract policy from %s\n"),
-              rpmteNEVRA(te));
-       return RPMRC_FAIL;
-    }
-
-    /* find the tail of pol */
-    polTail = pol;
-    while (polTail->next) {
-       polTail = polTail->next;
-    }
-
-    /* add the new policy to the list */
-    if (!policiesHead) {
-       policiesHead = pol;
-       policiesTail = polTail;
-    } else {
-       if (rpmteType(te) == TR_ADDED) {
-           /* add to the end of the list */
-           policiesTail->next = pol;
-           policiesTail = polTail;
-       } else {
-           /* add to the beginning of the list */
-           polTail->next = policiesHead;
-           policiesHead = pol;
-       }
-    }
-
-    return RPMRC_OK;
-}
-
-
-
-rpmRC PLUGINHOOK_INIT_FUNC(rpmts _ts, const char *_name, const char *_opts)
-{
-    ts = _ts;
-    name = strdup(_name);
-    policiesHead = policiesTail = NULL;
-    return RPMRC_OK;
-}
-
-rpmRC PLUGINHOOK_CLEANUP_FUNC(void)
-{
-    _free(name);
-    ts = NULL;
-    policiesHead = policiesTail = sepolFree(policiesHead);
-    return RPMRC_OK;
-}
-
-rpmRC PLUGINHOOK_OPENTE_FUNC(rpmte te)
-{
-    return sepolAddTE(te);
-}
-
-rpmRC PLUGINHOOK_COLL_POST_ADD_FUNC(void)
-{
-    return sepolGo();
-}
-
-rpmRC PLUGINHOOK_COLL_PRE_REMOVE_FUNC(void)
-{
-    return sepolGo();
-}
diff --git a/plugins/syslog.c b/plugins/syslog.c
new file mode 100644 (file)
index 0000000..5f22f98
--- /dev/null
@@ -0,0 +1,116 @@
+#include "system.h"
+
+#include <syslog.h>
+
+#include <rpm/rpmts.h>
+#include "lib/rpmplugin.h"
+
+struct logstat {
+    int logging;
+    unsigned int scriptfail;
+    unsigned int pkgfail;
+};
+
+static rpmRC syslog_init(rpmPlugin plugin, rpmts ts)
+{
+    /* XXX make this configurable? */
+    const char * log_ident = "[RPM]";
+    struct logstat * state = rcalloc(1, sizeof(*state));
+
+    rpmPluginSetData(plugin, state);
+    openlog(log_ident, (LOG_PID), LOG_USER);
+    return RPMRC_OK;
+}
+
+static void syslog_cleanup(rpmPlugin plugin)
+{
+    struct logstat * state = rpmPluginGetData(plugin);
+    free(state);
+    closelog();
+}
+
+static rpmRC syslog_tsm_pre(rpmPlugin plugin, rpmts ts)
+{
+    struct logstat * state = rpmPluginGetData(plugin);
+    
+    /* Reset counters */
+    state->scriptfail = 0;
+    state->pkgfail = 0;
+
+    /* Assume we are logging but... */
+    state->logging = 1;
+
+    /* ...don't log test transactions */
+    if (rpmtsFlags(ts) & (RPMTRANS_FLAG_TEST|RPMTRANS_FLAG_BUILD_PROBS))
+       state->logging = 0;
+
+    /* ...don't log chroot transactions */
+    if (!rstreq(rpmtsRootDir(ts), "/"))
+       state->logging = 0;
+
+    if (state->logging) {
+       syslog(LOG_NOTICE, "Transaction ID %x started", rpmtsGetTid(ts));
+    }
+
+    return RPMRC_OK;
+}
+
+static rpmRC syslog_tsm_post(rpmPlugin plugin, rpmts ts, int res)
+{
+    struct logstat * state = rpmPluginGetData(plugin);
+
+    if (state->logging) {
+       if (state->pkgfail || state->scriptfail) {
+           syslog(LOG_WARNING, "%u elements failed, %u scripts failed",
+                  state->pkgfail, state->scriptfail);
+       }
+       syslog(LOG_NOTICE, "Transaction ID %x finished: %d",
+               rpmtsGetTid(ts), res);
+    }
+
+    state->logging = 0;
+    return RPMRC_OK;
+}
+
+static rpmRC syslog_psm_post(rpmPlugin plugin, rpmte te, int res)
+{
+    struct logstat * state = rpmPluginGetData(plugin);
+
+    if (state->logging) {
+       int lvl = LOG_NOTICE;
+       const char *op = (rpmteType(te) == TR_ADDED) ? "install" : "erase";
+       const char *outcome = "success";
+       /* XXX: Permit configurable header queryformat? */
+       const char *pkg = rpmteNEVRA(te);
+
+       if (res != RPMRC_OK) {
+           lvl = LOG_WARNING;
+           outcome = "failure";
+           state->pkgfail++;
+       }
+
+       syslog(lvl, "%s %s: %s", op, pkg, outcome);
+    }
+    return RPMRC_OK;
+}
+
+static rpmRC syslog_scriptlet_post(rpmPlugin plugin,
+                                       const char *s_name, int type, int res)
+{
+    struct logstat * state = rpmPluginGetData(plugin);
+
+    if (state->logging && res) {
+       syslog(LOG_WARNING, "scriptlet %s failure: %d\n", s_name, res);
+       state->scriptfail++;
+    }
+    return RPMRC_OK;
+}
+
+struct rpmPluginHooks_s syslog_hooks = {
+    .init = syslog_init,
+    .cleanup = syslog_cleanup,
+    .tsm_pre = syslog_tsm_pre,
+    .tsm_post = syslog_tsm_post,
+    .psm_post = syslog_psm_post,
+    .scriptlet_post = syslog_scriptlet_post,
+};
diff --git a/plugins/systemd_inhibit.c b/plugins/systemd_inhibit.c
new file mode 100644 (file)
index 0000000..e2cbcff
--- /dev/null
@@ -0,0 +1,111 @@
+#include "system.h"
+
+#include <dbus/dbus.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <rpm/rpmlog.h>
+#include <rpm/rpmts.h>
+#include "lib/rpmplugin.h"
+
+static int lock_fd = -1;
+
+static int inhibit(void)
+{
+    DBusError err;
+    DBusConnection *bus = NULL;
+    DBusMessage *msg = NULL;
+    DBusMessage *reply = NULL;
+    int fd = -1;
+
+    dbus_error_init(&err);
+    bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);
+
+    if (bus) {
+       msg = dbus_message_new_method_call("org.freedesktop.login1",
+                                          "/org/freedesktop/login1",
+                                          "org.freedesktop.login1.Manager",
+                                          "Inhibit");
+    }
+
+    if (msg) {
+       const char *what = "idle:sleep:shutdown";
+       const char *mode = "block";
+       const char *who = "RPM";
+       const char *reason = "Transaction running";
+
+       dbus_message_append_args(msg,
+                                DBUS_TYPE_STRING, &what,
+                                DBUS_TYPE_STRING, &who,
+                                DBUS_TYPE_STRING, &reason,
+                                DBUS_TYPE_STRING, &mode,
+                                DBUS_TYPE_INVALID);
+
+       reply = dbus_connection_send_with_reply_and_block(bus, msg, -1, &err);
+       dbus_message_unref(msg);
+    }
+
+    if (reply) {
+       dbus_message_get_args(reply, &err,
+                             DBUS_TYPE_UNIX_FD, &fd,
+                             DBUS_TYPE_INVALID);
+       dbus_message_unref(reply);
+    }
+    
+    if (dbus_error_is_set(&err)) {
+       rpmlog(RPMLOG_WARNING,
+              "Unable to get systemd shutdown inhibition lock: %s\n",
+               err.message);
+       dbus_error_free(&err);
+    }
+
+    if (bus) {
+       dbus_connection_close(bus);
+       dbus_connection_unref(bus);
+    }
+
+    return fd;
+}
+
+static rpmRC systemd_inhibit_init(rpmPlugin plugin, rpmts ts)
+{
+    struct stat st;
+
+    if (lstat("/run/systemd/system/", &st) == 0) {
+        if (S_ISDIR(st.st_mode)) {
+            return RPMRC_OK;
+        }
+    }
+
+    return RPMRC_NOTFOUND;
+}
+
+static rpmRC systemd_inhibit_tsm_pre(rpmPlugin plugin, rpmts ts)
+{
+    if (rpmtsFlags(ts) & (RPMTRANS_FLAG_TEST|RPMTRANS_FLAG_BUILD_PROBS))
+       return RPMRC_OK;
+
+    lock_fd = inhibit();
+
+    if (lock_fd >= 0) {
+       rpmlog(RPMLOG_DEBUG, "System shutdown blocked (fd %d)\n", lock_fd);
+    }
+
+    return RPMRC_OK;
+}
+
+static rpmRC systemd_inhibit_tsm_post(rpmPlugin plugin, rpmts ts, int res)
+{
+    if (lock_fd >= 0) {
+       close(lock_fd);
+       lock_fd = -1;
+       rpmlog(RPMLOG_DEBUG, "System shutdown unblocked\n");
+    }
+    return RPMRC_OK;
+}
+
+struct rpmPluginHooks_s systemd_inhibit_hooks = {
+    .init = systemd_inhibit_init,
+    .tsm_pre = systemd_inhibit_tsm_pre,
+    .tsm_post = systemd_inhibit_tsm_post,
+};
index 819b3f6eed07e816e0d7df58e690f9b07c38226b..9bd9900c418d517519d6f064625e9a7c3e108708 100644 (file)
@@ -1 +1 @@
-br ca cs da de el es eo fi fr is it ja ko ms nb nl pl pt pt_BR ru sk sl sr sr@latin sv te tr uk zh_CN zh_TW
+ar br ca cmn cs da de el eo es fi fr id is it ja ko ms nb nl pl pt pt_BR ru sk sl sr sr@latin sv te tr uk vi zh_CN zh_TW
index 4eee2648724beac2639a694d7b91aa04ac9e720c..b6f982622128b5b7a05b2efcaac5bc1f84c79cd3 100644 (file)
@@ -1,13 +1,11 @@
 # List of files which contain translatable strings.
-
-# Package source files
-
 cliutils.c
+rpm2archive.c
 rpm2cpio.c
-rpmqv.c
 rpmbuild.c
 rpmdb.c
 rpmkeys.c
+rpmqv.c
 rpmsign.c
 rpmspec.c
 build/build.c
@@ -29,11 +27,15 @@ build/policies.c
 build/reqprov.c
 build/rpmfc.c
 build/spec.c
+lib/backend/db3.c
+lib/backend/dbi.c
 lib/cpio.c
 lib/depends.c
 lib/formats.c
+lib/fprint.c
 lib/fsm.c
-lib/legacy.c
+lib/header.c
+lib/headerfmt.c
 lib/manifest.c
 lib/order.c
 lib/package.c
@@ -42,9 +44,11 @@ lib/poptI.c
 lib/poptQV.c
 lib/psm.c
 lib/query.c
+lib/relocation.c
 lib/rpmal.c
 lib/rpmchecksig.c
 lib/rpmchroot.c
+lib/rpmdb.c
 lib/rpmds.c
 lib/rpmfi.c
 lib/rpmgi.c
@@ -60,34 +64,33 @@ lib/rpmtd.c
 lib/rpmte.c
 lib/rpmts.c
 lib/rpmvercmp.c
+lib/rpmvs.c
 lib/signature.c
-lib/transaction.c
-lib/verify.c
-lib/fprint.c
-lib/header.c
-lib/headerfmt.c
-lib/merge.c
-lib/rpmdb.c
 lib/tagexts.c
 lib/tagname.c
-lib/backend/db3.c
-lib/backend/dbconfig.c
-plugins/exec.c
-plugins/sepolicy.c
+lib/transaction.c
+lib/verify.c
+plugins/ima.c
+plugins/prioreset.c
+plugins/selinux.c
+plugins/syslog.c
+plugins/systemd_inhibit.c
 python/rpmts-py.c
 rpmio/argv.c
 rpmio/digest.c
+rpmio/digest_nss.c
 rpmio/macro.c
 rpmio/rpmfileutil.c
-rpmio/rpmlua.c
 rpmio/rpmio.c
 rpmio/rpmlog.c
+rpmio/rpmlua.c
 rpmio/rpmmalloc.c
 rpmio/rpmpgp.c
-rpmio/rpmstring.c
 rpmio/rpmsq.c
+rpmio/rpmstring.c
 rpmio/rpmsw.c
 rpmio/url.c
 sign/rpmgensig.c
+sign/rpmsignfiles.c
 tools/rpmdeps.c
 tools/rpmgraph.c
diff --git a/po/ar.po b/po/ar.po
new file mode 100644 (file)
index 0000000..15b040a
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,3930 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Mosaab Alzoubi <moceap@hotmail.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: RPM\n"
+"Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: Arabic (http://www.transifex.com/rpm-team/rpm/language/ar/)\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+#: cliutils.c:21 lib/poptI.c:29
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
+
+#: cliutils.c:27 lib/poptALL.c:56
+#, c-format
+msgid "RPM version %s\n"
+msgstr "إصدارة RPM %s\n"
+
+#: cliutils.c:32
+#, c-format
+msgid "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
+msgstr "الحقوق محفوظة 1998-2002 - شركة ريدهات.\n"
+
+#: cliutils.c:33
+#, c-format
+msgid ""
+"This program may be freely redistributed under the terms of the GNU GPL\n"
+msgstr ""
+"يُمكن إعادة نشر هذا البرنامج بحريّة تحت بنود رخصة النّشر العمومية من غنّو\n"
+
+#: cliutils.c:53
+#, c-format
+msgid "creating a pipe for --pipe failed: %m\n"
+msgstr "فشل إنشاء عبّارة بالمُعطى --pipe: %m\n"
+
+#: cliutils.c:62
+#, c-format
+msgid "exec failed\n"
+msgstr "فشل التّنفيذ\n"
+
+#: rpm2archive.c:91 rpm2cpio.c:68
+#, c-format
+msgid "argument is not an RPM package\n"
+msgstr "لا تدل المُدخلات على حزمة RPM\n"
+
+#: rpm2archive.c:96 rpm2cpio.c:73
+#, c-format
+msgid "error reading header from package\n"
+msgstr "خطأ أثناء قراءة ترويسة الحزمة\n"
+
+#: rpm2archive.c:111 rpm2cpio.c:88
+#, c-format
+msgid "cannot re-open payload: %s\n"
+msgstr ""
+
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
+msgstr ""
+
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
+msgstr ""
+
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
+msgstr ""
+
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
+msgstr ""
+
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
+msgstr ""
+
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
+msgstr ""
+
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
+msgstr ""
+
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
+msgstr ""
+
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
+msgstr ""
+
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr ""
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <tarball>"
+msgstr ""
+
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
+msgid "<tarball>"
+msgstr ""
+
+#: rpmbuild.c:186
+msgid "build through %build (%prep, then compile) from <tarball>"
+msgstr ""
+
+#: rpmbuild.c:189
+msgid "build through %install (%prep, %build, then install) from <tarball>"
+msgstr ""
+
+#: rpmbuild.c:192
+#, c-format
+msgid "verify %files section from <tarball>"
+msgstr ""
+
+#: rpmbuild.c:195
+msgid "build source and binary packages from <tarball>"
+msgstr ""
+
+#: rpmbuild.c:198
+msgid "build binary package only from <tarball>"
+msgstr ""
+
+#: rpmbuild.c:201
+msgid "build source package only from <tarball>"
+msgstr ""
+
+#: rpmbuild.c:205
+msgid "build binary package from <source package>"
+msgstr ""
+
+#: rpmbuild.c:212
+msgid "override build root"
+msgstr ""
+
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
+msgid "remove build tree when done"
+msgstr ""
+
+#: rpmbuild.c:218
+msgid "ignore ExcludeArch: directives from spec file"
+msgstr ""
+
+#: rpmbuild.c:220
+msgid "debug file state machine"
+msgstr ""
+
+#: rpmbuild.c:222
+msgid "do not execute any stages of the build"
+msgstr ""
+
+#: rpmbuild.c:224
+msgid "do not verify build dependencies"
+msgstr ""
+
+#: rpmbuild.c:226
+msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
+msgstr ""
+
+#: rpmbuild.c:230
+#, c-format
+msgid "do not execute %clean stage of the build"
+msgstr ""
+
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
+#, c-format
+msgid "do not execute %check stage of the build"
+msgstr ""
+
+#: rpmbuild.c:237
+msgid "do not accept i18N msgstr's from specfile"
+msgstr ""
+
+#: rpmbuild.c:239
+msgid "remove sources when done"
+msgstr "أزِل المصادر عند الانتهاء"
+
+#: rpmbuild.c:241
+msgid "remove specfile when done"
+msgstr "أزِل ملف المُحدّد عند الانتهاء"
+
+#: rpmbuild.c:243
+msgid "skip straight to specified stage (only for c,i)"
+msgstr ""
+
+#: rpmbuild.c:245
+msgid "override target platform"
+msgstr ""
+
+#: rpmbuild.c:262
+msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
+msgstr ""
+
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
+msgid "Failed build dependencies:\n"
+msgstr ""
+
+#: rpmbuild.c:300
+#, c-format
+msgid "Unable to open spec file %s: %s\n"
+msgstr ""
+
+#: rpmbuild.c:363
+#, c-format
+msgid "Failed to open tar pipe: %m\n"
+msgstr ""
+
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
+#, c-format
+msgid "Failed to read spec file from %s\n"
+msgstr ""
+
+#: rpmbuild.c:401
+#, c-format
+msgid "Failed to rename %s to %s: %m\n"
+msgstr ""
+
+#: rpmbuild.c:479
+#, c-format
+msgid "failed to stat %s: %m\n"
+msgstr ""
+
+#: rpmbuild.c:483
+#, c-format
+msgid "File %s is not a regular file.\n"
+msgstr ""
+
+#: rpmbuild.c:490
+#, c-format
+msgid "File %s does not appear to be a specfile.\n"
+msgstr ""
+
+#: rpmbuild.c:556
+#, c-format
+msgid "Building target platforms: %s\n"
+msgstr ""
+
+#: rpmbuild.c:564
+#, c-format
+msgid "Building for target %s\n"
+msgstr ""
+
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr ""
+
+#: rpmdb.c:21
+msgid "initialize database"
+msgstr "تهيئة قاعدة البيانات"
+
+#: rpmdb.c:23
+msgid "rebuild database inverted lists from installed package headers"
+msgstr ""
+
+#: rpmdb.c:26
+msgid "verify database files"
+msgstr "تحقّق من ملفات قاعدة البيانات"
+
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
+msgid "Database options:"
+msgstr "خيارات قاعدة البيانات:"
+
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr ""
+
+#: rpmkeys.c:20
+msgid "verify package signature(s)"
+msgstr "تحقّق من توقيعات الحزمة"
+
+#: rpmkeys.c:22
+msgid "import an armored public key"
+msgstr ""
+
+#: rpmkeys.c:24
+msgid "don't import, but tell if it would work or not"
+msgstr ""
+
+#: rpmkeys.c:27 rpmkeys.c:29
+msgid "list keys from RPM keyring"
+msgstr "أظهر قائمة المفاتيح من حلقة مفاتيح RPM"
+
+#: rpmkeys.c:36
+msgid "Keyring options:"
+msgstr "خيارات حلقة المفاتيح:"
+
+#: rpmkeys.c:64 rpmsign.c:161
+msgid "no arguments given"
+msgstr ""
+
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr ""
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr ""
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr ""
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr ""
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr ""
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr ""
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr ""
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr ""
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr ""
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr ""
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr ""
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr ""
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr ""
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr ""
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr ""
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr ""
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr "وقّع الحزم"
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr ""
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr "احذف توقيعات الحُزم"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "خيارات التّوقيع:"
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr ""
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr ""
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr ""
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr ""
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr ""
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr ""
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr "خيارات المُحدّد:"
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr ""
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr ""
+
+#: build/build.c:125
+#, c-format
+msgid "Unable to open stream: %s\n"
+msgstr ""
+
+#: build/build.c:158
+#, c-format
+msgid "Executing(%s): %s\n"
+msgstr "يجري تنفيذ(%s): %s\n"
+
+#: build/build.c:163
+#, c-format
+msgid "Exec of %s failed (%s): %s\n"
+msgstr "فشل تنفيذ %s (%s): %s\n"
+
+#: build/build.c:172
+#, c-format
+msgid "Error executing scriptlet %s (%s)\n"
+msgstr ""
+
+#: build/build.c:178
+#, c-format
+msgid "Bad exit status from %s (%s)\n"
+msgstr "نهاية غير سليمة في %s (%s)\n"
+
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
+msgid ""
+"\n"
+"\n"
+"RPM build errors:\n"
+msgstr ""
+"\n"
+"\n"
+"أخطاء بناء الحزمة:\n"
+
+#: build/expression.c:215
+msgid "syntax error while parsing ==\n"
+msgstr ""
+
+#: build/expression.c:245
+msgid "syntax error while parsing &&\n"
+msgstr ""
+
+#: build/expression.c:254
+msgid "syntax error while parsing ||\n"
+msgstr ""
+
+#: build/expression.c:304
+msgid "parse error in expression\n"
+msgstr ""
+
+#: build/expression.c:336
+msgid "unmatched (\n"
+msgstr ""
+
+#: build/expression.c:368
+msgid "- only on numbers\n"
+msgstr ""
+
+#: build/expression.c:384
+msgid "! only on numbers\n"
+msgstr ""
+
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
+msgid "types must match\n"
+msgstr ""
+
+#: build/expression.c:439
+msgid "* / not suported for strings\n"
+msgstr ""
+
+#: build/expression.c:490
+msgid "- not suported for strings\n"
+msgstr ""
+
+#: build/expression.c:637
+msgid "&& and || not suported for strings\n"
+msgstr ""
+
+#: build/expression.c:669
+msgid "syntax error in expression\n"
+msgstr ""
+
+#: build/files.c:343 build/files.c:524 build/files.c:743
+#, c-format
+msgid "Missing '(' in %s %s\n"
+msgstr ""
+
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
+#, c-format
+msgid "Missing ')' in %s(%s\n"
+msgstr ""
+
+#: build/files.c:378 build/files.c:684
+#, c-format
+msgid "Invalid %s token: %s\n"
+msgstr ""
+
+#: build/files.c:490
+#, c-format
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
+
+#: build/files.c:539
+#, c-format
+msgid "Non-white space follows %s(): %s\n"
+msgstr ""
+
+#: build/files.c:579
+#, c-format
+msgid "Bad syntax: %s(%s)\n"
+msgstr ""
+
+#: build/files.c:588
+#, c-format
+msgid "Bad mode spec: %s(%s)\n"
+msgstr ""
+
+#: build/files.c:600
+#, c-format
+msgid "Bad dirmode spec: %s(%s)\n"
+msgstr ""
+
+#: build/files.c:705
+#, c-format
+msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
+msgstr ""
+
+#: build/files.c:712
+#, c-format
+msgid "Duplicate locale %s in %%lang(%s)\n"
+msgstr ""
+
+#: build/files.c:827
+#, c-format
+msgid "Invalid capability: %s\n"
+msgstr ""
+
+#: build/files.c:837
+msgid "File capability support not built in\n"
+msgstr ""
+
+#: build/files.c:888
+#, c-format
+msgid "File must begin with \"/\": %s\n"
+msgstr ""
+
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
+#, c-format
+msgid "Unknown file digest algorithm %u, falling back to MD5\n"
+msgstr ""
+
+#: build/files.c:1074
+#, c-format
+msgid "File listed twice: %s\n"
+msgstr ""
+
+#: build/files.c:1196
+#, c-format
+msgid "reading symlink %s failed: %s\n"
+msgstr ""
+
+#: build/files.c:1204
+#, c-format
+msgid "Symlink points to BuildRoot: %s -> %s\n"
+msgstr ""
+
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
+#, c-format
+msgid "Directory not found: %s\n"
+msgstr ""
+
+#: build/files.c:1387 lib/rpminstall.c:449
+#, c-format
+msgid "File not found: %s\n"
+msgstr ""
+
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
+#, c-format
+msgid "%s: can't load unknown tag (%d).\n"
+msgstr ""
+
+#: build/files.c:1598
+#, c-format
+msgid "%s: public key read failed.\n"
+msgstr ""
+
+#: build/files.c:1602
+#, c-format
+msgid "%s: not an armored public key.\n"
+msgstr ""
+
+#: build/files.c:1611
+#, c-format
+msgid "%s: failed to encode\n"
+msgstr ""
+
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
+#, c-format
+msgid "File needs leading \"/\": %s\n"
+msgstr ""
+
+#: build/files.c:2122
+#, c-format
+msgid "%%dev glob not permitted: %s\n"
+msgstr ""
+
+#: build/files.c:2134
+#, c-format
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
+
+#: build/files.c:2136
+#, c-format
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
+
+#: build/files.c:2171
+#, c-format
+msgid "Could not open %%files file %s: %m\n"
+msgstr ""
+
+#: build/files.c:2182
+#, c-format
+msgid "line: %s\n"
+msgstr "السّطر: %s\n"
+
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
+#, c-format
+msgid "Error reading %%files file %s: %m\n"
+msgstr ""
+
+#: build/files.c:2223
+#, c-format
+msgid "illegal _docdir_fmt %s: %s\n"
+msgstr ""
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
+#, c-format
+msgid "Can't mix special %s with other forms: %s\n"
+msgstr ""
+
+#: build/files.c:2471
+#, c-format
+msgid "More than one file on a line: %s\n"
+msgstr ""
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
+#, c-format
+msgid "Bad file: %s: %s\n"
+msgstr ""
+
+#: build/files.c:2725
+#, c-format
+msgid "Checking for unpackaged file(s): %s\n"
+msgstr ""
+
+#: build/files.c:2738
+#, c-format
+msgid ""
+"Installed (but unpackaged) file(s) found:\n"
+"%s"
+msgstr ""
+
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
+#, c-format
+msgid "Processing files: %s\n"
+msgstr ""
+
+#: build/files.c:3124
+#, c-format
+msgid "Binaries arch (%d) not matching the package arch (%d).\n"
+msgstr ""
+
+#: build/files.c:3130
+msgid "Arch dependent binaries in noarch package\n"
+msgstr ""
+
+#: build/pack.c:91
+#, c-format
+msgid "create archive failed on file %s: %s\n"
+msgstr ""
+
+#: build/pack.c:94
+#, c-format
+msgid "create archive failed: %s\n"
+msgstr ""
+
+#: build/pack.c:121
+#, c-format
+msgid "Could not open %s file: %s\n"
+msgstr ""
+
+#: build/pack.c:138
+#, c-format
+msgid "%s: line: %s\n"
+msgstr "%s: السّطر: %s\n"
+
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
+
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
+
+#: build/pack.c:198
+#, c-format
+msgid "Could not canonicalize hostname: %s\n"
+msgstr ""
+
+#: build/pack.c:358
+#, c-format
+msgid "Unknown payload compression: %s\n"
+msgstr ""
+
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
+
+#: build/pack.c:434
+#, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr ""
+
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
+
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
+
+#: build/pack.c:520
+#, c-format
+msgid "Could not open %s: %s\n"
+msgstr "تعذّر فتح %s: %s\n"
+
+#: build/pack.c:527
+#, c-format
+msgid "Unable to write package: %s\n"
+msgstr "تعذّرت كتابة الحزمة: %s\n"
+
+#: build/pack.c:611
+#, c-format
+msgid "Wrote: %s\n"
+msgstr "تمت كتابة: %s\n"
+
+#: build/pack.c:630
+#, c-format
+msgid "Executing \"%s\":\n"
+msgstr "يجري تنفيذ \"%s\":\n"
+
+#: build/pack.c:633
+#, c-format
+msgid "Execution of \"%s\" failed.\n"
+msgstr ""
+
+#: build/pack.c:637
+#, c-format
+msgid "Package check \"%s\" failed.\n"
+msgstr ""
+
+#: build/pack.c:684
+#, c-format
+msgid "Could not generate output filename for package %s: %s\n"
+msgstr ""
+
+#: build/pack.c:701
+#, c-format
+msgid "cannot create %s: %s\n"
+msgstr ""
+
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
+#, c-format
+msgid "line %d: second %s\n"
+msgstr ""
+
+#: build/parseChangelog.c:185
+#, c-format
+msgid "bogus date in %%changelog: %s\n"
+msgstr ""
+
+#: build/parseChangelog.c:218
+#, c-format
+msgid "%%changelog entries must start with *\n"
+msgstr ""
+
+#: build/parseChangelog.c:226
+#, c-format
+msgid "incomplete %%changelog entry\n"
+msgstr ""
+
+#: build/parseChangelog.c:237
+#, c-format
+msgid "bad date in %%changelog: %s\n"
+msgstr ""
+
+#: build/parseChangelog.c:242
+#, c-format
+msgid "%%changelog not in descending chronological order\n"
+msgstr ""
+
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
+#, c-format
+msgid "missing name in %%changelog\n"
+msgstr ""
+
+#: build/parseChangelog.c:272
+#, c-format
+msgid "no description in %%changelog\n"
+msgstr ""
+
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
+#: build/parseDescription.c:32
+#, c-format
+msgid "line %d: Error parsing %%description: %s\n"
+msgstr ""
+
+#: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
+#: build/parseScript.c:321
+#, c-format
+msgid "line %d: Bad option %s: %s\n"
+msgstr ""
+
+#: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
+#: build/parseScript.c:332
+#, c-format
+msgid "line %d: Too many names: %s\n"
+msgstr ""
+
+#: build/parseFiles.c:33
+#, c-format
+msgid "line %d: Error parsing %%files: %s\n"
+msgstr ""
+
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
+#: build/parsePolicies.c:32
+#, c-format
+msgid "line %d: Error parsing %%policies: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:71
+#, c-format
+msgid "Error parsing tag field: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:164
+#, c-format
+msgid "line %d: Bad number: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:170
+#, c-format
+msgid "line %d: Bad no%s number: %u\n"
+msgstr ""
+
+#: build/parsePreamble.c:233
+#, c-format
+msgid "line %d: Bad %s number: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:247
+#, c-format
+msgid "%s %d defined multiple times\n"
+msgstr ""
+
+#: build/parsePreamble.c:292
+#, c-format
+msgid "Downloading %s to %s\n"
+msgstr "يجري تنزيل %s إلى %s\n"
+
+#: build/parsePreamble.c:295
+#, c-format
+msgid "Couldn't download %s\n"
+msgstr "تعذّر تنزيل %s\n"
+
+#: build/parsePreamble.c:439
+#, c-format
+msgid "Architecture is excluded: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:444
+#, c-format
+msgid "Architecture is not included: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:449
+#, c-format
+msgid "OS is excluded: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:454
+#, c-format
+msgid "OS is not included: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:480
+#, c-format
+msgid "%s field must be present in package: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:503
+#, c-format
+msgid "Duplicate %s entries in package: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:568
+#, c-format
+msgid "Unable to open icon %s: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:584
+#, c-format
+msgid "Unable to read icon %s: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:594
+#, c-format
+msgid "Unknown icon type: %s\n"
+msgstr "نوع الرّمز غير معروف: %s\n"
+
+#: build/parsePreamble.c:608
+#, c-format
+msgid "line %d: Tag takes single token only: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:616
+#, c-format
+msgid "line %d: %s in: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:618
+#, c-format
+msgid "%s in: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:637
+#, c-format
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
+#, c-format
+msgid "line %d: Malformed tag: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:745
+#, c-format
+msgid "line %d: Empty tag: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:806
+#, c-format
+msgid "line %d: Prefixes must not end with \"/\": %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:818
+#, c-format
+msgid "line %d: Docdir must begin with '/': %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:831
+#, c-format
+msgid "line %d: Epoch field must be an unsigned number: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:868
+#, c-format
+msgid "line %d: Bad %s: qualifiers: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:902
+#, c-format
+msgid "line %d: Bad BuildArchitecture format: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
+#, c-format
+msgid "line %d: Only noarch subpackages are supported: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:934
+#, c-format
+msgid "Internal error: Bogus tag %d\n"
+msgstr ""
+
+#: build/parsePreamble.c:1032
+#, c-format
+msgid "line %d: %s is deprecated: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:1093
+#, c-format
+msgid "Bad package specification: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
+
+#: build/parsePreamble.c:1144
+#, c-format
+msgid "line %d: Unknown tag: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:1176
+#, c-format
+msgid "%%{buildroot} couldn't be empty\n"
+msgstr ""
+
+#: build/parsePreamble.c:1180
+#, c-format
+msgid "%%{buildroot} can not be \"/\"\n"
+msgstr ""
+
+#: build/parsePrep.c:29
+#, c-format
+msgid "Bad source: %s: %s\n"
+msgstr "مصدر خاطئ: %s: %s\n"
+
+#: build/parsePrep.c:74
+#, c-format
+msgid "No patch number %u\n"
+msgstr ""
+
+#: build/parsePrep.c:76
+#, c-format
+msgid "%%patch without corresponding \"Patch:\" tag\n"
+msgstr ""
+
+#: build/parsePrep.c:164
+#, c-format
+msgid "No source number %u\n"
+msgstr ""
+
+#: build/parsePrep.c:166
+msgid "No \"Source:\" tag in the spec file\n"
+msgstr ""
+
+#: build/parsePrep.c:300
+#, c-format
+msgid "Error parsing %%setup: %s\n"
+msgstr ""
+
+#: build/parsePrep.c:311
+#, c-format
+msgid "line %d: Bad arg to %%setup: %s\n"
+msgstr ""
+
+#: build/parsePrep.c:326
+#, c-format
+msgid "line %d: Bad %%setup option %s: %s\n"
+msgstr ""
+
+#: build/parsePrep.c:495
+#, c-format
+msgid "%s: %s: %s\n"
+msgstr "%s: %s: %s\n"
+
+#: build/parsePrep.c:508
+#, c-format
+msgid "Invalid patch number %s: %s\n"
+msgstr ""
+
+#: build/parsePrep.c:535
+#, c-format
+msgid "line %d: second %%prep\n"
+msgstr ""
+
+#: build/parseReqs.c:52
+msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
+msgstr ""
+
+#: build/parseReqs.c:57
+msgid "Versioned file name not permitted"
+msgstr ""
+
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr ""
+
+#: build/parseReqs.c:232 build/parseReqs.c:307
+msgid "invalid dependency"
+msgstr ""
+
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
+#, c-format
+msgid "line %d: %s: %s\n"
+msgstr ""
+
+#: build/parseScript.c:263
+#, c-format
+msgid "line %d: triggers must have --: %s\n"
+msgstr ""
+
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
+#, c-format
+msgid "line %d: Error parsing %s: %s\n"
+msgstr ""
+
+#: build/parseScript.c:293
+#, c-format
+msgid "line %d: internal script must end with '>': %s\n"
+msgstr ""
+
+#: build/parseScript.c:299
+#, c-format
+msgid "line %d: script program must begin with '/': %s\n"
+msgstr ""
+
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
+#, c-format
+msgid "line %d: Second %s\n"
+msgstr ""
+
+#: build/parseScript.c:386
+#, c-format
+msgid "line %d: unsupported internal script: %s\n"
+msgstr ""
+
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
+#, c-format
+msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:190
+#, c-format
+msgid "line %d: %s\n"
+msgstr "السّطر %d: %s\n"
+
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
+#, c-format
+msgid "Unable to open %s: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:351
+#, c-format
+msgid "%s:%d: Argument expected for %s\n"
+msgstr ""
+
+#: build/parseSpec.c:373
+#, c-format
+msgid "line %d: Unclosed %%if\n"
+msgstr ""
+
+#: build/parseSpec.c:378
+#, c-format
+msgid "line %d: unclosed macro or bad line continuation\n"
+msgstr ""
+
+#: build/parseSpec.c:420
+#, c-format
+msgid "%s:%d: bad %%if condition\n"
+msgstr ""
+
+#: build/parseSpec.c:428
+#, c-format
+msgid "%s:%d: Got a %%else with no %%if\n"
+msgstr ""
+
+#: build/parseSpec.c:439
+#, c-format
+msgid "%s:%d: Got a %%endif with no %%if\n"
+msgstr ""
+
+#: build/parseSpec.c:460
+#, c-format
+msgid "%s:%d: malformed %%include statement\n"
+msgstr ""
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr ""
+
+#: build/parseSpec.c:912
+#, c-format
+msgid "Package has no %%description: %s\n"
+msgstr ""
+
+#: build/policies.c:87
+#, c-format
+msgid "Policy module '%s' duplicated with overlapping types\n"
+msgstr ""
+
+#: build/policies.c:93
+#, c-format
+msgid "Base modules '%s' and '%s' have overlapping types\n"
+msgstr ""
+
+#: build/policies.c:101
+msgid "Failed to get policies from header\n"
+msgstr ""
+
+#: build/policies.c:154
+#, c-format
+msgid "%%semodule requires a file path\n"
+msgstr ""
+
+#: build/policies.c:163
+#, c-format
+msgid "Failed to read  policy file: %s\n"
+msgstr ""
+
+#: build/policies.c:170
+#, c-format
+msgid "Failed to encode policy file: %s\n"
+msgstr ""
+
+#: build/policies.c:187
+#, c-format
+msgid "Failed to determine a policy name: %s\n"
+msgstr ""
+
+#: build/policies.c:199
+#, c-format
+msgid ""
+"'%s' type given with other types in %%semodule %s. Compacting types to "
+"'%s'.\n"
+msgstr ""
+
+#: build/policies.c:246
+#, c-format
+msgid "Error parsing %s: %s\n"
+msgstr ""
+
+#: build/policies.c:252
+#, c-format
+msgid "Expecting %%semodule tag: %s\n"
+msgstr ""
+
+#: build/policies.c:262
+#, c-format
+msgid "Missing module path in line: %s\n"
+msgstr ""
+
+#: build/policies.c:268
+#, c-format
+msgid "Too many arguments in line: %s\n"
+msgstr ""
+
+#: build/policies.c:307
+#, c-format
+msgid "Processing policies: %s\n"
+msgstr ""
+
+#: build/rpmfc.c:160
+#, c-format
+msgid "Ignoring invalid regex %s\n"
+msgstr ""
+
+#: build/rpmfc.c:266
+#, c-format
+msgid "Couldn't create pipe for %s: %m\n"
+msgstr ""
+
+#: build/rpmfc.c:289
+#, c-format
+msgid "Couldn't exec %s: %s\n"
+msgstr "تعذّر تنفيذ %s: %s\n"
+
+#: build/rpmfc.c:294 lib/rpmscript.c:320
+#, c-format
+msgid "Couldn't fork %s: %s\n"
+msgstr ""
+
+#: build/rpmfc.c:377
+#, c-format
+msgid "%s failed: %x\n"
+msgstr ""
+
+#: build/rpmfc.c:381
+#, c-format
+msgid "failed to write all data to %s: %s\n"
+msgstr ""
+
+#: build/rpmfc.c:1032
+msgid "Empty file classifier\n"
+msgstr ""
+
+#: build/rpmfc.c:1041
+msgid "No file attributes configured\n"
+msgstr ""
+
+#: build/rpmfc.c:1060
+#, c-format
+msgid "magic_open(0x%x) failed: %s\n"
+msgstr ""
+
+#: build/rpmfc.c:1066
+#, c-format
+msgid "magic_load failed: %s\n"
+msgstr ""
+
+#: build/rpmfc.c:1108
+#, c-format
+msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
+msgstr ""
+
+#: build/rpmfc.c:1309
+#, c-format
+msgid "Finding  %s: %s\n"
+msgstr "يجري إبجاد  %s: %s\n"
+
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
+#, c-format
+msgid "Failed to find %s:\n"
+msgstr "تعذّر إيجاد %s:\n"
+
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
+#, c-format
+msgid "query of specfile %s failed, can't parse\n"
+msgstr ""
+
+#: lib/backend/db3.c:97
+#, c-format
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr ""
+
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr ""
+
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr ""
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr ""
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "مُشتركة"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr ""
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
+#, c-format
+msgid "%s is a Delta RPM and cannot be directly installed\n"
+msgstr ""
+
+#: lib/depends.c:97
+#, c-format
+msgid "Unsupported payload (%s) in package %s\n"
+msgstr ""
+
+#: lib/depends.c:377
+#, c-format
+msgid "package %s was already added, skipping %s\n"
+msgstr ""
+
+#: lib/depends.c:378
+#, c-format
+msgid "package %s was already added, replacing with %s\n"
+msgstr ""
+
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
+msgid "(not a number)"
+msgstr "(ليس رقمًا)"
+
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr ""
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(نوع غير سليم)"
+
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
+msgstr "%c"
+
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
+msgstr "%a %b %d %Y"
+
+#: lib/formats.c:253
+msgid "(not base64)"
+msgstr ""
+
+#: lib/formats.c:313
+msgid "(invalid xml type)"
+msgstr ""
+
+#: lib/formats.c:358
+msgid "(not an OpenPGP signature)"
+msgstr ""
+
+#: lib/formats.c:369
+#, c-format
+msgid "Invalid date %u"
+msgstr ""
+
+#: lib/formats.c:417
+msgid "normal"
+msgstr "عادية"
+
+#: lib/formats.c:420 lib/verify.c:393
+msgid "replaced"
+msgstr "مُستبدلة"
+
+#: lib/formats.c:423 lib/verify.c:387
+msgid "not installed"
+msgstr "غير مثبّتة"
+
+#: lib/formats.c:426 lib/verify.c:389
+msgid "net shared"
+msgstr ""
+
+#: lib/formats.c:429 lib/verify.c:391
+msgid "wrong color"
+msgstr "لون خاطئ"
+
+#: lib/formats.c:432
+msgid "missing"
+msgstr "مفقودة"
+
+#: lib/formats.c:435
+msgid "(unknown)"
+msgstr "(غير معروفة)"
+
+#: lib/fsm.c:745
+#, c-format
+msgid "%s saved as %s\n"
+msgstr "%s حُفت كـ %s\n"
+
+#: lib/fsm.c:798
+#, c-format
+msgid "%s created as %s\n"
+msgstr "%s أُنشئت كـ %s\n"
+
+#: lib/fsm.c:1082
+#, c-format
+msgid "%s %s: remove failed: %s\n"
+msgstr ""
+
+#: lib/fsm.c:1083
+msgid "directory"
+msgstr "دليل"
+
+#: lib/fsm.c:1083
+msgid "file"
+msgstr "ملف"
+
+#: lib/header.c:285
+#, c-format
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
+
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
+
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
+
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
+
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
+
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
+
+#: lib/header.c:1841
+#, c-format
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
+
+#: lib/header.c:1876
+#, c-format
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr ""
+
+#: lib/header.c:1885
+#, c-format
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
+
+#: lib/header.c:1890
+#, c-format
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
+
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1909
+#, c-format
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
+
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
+
+#: lib/header.c:1949
+#, c-format
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr ""
+
+#: lib/headerfmt.c:362
+#, c-format
+msgid "missing { after %%"
+msgstr ""
+
+#: lib/headerfmt.c:384
+#, c-format
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr ""
+
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr ""
+
+#: lib/headerfmt.c:413
+#, c-format
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr ""
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr ""
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr ""
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr ""
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr ""
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr ""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr ""
+
+#: lib/poptALL.c:154
+#, c-format
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
+
+#: lib/poptALL.c:188
+msgid "predefine MACRO with value EXPR"
+msgstr ""
+
+#: lib/poptALL.c:189 lib/poptALL.c:192
+msgid "'MACRO EXPR'"
+msgstr ""
+
+#: lib/poptALL.c:191
+msgid "define MACRO with value EXPR"
+msgstr ""
+
+#: lib/poptALL.c:194
+msgid "undefine MACRO"
+msgstr ""
+
+#: lib/poptALL.c:195
+msgid "MACRO"
+msgstr ""
+
+#: lib/poptALL.c:197
+msgid "print macro expansion of EXPR"
+msgstr ""
+
+#: lib/poptALL.c:198
+msgid "'EXPR'"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
+msgid "read <FILE:...> instead of default file(s)"
+msgstr ""
+
+#: lib/poptALL.c:203 lib/poptALL.c:222
+msgid "<FILE:...>"
+msgstr ""
+
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
+msgid "don't verify package digest(s)"
+msgstr ""
+
+#: lib/poptALL.c:213
+msgid "don't verify database header(s) when retrieved"
+msgstr ""
+
+#: lib/poptALL.c:215
+msgid "don't verify package signature(s)"
+msgstr ""
+
+#: lib/poptALL.c:218
+msgid "send stdout to CMD"
+msgstr ""
+
+#: lib/poptALL.c:219
+msgid "CMD"
+msgstr ""
+
+#: lib/poptALL.c:224
+msgid "use ROOT as top level directory"
+msgstr ""
+
+#: lib/poptALL.c:225
+msgid "ROOT"
+msgstr ""
+
+#: lib/poptALL.c:227
+msgid "use database in DIRECTORY"
+msgstr ""
+
+#: lib/poptALL.c:228
+msgid "DIRECTORY"
+msgstr ""
+
+#: lib/poptALL.c:231
+msgid "display known query tags"
+msgstr ""
+
+#: lib/poptALL.c:233
+msgid "display final rpmrc and macro configuration"
+msgstr ""
+
+#: lib/poptALL.c:235
+msgid "provide less detailed output"
+msgstr ""
+
+#: lib/poptALL.c:237
+msgid "provide more detailed output"
+msgstr ""
+
+#: lib/poptALL.c:239
+msgid "print the version of rpm being used"
+msgstr ""
+
+#: lib/poptALL.c:245
+msgid "debug payload file state machine"
+msgstr ""
+
+#: lib/poptALL.c:251
+msgid "debug rpmio I/O"
+msgstr ""
+
+#: lib/poptALL.c:310
+#, c-format
+msgid "%s: option table misconfigured (%d)\n"
+msgstr ""
+
+#: lib/poptI.c:52
+msgid "exclude paths must begin with a /"
+msgstr ""
+
+#: lib/poptI.c:64
+msgid "relocations must begin with a /"
+msgstr ""
+
+#: lib/poptI.c:67
+msgid "relocations must contain a ="
+msgstr ""
+
+#: lib/poptI.c:70
+msgid "relocations must have a / following the ="
+msgstr ""
+
+#: lib/poptI.c:118
+msgid "install all files, even configurations which might otherwise be skipped"
+msgstr ""
+
+#: lib/poptI.c:122
+msgid ""
+"remove all packages which match <package> (normally an error is generated if "
+"<package> specified multiple packages)"
+msgstr ""
+
+#: lib/poptI.c:127
+msgid "relocate files in non-relocatable package"
+msgstr ""
+
+#: lib/poptI.c:131
+msgid "print dependency loops as warning"
+msgstr ""
+
+#: lib/poptI.c:135
+msgid "erase (uninstall) package"
+msgstr ""
+
+#: lib/poptI.c:135
+msgid "<package>+"
+msgstr "<package>+"
+
+#: lib/poptI.c:138 lib/poptI.c:175
+msgid "do not install configuration files"
+msgstr ""
+
+#: lib/poptI.c:141 lib/poptI.c:180
+msgid "do not install documentation"
+msgstr ""
+
+#: lib/poptI.c:143
+msgid "skip files with leading component <path> "
+msgstr ""
+
+#: lib/poptI.c:144
+msgid "<path>"
+msgstr "<path>"
+
+#: lib/poptI.c:147
+msgid "short hand for --replacepkgs --replacefiles"
+msgstr ""
+
+#: lib/poptI.c:151
+msgid "upgrade package(s) if already installed"
+msgstr ""
+
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
+msgid "<packagefile>+"
+msgstr "<packagefile>+"
+
+#: lib/poptI.c:154
+msgid "print hash marks as package installs (good with -v)"
+msgstr ""
+
+#: lib/poptI.c:157
+msgid "don't verify package architecture"
+msgstr ""
+
+#: lib/poptI.c:160
+msgid "don't verify package operating system"
+msgstr ""
+
+#: lib/poptI.c:163
+msgid "don't check disk space before installing"
+msgstr ""
+
+#: lib/poptI.c:165
+msgid "install documentation"
+msgstr ""
+
+#: lib/poptI.c:168
+msgid "install package(s)"
+msgstr "ثبّت الحزم"
+
+#: lib/poptI.c:171
+msgid "update the database, but do not modify the filesystem"
+msgstr ""
+
+#: lib/poptI.c:177
+msgid "do not verify package dependencies"
+msgstr ""
+
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
+msgid "don't verify digest of files"
+msgstr ""
+
+#: lib/poptI.c:185
+msgid "don't verify digest of files (obsolete)"
+msgstr ""
+
+#: lib/poptI.c:187
+msgid "don't install file security contexts"
+msgstr ""
+
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
+msgid "do not reorder package installation to satisfy dependencies"
+msgstr ""
+
+#: lib/poptI.c:197
+msgid "do not execute package scriptlet(s)"
+msgstr ""
+
+#: lib/poptI.c:201
+#, c-format
+msgid "do not execute %%pre scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:204
+#, c-format
+msgid "do not execute %%post scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:207
+#, c-format
+msgid "do not execute %%preun scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:210
+#, c-format
+msgid "do not execute %%postun scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
+msgid "do not execute any scriptlet(s) triggered by this package"
+msgstr ""
+
+#: lib/poptI.c:222
+#, c-format
+msgid "do not execute any %%triggerprein scriptlet(s)"
+msgstr ""
+
+#: lib/poptI.c:225
+#, c-format
+msgid "do not execute any %%triggerin scriptlet(s)"
+msgstr ""
+
+#: lib/poptI.c:228
+#, c-format
+msgid "do not execute any %%triggerun scriptlet(s)"
+msgstr ""
+
+#: lib/poptI.c:231
+#, c-format
+msgid "do not execute any %%triggerpostun scriptlet(s)"
+msgstr ""
+
+#: lib/poptI.c:235
+msgid ""
+"upgrade to an old version of the package (--force on upgrades does this "
+"automatically)"
+msgstr ""
+
+#: lib/poptI.c:239
+msgid "print percentages as package installs"
+msgstr ""
+
+#: lib/poptI.c:241
+msgid "relocate the package to <dir>, if relocatable"
+msgstr ""
+
+#: lib/poptI.c:242
+msgid "<dir>"
+msgstr "<dir>"
+
+#: lib/poptI.c:244
+msgid "relocate files from path <old> to <new>"
+msgstr ""
+
+#: lib/poptI.c:245
+msgid "<old>=<new>"
+msgstr "<old>=<new>"
+
+#: lib/poptI.c:248
+msgid "ignore file conflicts between packages"
+msgstr ""
+
+#: lib/poptI.c:251
+msgid "reinstall if the package is already present"
+msgstr ""
+
+#: lib/poptI.c:253
+msgid "don't install, but tell if it would work or not"
+msgstr ""
+
+#: lib/poptI.c:256
+msgid "upgrade package(s)"
+msgstr ""
+
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
+msgid "query/verify all packages"
+msgstr ""
+
+#: lib/poptQV.c:77
+msgid "rpm checksig mode"
+msgstr ""
+
+#: lib/poptQV.c:79
+msgid "query/verify package(s) owning file"
+msgstr ""
+
+#: lib/poptQV.c:81
+msgid "query/verify package(s) in group"
+msgstr ""
+
+#: lib/poptQV.c:83
+msgid "query/verify a package file"
+msgstr ""
+
+#: lib/poptQV.c:86
+msgid "query/verify package(s) with package identifier"
+msgstr ""
+
+#: lib/poptQV.c:88
+msgid "query/verify package(s) with header identifier"
+msgstr ""
+
+#: lib/poptQV.c:91
+msgid "rpm query mode"
+msgstr ""
+
+#: lib/poptQV.c:93
+msgid "query/verify a header instance"
+msgstr ""
+
+#: lib/poptQV.c:95
+msgid "query/verify package(s) from install transaction"
+msgstr ""
+
+#: lib/poptQV.c:97
+msgid "query the package(s) triggered by the package"
+msgstr ""
+
+#: lib/poptQV.c:99
+msgid "rpm verify mode"
+msgstr ""
+
+#: lib/poptQV.c:101
+msgid "query/verify the package(s) which require a dependency"
+msgstr ""
+
+#: lib/poptQV.c:103
+msgid "query/verify the package(s) which provide a dependency"
+msgstr ""
+
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
+msgid "do not glob arguments"
+msgstr ""
+
+#: lib/poptQV.c:116
+msgid "do not process non-package files as manifests"
+msgstr ""
+
+#: lib/poptQV.c:193
+msgid "list all configuration files"
+msgstr ""
+
+#: lib/poptQV.c:195
+msgid "list all documentation files"
+msgstr ""
+
+#: lib/poptQV.c:197
+msgid "list all license files"
+msgstr ""
+
+#: lib/poptQV.c:199
+msgid "list all artifact files"
+msgstr ""
+
+#: lib/poptQV.c:201
+msgid "dump basic file information"
+msgstr ""
+
+#: lib/poptQV.c:205
+msgid "list files in package"
+msgstr ""
+
+#: lib/poptQV.c:210
+#, c-format
+msgid "skip %%ghost files"
+msgstr ""
+
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
+msgid "display the states of the listed files"
+msgstr ""
+
+#: lib/poptQV.c:241
+msgid "don't verify size of files"
+msgstr ""
+
+#: lib/poptQV.c:244
+msgid "don't verify symlink path of files"
+msgstr ""
+
+#: lib/poptQV.c:247
+msgid "don't verify owner of files"
+msgstr ""
+
+#: lib/poptQV.c:250
+msgid "don't verify group of files"
+msgstr ""
+
+#: lib/poptQV.c:253
+msgid "don't verify modification time of files"
+msgstr ""
+
+#: lib/poptQV.c:256 lib/poptQV.c:259
+msgid "don't verify mode of files"
+msgstr ""
+
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
+msgstr ""
+
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr ""
+
+#: lib/poptQV.c:266
+msgid "don't verify files in package"
+msgstr ""
+
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
+msgid "don't verify package dependencies"
+msgstr ""
+
+#: lib/poptQV.c:271 lib/poptQV.c:274
+msgid "don't execute verify script(s)"
+msgstr ""
+
+#: lib/psm.c:146
+#, c-format
+msgid "Missing rpmlib features for %s:\n"
+msgstr ""
+
+#: lib/psm.c:183
+msgid "source package expected, binary found\n"
+msgstr ""
+
+#: lib/psm.c:194
+msgid "source package contains no .spec file\n"
+msgstr ""
+
+#: lib/psm.c:606
+#, c-format
+msgid "unpacking of archive failed%s%s: %s\n"
+msgstr ""
+
+#: lib/psm.c:607
+msgid " on file "
+msgstr ""
+
+#: lib/query.c:108
+#, c-format
+msgid "incorrect format: %s\n"
+msgstr ""
+
+#: lib/query.c:120
+msgid "(contains no files)\n"
+msgstr ""
+
+#: lib/query.c:161
+msgid "normal        "
+msgstr "عادية"
+
+#: lib/query.c:164
+msgid "replaced      "
+msgstr "مُستبدلة"
+
+#: lib/query.c:167
+msgid "not installed "
+msgstr "غير مثبّتة"
+
+#: lib/query.c:170
+msgid "net shared    "
+msgstr ""
+
+#: lib/query.c:173
+msgid "wrong color   "
+msgstr "لون خاطئ"
+
+#: lib/query.c:176
+msgid "(no state)    "
+msgstr "(بدون حالة)"
+
+#: lib/query.c:179
+#, c-format
+msgid "(unknown %3d) "
+msgstr "(غير معروف %3d) "
+
+#: lib/query.c:199
+msgid "package has not file owner/group lists\n"
+msgstr ""
+
+#: lib/query.c:233
+msgid "package has neither file owner or id lists\n"
+msgstr ""
+
+#: lib/query.c:321
+#, c-format
+msgid "group %s does not contain any packages\n"
+msgstr ""
+
+#: lib/query.c:328
+#, c-format
+msgid "no package triggers %s\n"
+msgstr ""
+
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
+#, c-format
+msgid "malformed %s: %s\n"
+msgstr ""
+
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
+#, c-format
+msgid "no package matches %s: %s\n"
+msgstr ""
+
+#: lib/query.c:387
+#, c-format
+msgid "no package requires %s\n"
+msgstr ""
+
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
+#, c-format
+msgid "no package provides %s\n"
+msgstr ""
+
+#: lib/query.c:455
+#, c-format
+msgid "file %s: %s\n"
+msgstr "الملف %s: %s\n"
+
+#: lib/query.c:458
+#, c-format
+msgid "file %s is not owned by any package\n"
+msgstr ""
+
+#: lib/query.c:469
+#, c-format
+msgid "invalid package number: %s\n"
+msgstr ""
+
+#: lib/query.c:476
+#, c-format
+msgid "record %u could not be read\n"
+msgstr ""
+
+#: lib/query.c:491 lib/rpminstall.c:690
+#, c-format
+msgid "package %s is not installed\n"
+msgstr ""
+
+#: lib/query.c:525
+#, c-format
+msgid "unknown tag: \"%s\"\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
+#, c-format
+msgid "%s: key %d import failed.\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:66
+#, c-format
+msgid "%s: key %d not an armored public key.\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:111
+#, c-format
+msgid "%s: import read failed(%d).\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:131
+#, c-format
+msgid "Fread failed: %s"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
+msgstr "غير موافق"
+
+#: lib/rpmchecksig.c:268
+msgid "OK"
+msgstr "موافق"
+
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
+#, c-format
+msgid "%s: open failed: %s\n"
+msgstr "%s: فشل فتح: %s\n"
+
+#: lib/rpmchroot.c:43
+#, c-format
+msgid "Unable to open current directory: %m\n"
+msgstr ""
+
+#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
+#, c-format
+msgid "%s: chroot directory not set\n"
+msgstr ""
+
+#: lib/rpmchroot.c:70
+#, c-format
+msgid "Unable to change root directory: %m\n"
+msgstr ""
+
+#: lib/rpmchroot.c:95
+#, c-format
+msgid "Unable to restore root directory: %m\n"
+msgstr ""
+
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr ""
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr ""
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr ""
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr ""
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr ""
+
+#: lib/rpmds.c:744
+msgid "NO "
+msgstr "لا"
+
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "نعم"
+
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+msgstr ""
+
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr ""
+
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr ""
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr ""
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr ""
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr ""
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr ""
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr ""
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr ""
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr ""
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr ""
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr ""
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr ""
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr ""
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr ""
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr ""
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr ""
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr ""
+
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr ""
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr ""
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr ""
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
+
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " فشل - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr ""
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
+#, c-format
+msgid "open of %s failed: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
+#, c-format
+msgid "%s: not an rpm package (or package manifest)\n"
+msgstr ""
+
+#: lib/rpminstall.c:142
+#, c-format
+msgid "Updating / installing...\n"
+msgstr ""
+
+#: lib/rpminstall.c:144
+#, c-format
+msgid "Cleaning up / removing...\n"
+msgstr ""
+
+#: lib/rpminstall.c:193
+msgid "Preparing..."
+msgstr "يجري التّحضير..."
+
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
+msgstr ""
+
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
+msgstr "فشل في الاعتماديات:\n"
+
+#: lib/rpminstall.c:323
+#, c-format
+msgid "%s: not an rpm package (or package manifest): %s\n"
+msgstr ""
+
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
+#, c-format
+msgid "%s cannot be installed\n"
+msgstr ""
+
+#: lib/rpminstall.c:490
+#, c-format
+msgid "Retrieving %s\n"
+msgstr ""
+
+#: lib/rpminstall.c:502
+#, c-format
+msgid "skipping %s - transfer failed\n"
+msgstr ""
+
+#: lib/rpminstall.c:572
+#, c-format
+msgid "package %s is not relocatable\n"
+msgstr ""
+
+#: lib/rpminstall.c:603
+#, c-format
+msgid "error reading from file %s\n"
+msgstr ""
+
+#: lib/rpminstall.c:697
+#, c-format
+msgid "\"%s\" specifies multiple packages:\n"
+msgstr ""
+
+#: lib/rpminstall.c:736
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "تعذّر فتح %s: %s\n"
+
+#: lib/rpminstall.c:742
+#, c-format
+msgid "Installing %s\n"
+msgstr "يجري تثبيت %s\n"
+
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
+msgstr ""
+
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
+msgstr ""
+
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
+msgstr ""
+
+#: lib/rpmlead.c:118
+#, c-format
+msgid "read failed: %s (%d)\n"
+msgstr ""
+
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
+msgstr ""
+
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
+#, c-format
+msgid "can't create %s lock on %s (%s)\n"
+msgstr ""
+
+#: lib/rpmlock.c:133
+#, c-format
+msgid "waiting for %s lock on %s\n"
+msgstr ""
+
+#: lib/rpmplugins.c:65
+#, c-format
+msgid "Failed to dlopen %s %s\n"
+msgstr ""
+
+#: lib/rpmplugins.c:73
+#, c-format
+msgid "Failed to resolve symbol %s: %s\n"
+msgstr ""
+
+#: lib/rpmplugins.c:154
+#, c-format
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr ""
+
+#: lib/rpmplugins.c:199
+#, c-format
+msgid "Plugin %s not loaded\n"
+msgstr ""
+
+#: lib/rpmprob.c:109
+msgid "different"
+msgstr "مختلفة"
+
+#: lib/rpmprob.c:114
+#, c-format
+msgid "package %s is intended for a %s architecture"
+msgstr ""
+
+#: lib/rpmprob.c:118
+#, c-format
+msgid "package %s is intended for a %s operating system"
+msgstr ""
+
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
+msgstr ""
+
+#: lib/rpmprob.c:125
+#, c-format
+msgid "path %s in package %s is not relocatable"
+msgstr ""
+
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
+msgstr ""
+
+#: lib/rpmprob.c:135
+#, c-format
+msgid "file %s from install of %s conflicts with file from package %s"
+msgstr ""
+
+#: lib/rpmprob.c:140
+#, c-format
+msgid "package %s (which is newer than %s) is already installed"
+msgstr ""
+
+#: lib/rpmprob.c:145
+#, c-format
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+msgstr ""
+
+#: lib/rpmprob.c:155
+#, c-format
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+msgstr ""
+
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
+msgstr "%s is مطلوبة بواسطة %s%s"
+
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
+msgstr "(مثبّتة) "
+
+#: lib/rpmprob.c:163
+#, c-format
+msgid "%s conflicts with %s%s"
+msgstr "%s تتعارض مع %s%s"
+
+#: lib/rpmprob.c:167
+#, c-format
+msgid "%s is obsoleted by %s%s"
+msgstr "%s عُيّنت كمنتهية بواسطة %s%s"
+
+#: lib/rpmprob.c:172
+#, c-format
+msgid "unknown error %d encountered while manipulating package %s"
+msgstr ""
+
+#: lib/rpmrc.c:222
+#, c-format
+msgid "missing second ':' at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:225
+#, c-format
+msgid "missing architecture name at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:370
+#, c-format
+msgid "Incomplete data line at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:375
+#, c-format
+msgid "Too many args in data line at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:382
+#, c-format
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr ""
+
+#: lib/rpmrc.c:413
+#, c-format
+msgid "Incomplete default line at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:551
+#, c-format
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr ""
+
+#: lib/rpmrc.c:564
+#, c-format
+msgid "missing architecture for %s at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:632
+#, c-format
+msgid "bad option '%s' at %s:%d\n"
+msgstr "خيار خاطئ '%s' at %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr ""
+
+#: lib/rpmrc.c:1469
+#, c-format
+msgid "Unknown system: %s\n"
+msgstr "نظام غير معروف: %s\n"
+
+#: lib/rpmrc.c:1471
+#, c-format
+msgid "Please contact %s\n"
+msgstr "اتّصل رجاءً %s\n"
+
+#: lib/rpmrc.c:1604
+#, c-format
+msgid "Unable to open %s for reading: %m.\n"
+msgstr ""
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
+
+#: lib/rpmscript.c:138
+#, c-format
+msgid "Unable to restore current directory: %m"
+msgstr ""
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr ""
+
+#: lib/rpmscript.c:278
+#, c-format
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr ""
+
+#: lib/rpmscript.c:313
+#, c-format
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr ""
+
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr ""
+
+#: lib/rpmscript.c:371
+#, c-format
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr ""
+
+#: lib/rpmscript.c:375
+#, c-format
+msgid "%s scriptlet failed, signal %d\n"
+msgstr ""
+
+#: lib/rpmscript.c:378
+#, c-format
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr ""
+
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "صيغة غير معروفة"
+
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "ثبّت"
+
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "أزِل"
+
+#: lib/rpmts.c:100
+#, c-format
+msgid "cannot open Packages database in %s\n"
+msgstr ""
+
+#: lib/rpmts.c:199
+#, c-format
+msgid "extra '(' in package label: %s\n"
+msgstr ""
+
+#: lib/rpmts.c:217
+#, c-format
+msgid "missing '(' in package label: %s\n"
+msgstr ""
+
+#: lib/rpmts.c:225
+#, c-format
+msgid "missing ')' in package label: %s\n"
+msgstr ""
+
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr ""
+
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "مُبادلة"
+
+#: lib/rpmvs.c:152
+#, c-format
+msgid "%s tag %u: invalid type %u"
+msgstr ""
+
+#: lib/rpmvs.c:158
+#, c-format
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
+
+#: lib/rpmvs.c:178
+#, c-format
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
+
+#: lib/rpmvs.c:188
+#, c-format
+msgid "%s tag %u: invalid size %u"
+msgstr ""
+
+#: lib/rpmvs.c:195
+#, c-format
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
+
+#: lib/rpmvs.c:206
+#, c-format
+msgid "%s: tag %u: invalid hex"
+msgstr ""
+
+#: lib/rpmvs.c:261
+#, c-format
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
+
+#: lib/rpmvs.c:268
+#, c-format
+msgid "%s%s"
+msgstr ""
+
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
+
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "الترويسة"
+
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
+
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "تعذّر تحميل رأس التّوقيع.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "مُستثناة"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr ""
+
+#: lib/verify.c:263
+#, c-format
+msgid "Duplicate username or UID for user %s\n"
+msgstr ""
+
+#: lib/verify.c:284
+#, c-format
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr ""
+
+#: lib/verify.c:395
+msgid "no state"
+msgstr ""
+
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr ""
+
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "مفقود   %c %s"
+
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr ""
+
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
+msgstr ""
+
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
+
+#: rpmio/digest_nss.c:79
+#, c-format
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, c-format
+msgid "%3d>%*s(empty)\n"
+msgstr ""
+
+#: rpmio/macro.c:316
+#, c-format
+msgid "%3d<%*s(empty)\n"
+msgstr ""
+
+#: rpmio/macro.c:483
+#, c-format
+msgid "Macro %%%s has unterminated opts\n"
+msgstr ""
+
+#: rpmio/macro.c:495 rpmio/macro.c:533
+#, c-format
+msgid "Macro %%%s has unterminated body\n"
+msgstr ""
+
+#: rpmio/macro.c:551
+#, c-format
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
+
+#: rpmio/macro.c:557
+#, c-format
+msgid "Macro %%%s has empty body\n"
+msgstr ""
+
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
+#, c-format
+msgid "Macro %%%s failed to expand\n"
+msgstr ""
+
+#: rpmio/macro.c:607
+#, c-format
+msgid "Macro %%%s has illegal name (%%undefine)\n"
+msgstr ""
+
+#: rpmio/macro.c:637
+#, c-format
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
+
+#: rpmio/macro.c:761
+#, c-format
+msgid "Unknown option %c in %s(%s)\n"
+msgstr ""
+
+#: rpmio/macro.c:1055
+msgid ""
+"Too many levels of recursion in macro expansion. It is likely caused by "
+"recursive macro declaration.\n"
+msgstr ""
+
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
+#, c-format
+msgid "Unterminated %c: %s\n"
+msgstr ""
+
+#: rpmio/macro.c:1182
+#, c-format
+msgid "A %% is followed by an unparseable macro\n"
+msgstr ""
+
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr ""
+
+#: rpmio/rpmfileutil.c:258
+#, c-format
+msgid "error creating temporary file %s: %m\n"
+msgstr ""
+
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
+#, c-format
+msgid "File %s: %s\n"
+msgstr "الملف %s: %s\n"
+
+#: rpmio/rpmfileutil.c:332
+#, c-format
+msgid "File %s is smaller than %u bytes\n"
+msgstr ""
+
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr ""
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(بدون أخطاء)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "خطأ فادح: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "خطأ: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr ""
+
+#: rpmio/rpmlua.c:523
+#, c-format
+msgid "invalid syntax in lua scriptlet: %s\n"
+msgstr ""
+
+#: rpmio/rpmlua.c:541
+#, c-format
+msgid "invalid syntax in lua script: %s\n"
+msgstr ""
+
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
+#, c-format
+msgid "lua script failed: %s\n"
+msgstr ""
+
+#: rpmio/rpmlua.c:560
+#, c-format
+msgid "invalid syntax in lua file: %s\n"
+msgstr ""
+
+#: rpmio/rpmlua.c:756
+#, c-format
+msgid "lua hook failed: %s\n"
+msgstr ""
+
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr "(لا شيء)"
+
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
+#, c-format
+msgid "%s: Fwrite failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:177
+#, c-format
+msgid "%s: Fflush failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:202
+msgid "Unsupported PGP signature\n"
+msgstr ""
+
+#: sign/rpmgensig.c:208
+#, c-format
+msgid "Unsupported PGP hash algorithm %u\n"
+msgstr ""
+
+#: sign/rpmgensig.c:221
+#, c-format
+msgid "Unsupported PGP pubkey algorithm %u\n"
+msgstr ""
+
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "تعذّر تنفيذ %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
+#, c-format
+msgid "Could not read from file %s: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:312
+#, c-format
+msgid "gpg exec failed (%d)\n"
+msgstr ""
+
+#: sign/rpmgensig.c:354
+msgid "gpg failed to write signature\n"
+msgstr ""
+
+#: sign/rpmgensig.c:371
+msgid "unable to read the signature\n"
+msgstr ""
+
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
+msgid "rpmMkTemp failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
+#, c-format
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
+
+#: sign/rpmgensig.c:682
+#, c-format
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
+
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
+#, c-format
+msgid "%s: rpmWriteSignature failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:812
+#, c-format
+msgid "replacing %s failed: %s\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
+#, c-format
+msgid "%s: read manifest failed: %s\n"
+msgstr ""
+
+#: tools/rpmgraph.c:219
+msgid "don't verify header+payload signature"
+msgstr ""
diff --git a/po/bn_IN.po b/po/bn_IN.po
deleted file mode 100644 (file)
index e84e3ec..0000000
+++ /dev/null
@@ -1,3484 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# This file is distributed under the same license as the PACKAGE package.
-# 
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: RPM\n"
-"Report-Msgid-Bugs-To: http://rpm.org/\n"
-"POT-Creation-Date: 2012-11-05 10:07+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
-"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Bengali (India) (http://www.transifex.com/projects/p/rpm/language/bn_IN/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: bn_IN\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: cliutils.c:21 lib/poptI.c:29
-#, c-format
-msgid "%s: %s\n"
-msgstr ""
-
-#: cliutils.c:27 lib/poptALL.c:55
-#, c-format
-msgid "RPM version %s\n"
-msgstr ""
-
-#: cliutils.c:32
-#, c-format
-msgid "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
-msgstr ""
-
-#: cliutils.c:33
-#, c-format
-msgid ""
-"This program may be freely redistributed under the terms of the GNU GPL\n"
-msgstr ""
-
-#: cliutils.c:53
-#, c-format
-msgid "creating a pipe for --pipe failed: %m\n"
-msgstr ""
-
-#: cliutils.c:63
-#, c-format
-msgid "exec failed\n"
-msgstr ""
-
-#: rpm2cpio.c:63
-#, c-format
-msgid "argument is not an RPM package\n"
-msgstr ""
-
-#: rpm2cpio.c:68
-#, c-format
-msgid "error reading header from package\n"
-msgstr ""
-
-#: rpm2cpio.c:83
-#, c-format
-msgid "cannot re-open payload: %s\n"
-msgstr ""
-
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr ""
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr ""
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr ""
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr ""
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr ""
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr ""
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr ""
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr ""
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr ""
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr ""
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid ""
-"--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr ""
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr ""
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr ""
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr ""
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr ""
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr ""
-
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr ""
-
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:129
-#, c-format
-msgid "verify %files section from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:142
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
-msgid "<tarball>"
-msgstr ""
-
-#: rpmbuild.c:145
-msgid "build through %build (%prep, then compile) from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:148
-msgid "build through %install (%prep, %build, then install) from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:151
-#, c-format
-msgid "verify %files section from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:154
-msgid "build source and binary packages from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:157
-msgid "build binary package only from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:160
-msgid "build source package only from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:164
-msgid "build binary package from <source package>"
-msgstr ""
-
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr ""
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-
-#: rpmbuild.c:171
-msgid "override build root"
-msgstr ""
-
-#: rpmbuild.c:173
-msgid "remove build tree when done"
-msgstr ""
-
-#: rpmbuild.c:175
-msgid "ignore ExcludeArch: directives from spec file"
-msgstr ""
-
-#: rpmbuild.c:177
-msgid "debug file state machine"
-msgstr ""
-
-#: rpmbuild.c:179
-msgid "do not execute any stages of the build"
-msgstr ""
-
-#: rpmbuild.c:181
-msgid "do not verify build dependencies"
-msgstr ""
-
-#: rpmbuild.c:183
-msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
-msgstr ""
-
-#: rpmbuild.c:187
-#, c-format
-msgid "do not execute %clean stage of the build"
-msgstr ""
-
-#: rpmbuild.c:189
-#, c-format
-msgid "do not execute %check stage of the build"
-msgstr ""
-
-#: rpmbuild.c:192
-msgid "do not accept i18N msgstr's from specfile"
-msgstr ""
-
-#: rpmbuild.c:194
-msgid "remove sources when done"
-msgstr ""
-
-#: rpmbuild.c:196
-msgid "remove specfile when done"
-msgstr ""
-
-#: rpmbuild.c:198
-msgid "skip straight to specified stage (only for c,i)"
-msgstr ""
-
-#: rpmbuild.c:200 rpmspec.c:34
-msgid "override target platform"
-msgstr ""
-
-#: rpmbuild.c:217
-msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
-msgstr ""
-
-#: rpmbuild.c:237
-msgid "Failed build dependencies:\n"
-msgstr ""
-
-#: rpmbuild.c:255
-#, c-format
-msgid "Unable to open spec file %s: %s\n"
-msgstr ""
-
-#: rpmbuild.c:317
-#, c-format
-msgid "Failed to open tar pipe: %m\n"
-msgstr ""
-
-#: rpmbuild.c:336
-#, c-format
-msgid "Failed to read spec file from %s\n"
-msgstr ""
-
-#: rpmbuild.c:348
-#, c-format
-msgid "Failed to rename %s to %s: %m\n"
-msgstr ""
-
-#: rpmbuild.c:419
-#, c-format
-msgid "failed to stat %s: %m\n"
-msgstr ""
-
-#: rpmbuild.c:423
-#, c-format
-msgid "File %s is not a regular file.\n"
-msgstr ""
-
-#: rpmbuild.c:430
-#, c-format
-msgid "File %s does not appear to be a specfile.\n"
-msgstr ""
-
-#: rpmbuild.c:496
-#, c-format
-msgid "Building target platforms: %s\n"
-msgstr ""
-
-#: rpmbuild.c:504
-#, c-format
-msgid "Building for target %s\n"
-msgstr ""
-
-#: rpmdb.c:22
-msgid "initialize database"
-msgstr ""
-
-#: rpmdb.c:24
-msgid "rebuild database inverted lists from installed package headers"
-msgstr ""
-
-#: rpmdb.c:27
-msgid "verify database files"
-msgstr ""
-
-#: rpmdb.c:33
-msgid "Database options:"
-msgstr ""
-
-#: rpmkeys.c:24
-msgid "verify package signature(s)"
-msgstr ""
-
-#: rpmkeys.c:26
-msgid "import an armored public key"
-msgstr ""
-
-#: rpmkeys.c:28
-msgid "don't import, but tell if it would work or not"
-msgstr ""
-
-#: rpmkeys.c:31 rpmkeys.c:33
-msgid "list keys from RPM keyring"
-msgstr ""
-
-#: rpmkeys.c:40
-msgid "Keyring options:"
-msgstr ""
-
-#: rpmkeys.c:64 rpmsign.c:144
-msgid "no arguments given"
-msgstr ""
-
-#: rpmsign.c:25
-msgid "sign package(s)"
-msgstr ""
-
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
-msgstr ""
-
-#: rpmsign.c:29
-msgid "delete package signatures"
-msgstr ""
-
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr ""
-
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr ""
-
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
-msgstr ""
-
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr ""
-
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
-msgstr ""
-
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr ""
-
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
-msgstr ""
-
-#: rpmspec.c:28
-msgid "query spec file(s)"
-msgstr ""
-
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
-msgstr ""
-
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
-msgstr ""
-
-#: rpmspec.c:36 lib/poptQV.c:189
-msgid "use the following query format"
-msgstr ""
-
-#: rpmspec.c:45
-msgid "Spec options:"
-msgstr ""
-
-#: rpmspec.c:90
-msgid "no arguments given for parse"
-msgstr ""
-
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
-msgstr ""
-
-#: build/build.c:126
-#, c-format
-msgid "Unable to open stream: %s\n"
-msgstr ""
-
-#: build/build.c:161
-#, c-format
-msgid "Executing(%s): %s\n"
-msgstr ""
-
-#: build/build.c:168
-#, c-format
-msgid "Exec of %s failed (%s): %s\n"
-msgstr ""
-
-#: build/build.c:177
-#, c-format
-msgid "Error executing scriptlet %s (%s)\n"
-msgstr ""
-
-#: build/build.c:184
-#, c-format
-msgid "Bad exit status from %s (%s)\n"
-msgstr ""
-
-#: build/build.c:291
-msgid ""
-"\n"
-"\n"
-"RPM build errors:\n"
-msgstr ""
-
-#: build/expression.c:216
-msgid "syntax error while parsing ==\n"
-msgstr ""
-
-#: build/expression.c:246
-msgid "syntax error while parsing &&\n"
-msgstr ""
-
-#: build/expression.c:255
-msgid "syntax error while parsing ||\n"
-msgstr ""
-
-#: build/expression.c:305
-msgid "parse error in expression\n"
-msgstr ""
-
-#: build/expression.c:337
-msgid "unmatched (\n"
-msgstr ""
-
-#: build/expression.c:369
-msgid "- only on numbers\n"
-msgstr ""
-
-#: build/expression.c:385
-msgid "! only on numbers\n"
-msgstr ""
-
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
-msgid "types must match\n"
-msgstr ""
-
-#: build/expression.c:440
-msgid "* / not suported for strings\n"
-msgstr ""
-
-#: build/expression.c:491
-msgid "- not suported for strings\n"
-msgstr ""
-
-#: build/expression.c:638
-msgid "&& and || not suported for strings\n"
-msgstr ""
-
-#: build/expression.c:671
-msgid "syntax error in expression\n"
-msgstr ""
-
-#: build/files.c:327 build/files.c:496 build/files.c:710
-#, c-format
-msgid "Missing '(' in %s %s\n"
-msgstr ""
-
-#: build/files.c:337 build/files.c:632 build/files.c:720 build/files.c:779
-#, c-format
-msgid "Missing ')' in %s(%s\n"
-msgstr ""
-
-#: build/files.c:362 build/files.c:651
-#, c-format
-msgid "Invalid %s token: %s\n"
-msgstr ""
-
-#: build/files.c:465
-#, c-format
-msgid "Missing %s in %s %s\n"
-msgstr ""
-
-#: build/files.c:511
-#, c-format
-msgid "Non-white space follows %s(): %s\n"
-msgstr ""
-
-#: build/files.c:547
-#, c-format
-msgid "Bad syntax: %s(%s)\n"
-msgstr ""
-
-#: build/files.c:556
-#, c-format
-msgid "Bad mode spec: %s(%s)\n"
-msgstr ""
-
-#: build/files.c:568
-#, c-format
-msgid "Bad dirmode spec: %s(%s)\n"
-msgstr ""
-
-#: build/files.c:672
-#, c-format
-msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
-msgstr ""
-
-#: build/files.c:679
-#, c-format
-msgid "Duplicate locale %s in %%lang(%s)\n"
-msgstr ""
-
-#: build/files.c:794
-#, c-format
-msgid "Invalid capability: %s\n"
-msgstr ""
-
-#: build/files.c:804
-msgid "File capability support not built in\n"
-msgstr ""
-
-#: build/files.c:853
-#, c-format
-msgid "File must begin with \"/\": %s\n"
-msgstr ""
-
-#: build/files.c:974
-#, c-format
-msgid "Unknown file digest algorithm %u, falling back to MD5\n"
-msgstr ""
-
-#: build/files.c:1002
-#, c-format
-msgid "File listed twice: %s\n"
-msgstr ""
-
-#: build/files.c:1124
-#, c-format
-msgid "reading symlink %s failed: %s\n"
-msgstr ""
-
-#: build/files.c:1132
-#, c-format
-msgid "Symlink points to BuildRoot: %s -> %s\n"
-msgstr ""
-
-#: build/files.c:1346
-#, c-format
-msgid "Directory not found: %s\n"
-msgstr ""
-
-#: build/files.c:1347
-#, c-format
-msgid "File not found: %s\n"
-msgstr ""
-
-#: build/files.c:1538
-#, c-format
-msgid "%s: can't load unknown tag (%d).\n"
-msgstr ""
-
-#: build/files.c:1544
-#, c-format
-msgid "%s: public key read failed.\n"
-msgstr ""
-
-#: build/files.c:1548
-#, c-format
-msgid "%s: not an armored public key.\n"
-msgstr ""
-
-#: build/files.c:1557
-#, c-format
-msgid "%s: failed to encode\n"
-msgstr ""
-
-#: build/files.c:1602
-#, c-format
-msgid "File needs leading \"/\": %s\n"
-msgstr ""
-
-#: build/files.c:1626
-#, c-format
-msgid "%%dev glob not permitted: %s\n"
-msgstr ""
-
-#: build/files.c:1639
-#, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr ""
-
-#: build/files.c:1640 lib/rpminstall.c:426
-#, c-format
-msgid "File not found by glob: %s\n"
-msgstr ""
-
-#: build/files.c:1676
-#, c-format
-msgid "Could not open %%files file %s: %m\n"
-msgstr ""
-
-#: build/files.c:1683
-#, c-format
-msgid "line: %s\n"
-msgstr ""
-
-#: build/files.c:1690
-#, c-format
-msgid "Error reading %%files file %s: %m\n"
-msgstr ""
-
-#: build/files.c:1712
-#, c-format
-msgid "illegal _docdir_fmt %s: %s\n"
-msgstr ""
-
-#: build/files.c:1866
-#, c-format
-msgid "Can't mix special %s with other forms: %s\n"
-msgstr ""
-
-#: build/files.c:1883
-#, c-format
-msgid "More than one file on a line: %s\n"
-msgstr ""
-
-#: build/files.c:2011
-#, c-format
-msgid "Bad file: %s: %s\n"
-msgstr ""
-
-#: build/files.c:2036 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr ""
-
-#: build/files.c:2070
-#, c-format
-msgid "Checking for unpackaged file(s): %s\n"
-msgstr ""
-
-#: build/files.c:2083
-#, c-format
-msgid ""
-"Installed (but unpackaged) file(s) found:\n"
-"%s"
-msgstr ""
-
-#: build/files.c:2114
-#, c-format
-msgid "Processing files: %s\n"
-msgstr ""
-
-#: build/files.c:2127
-#, c-format
-msgid "Binaries arch (%d) not matching the package arch (%d).\n"
-msgstr ""
-
-#: build/files.c:2133
-msgid "Arch dependent binaries in noarch package\n"
-msgstr ""
-
-#: build/pack.c:50
-#, c-format
-msgid "create archive failed on file %s: %s\n"
-msgstr ""
-
-#: build/pack.c:53
-#, c-format
-msgid "create archive failed: %s\n"
-msgstr ""
-
-#: build/pack.c:80
-#, c-format
-msgid "Could not open %s file: %s\n"
-msgstr ""
-
-#: build/pack.c:96
-#, c-format
-msgid "%s: line: %s\n"
-msgstr ""
-
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr ""
-
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:206
-#, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr ""
-
-#: build/pack.c:310
-#, c-format
-msgid "Unknown payload compression: %s\n"
-msgstr ""
-
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr ""
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr ""
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr ""
-
-#: build/pack.c:440
-#, c-format
-msgid "Could not open %s: %s\n"
-msgstr ""
-
-#: build/pack.c:452
-#, c-format
-msgid "Unable to write package: %s\n"
-msgstr ""
-
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr ""
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr ""
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:523
-#, c-format
-msgid "Wrote: %s\n"
-msgstr ""
-
-#: build/pack.c:542
-#, c-format
-msgid "Executing \"%s\":\n"
-msgstr ""
-
-#: build/pack.c:545
-#, c-format
-msgid "Execution of \"%s\" failed.\n"
-msgstr ""
-
-#: build/pack.c:549
-#, c-format
-msgid "Package check \"%s\" failed.\n"
-msgstr ""
-
-#: build/pack.c:598
-#, c-format
-msgid "Could not generate output filename for package %s: %s\n"
-msgstr ""
-
-#: build/pack.c:615
-#, c-format
-msgid "cannot create %s: %s\n"
-msgstr ""
-
-#: build/parseBuildInstallClean.c:35
-#, c-format
-msgid "line %d: second %s\n"
-msgstr ""
-
-#: build/parseChangelog.c:114
-#, c-format
-msgid "bogus date in %%changelog: %s\n"
-msgstr ""
-
-#: build/parseChangelog.c:146
-#, c-format
-msgid "%%changelog entries must start with *\n"
-msgstr ""
-
-#: build/parseChangelog.c:154
-#, c-format
-msgid "incomplete %%changelog entry\n"
-msgstr ""
-
-#: build/parseChangelog.c:169
-#, c-format
-msgid "bad date in %%changelog: %s\n"
-msgstr ""
-
-#: build/parseChangelog.c:174
-#, c-format
-msgid "%%changelog not in descending chronological order\n"
-msgstr ""
-
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
-#, c-format
-msgid "missing name in %%changelog\n"
-msgstr ""
-
-#: build/parseChangelog.c:200
-#, c-format
-msgid "no description in %%changelog\n"
-msgstr ""
-
-#: build/parseDescription.c:32
-#, c-format
-msgid "line %d: Error parsing %%description: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
-#, c-format
-msgid "line %d: Bad option %s: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
-#, c-format
-msgid "line %d: Too many names: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr ""
-
-#: build/parseFiles.c:33
-#, c-format
-msgid "line %d: Error parsing %%files: %s\n"
-msgstr ""
-
-#: build/parsePolicies.c:32
-#, c-format
-msgid "line %d: Error parsing %%policies: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:69
-#, c-format
-msgid "Error parsing tag field: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:162
-#, c-format
-msgid "line %d: Bad number: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:168
-#, c-format
-msgid "line %d: Bad no%s number: %u\n"
-msgstr ""
-
-#: build/parsePreamble.c:231
-#, c-format
-msgid "line %d: Bad %s number: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:245
-#, c-format
-msgid "%s %d defined multiple times\n"
-msgstr ""
-
-#: build/parsePreamble.c:290
-#, c-format
-msgid "Downloading %s to %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:293
-#, c-format
-msgid "Couldn't download %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:432
-#, c-format
-msgid "Architecture is excluded: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:437
-#, c-format
-msgid "Architecture is not included: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:442
-#, c-format
-msgid "OS is excluded: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:447
-#, c-format
-msgid "OS is not included: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:473
-#, c-format
-msgid "%s field must be present in package: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:496
-#, c-format
-msgid "Duplicate %s entries in package: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:554
-#, c-format
-msgid "Unable to open icon %s: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:570
-#, c-format
-msgid "Unable to read icon %s: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:580
-#, c-format
-msgid "Unknown icon type: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:594
-#, c-format
-msgid "line %d: Tag takes single token only: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:614
-#, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:617
-#, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:623
-#, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:646
-#, c-format
-msgid "line %d: Malformed tag: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:654
-#, c-format
-msgid "line %d: Empty tag: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:715
-#, c-format
-msgid "line %d: Prefixes must not end with \"/\": %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:727
-#, c-format
-msgid "line %d: Docdir must begin with '/': %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:740
-#, c-format
-msgid "line %d: Epoch field must be an unsigned number: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:777
-#, c-format
-msgid "line %d: Bad %s: qualifiers: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:804
-#, c-format
-msgid "line %d: Bad BuildArchitecture format: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:814
-#, c-format
-msgid "line %d: Only noarch subpackages are supported: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:830
-#, c-format
-msgid "Internal error: Bogus tag %d\n"
-msgstr ""
-
-#: build/parsePreamble.c:915
-#, c-format
-msgid "line %d: %s is deprecated: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:978
-#, c-format
-msgid "Bad package specification: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:1015
-#, c-format
-msgid "line %d: Unknown tag: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:1047
-#, c-format
-msgid "%%{buildroot} couldn't be empty\n"
-msgstr ""
-
-#: build/parsePreamble.c:1051
-#, c-format
-msgid "%%{buildroot} can not be \"/\"\n"
-msgstr ""
-
-#: build/parsePrep.c:28
-#, c-format
-msgid "Bad source: %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:73
-#, c-format
-msgid "No patch number %u\n"
-msgstr ""
-
-#: build/parsePrep.c:75
-#, c-format
-msgid "%%patch without corresponding \"Patch:\" tag\n"
-msgstr ""
-
-#: build/parsePrep.c:152
-#, c-format
-msgid "No source number %u\n"
-msgstr ""
-
-#: build/parsePrep.c:154
-msgid "No \"Source:\" tag in the spec file\n"
-msgstr ""
-
-#: build/parsePrep.c:261
-#, c-format
-msgid "Error parsing %%setup: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:272
-#, c-format
-msgid "line %d: Bad arg to %%setup: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:287
-#, c-format
-msgid "line %d: Bad %%setup option %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:446
-#, c-format
-msgid "%s: %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:459
-#, c-format
-msgid "Invalid patch number %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:486
-#, c-format
-msgid "line %d: second %%prep\n"
-msgstr ""
-
-#: build/parseReqs.c:112
-msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
-msgstr ""
-
-#: build/parseReqs.c:137
-msgid "Versioned file name not permitted"
-msgstr ""
-
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr ""
-
-#: build/parseReqs.c:165
-msgid "invalid dependency"
-msgstr ""
-
-#: build/parseReqs.c:181
-#, c-format
-msgid "line %d: %s: %s\n"
-msgstr ""
-
-#: build/parseScript.c:192
-#, c-format
-msgid "line %d: triggers must have --: %s\n"
-msgstr ""
-
-#: build/parseScript.c:202 build/parseScript.c:265
-#, c-format
-msgid "line %d: Error parsing %s: %s\n"
-msgstr ""
-
-#: build/parseScript.c:214
-#, c-format
-msgid "line %d: internal script must end with '>': %s\n"
-msgstr ""
-
-#: build/parseScript.c:220
-#, c-format
-msgid "line %d: script program must begin with '/': %s\n"
-msgstr ""
-
-#: build/parseScript.c:258
-#, c-format
-msgid "line %d: Second %s\n"
-msgstr ""
-
-#: build/parseScript.c:301
-#, c-format
-msgid "line %d: unsupported internal script: %s\n"
-msgstr ""
-
-#: build/parseScript.c:318
-#, c-format
-msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
-msgstr ""
-
-#: build/parseSpec.c:209
-#, c-format
-msgid "line %d: %s\n"
-msgstr ""
-
-#: build/parseSpec.c:252
-#, c-format
-msgid "Unable to open %s: %s\n"
-msgstr ""
-
-#: build/parseSpec.c:286
-#, c-format
-msgid "%s:%d: Argument expected for %s\n"
-msgstr ""
-
-#: build/parseSpec.c:308
-#, c-format
-msgid "line %d: Unclosed %%if\n"
-msgstr ""
-
-#: build/parseSpec.c:313
-#, c-format
-msgid "line %d: unclosed macro or bad line continuation\n"
-msgstr ""
-
-#: build/parseSpec.c:355
-#, c-format
-msgid "%s:%d: bad %%if condition\n"
-msgstr ""
-
-#: build/parseSpec.c:363
-#, c-format
-msgid "%s:%d: Got a %%else with no %%if\n"
-msgstr ""
-
-#: build/parseSpec.c:374
-#, c-format
-msgid "%s:%d: Got a %%endif with no %%if\n"
-msgstr ""
-
-#: build/parseSpec.c:392
-#, c-format
-msgid "%s:%d: malformed %%include statement\n"
-msgstr ""
-
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
-msgstr ""
-
-#: build/parseSpec.c:703
-#, c-format
-msgid "Package has no %%description: %s\n"
-msgstr ""
-
-#: build/policies.c:87
-#, c-format
-msgid "Policy module '%s' duplicated with overlapping types\n"
-msgstr ""
-
-#: build/policies.c:93
-#, c-format
-msgid "Base modules '%s' and '%s' have overlapping types\n"
-msgstr ""
-
-#: build/policies.c:101
-msgid "Failed to get policies from header\n"
-msgstr ""
-
-#: build/policies.c:154
-#, c-format
-msgid "%%semodule requires a file path\n"
-msgstr ""
-
-#: build/policies.c:163
-#, c-format
-msgid "Failed to read  policy file: %s\n"
-msgstr ""
-
-#: build/policies.c:170
-#, c-format
-msgid "Failed to encode policy file: %s\n"
-msgstr ""
-
-#: build/policies.c:187
-#, c-format
-msgid "Failed to determine a policy name: %s\n"
-msgstr ""
-
-#: build/policies.c:199
-#, c-format
-msgid ""
-"'%s' type given with other types in %%semodule %s. Compacting types to "
-"'%s'.\n"
-msgstr ""
-
-#: build/policies.c:246
-#, c-format
-msgid "Error parsing %s: %s\n"
-msgstr ""
-
-#: build/policies.c:252
-#, c-format
-msgid "Expecting %%semodule tag: %s\n"
-msgstr ""
-
-#: build/policies.c:262
-#, c-format
-msgid "Missing module path in line: %s\n"
-msgstr ""
-
-#: build/policies.c:268
-#, c-format
-msgid "Too many arguments in line: %s\n"
-msgstr ""
-
-#: build/policies.c:307
-#, c-format
-msgid "Processing policies: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:108
-#, c-format
-msgid "Ignoring invalid regex %s\n"
-msgstr ""
-
-#: build/rpmfc.c:204
-#, c-format
-msgid "Couldn't create pipe for %s: %m\n"
-msgstr ""
-
-#: build/rpmfc.c:229
-#, c-format
-msgid "Couldn't exec %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:234 lib/rpmscript.c:255
-#, c-format
-msgid "Couldn't fork %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:317
-#, c-format
-msgid "%s failed: %x\n"
-msgstr ""
-
-#: build/rpmfc.c:321
-#, c-format
-msgid "failed to write all data to %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
-msgid "Empty file classifier\n"
-msgstr ""
-
-#: build/rpmfc.c:918
-msgid "No file attributes configured\n"
-msgstr ""
-
-#: build/rpmfc.c:938
-#, c-format
-msgid "magic_open(0x%x) failed: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:944
-#, c-format
-msgid "magic_load failed: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:986
-#, c-format
-msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
-msgstr ""
-
-#: build/rpmfc.c:1166
-#, c-format
-msgid "Finding  %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
-#, c-format
-msgid "Failed to find %s:\n"
-msgstr ""
-
-#: build/spec.c:404
-#, c-format
-msgid "query of specfile %s failed, can't parse\n"
-msgstr ""
-
-#: lib/cpio.c:364
-#, c-format
-msgid "(error 0x%x)"
-msgstr ""
-
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr ""
-
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr ""
-
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr ""
-
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr ""
-
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr ""
-
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr ""
-
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr ""
-
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr ""
-
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr ""
-
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr ""
-
-#: lib/depends.c:68
-#, c-format
-msgid "%s is a Delta RPM and cannot be directly installed\n"
-msgstr ""
-
-#: lib/depends.c:72
-#, c-format
-msgid "Unsupported payload (%s) in package %s\n"
-msgstr ""
-
-#: lib/depends.c:348
-#, c-format
-msgid "package %s was already added, skipping %s\n"
-msgstr ""
-
-#: lib/depends.c:349
-#, c-format
-msgid "package %s was already added, replacing with %s\n"
-msgstr ""
-
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
-msgid "(not a number)"
-msgstr ""
-
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
-msgstr ""
-
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
-msgstr ""
-
-#: lib/formats.c:314
-msgid "(not base64)"
-msgstr ""
-
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr ""
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr ""
-
-#: lib/formats.c:384
-msgid "(invalid xml type)"
-msgstr ""
-
-#: lib/formats.c:434
-msgid "(not an OpenPGP signature)"
-msgstr ""
-
-#: lib/formats.c:446
-#, c-format
-msgid "Invalid date %u"
-msgstr ""
-
-#: lib/formats.c:512
-msgid "normal"
-msgstr ""
-
-#: lib/formats.c:515
-msgid "replaced"
-msgstr ""
-
-#: lib/formats.c:518
-msgid "not installed"
-msgstr ""
-
-#: lib/formats.c:521
-msgid "net shared"
-msgstr ""
-
-#: lib/formats.c:524
-msgid "wrong color"
-msgstr ""
-
-#: lib/formats.c:527
-msgid "missing"
-msgstr ""
-
-#: lib/formats.c:530
-msgid "(unknown)"
-msgstr ""
-
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
-#, c-format
-msgid "%s saved as %s\n"
-msgstr ""
-
-#: lib/fsm.c:1543
-#, c-format
-msgid "%s created as %s\n"
-msgstr ""
-
-#: lib/fsm.c:1845
-#, c-format
-msgid "%s %s: remove failed: %s\n"
-msgstr ""
-
-#: lib/fsm.c:1846
-msgid "directory"
-msgstr ""
-
-#: lib/fsm.c:1846
-msgid "file"
-msgstr ""
-
-#: lib/package.c:146
-#, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr ""
-
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr ""
-
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr ""
-
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr ""
-
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr ""
-
-#: lib/package.c:296
-#, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr ""
-
-#: lib/package.c:322 lib/signature.c:142
-#, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:331 lib/signature.c:151
-#, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:358 lib/signature.c:185
-#, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr ""
-
-#: lib/package.c:427
-#, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr ""
-
-#: lib/package.c:436
-#, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/package.c:452
-#, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr ""
-
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr ""
-
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
-msgstr ""
-
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr ""
-
-#: lib/package.c:629 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
-#, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr ""
-
-#: lib/poptALL.c:157
-msgid "predefine MACRO with value EXPR"
-msgstr ""
-
-#: lib/poptALL.c:158 lib/poptALL.c:161
-msgid "'MACRO EXPR'"
-msgstr ""
-
-#: lib/poptALL.c:160
-msgid "define MACRO with value EXPR"
-msgstr ""
-
-#: lib/poptALL.c:163
-msgid "print macro expansion of EXPR"
-msgstr ""
-
-#: lib/poptALL.c:164
-msgid "'EXPR'"
-msgstr ""
-
-#: lib/poptALL.c:166 lib/poptALL.c:180
-msgid "read <FILE:...> instead of default file(s)"
-msgstr ""
-
-#: lib/poptALL.c:167 lib/poptALL.c:181
-msgid "<FILE:...>"
-msgstr ""
-
-#: lib/poptALL.c:170
-msgid "don't verify package digest(s)"
-msgstr ""
-
-#: lib/poptALL.c:172
-msgid "don't verify database header(s) when retrieved"
-msgstr ""
-
-#: lib/poptALL.c:174
-msgid "don't verify package signature(s)"
-msgstr ""
-
-#: lib/poptALL.c:177
-msgid "send stdout to CMD"
-msgstr ""
-
-#: lib/poptALL.c:178
-msgid "CMD"
-msgstr ""
-
-#: lib/poptALL.c:183
-msgid "use ROOT as top level directory"
-msgstr ""
-
-#: lib/poptALL.c:184
-msgid "ROOT"
-msgstr ""
-
-#: lib/poptALL.c:186
-msgid "use database in DIRECTORY"
-msgstr ""
-
-#: lib/poptALL.c:187
-msgid "DIRECTORY"
-msgstr ""
-
-#: lib/poptALL.c:190
-msgid "display known query tags"
-msgstr ""
-
-#: lib/poptALL.c:192
-msgid "display final rpmrc and macro configuration"
-msgstr ""
-
-#: lib/poptALL.c:194
-msgid "provide less detailed output"
-msgstr ""
-
-#: lib/poptALL.c:196
-msgid "provide more detailed output"
-msgstr ""
-
-#: lib/poptALL.c:198
-msgid "print the version of rpm being used"
-msgstr ""
-
-#: lib/poptALL.c:204
-msgid "debug payload file state machine"
-msgstr ""
-
-#: lib/poptALL.c:210
-msgid "debug rpmio I/O"
-msgstr ""
-
-#: lib/poptALL.c:277
-#, c-format
-msgid "%s: option table misconfigured (%d)\n"
-msgstr ""
-
-#: lib/poptI.c:52
-msgid "exclude paths must begin with a /"
-msgstr ""
-
-#: lib/poptI.c:64
-msgid "relocations must begin with a /"
-msgstr ""
-
-#: lib/poptI.c:67
-msgid "relocations must contain a ="
-msgstr ""
-
-#: lib/poptI.c:70
-msgid "relocations must have a / following the ="
-msgstr ""
-
-#: lib/poptI.c:114
-msgid ""
-"install all files, even configurations which might otherwise be skipped"
-msgstr ""
-
-#: lib/poptI.c:118
-msgid ""
-"remove all packages which match <package> (normally an error is generated if"
-" <package> specified multiple packages)"
-msgstr ""
-
-#: lib/poptI.c:123
-msgid "relocate files in non-relocatable package"
-msgstr ""
-
-#: lib/poptI.c:127
-msgid "print dependency loops as warning"
-msgstr ""
-
-#: lib/poptI.c:131
-msgid "erase (uninstall) package"
-msgstr ""
-
-#: lib/poptI.c:131
-msgid "<package>+"
-msgstr ""
-
-#: lib/poptI.c:134 lib/poptI.c:171
-msgid "do not install configuration files"
-msgstr ""
-
-#: lib/poptI.c:137 lib/poptI.c:176
-msgid "do not install documentation"
-msgstr ""
-
-#: lib/poptI.c:139
-msgid "skip files with leading component <path> "
-msgstr ""
-
-#: lib/poptI.c:140
-msgid "<path>"
-msgstr ""
-
-#: lib/poptI.c:143
-msgid "short hand for --replacepkgs --replacefiles"
-msgstr ""
-
-#: lib/poptI.c:147
-msgid "upgrade package(s) if already installed"
-msgstr ""
-
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
-msgid "<packagefile>+"
-msgstr ""
-
-#: lib/poptI.c:150
-msgid "print hash marks as package installs (good with -v)"
-msgstr ""
-
-#: lib/poptI.c:153
-msgid "don't verify package architecture"
-msgstr ""
-
-#: lib/poptI.c:156
-msgid "don't verify package operating system"
-msgstr ""
-
-#: lib/poptI.c:159
-msgid "don't check disk space before installing"
-msgstr ""
-
-#: lib/poptI.c:161
-msgid "install documentation"
-msgstr ""
-
-#: lib/poptI.c:164
-msgid "install package(s)"
-msgstr ""
-
-#: lib/poptI.c:167
-msgid "update the database, but do not modify the filesystem"
-msgstr ""
-
-#: lib/poptI.c:173
-msgid "do not verify package dependencies"
-msgstr ""
-
-#: lib/poptI.c:179 lib/poptQV.c:204 lib/poptQV.c:206
-msgid "don't verify digest of files"
-msgstr ""
-
-#: lib/poptI.c:181
-msgid "don't verify digest of files (obsolete)"
-msgstr ""
-
-#: lib/poptI.c:183
-msgid "don't install file security contexts"
-msgstr ""
-
-#: lib/poptI.c:187
-msgid "do not reorder package installation to satisfy dependencies"
-msgstr ""
-
-#: lib/poptI.c:191
-msgid "do not execute package scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:195
-#, c-format
-msgid "do not execute %%pre scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:198
-#, c-format
-msgid "do not execute %%post scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:201
-#, c-format
-msgid "do not execute %%preun scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:204
-#, c-format
-msgid "do not execute %%postun scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:207
-msgid "do not execute any scriptlet(s) triggered by this package"
-msgstr ""
-
-#: lib/poptI.c:210
-#, c-format
-msgid "do not execute any %%triggerprein scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:213
-#, c-format
-msgid "do not execute any %%triggerin scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:216
-#, c-format
-msgid "do not execute any %%triggerun scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:219
-#, c-format
-msgid "do not execute any %%triggerpostun scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
-msgid ""
-"upgrade to an old version of the package (--force on upgrades does this "
-"automatically)"
-msgstr ""
-
-#: lib/poptI.c:231
-msgid "print percentages as package installs"
-msgstr ""
-
-#: lib/poptI.c:233
-msgid "relocate the package to <dir>, if relocatable"
-msgstr ""
-
-#: lib/poptI.c:234
-msgid "<dir>"
-msgstr ""
-
-#: lib/poptI.c:236
-msgid "relocate files from path <old> to <new>"
-msgstr ""
-
-#: lib/poptI.c:237
-msgid "<old>=<new>"
-msgstr ""
-
-#: lib/poptI.c:240
-msgid "ignore file conflicts between packages"
-msgstr ""
-
-#: lib/poptI.c:243
-msgid "reinstall if the package is already present"
-msgstr ""
-
-#: lib/poptI.c:245
-msgid "don't install, but tell if it would work or not"
-msgstr ""
-
-#: lib/poptI.c:248
-msgid "upgrade package(s)"
-msgstr ""
-
-#: lib/poptQV.c:67
-msgid "query/verify all packages"
-msgstr ""
-
-#: lib/poptQV.c:69
-msgid "rpm checksig mode"
-msgstr ""
-
-#: lib/poptQV.c:71
-msgid "query/verify package(s) owning file"
-msgstr ""
-
-#: lib/poptQV.c:73
-msgid "query/verify package(s) in group"
-msgstr ""
-
-#: lib/poptQV.c:75
-msgid "query/verify a package file"
-msgstr ""
-
-#: lib/poptQV.c:78
-msgid "query/verify package(s) with package identifier"
-msgstr ""
-
-#: lib/poptQV.c:80
-msgid "query/verify package(s) with header identifier"
-msgstr ""
-
-#: lib/poptQV.c:83
-msgid "rpm query mode"
-msgstr ""
-
-#: lib/poptQV.c:85
-msgid "query/verify a header instance"
-msgstr ""
-
-#: lib/poptQV.c:87
-msgid "query/verify package(s) from install transaction"
-msgstr ""
-
-#: lib/poptQV.c:89
-msgid "query the package(s) triggered by the package"
-msgstr ""
-
-#: lib/poptQV.c:91
-msgid "rpm verify mode"
-msgstr ""
-
-#: lib/poptQV.c:93
-msgid "query/verify the package(s) which require a dependency"
-msgstr ""
-
-#: lib/poptQV.c:95
-msgid "query/verify the package(s) which provide a dependency"
-msgstr ""
-
-#: lib/poptQV.c:98
-msgid "do not glob arguments"
-msgstr ""
-
-#: lib/poptQV.c:100
-msgid "do not process non-package files as manifests"
-msgstr ""
-
-#: lib/poptQV.c:171
-msgid "list all configuration files"
-msgstr ""
-
-#: lib/poptQV.c:173
-msgid "list all documentation files"
-msgstr ""
-
-#: lib/poptQV.c:175
-msgid "dump basic file information"
-msgstr ""
-
-#: lib/poptQV.c:179
-msgid "list files in package"
-msgstr ""
-
-#: lib/poptQV.c:184
-#, c-format
-msgid "skip %%ghost files"
-msgstr ""
-
-#: lib/poptQV.c:191
-msgid "display the states of the listed files"
-msgstr ""
-
-#: lib/poptQV.c:209
-msgid "don't verify size of files"
-msgstr ""
-
-#: lib/poptQV.c:212
-msgid "don't verify symlink path of files"
-msgstr ""
-
-#: lib/poptQV.c:215
-msgid "don't verify owner of files"
-msgstr ""
-
-#: lib/poptQV.c:218
-msgid "don't verify group of files"
-msgstr ""
-
-#: lib/poptQV.c:221
-msgid "don't verify modification time of files"
-msgstr ""
-
-#: lib/poptQV.c:224 lib/poptQV.c:227
-msgid "don't verify mode of files"
-msgstr ""
-
-#: lib/poptQV.c:230
-msgid "don't verify capabilities of files"
-msgstr ""
-
-#: lib/poptQV.c:233
-msgid "don't verify file security contexts"
-msgstr ""
-
-#: lib/poptQV.c:235
-msgid "don't verify files in package"
-msgstr ""
-
-#: lib/poptQV.c:237 tools/rpmgraph.c:218
-msgid "don't verify package dependencies"
-msgstr ""
-
-#: lib/poptQV.c:240 lib/poptQV.c:243
-msgid "don't execute verify script(s)"
-msgstr ""
-
-#: lib/psm.c:212
-#, c-format
-msgid "Missing rpmlib features for %s:\n"
-msgstr ""
-
-#: lib/psm.c:254
-msgid "source package expected, binary found\n"
-msgstr ""
-
-#: lib/psm.c:307
-msgid "source package contains no .spec file\n"
-msgstr ""
-
-#: lib/psm.c:836
-#, c-format
-msgid "unpacking of archive failed%s%s: %s\n"
-msgstr ""
-
-#: lib/psm.c:837
-msgid " on file "
-msgstr ""
-
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
-#, c-format
-msgid "incorrect format: %s\n"
-msgstr ""
-
-#: lib/query.c:123
-msgid "(contains no files)\n"
-msgstr ""
-
-#: lib/query.c:156
-msgid "normal        "
-msgstr ""
-
-#: lib/query.c:159
-msgid "replaced      "
-msgstr ""
-
-#: lib/query.c:162
-msgid "not installed "
-msgstr ""
-
-#: lib/query.c:165
-msgid "net shared    "
-msgstr ""
-
-#: lib/query.c:168
-msgid "wrong color   "
-msgstr ""
-
-#: lib/query.c:171
-msgid "(no state)    "
-msgstr ""
-
-#: lib/query.c:174
-#, c-format
-msgid "(unknown %3d) "
-msgstr ""
-
-#: lib/query.c:194
-msgid "package has not file owner/group lists\n"
-msgstr ""
-
-#: lib/query.c:225
-msgid "package has neither file owner or id lists\n"
-msgstr ""
-
-#: lib/query.c:314
-#, c-format
-msgid "group %s does not contain any packages\n"
-msgstr ""
-
-#: lib/query.c:321
-#, c-format
-msgid "no package triggers %s\n"
-msgstr ""
-
-#: lib/query.c:332 lib/query.c:351 lib/query.c:367
-#, c-format
-msgid "malformed %s: %s\n"
-msgstr ""
-
-#: lib/query.c:342 lib/query.c:357 lib/query.c:372
-#, c-format
-msgid "no package matches %s: %s\n"
-msgstr ""
-
-#: lib/query.c:380
-#, c-format
-msgid "no package requires %s\n"
-msgstr ""
-
-#: lib/query.c:388
-#, c-format
-msgid "no package provides %s\n"
-msgstr ""
-
-#: lib/query.c:420
-#, c-format
-msgid "file %s: %s\n"
-msgstr ""
-
-#: lib/query.c:423
-#, c-format
-msgid "file %s is not owned by any package\n"
-msgstr ""
-
-#: lib/query.c:434
-#, c-format
-msgid "invalid package number: %s\n"
-msgstr ""
-
-#: lib/query.c:441
-#, c-format
-msgid "record %u could not be read\n"
-msgstr ""
-
-#: lib/query.c:454 lib/rpminstall.c:654
-#, c-format
-msgid "package %s is not installed\n"
-msgstr ""
-
-#: lib/query.c:488
-#, c-format
-msgid "unknown tag: \"%s\"\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:44
-#, c-format
-msgid "%s: key %d import failed.\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:48
-#, c-format
-msgid "%s: key %d not an armored public key.\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:93
-#, c-format
-msgid "%s: import read failed(%d).\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:119
-#, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
-msgstr ""
-
-#: lib/rpmchecksig.c:386
-msgid "OK"
-msgstr ""
-
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr ""
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ""
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr ""
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ""
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
-#, c-format
-msgid "%s: open failed: %s\n"
-msgstr ""
-
-#: lib/rpmchroot.c:43
-#, c-format
-msgid "Unable to open current directory: %m\n"
-msgstr ""
-
-#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
-#, c-format
-msgid "%s: chroot directory not set\n"
-msgstr ""
-
-#: lib/rpmchroot.c:70
-#, c-format
-msgid "Unable to change root directory: %m\n"
-msgstr ""
-
-#: lib/rpmchroot.c:95
-#, c-format
-msgid "Unable to restore root directory: %m\n"
-msgstr ""
-
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr ""
-
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr ""
-
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr ""
-
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
-msgstr ""
-
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
-msgstr ""
-
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
-msgstr ""
-
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr ""
-
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr ""
-
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr ""
-
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr ""
-
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr ""
-
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr ""
-
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr ""
-
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr ""
-
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr ""
-
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr ""
-
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr ""
-
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
-msgstr ""
-
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
-msgstr ""
-
-#: lib/rpmgi.c:136
-#, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
-msgstr ""
-
-#: lib/rpminstall.c:141
-#, c-format
-msgid "Updating / installing...\n"
-msgstr ""
-
-#: lib/rpminstall.c:143
-#, c-format
-msgid "Cleaning up / removing...\n"
-msgstr ""
-
-#: lib/rpminstall.c:192
-msgid "Preparing..."
-msgstr ""
-
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
-msgstr ""
-
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
-msgstr ""
-
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
-msgstr ""
-
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
-msgstr ""
-
-#: lib/rpminstall.c:542
-#, c-format
-msgid "package %s is not relocatable\n"
-msgstr ""
-
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
-msgstr ""
-
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:706
-#, c-format
-msgid "Installing %s\n"
-msgstr ""
-
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
-msgstr ""
-
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
-msgstr ""
-
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
-msgstr ""
-
-#: lib/rpmlead.c:123
-#, c-format
-msgid "read failed: %s (%d)\n"
-msgstr ""
-
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
-msgstr ""
-
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
-msgstr ""
-
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
-msgstr ""
-
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
-msgstr ""
-
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
-msgstr ""
-
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr ""
-
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
-msgstr ""
-
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
-#: lib/rpmprob.c:109
-msgid "different"
-msgstr ""
-
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
-msgstr ""
-
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
-msgstr ""
-
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
-msgstr ""
-
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
-msgstr ""
-
-#: lib/rpmprob.c:130
-#, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
-msgstr ""
-
-#: lib/rpmprob.c:135
-#, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
-msgstr ""
-
-#: lib/rpmprob.c:140
-#, c-format
-msgid "package %s (which is newer than %s) is already installed"
-msgstr ""
-
-#: lib/rpmprob.c:145
-#, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
-msgstr ""
-
-#: lib/rpmprob.c:155
-#, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
-msgstr ""
-
-#: lib/rpmprob.c:159
-#, c-format
-msgid "%s is needed by %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
-msgstr ""
-
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
-msgstr ""
-
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr ""
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:494
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:511 lib/rpmrc.c:543
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:522
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr ""
-
-#: lib/rpmrc.c:535
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:602
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:926
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1348
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Please contact %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1590
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr ""
-
-#: lib/rpmts.c:192
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:210
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:218
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:278
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1085
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr ""
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1409
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1409
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr ""
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr ""
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr ""
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr ""
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr ""
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr ""
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr ""
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr ""
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr ""
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr ""
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr ""
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr ""
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ""
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr ""
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr ""
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr ""
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr ""
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr ""
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr ""
-
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr ""
-
-#: lib/rpmdb.c:2250
-#, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr ""
-
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr ""
-
-#: lib/rpmdb.c:2382
-#, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr ""
-
-#: lib/rpmdb.c:2448
-#, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr ""
-
-#: lib/rpmdb.c:2644
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr ""
-
-#: lib/rpmdb.c:2875
-#, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2910
-#, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr ""
-
-#: lib/rpmdb.c:2924
-#, c-format
-msgid "cannot add record originally at %u\n"
-msgstr ""
-
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr ""
-
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr ""
-
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr ""
-
-#: lib/rpmdb.c:2960
-#, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr ""
-
-#: lib/backend/db3.c:33
-#, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr ""
-
-#: lib/backend/db3.c:36
-#, c-format
-msgid "db%d error(%d): %s\n"
-msgstr ""
-
-#: lib/backend/db3.c:500
-#, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr ""
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr ""
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr ""
-
-#: lib/backend/db3.c:582
-#, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:144
-#, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:181
-#, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:190
-#, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:199
-#, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr ""
-
-#: plugins/sepolicy.c:218
-#, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:231
-#, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr ""
-
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr ""
-
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr ""
-
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
-msgstr ""
-
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
-#, c-format
-msgid "%s failed with exit code %i\n"
-msgstr ""
-
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr ""
-
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr ""
-
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
-
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
-
-#: plugins/sepolicy.c:594
-#, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr ""
-
-#: rpmio/macro.c:185
-#, c-format
-msgid "======================== active %d empty %d\n"
-msgstr ""
-
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
-msgstr ""
-
-#: rpmio/macro.c:364
-#, c-format
-msgid "%3d<%*s(empty)\n"
-msgstr ""
-
-#: rpmio/macro.c:537 rpmio/macro.c:575
-#, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr ""
-
-#: rpmio/macro.c:594
-#, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr ""
-
-#: rpmio/macro.c:600
-#, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr ""
-
-#: rpmio/macro.c:605
-#, c-format
-msgid "Macro %%%s has empty body\n"
-msgstr ""
-
-#: rpmio/macro.c:611
-#, c-format
-msgid "Macro %%%s failed to expand\n"
-msgstr ""
-
-#: rpmio/macro.c:649
-#, c-format
-msgid "Macro %%%s has illegal name (%%undefine)\n"
-msgstr ""
-
-#: rpmio/macro.c:743
-#, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr ""
-
-#: rpmio/macro.c:825
-#, c-format
-msgid "Unknown option %c in %s(%s)\n"
-msgstr ""
-
-#: rpmio/macro.c:1048
-msgid ""
-"Too many levels of recursion in macro expansion. It is likely caused by "
-"recursive macro declaration.\n"
-msgstr ""
-
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
-#, c-format
-msgid "Unterminated %c: %s\n"
-msgstr ""
-
-#: rpmio/macro.c:1175
-#, c-format
-msgid "A %% is followed by an unparseable macro\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:245
-#, c-format
-msgid "error creating temporary file %s: %m\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
-#, c-format
-msgid "File %s: %s\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:319
-#, c-format
-msgid "File %s is smaller than %u bytes\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr ""
-
-#: rpmio/rpmlua.c:506
-#, c-format
-msgid "invalid syntax in lua scriptlet: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:522
-#, c-format
-msgid "invalid syntax in lua script: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
-#, c-format
-msgid "lua script failed: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:541
-#, c-format
-msgid "invalid syntax in lua file: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:709
-#, c-format
-msgid "lua hook failed: %s\n"
-msgstr ""
-
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr ""
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr ""
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr ""
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr ""
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr ""
-
-#: rpmio/rpmmalloc.c:25
-#, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr ""
-
-#: rpmio/rpmpgp.c:1008
-#, c-format
-msgid "V%d %s/%s %s, key ID %s"
-msgstr ""
-
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
-msgstr ""
-
-#: sign/rpmgensig.c:87
-#, c-format
-msgid "%s: Fwrite failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:97
-#, c-format
-msgid "%s: Fflush failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:125
-msgid "Unsupported PGP signature\n"
-msgstr ""
-
-#: sign/rpmgensig.c:131
-#, c-format
-msgid "Unsupported PGP hash algorithm %u\n"
-msgstr ""
-
-#: sign/rpmgensig.c:144
-#, c-format
-msgid "Unsupported PGP pubkey algorithm %u\n"
-msgstr ""
-
-#: sign/rpmgensig.c:174
-#, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr ""
-
-#: sign/rpmgensig.c:216
-#, c-format
-msgid "gpg exec failed (%d)\n"
-msgstr ""
-
-#: sign/rpmgensig.c:246
-msgid "gpg failed to write signature\n"
-msgstr ""
-
-#: sign/rpmgensig.c:263
-msgid "unable to read the signature\n"
-msgstr ""
-
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
-msgid "rpmMkTemp failed\n"
-msgstr ""
-
-#: sign/rpmgensig.c:501
-#, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr ""
-
-#: sign/rpmgensig.c:525
-#, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:531
-#, c-format
-msgid "%s: rpmWriteSignature failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:545
-#, c-format
-msgid "replacing %s failed: %s\n"
-msgstr ""
-
-#: tools/rpmgraph.c:142
-#, c-format
-msgid "%s: read manifest failed: %s\n"
-msgstr ""
-
-#: tools/rpmgraph.c:220
-msgid "don't verify header+payload signature"
-msgstr ""
index 02f77315203749c4f98575bb4fbca44ab8100b49..16c7daad58e5c61148e73fdc6e46f421d72da141 100644 (file)
--- a/po/br.po
+++ b/po/br.po
@@ -3,15 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Thierry Vignaud <thierry.vignaud@gmail.com>, 2012.
+# Thierry Vignaud <thierry.vignaud@gmail.com>, 2012,2015,2017
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-12-19 10:54+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Breton (http://www.transifex.com/rpm-team/rpm/language/br/)\n"
 "Language: br\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -44,962 +44,1097 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "sac'het eo bet seveniñ\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
-msgstr ""
+msgstr "an arguzenn n'eo ket ur pakad RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr ""
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr ""
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr ""
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr ""
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr ""
-
-#: rpmqv.c:128
-msgid "unexpected query format"
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
 msgstr ""
 
-#: rpmqv.c:131
-msgid "unexpected query source"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr ""
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
+msgstr "<restr_spec>"
 
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
 msgstr ""
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
 msgstr ""
 
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:170
+#: rpmbuild.c:161
+#, c-format
 msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<pakad tarzh>"
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
 
-#: rpmqv.c:230
+#: rpmbuild.c:167 rpmbuild.c:208
 msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr ""
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "n'eus pakad evet da lemel"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "n'eus pakad evet da staliañ"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr ""
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr ""
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr ""
-
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr ""
-
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
 
-#: rpmbuild.c:129
+#: rpmbuild.c:170
 #, c-format
-msgid "verify %files section from <specfile>"
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
-msgstr ""
+msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr ""
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<pakad tarzh>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
+#: rpmbuild.c:212
+msgid "override build root"
 msgstr ""
 
-#: rpmbuild.c:171
-msgid "override build root"
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
 
-#: rpmbuild.c:173
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr ""
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr ""
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr ""
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr ""
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr ""
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr ""
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr ""
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr ""
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr ""
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr ""
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr ""
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
-msgstr ""
+msgstr "Fazi en un adenvel %s da %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
-msgstr ""
+msgstr "Sac'het eo bet stat %s :\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
-msgstr ""
+msgstr "%s n'eo ket ur restr reizh\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr ""
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr ""
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr ""
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr ""
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr ""
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr ""
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
+msgstr "Dibaboù ar stlennvon:"
+
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
 msgstr ""
 
-#: rpmkeys.c:24
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
-msgstr ""
+msgstr "n'eo ket bet roet arguzenn ebet"
 
-#: rpmsign.c:25
-msgid "sign package(s)"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
 msgstr ""
 
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
 msgstr ""
 
-#: rpmsign.c:29
-msgid "delete package signatures"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
 msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "N'hell ket bet sevenet %s : %s\n"
-
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
 msgstr ""
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
+#: rpmqv.c:126
+msgid "unexpected query flags"
 msgstr ""
 
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
+#: rpmqv.c:129
+msgid "unexpected query format"
 msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmqv.c:132
+msgid "unexpected query source"
 msgstr ""
 
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
 msgstr ""
 
-#: rpmspec.c:28
-msgid "query spec file(s)"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
 msgstr ""
 
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
 msgstr ""
 
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
-msgid "use the following query format"
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
 msgstr ""
 
-#: rpmspec.c:45
-msgid "Spec options:"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
 msgstr ""
 
-#: rpmspec.c:90
-msgid "no arguments given for parse"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
 msgstr ""
 
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
 msgstr ""
 
-#: build/build.c:126
-#, c-format
-msgid "Unable to open stream: %s\n"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:161
-#, c-format
-msgid "Executing(%s): %s\n"
-msgstr "O seveniñ(%s) : %s\n"
-
-#: build/build.c:168
-#, c-format
-msgid "Exec of %s failed (%s): %s\n"
-msgstr "Sac'het eo bet seveniñ %s (%s) : %s\n"
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr ""
 
-#: build/build.c:177
-#, c-format
-msgid "Error executing scriptlet %s (%s)\n"
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:184
-#, c-format
-msgid "Bad exit status from %s (%s)\n"
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
 msgstr ""
 
-#: build/build.c:291
-msgid ""
-"\n"
-"\n"
-"RPM build errors:\n"
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
 msgstr ""
 
-#: build/expression.c:216
-msgid "syntax error while parsing ==\n"
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
 msgstr ""
 
-#: build/expression.c:246
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "n'eus pakad ebet da lemel"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "n'eus pakad ebet da staliañ"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr ""
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr ""
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr "sinañ pakad(où)"
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr "sinañ pakad(où) (evel --addsign)"
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr "lemel sinadurioù pakad"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "Dibaboù ar sinadur:"
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr ""
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr ""
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr ""
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr ""
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr ""
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr ""
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr "Dibaboù Spec :"
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr ""
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr ""
+
+#: build/build.c:125
+#, c-format
+msgid "Unable to open stream: %s\n"
+msgstr ""
+
+#: build/build.c:158
+#, c-format
+msgid "Executing(%s): %s\n"
+msgstr "O seveniñ(%s) : %s\n"
+
+#: build/build.c:163
+#, c-format
+msgid "Exec of %s failed (%s): %s\n"
+msgstr "Sac'het eo bet seveniñ %s (%s) : %s\n"
+
+#: build/build.c:172
+#, c-format
+msgid "Error executing scriptlet %s (%s)\n"
+msgstr ""
+
+#: build/build.c:178
+#, c-format
+msgid "Bad exit status from %s (%s)\n"
+msgstr ""
+
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
+msgid ""
+"\n"
+"\n"
+"RPM build errors:\n"
+msgstr ""
+
+#: build/expression.c:215
+msgid "syntax error while parsing ==\n"
+msgstr ""
+
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr ""
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr ""
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr ""
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr ""
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr ""
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr ""
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr ""
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr ""
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
-msgstr ""
+msgstr "Mankout a ra '(' e %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
-msgstr ""
+msgstr "Mankout a ra ')' e %s %s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr ""
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr ""
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr ""
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "N'eo ket bet kavet ar renkell : %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "N'eo ket bet kavet ar rstr : %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "N'eo ket ur renkell: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "linenn : %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "Fazi en ur lenn %%files eus ar restr %s : %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr "Muioc'h evit ur restr war ul linenn : %s\n"
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "N'eo ket ur restr mat : %s : %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr ""
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "N'hell ket bet digoret ar restr %s : %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s : linenn : %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
 msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
 msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Fazi en un adenvel %s da %s: %m\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "N'hell ket bet digoret ar restr %s : %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
-msgstr ""
-
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr ""
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr ""
+msgstr "N'hell ket bet skrivet ar pakad: %s\n"
 
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
-msgstr ""
+msgstr "Skrivet: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "O seveniñ « %s » :\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Sac'het eo bet seveniñ « %s ».\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Sac'het eo bet ar gwiriekaat pakad « %s ».\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "n'hell ket bet krouet %s : %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "linenn %d : re a anvioù : %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "linenn %d : n'eus ket eus ar pakad-se : %s\n"
-
-#: build/parseDescription.c:74
+#: build/parseFiles.c:33
 #, c-format
-msgid "line %d: Second description\n"
+msgid "line %d: Error parsing %%files: %s\n"
 msgstr ""
 
-#: build/parseFiles.c:33
+#: build/parseFiles.c:73
 #, c-format
-msgid "line %d: Error parsing %%files: %s\n"
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
@@ -1007,341 +1142,410 @@ msgstr ""
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
-msgstr ""
+msgstr "O pellgargañ %s da %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr ""
+msgid "%s in: %s\n"
+msgstr "%s e: %s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s : %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr ""
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr ""
+
+#: build/parseReqs.c:232 build/parseReqs.c:307
+msgid "invalid dependency"
+msgstr ""
+
+#: build/parseReqs.c:267 lib/rpmds.c:1470
 msgid "Version required"
 msgstr "Ret eo e vede ur stumm"
 
-#: build/parseReqs.c:165
-msgid "invalid dependency"
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr "linenn %d : %s : %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr ""
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "linenn %d : %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "fazi en ur zigeriñ %s : %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr ""
+
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr ""
@@ -1412,450 +1616,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "N'hell bet bet sevenet %s : %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "sac'het eo bet %s : %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "sac'het eo bet magic_open(0x%x) : %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "sac'het eo bet magic_load : %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "O klask  %s : %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Sac'het eo bet klask %s :\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(fazi 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
 msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
 msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "n'hellan ket krouiliñ %s war %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "rannet"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
 msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
 msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " sac'het - "
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "Un Delta RPM eo %s neuez ne c'hell ket bezañ staliet\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "Bet eo ouzhpennet ar pakad %s dija, o tremen e-biou %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "Bet eo ouzhpennet ar pakad %s dija, o erlec'hiañ gant %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(n'eo ket un niverenn)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr ""
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr ""
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr ""
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr ""
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "reizh"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "erlec'hiet"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "ket staliet"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "ket rannet"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "mankout a ra"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(dianav)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr "%s %s : sac'het eo bet lemel : %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr "renkell"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr "restr"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
+
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s : sac'het eo bet rpmReadSignature : %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s : n'eus sinadur ebet\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s : sac'het eo bet headerRead : %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr ""
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr ""
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr ""
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr ""
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr ""
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr ""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s : sac'het eo bet Fread : %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
-msgstr ""
+msgstr "URZH"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
-msgstr ""
+msgstr "RENKEL"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr ""
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr ""
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr ""
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr ""
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr ""
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1876,527 +2191,576 @@ msgstr ""
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "lemel (distaliañ) ar pakad"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<pakad>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "na stal ket ar restroù kefluniadur"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "na stal ket an teuliadur"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<hent>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<restr_pakad>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr ""
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr ""
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "Stal teuliadur"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "Staliañ pakad(où)"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr ""
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr ""
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr ""
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr ""
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr ""
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr ""
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr ""
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr ""
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr ""
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr ""
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/poptQV.c:176
+#: lib/poptQV.c:197
 msgid "list all license files"
 msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+msgid "list all artifact files"
+msgstr ""
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr ""
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "o tremen e-biou ar restroù %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "o tremen e-biou ar restroù %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr ""
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr ""
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr ""
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr ""
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr ""
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr ""
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr ""
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " war restr "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "sac'het eo bet %s war ar restr %s : %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "sac'het eo bet %s : %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr ""
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "reizh         "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "erlec'hiet    "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "ket staliet   "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr ""
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(stat ebet)   "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr ""
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr ""
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr ""
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr ""
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr ""
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr ""
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr ""
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr ""
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr ""
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr "%s : sac'het eo bet headerRead : %s\n"
-
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
-msgstr "KET MAT"
-
-#: lib/rpmchecksig.c:386
-msgid "OK"
-msgstr "MAT"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ""
-msgstr ""
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
+msgstr "KET MAT"
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:268
+msgid "OK"
+msgstr "MAT"
+
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s : sac'het eo bet digeriñ : %s\n"
@@ -2421,1075 +2785,1141 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr "KET"
-
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr "YA"
-
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
-msgstr ""
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader : o tremen e-biou"
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr ""
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s : sac'het eo bet regexec : %s\n"
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr ""
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s : sac'het eo bet regcomp : %s\n"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr ""
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator : o tremen e-biou"
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmdb.c:2520
 #, c-format
-msgid "open of %s failed: %s\n"
+msgid "failed to create directory %s: %s\n"
 msgstr ""
 
-#: lib/rpmgi.c:136
+#: lib/rpmdb.c:2557
 #, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpmdb.c:2572
 #, c-format
-msgid "Updating / installing...\n"
-msgstr "O vremañaat / o staliañ ...\n"
+msgid "cannot add record originally at %u\n"
+msgstr ""
 
-#: lib/rpminstall.c:143
-#, c-format
-msgid "Cleaning up / removing...\n"
-msgstr "O naetaat / O lemel ...\n"
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
-msgstr "O prientiñ ..."
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr ""
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
-msgstr "O prientiñ ar pakadoù ..."
+#: lib/rpmds.c:744
+msgid "NO "
+msgstr "KET"
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
-msgstr "Sujedigezh sac'het :\n"
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "YA"
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
-msgstr "O tegas %s\n"
-
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpminstall.c:542
-#, c-format
-msgid "package %s is not relocatable\n"
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
-msgstr "fazi en ur lenn eus ar restr %s\n"
-
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
 msgstr ""
 
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "N'hell ket bet digoret %s : %s\n"
-
-#: lib/rpminstall.c:706
-#, c-format
-msgid "Installing %s\n"
-msgstr "O staliañ %s\n"
-
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
-msgstr "n'eo ket ur pakad rpm"
-
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
 msgstr ""
 
-#: lib/rpmlead.c:123
-#, c-format
-msgid "read failed: %s (%d)\n"
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
 msgstr ""
 
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
-msgstr "o c'hortoz evit krouiliñ %s war %s\n"
-
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
-msgstr "Sac'het eo bet dlopen %s %s\n"
-
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmprob.c:109
-msgid "different"
-msgstr "disheñvel"
-
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
-msgstr "Staliet eo dija ar pakad %s"
-
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmprob.c:130
-#, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpmprob.c:135
-#, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpmprob.c:140
+#: lib/rpmds.c:1410
 #, c-format
-msgid "package %s (which is newer than %s) is already installed"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpmprob.c:145
-#, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpmprob.c:155
-#, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpmprob.c:159
-#, c-format
-msgid "%s is needed by %s%s"
-msgstr "%s a zo un ezhomm eus %s%s"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
-msgstr "(staliet)"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
 
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpmrc.c:194
+#: lib/rpmds.c:1544
 #, c-format
-msgid "missing second ':' at %s:%d\n"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmrc.c:354
+#: lib/rpmfi.c:810
 #, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:385
+#: lib/rpmfi.c:817
 #, c-format
-msgid "Incomplete default line at %s:%d\n"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:390
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "Too many args in default line at %s:%d\n"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmrc.c:495
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
 msgstr ""
 
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr "N'hell ket bet digoret %s e %s:%d : %m\n"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr ""
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
 msgstr ""
 
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
 msgstr ""
 
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "N'hell ket bet digoret %s evit lenn : %m.\n"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr ""
 
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmscript.c:221
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " sac'het - "
+
+#: lib/rpmfi.c:2392
 #, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmscript.c:248
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgid "open of %s failed: %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:272
+#: lib/rpmgi.c:144
 #, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:276
+#: lib/rpmgi.c:155
 #, c-format
-msgid "%s scriptlet failed, signal %d\n"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmscript.c:279
+#: lib/rpminstall.c:142
 #, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
+msgid "Updating / installing...\n"
+msgstr "O vremañaat / o staliañ ...\n"
 
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Furmad dianav"
+#: lib/rpminstall.c:144
+#, c-format
+msgid "Cleaning up / removing...\n"
+msgstr "O naetaat / O lemel ...\n"
 
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "staliañ"
+#: lib/rpminstall.c:193
+msgid "Preparing..."
+msgstr "O prientiñ ..."
 
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "lemel"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
+msgstr "O prientiñ ar pakadoù ..."
 
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "N'hell ket bet digoret stlennvon ar pakadoù e %s\n"
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
+msgstr "Sujedigezh sac'het :\n"
 
-#: lib/rpmts.c:191
+#: lib/rpminstall.c:323
 #, c-format
-msgid "extra '(' in package label: %s\n"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpmts.c:209
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "missing '(' in package label: %s\n"
+msgid "%s cannot be installed\n"
 msgstr ""
 
-#: lib/rpmts.c:217
+#: lib/rpminstall.c:490
 #, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
+msgid "Retrieving %s\n"
+msgstr "O tegas %s\n"
 
-#: lib/rpmts.c:273
+#: lib/rpminstall.c:502
 #, c-format
-msgid "%s: reading of public key failed.\n"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "gra"
-
-#: lib/signature.c:90
+#: lib/rpminstall.c:572
 #, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/signature.c:101
+#: lib/rpminstall.c:603
 #, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
+msgid "error reading from file %s\n"
+msgstr "fazi en ur lenn eus ar restr %s\n"
 
-#: lib/signature.c:107
+#: lib/rpminstall.c:697
 #, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/signature.c:123
+#: lib/rpminstall.c:736
 #, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
+msgid "cannot open %s: %s\n"
+msgstr "N'hell ket bet digoret %s : %s\n"
 
-#: lib/signature.c:196
+#: lib/rpminstall.c:742
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
+msgid "Installing %s\n"
+msgstr "O staliañ %s\n"
+
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
+msgstr "n'eo ket ur pakad rpm"
 
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpmlead.c:118
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
+msgid "read failed: %s (%d)\n"
 msgstr ""
 
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
+#, c-format
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
+#: lib/rpmlock.c:133
+#, c-format
+msgid "waiting for %s lock on %s\n"
+msgstr "o c'hortoz evit krouiliñ %s war %s\n"
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
+#: lib/rpmplugins.c:65
+#, c-format
+msgid "Failed to dlopen %s %s\n"
+msgstr "Sac'het eo bet dlopen %s %s\n"
 
-#: lib/signature.c:489
-msgid "Header "
+#: lib/rpmplugins.c:73
+#, c-format
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/signature.c:530
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "tremenet en e biou"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "sac'het"
-
-#: lib/verify.c:372
+#: lib/rpmplugins.c:199
 #, c-format
-msgid "missing   %c %s"
-msgstr "mankout a ra  %c %s"
+msgid "Plugin %s not loaded\n"
+msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmprob.c:109
+msgid "different"
+msgstr "disheñvel"
+
+#: lib/rpmprob.c:114
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/headerfmt.c:336
-msgid "invalid field width"
+#: lib/rpmprob.c:118
+#, c-format
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr ""
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
+msgstr "Staliet eo dija ar pakad %s"
 
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
+#: lib/rpmprob.c:125
+#, c-format
+msgid "path %s in package %s is not relocatable"
 msgstr ""
 
-#: lib/headerfmt.c:375
-msgid "empty tag format"
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/headerfmt.c:386
-msgid "empty tag name"
+#: lib/rpmprob.c:135
+#, c-format
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/headerfmt.c:393
-msgid "unknown tag"
+#: lib/rpmprob.c:140
+#, c-format
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
+#: lib/rpmprob.c:145
+#, c-format
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
+#: lib/rpmprob.c:155
+#, c-format
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr ""
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
+msgstr "%s a zo un ezhomm eus %s%s"
 
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr ""
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
+msgstr "(staliet)"
 
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
+#: lib/rpmprob.c:163
+#, c-format
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
+#: lib/rpmprob.c:167
+#, c-format
+msgid "%s is obsoleted by %s%s"
 msgstr ""
 
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
+#: lib/rpmprob.c:172
+#, c-format
+msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
+#: lib/rpmrc.c:222
+#, c-format
+msgid "missing second ':' at %s:%d\n"
 msgstr ""
 
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
+#: lib/rpmrc.c:225
+#, c-format
+msgid "missing architecture name at %s:%d\n"
 msgstr ""
 
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
+#: lib/rpmrc.c:370
+#, c-format
+msgid "Incomplete data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:97
+#: lib/rpmrc.c:375
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
+msgid "Too many args in data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:191
+#: lib/rpmrc.c:382
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "N'hell ket bet digoret indeks %s gant db%d - %s (%d)\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr ""
 
-#: lib/rpmdb.c:516
+#: lib/rpmrc.c:413
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "Incomplete default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader : o tremen e-biou"
-
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:523
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s : sac'het eo bet regexec : %s\n"
+msgid "missing argument for %s at %s:%d\n"
+msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:551
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s : sac'het eo bet regcomp : %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator : o tremen e-biou"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "N'hell ket bet digoret %s e %s:%d : %m\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:564
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "missing architecture for %s at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "bad option '%s' at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) removing header #%d record\n"
+msgid "Unknown system: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "N'hell ket bet digoret %s evit lenn : %m.\n"
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
 msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr ""
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Furmad dianav"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr ""
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "staliañ"
+
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "lemel"
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:100
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr ""
+msgid "cannot open Packages database in %s\n"
+msgstr "N'hell ket bet digoret stlennvon ar pakadoù e %s\n"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:199
 #, c-format
-msgid "failed to remove directory %s: %s\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:225
 #, c-format
-msgid "db%d error(%d): %s\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "n'hellan ket krouiliñ %s war %s/%s\n"
+msgid "%s: reading of public key failed.\n"
+msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "rannet"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "gra"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
+#: lib/rpmvs.c:152
+#, c-format
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:158
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:178
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:206
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr ""
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "tremenet en e biou"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "Sac'het eo bet seveniñ %s : %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "sac'het"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "mankout a ra  %c %s"
+
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:40
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "======================== active %d empty %d\n"
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/macro.c:286
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "%3d>%*s(empty)\n"
 msgstr ""
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr ""
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr ""
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr ""
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr ""
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[hini ebet]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(fazi ebet)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "Fazi sac'hus : "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "fazi :"
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "hoc'h evezh : "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[hini ebet]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(fazi ebet)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "Fazi sac'hus : "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "fazi :"
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "ho evezh : "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, ID alc'hwez %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(hini ebet)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s : sac'het eo bet Fwrite : %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s : sac'het eo bet Fread : %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s : sac'het eo bet Fflush : %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not exec %s: %s\n"
+msgstr "N'hell ket bet sevenet %s : %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:302
+#, c-format
+msgid "Could not read from file %s: %s\n"
+msgstr "N'hell ket bet lennet ar restr %s : %s\n"
+
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "Sac'het eo bet seveniñ gpg (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "sac'het eo rpmMkTemp\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s : sac'het eo bet writeLead : %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s : sac'het eo bet rpmReadSignature : %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s : sac'het eo bet headerRead : %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s : sac'het eo bet rpmWriteSignature : %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s : sac'het eo bet writeLead : %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "sach'et eo bet erlec'hiañ %s : %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 594edd3ca00a76b3c5ae1d4f684e634bcb730bbf..6c23d3a0d167455e4e9c99ff91a81ea3f9c1ec87 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -3,14 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
+# Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2017
+# Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2015-2016
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Catalan (http://www.transifex.com/rpm-team/rpm/language/ca/)\n"
 "Language: ca\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -25,7 +27,7 @@ msgstr "%s: %s\n"
 #: cliutils.c:27 lib/poptALL.c:56
 #, c-format
 msgid "RPM version %s\n"
-msgstr "Versió de l'RPM %s\n"
+msgstr "Versió %s de RPM\n"
 
 #: cliutils.c:32
 #, c-format
@@ -45,557 +47,647 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "Ha fallat la creació d'una canonada per a --pipe: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
-msgstr "ha fallat l'execució\n"
+msgstr "ha fallat l'exec\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "l'argument no és un paquet RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "s'ha produït un error en llegir la capçalera del paquet\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
-msgstr "no s'ha pogut tornar a obrir les dades de càrrega: %s\n"
+msgstr "no s'ha pogut tornar a obrir la càrrega: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Opcions de consulta (amb -q o --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Opcions de verificació (amb -V o --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Opcions d'instal·lació/actualització/supressió:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Opcions comunes per a tots els modes d'rpm i executables:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "només es pot realitzar un tipus de consulta/verificació alhora"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "indicadors inesperats de la consulta"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "format inesperat de la consulta"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "font inesperada de la consulta"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "només es pot especificar un mode principal"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "només es poden reubicar els fitxers durant la instal·lació d'un paquet"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "no es pot utilitzar l'opció --prefix amb --relocate o --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"només es poden utilitzar les opcions --relocate i --excludepath quan "
-"s'estiguin instal·lant paquets nous"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr ""
-"només es pot utilitzar l'opció --prefix quan s'estiguin instal·lant paquets "
-"nous"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "els arguments a --prefix han de començar amb una /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-"només es pot especificar l'opció --replacepkgs durant la instal·lació d'un "
-"paquet"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-"només es pot especificar l'opció --excludedocs durant la instal·lació d'un "
-"paquet"
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
+msgstr "ja s'ha especificat el buildroot i s'ignora %s\n"
 
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
-"només es pot especificar l'opció --includedocs durant la instal·lació d'un "
-"paquet"
+"construeix mitjançant el %prep (desempaqueta les fonts i aplica els pedaços) "
+"des del <fitxer spec>"
 
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "només es pot especificar una opció entre --excludedocs i --includedocs"
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
+msgstr "<fitxer spec>"
 
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
-"només es pot especificar l'opció --ignorearch durant la instal·lació d'un "
-"paquet"
+"construeix mitjançant el %build (%prep, després compila) des del <fitxer "
+"spec>"
 
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
-"només es pot especificar l'opció --ignoreos durant la instal·lació d'un "
-"paquet"
+"construeix mitjançant el %install (%prep, %build i després instal·la) des "
+"del <fitxer spec>"
 
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-"només es pot especificar l'opció --ignoresize durant la instal·lació d'un "
-"paquet"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
+msgstr "verifica la secció %files des del <fitxer spec>"
 
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
 msgstr ""
-"només es pot especificar l'opció --allmatches durant la supressió d'un paquet"
+"construeix els paquets de les fonts i dels binaris des del <fitxer spec>"
 
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-"només es pot especificar l'opció --allfiles durant la instal·lació d'un "
-"paquet"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
+msgstr "construeix només el paquet dels binaris des del <fitxer spec>"
 
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"només es pot especificar l'opció --justdb durant la instal·lació i supressió "
-"d'un paquet"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
+msgstr "construeix només el paquet de les fonts des del <fitxer spec>"
 
-#: rpmqv.c:221
+#: rpmbuild.c:161
+#, c-format
 msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
-"només es poden especificar les opcions d'inhabilitació d'scripts durant la "
-"instal·lació i supressió d'un paquet"
+"construeix mitjançant el %prep (desempaqueta de les fonts i aplica els "
+"pedaços) des del <paquet de les fonts>"
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"només es poden especificar les opcions d'inhabilitació de l'activador durant "
-"la instal·lació i supressió d'un paquet"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<paquet de les fonts>"
 
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
+"construeix mitjançant el %build (%prep, després compila) des del <paquet de "
+"les fonts>"
 
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
+"construeix mitjançant el %install (%prep, %build i instal·la) des del "
+"<paquet de les fonts>"
 
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "els arguments a --root (-r) han de començar per /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "no s'han donat paquets per a suprimir"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "no s'han donat paquets per a instal·lar"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "no s'han donat arguments per a consultar"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "no s'han donat arguments per a verificar"
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr "el buildroot ja s'ha especificat, s'està ignorant %s\n"
-
-#: rpmbuild.c:120
+#: rpmbuild.c:170
 #, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-"munta amb %prep (desempaqueta els fonts i aplica els pedaços) des del "
-"<fitxer d'especificació>"
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr "<fitxer d'especificació>"
+msgid "verify %files section from <source package>"
+msgstr "verifica la secció %files des del <paquet de les fonts>"
 
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr ""
-"munta amb %build (%prep, després compila) des del <fitxer d'especificació>"
-
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
-"munta amb %install (%prep, %build i després instal·la) des del <fitxer "
-"d'especificació>"
-
-#: rpmbuild.c:129
-#, c-format
-msgid "verify %files section from <specfile>"
-msgstr "verifica la secció %files de <fitxer d'especificació>"
+"construeix el paquet dels binaris i de les fonts des del <paquet de les "
+"fonts>"
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
-msgstr "munta els paquets de codi font i binaris de <fitxer d'especificació>"
-
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
-msgstr "munta només el paquet binari de <fitxer d'especificació>"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr "construeix només el paquet dels binaris des del <paquet de les fonts>"
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
-msgstr "munta només el paquet font de <fitxer d'especificació>"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr "construeix només el paquet de les fonts des del <paquet de les fonts>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
-"munta amb %prep (desempaqueta els fonts i aplica els pedaços) des de "
-"l'<arxiu tar>"
+"construeix mitjançant el %prep (desempaqueta les fonts i aplica els pedaços) "
+"des de l'<arxiu tar>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<arxiu tar>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
-msgstr "munta amb %build (%prep, després compila) des de l'<arxiu tar>"
+msgstr ""
+"construeix mitjançant el %build (%prep, després compila) des de l'<arxiu tar>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
-msgstr "munta amb %install (%prep, %build, instal·la) des de l'<arxiu tar>"
+msgstr ""
+"construeix mitjançant el %install (%prep, %build, instal·la) des de l'<arxiu "
+"tar>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "verifica la secció %files des de l'<arxiu tar>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
-msgstr "munta els paquets font i binari des de l'<arxiu tar>"
+msgstr ""
+"construeix els paquets de les fonts i dels binaris des de l'<arxiu tar>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
-msgstr "munta el paquet binari des de l'<arxiu tar> només"
+msgstr "construeix el paquet dels binaris només des de l'<arxiu tar>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
-msgstr "munta els paquets font només des de l'<arxiu tar>"
+msgstr "construeix el paquet de les fonts només des de l'<arxiu tar>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
-msgstr "munta els paquets binaris des de <paquet font>"
-
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<paquet font>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr "munta amb %install (%prep, %build i instal·la) des del <paquet font>"
+msgstr "construeix el paquet dels binaris des del <paquet de les fonts>"
 
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
-msgstr "omet l'arrel de compilació"
+msgstr "substitueix l'arrel de la construcció"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr "executa la construcció al directori actual"
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
-msgstr "suprimeix l'arbre del muntatge en acabar"
+msgstr "suprimeix l'arbre de la construcció en acabar"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignora ExcludeArch: directives del fitxer d'especificació"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "depura la màquina d'estat de fitxers"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
-msgstr "no executis cap fase del muntatge"
+msgstr "no executis cap de les etapes de la construcció"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
-msgstr "no verifiquis les dependències del muntatge"
+msgstr "no verifiquis les dependències de la construcció"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
+"genera capçaleres del paquet compatibles amb l'empaquetament rpm v3 (llegat)"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
-msgstr ""
+msgstr "no executis l'etapa %clean de la construcció"
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr "no executis l'etapa %prep de la construcció"
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
-msgstr ""
+msgstr "no executis l'etapa %check de la construcció"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
-msgstr "no acceptis els msgstr d'i18N des d'un fitxer d'especificació"
+msgstr "no acceptis els msgstr d'i18N del fitxer spec"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
-msgstr "suprimeix els fonts en acabar"
+msgstr "suprimeix les fonts en acabar"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
-msgstr "suprimeix el fitxer d'especificació en acabar"
+msgstr "suprimeix el fitxer spec en acabar"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "vés directament a l'etapa especificada (només per a c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
-msgstr "omet plataforma objectiu"
+msgstr "substitueix la plataforma"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
-"Opcions de muntatge amb [ <fitxer d'especificacions> | <arxiu tar> | <paquet "
-"font> ]:"
+"Opcions de construcció amb [ <fitxer spec> | <arxiu tar> | <paquet de les "
+"fonts> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Opcions comunes per a tots els modes rpm i executables:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
-msgstr "Han fallat les dependències de muntatge:\n"
+msgstr "Han fallat les dependències de la construcció:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "No s'ha pogut obrir el fitxer d'especificacions %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
-msgstr "No s'ha pogut obrir un conducte per al tar: %m\n"
+msgstr "Ha fallat l'obertura de la canonada per al tar: %m\n"
+
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr "S'ha trobat més d'un fitxer spec a %s\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
-msgstr "No s'ha pogut llegir el fitxer d'especificacions des de %s\n"
+msgstr "Ha fallat la lectura del fitxer spec de %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
-msgstr "No s'ha pogut canviar el nom de %s per %s: %m\n"
+msgstr "Ha fallat el canvi de nom de %s a %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
-msgstr "No s'ha pogut obtenir l'estat de %s: %m\n"
+msgstr "Ha fallat l'obtenció de l'estat de %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "El fitxer %s no és un fitxer regular.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "El fitxer %s no sembla un fitxer d'especificacions.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
-msgstr "S'estan muntant les plataformes destí: %s\n"
+msgstr "Construcció per a les plataformes objectiu: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
-msgstr "S'està muntant per al destí %s\n"
+msgstr "Construcció per a l'objectiu %s\n"
+
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "els arguments a --root (-r) han de començar per /"
 
-#: rpmdb.c:22
+#: rpmdb.c:21
 msgid "initialize database"
-msgstr "initialitza la base de dades"
+msgstr "inicialitza la base de dades"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
-"torna a muntar les llistes invertides de la base de dades des de les "
-"capçaleres de paquets instal·lades"
+"reconstrueix la base de dades de les llistes inverses des de les capçaleres "
+"dels paquets instal·lats"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "verifica els fitxers de la base de dades"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+"exporta la base de dades al llistat de capçaleres de la sortida estàndard"
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+"importa la base de dades des de la llista de capçaleres de l'entrada "
+"estàndard"
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Opcions de la base de dades:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "només es pot especificar un mode principal"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "verifica la signatura dels paquets"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "importa una clau pública armada"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
-msgstr ""
+msgstr "no importis, però diguis si podria funcionar o no"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
-msgstr ""
+msgstr "llista les claus des de l'anell de claus RPM"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
-msgstr ""
+msgstr "Opcions de l'anell de claus:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "no s'han donat arguments"
 
-#: rpmsign.c:25
-msgid "sign package(s)"
-msgstr ""
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Opcions de selecció de paquets, de consulta o verificació:"
 
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
-msgstr "signa els paquets (igual que --addsign)"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Opcions de consulta (amb -q o --query):"
 
-#: rpmsign.c:29
-msgid "delete package signatures"
-msgstr "suprimeix les signatures dels paquets"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Opcions de verificació (amb -V o --verify):"
 
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr "Opcions de la signatura:"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Opcions d'instal·lació, actualització o supressió:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "No es pot executar %s: %s\n"
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "només es pot realitzar un tipus consulta o verifica alhora"
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
-msgstr "Heu d'establir «%%_gpg_name» al vostre fitxer de macros\n"
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "indicadors inesperats de la consulta"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Introduïu la contrasenya:"
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "format inesperat de la consulta"
 
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
-msgstr "La contrasenya és correcta.\n"
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "origen inesperat de la consulta"
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr ""
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "només es pot forçar la instal·lació i l'actualització"
 
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
 msgstr ""
+"només es poden traslladar els fitxers durant la instal·lació del paquet"
 
-#: rpmspec.c:28
-msgid "query spec file(s)"
-msgstr ""
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "no es pot utilitzar l'opció --prefix amb --relocate o --excludepath"
 
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
+"només es poden utilitzar les opcions --relocate i --excludepath quan "
+"s'instal·lin paquets nous"
 
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
-msgstr ""
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "només es pot utilitzar l'opció --prefix quan s'instal·lin paquets nous"
 
-#: rpmspec.c:36 lib/poptQV.c:192
-msgid "use the following query format"
-msgstr "utilitza el format de consulta següent"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "els arguments a --prefix han de començar amb una /"
 
-#: rpmspec.c:45
-msgid "Spec options:"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
 msgstr ""
+"--hash (-h) només es pot especificar durant la instal·lació i la supressió "
+"del paquet"
 
-#: rpmspec.c:90
-msgid "no arguments given for parse"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
 msgstr ""
+"--percent només es pot especificar durant la instal·lació i la supressió del "
+"paquet"
 
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
+"només es pot especificar l'opció --replacepkgs durant la instal·lació del "
+"paquet"
 
-#: build/build.c:126
-#, c-format
-msgid "Unable to open stream: %s\n"
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
 msgstr ""
+"només es pot especificar l'opció --excludedocs durant la instal·lació del "
+"paquet"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr ""
+"només es pot especificar l'opció --includedocs durant la instal·lació del "
+"paquet"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "només es pot especificar una opció entre --excludedocs i --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr ""
+"només es pot especificar l'opció --ignorearch durant la instal·lació del "
+"paquet"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
+"només es pot especificar l'opció --ignoreos durant la instal·lació del paquet"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr ""
+"només es pot especificar l'opció --ignoresize durant la instal·lació del "
+"paquet"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+"només es pot especificar l'opció --allmatches durant la supressió del paquet"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
+"només es pot especificar l'opció --allfiles durant la instal·lació del paquet"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"només es pot especificar l'opció --justdb durant la instal·lació i la "
+"supressió del paquet"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"només es poden especificar les opcions d'inhabilitació de scripts durant la "
+"instal·lació i la supressió del paquet"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"només es poden especificar les opcions d'inhabilitació de l'activador durant "
+"la instal·lació i la supressió del paquet"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps només es pot especificar durant la instal·lació, la supressió i la "
+"versificació del paquet"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+"--test només es pot especificar durant la instal·lació i la supressió del "
+"paquet"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "no s'han donat paquets per a suprimir"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "no s'han donat paquets per a instal·lar"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "no s'han donat arguments per a consultar"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "no s'han proporcionat arguments per verificar"
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr "signa els paquets"
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr "signa els paquets (idèntic a --addsign)"
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr "suprimeix les signatures dels paquets"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "Opcions de la signatura:"
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr "Heu d'establir «%%_gpg_name» al vostre fitxer de macros\n"
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr "analitza sintàcticament els fitxers spec per la sortida estàndard"
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr "consulta els fitxers spec"
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr "opera sobre els binaris dels rpm generats amb el spec (per defecte)"
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr "opera sobre les fonts del rpm generat amb el spec"
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr "utilitza el següent format de consulta"
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr "Opcions de spec:"
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr "no s'ha proporcionat arguments per analitzar sintàcticament"
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr "No es pot obrir el fitxer temporal: %s\n"
+
+#: build/build.c:125
+#, c-format
+msgid "Unable to open stream: %s\n"
+msgstr "No es pot obrir el flux: %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
-msgstr "Executant(%s): %s\n"
+msgstr "Execució(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Ha fallat l'execució de %s (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
-msgstr ""
+msgstr "S'ha produït un error en executar el scriptlet %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
-msgstr "L'estat de sortida de %s (%s) és erroni\n"
+msgstr "Estat incorrecte de sortida de %s (%s)\n"
+
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
 
-#: build/build.c:291
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -603,237 +695,317 @@ msgid ""
 msgstr ""
 "\n"
 "\n"
-"Errors del muntatge de l'RPM:\n"
+"Errors de construcció del RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "error de sintaxi mentre s'analitzava ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "error de sintaxi mentre s'analitzava &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "error de sintaxi mentre s'analitzava ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "error d'anàlisi a l'expressió\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "no hi ha hagut coincidències (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- només als nombres\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! només als nombres\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "els tipus han de coincidir\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / no és disponible per a les cadenes\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- no és disponible per a les cadenes\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& i || no són disponibles per a les cadenes\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "error de sintaxi a l'expressió\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
-msgstr "Manca '(' a %s %s\n"
+msgstr "Falta un «(» a %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
-msgstr "Manca ')' a %s(%s\n"
+msgstr "Falta un «)» a %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "L'element %s no és vàlid: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Manca %s a %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "%s() va seguit d'un caràcter que no és un espai en blanc: %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Sintaxi incorrecta: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
-msgstr "Especificació de mode incorrecta: %s(%s)\n"
+msgstr "mode incorrecte del spec: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
-msgstr "Especificació de dirmode incorrecta: %s(%s)\n"
+msgstr "dirmode incorrecte del spec: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
-msgstr ""
+msgstr "Longitud inusual de la configuració regional: \"%s\" a %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
-msgstr ""
+msgstr "Duplica la configuració regional %s al %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
-msgstr "Capacitat invàlida: %s\n"
+msgstr "Capacitat no vàlida: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
-msgstr "No s'ha muntat amb disponibilitat de fitxers\n"
+msgstr "No s'ha construït amb disponibilitat de fitxers\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
-msgstr "El fitxer ha de començar amb  \"/\": %s\n"
+msgstr "El fitxer ha de començar amb «/»: %s\n"
+
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
-msgstr "L'algorisme %u de resum del fitxer és desconegut, s'està usant MD5\n"
+msgstr "Es desconeix l'algorisme de resum del fitxer %u, es torna al MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "El fitxer apareix dues vegades: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
-msgstr ""
+msgstr "la lectura de l'enllaç simbòlic %s ha fallat: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
-msgstr "L'enllaç simbòlic apunta al BuildRoot: %s -> %s\n"
+msgstr "L'enllaç simbòlic apunta a l'arrel de la construcció: %s -> %s\n"
+
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "El camí està fora de l'arrel de la construcció: %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
-msgstr ""
+msgstr "No es va trobar el directori: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "No s'ha trobat el fitxer: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "No és un directori: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: no es pot carregar l'etiqueta incorrecta (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
-msgstr "%s: ha fallat la clau pública.\n"
+msgstr "%s: ha fallat la lectura de la clau pública.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: no és una clau pública armada.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
+msgstr "%s: ha fallat la codificació\n"
+
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "no s'ha pogut crear el directori"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
-msgstr "El fitxer ha de començar amb \"/\": %s\n"
+msgstr "El fitxer necessita el «/» principal: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "El glob no ha trobat el fitxer: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
-msgstr ""
+msgstr "No s'ha pogut obrir el fitxer %s del %%files: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "línia: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
 #, c-format
-msgid "Error reading %%files file %s: %m\n"
+msgid "Empty %%files file %s\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2200
+#, c-format
+msgid "Error reading %%files file %s: %m\n"
+msgstr "S'ha produït un error en llegir %%files del fitxer %s: %m\n"
+
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "El glob no ha trobat el fitxer: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
+msgstr "Més d'un fitxer en una línia: %s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
-msgstr "Fitxer no vàlid: %s: %s\n"
-
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Propietari/grup incorrecte: %s\n"
+msgstr "Fitxer incorrecte: %s: %s\n"
 
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
-msgstr "S'està comprovant fitxers no empaquetats: %s\n"
+msgstr "Comprovació per si hi ha fitxers no empaquetats: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -842,548 +1014,610 @@ msgstr ""
 "Hi ha fitxers instal·lats però no empaquetats:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
 #, c-format
-msgid "Processing files: %s\n"
+msgid "%s was mapped to multiple filenames"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3102
+#, c-format
+msgid "Processing files: %s\n"
+msgstr "Processament dels fitxers: %s\n"
+
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "Els binaris dependents de l'arquitectura estan en el paquet noarch\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
-msgstr ""
+msgstr "ha fallat la creació de l'arxiu al fitxer %s: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
-msgstr ""
+msgstr "ha fallat la creació de l'arxiu: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
-msgstr ""
+msgstr "No s'ha pogut obrir el fitxer %s: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: línia: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "El nom de màquina no es pot fer canònic: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "No s'ha pogut escriure les dades de %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "No s'ha pogut llegir les dades de %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "El nom de màquina no es pot fer canònic: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
-msgstr "Compressió de dades desconeguda: %s\n"
+msgstr "Càrrega desconeguda de compressió: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "No es pot crear la regió de capçalera no modificable.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "No s'ha pogut obrir el fitxer temporal.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "No s'ha pogut escriure la capçalera temporal\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Ha fallat la lectura del pitxer de política: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Dades CSA invàlides\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "No es pot tornar a carregar la capçalera de signatura.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "No es pot obrir %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "No es pot escriure el paquet: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "No s'ha pogut obrir el sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "No es pot llegir la capçalera de %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "No es pot escriure la capçalera a %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "S'ha escrit: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
-msgstr "S'està executant: \"%s\":\n"
+msgstr "S'està executant «%s»:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
-msgstr "Ha fallat l'execució de \"%s\" .\n"
+msgstr "Ha fallat l'execució de «%s».\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
-msgstr "Ha fallat la verificació del paquet \"%s\".\n"
+msgstr "Ha fallat la verificació del paquet «%s».\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "No es pot generar el nom de fitxer de sortida per al paquet %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "no es pot crear %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "línia %d: segon %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
-msgstr "les entrades del %%changelog han de començar amb *\n"
+msgstr "les entrades %%changelog han de començar amb *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
-msgstr "l'entrada de %%changelog no és completa\n"
+msgstr "Entrada incompleta del %%changelog\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
-msgstr "la data de %%changelog no és correcta: %s\n"
+msgstr "data incorrecta al %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "el %%changelog no està en ordre cronològic descendent\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
-msgstr "manca el nom a %%changelog\n"
+msgstr "falta el nom a %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
-msgstr "no hi ha descripció a %%changelog\n"
+msgstr "sense descripció al %%changelog\n"
+
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "línia %d: segon %%changelog\n"
 
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
-msgstr "línia %d: s'ha produït un error en analitzar %%description: %s\n"
+msgstr ""
+"línia %d: S'ha produït un error en analitzar sintàcticament el "
+"%%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
-msgstr "línia %d: opció incorrecta %s: %s\n"
+msgstr "línia %d: Opció %s incorrecta: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "línia %d: massa noms: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "línia %d: no existeix Package: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "línia %d: segona descripció\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
-msgstr "línia %d: s'ha produït un error en analitzar %%files: %s\n"
+msgstr ""
+"línia %d: S'ha produït un error en analitzar sintàcticament el %%files: %s\n"
+
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
 
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
+"línia %d: S'ha produït un error en analitzar sintàcticament el %%policies: "
+"%s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
-msgstr ""
+msgstr "S'ha produït un error en analitzar sintàcticament el camp tag: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "línia %d: número incorrecte: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
-msgstr "línia %d: Numero dolent%s número: %u\n"
+msgstr "línia %d: Número incorrecte de no%s: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
-msgstr "línia %d: número %s incorrecte: %s\n"
+msgstr "línia %d: número incorrecte %s: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
-msgstr "%s %d definit múltiples vegades\n"
+msgstr "%s %d es va definir diverses vegades\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
-msgstr ""
+msgstr "S'està baixant %s a %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
-msgstr ""
+msgstr "No s'ha pogut baixar %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "S'ha exclòs l'arquitectura: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
-msgstr "No s'inclou l'arquitectura: %s\n"
+msgstr "No s'ha inclòs l'arquitectura: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "S'ha exclòs el SO: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "No s'ha inclòs el SO: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
-msgstr "El camp %s ha de ser present al paquet: %s\n"
+msgstr "El camp %s ha d'estar present al paquet: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
-msgstr "L'entrada %s és duplicada al paquet: %s\n"
+msgstr "L'entrada %s està duplicada al paquet: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "No s'ha pogut obrir la icona %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "No s'ha pogut llegir la icona %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
-msgstr "El tipus d'icona és desconegut: %s\n"
+msgstr "Tipus desconegut d'icona: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
-msgstr "línia %d: l'etiqueta pren un únic testimoni: %s\n"
+msgstr "línia %d: L'etiqueta pren un únic testimoni: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr ""
+msgid "line %d: %s in: %s\n"
+msgstr "línia %d: %s a: %s\n"
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr ""
+msgid "%s in: %s\n"
+msgstr "%s a: %s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
-msgstr "línia %d: l'etiqueta és malament formada: %s\n"
+msgstr "línia %d: Etiqueta mal formada: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "línia %d: l'etiqueta és buida: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
-msgstr "línia %d: els prefixos no poden acabar en «/»: %s \n"
+msgstr "línia %d: els prefixos no poden acabar amb «/»: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "línia %d: «Docdir» ha de començar per «/»: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "línia %d: el camp Epoch ha d'ésser un nombre sense signe: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
-msgstr "línia %d: %s és incorrecte: qualificadors: %s\n"
+msgstr "línia %d: %s incorrecte: qualificadors: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
-msgstr "línia %d: el format de «BuildArchitecture» és incorrecte: %s\n"
+msgstr "línia %d: Format incorrecte del BuildArchitecture: %s\n"
+
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
-msgstr "linia %d: Només els subpaquets noarch estan suportats: %s\n"
+msgstr "línia %d: Només els subpaquets noarch estan suportats: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "S'ha produït un error intern: l'etiqueta %d és incorrecta\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
-msgstr ""
+msgstr "línia %d: %s està en desús: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
-msgstr "L'especificació del paquet és incorrecta: %s\n"
+msgstr "Especificació incorrecta del paquet: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "El paquet ja existeix: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
-msgstr "línia %d: l'etiqueta és desconeguda: %s\n"
+msgstr "línia %d: Etiqueta desconeguda: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} no pot estar buit\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
-msgstr "%%{buildroot} no pot ésser \"/\"\n"
+msgstr "%%{buildroot} no pot ser \"/\"\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
-msgstr "La font és incorrecta: %s: %s\n"
+msgstr "Fonts incorrectes: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "No existeix el pedaç número %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch sense l'etiqueta \"Patch:\" corresponent\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "No existeix la font número %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
-msgstr "Falta l'etiqueta \"Source:\" en el fitxer d'especificacions\n"
+msgstr "Sense \"Source:\" etiqueta al fitxer spec\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
-msgstr "Hi ha hagut un error en analitzar %%setup: %s\n"
+msgstr "S'ha produït un error en analitzar sintàcticament el %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
-msgstr "línia %d: l'argument a %%setup és incorrecte: %s\n"
+msgstr "línia %d: Argument incorrecte al %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
-msgstr "línia %d: l'opció de %%setup %s és incorrecta: %s\n"
+msgstr "línia %d: Opció %s incorrecta del %%setup: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "El número de pedaç %s no és vàlid: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "línia %d: segon %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr "No es permet ca dependència enriquida per a aquest tipus"
+
+#: build/parseReqs.c:232 build/parseReqs.c:307
+msgid "invalid dependency"
+msgstr "dependència no vàlida"
+
+#: build/parseReqs.c:267 lib/rpmds.c:1470
 msgid "Version required"
+msgstr "Es requereix la versió"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
 msgstr ""
 
-#: build/parseReqs.c:165
-msgid "invalid dependency"
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
-msgstr ""
+msgstr "línia %d: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "línia %d: els activadors han de tenir --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
-msgstr "línia %d: s'ha produït un error en analitzar %s: %s\n"
+msgstr "línia %d: S'ha produït un error en analitzar sintàcticament %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
-msgstr "línia %d: l'script intern ha d'acabar en «>»: %s\n"
+msgstr "línia %d: el script intern ha d'acabar amb «>»: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
-msgstr "línia %d: el programa d'script ha de començar per «/»: %s\n"
+msgstr "línia %d: el programa del script ha de començar per «/»: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "línia %d: Segon %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
-msgstr "línia %d: l'script intern no està disponible: %s\n"
+msgstr "línia %d: el script intern no està disponible: %s\n"
+
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "línia %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
 #, c-format
-msgid "Unable to open %s: %s\n"
-msgstr "No es pot obrir %s: %s\n"
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
+#, c-format
+msgid "Unable to open %s: %s\n"
+msgstr "No es pot obrir %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
-msgstr ""
+msgstr "%s:%d: S'esperava l'argument per %s\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
-msgstr ""
+msgstr "línia %d: %%if sense tancar\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
-msgstr ""
+msgstr "%s:%d: condició incorrecta del %%if\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: s'ha obtingut un %%else sense %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: s'ha obtingut un %%endif sense %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
-msgstr "No s'ha trobat cap arquitectura compatible per al muntatge\n"
+msgstr "No s'ha trobat cap arquitectura compatible per a la construcció\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "El paquet no té %%description: %s\n"
@@ -1400,17 +1634,17 @@ msgstr ""
 
 #: build/policies.c:101
 msgid "Failed to get policies from header\n"
-msgstr ""
+msgstr "Ha fallat l'obtenció de les polítiques de les capçaleres\n"
 
 #: build/policies.c:154
 #, c-format
 msgid "%%semodule requires a file path\n"
-msgstr ""
+msgstr "%%semodule requereix el camí a un fitxer\n"
 
 #: build/policies.c:163
 #, c-format
 msgid "Failed to read  policy file: %s\n"
-msgstr ""
+msgstr "Ha fallat la lectura del pitxer de política: %s\n"
 
 #: build/policies.c:170
 #, c-format
@@ -1420,7 +1654,7 @@ msgstr ""
 #: build/policies.c:187
 #, c-format
 msgid "Failed to determine a policy name: %s\n"
-msgstr ""
+msgstr "Ha fallat la determinació d'un nom de política: %s\n"
 
 #: build/policies.c:199
 #, c-format
@@ -1432,478 +1666,587 @@ msgstr ""
 #: build/policies.c:246
 #, c-format
 msgid "Error parsing %s: %s\n"
-msgstr ""
+msgstr "S'ha produït un error en analitzar sintàcticament %s: %s\n"
 
 #: build/policies.c:252
 #, c-format
 msgid "Expecting %%semodule tag: %s\n"
-msgstr ""
+msgstr "S'esperava l'etiqueta %%semodule: %s\n"
 
 #: build/policies.c:262
 #, c-format
 msgid "Missing module path in line: %s\n"
-msgstr ""
+msgstr "Falta el camí al mòdul en la línia: %s\n"
 
 #: build/policies.c:268
 #, c-format
 msgid "Too many arguments in line: %s\n"
-msgstr ""
+msgstr "Hi ha massa arguments en la línia: %s\n"
 
 #: build/policies.c:307
 #, c-format
 msgid "Processing policies: %s\n"
-msgstr ""
+msgstr "Processament de les polítiques: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
-msgstr ""
+msgstr "S'ignora l'expressió regular incorrecta %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "No s'ha pogut crear la canonada per a %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "No s'ha pogut executar %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "No s'ha pogut crear el procés fill de «%s»: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
-msgstr ""
+msgstr "ha fallat %s: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Ha fallat la conversió de %s a enter gran.\n"
+msgstr "ha fallat l'escriptura de totes les dades a %s: %s\n"
 
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
-msgstr ""
+msgstr "Classificador buit de fitxer\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
-msgstr ""
+msgstr "Sense atributs de fitxer configurats\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "Ha fallat magic_open(0x%x): %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "Ha fallat magic_load: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
-msgstr "Ha fallat el reconeixement del fitxer \"%s\": mode %06o %s\n"
+msgstr "Ha fallat el reconeixement del fitxer «%s»: mode %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "S'està cercant %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Ha fallat la cerca de %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
-"ha fallat la consulta del fitxer d'especificació %s, no es pot analitzar\n"
+"ha fallat la consulta del fitxer spec %s, no es pot analitzar "
+"sintàcticament\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(error 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s error(%d) de %s: %s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Valor màgic incorrecte"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s error(%d): %s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Capçalera dolenta/il·legible"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "opció de la bd no reconeguda: s'ignora «%s».\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "La mida de la capçalera és massa gran"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s té un valor numèric no vàlid i es va ignorar\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
+"%s té un valor de tipus «long» massa gran o massa petit i s'ha ignorat\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Tipus de fitxer desconegut"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
+"%s té un valor de tipus «enter» massa gran o massa petit i s'ha ignorat\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Manquen els enllaços durs"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "no es pot obtenir el blocatge %s a %s/%s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "No hi ha coincidència de resums"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "compartit"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Error intern"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "exclusiu"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "El fitxer de l'arxiu no és a la capçalera"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "tipus d'índex %x no vàlid a %s/%s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " ha fallat - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "error(%d) en obtenir «%s» registres de l'índex %s: %s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "error(%d) en emmagatzemar el registre «%s» en %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "error(%d) en suprimir el registre «%s» de %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "error(%d) en afegir el registre #%d a la capçalera\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "error(%d) en treure el registre #%d de la capçalera\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "error(%d) en assignar la instància de nou paquet\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s és un Delta RPM i no es pot instal·lar directament\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
-msgstr "Les dades (%s) no estan disponibles al paquet %s\n"
+msgstr "Càrrega (%s) no admesa al paquet %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
-msgstr "el paquet %s ja s'ha afegit, s'està ignorant %s\n"
+msgstr "el paquet %s ja es va afegir i s'ignora %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
-msgstr "el paquet %s ja es va afegir, s'està reemplaçant per %s\n"
+msgstr "el paquet %s ja es va afegir, s'està substituint amb %s\n"
+
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(no és un blob)"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:43
 msgid "(not a number)"
-msgstr "(no és una xifra)"
+msgstr "(no és un número)"
+
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(no és una cadena)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(tipus no vàlid)"
 
-#: lib/formats.c:125
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(no és base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(tipus invàlid)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(no és un blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
-msgstr "(tipus d'XML invàlid)"
+msgstr "(tipus no vàlid d'XML)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(no és una signatura d'OpenPGP)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
-msgstr ""
+msgstr "Data no vàlida %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
-msgstr ""
+msgstr "normal"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
-msgstr ""
+msgstr "substituït"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
-msgstr ""
+msgstr "no instal·lat"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
-msgstr ""
+msgstr "compartit per xarxa"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
-msgstr ""
+msgstr "color incorrecte"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
-msgstr ""
+msgstr "falta"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
-msgstr ""
-
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "l'usuari %s no existeix - usant el root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "el grup %s no existeix - s'està usant el root\n"
+msgstr "(desconegut)"
 
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
-msgstr "%s desat com a %s\n"
+msgstr "%s s'ha desat com a %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
-msgstr "%s creat com a %s\n"
+msgstr "%s s'ha creat com a %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
-msgstr ""
+msgstr "%s %s: ha fallat la supressió: %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
-msgstr ""
+msgstr "directori"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
-msgstr ""
+msgstr "fitxer"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr "hdr load: DOLENT"
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
-"etiqueta[%d]: dolenta, etiqueta %d tipus %d desplaçament %d compte %d\n"
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "capçalera SHA1: dolenta, no és hexadecimal\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "capçalera RSA: dolenta, no és binària\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "capçalera DSA: dolenta, no és binària\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "mida del blob(%d): dolenta, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr "hdr magic: DOLENT"
+
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
-"desplaçament de regió: dolent, etiqueta %d tipus %d desplaçament %d compte "
-"%d\n"
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
-"tros de regió: dolenta, etiqueta %d tipus %d desplaçament %d compte %d\n"
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "la dimensió de la regió:  dolenta, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "capçalera dimensió (%d): dolenta, la lectura ha retornat %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr "sigh pad(%zd): DOLENT, ha llegit %zd bytes"
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "capçalera màgica: dolenta\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
-"capçalera d'etiquetes: dolentes, número d'etiquetes (%d) fora de rang\n"
 
-#: lib/package.c:442
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "l'amplada del camp no és vàlida"
+
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "capçalera de dades: dolenta, número de bytes(%d) fora de rang\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "capçalera blob(%zd): dolenta, la lectura ha retornat %d\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "càrrega de la capçalera: dolenta\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "el format de l'etiqueta és buit"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: El rpmReadSignature ha fallat: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "el nom de l'etiqueta és buit"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: No hi ha signatura disponible\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: El headerRead ha fallat: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "s'esperava ] al final de la seqüència"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "no s'esperava ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "no s'esperava }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "s'esperava ? a l'expressió"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "s'esperava { després de ? a l'expressió"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "s'esperava } a l'expressió"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "s'esperava : després de ? a la subexpressió"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "s'esperava { després de : a l'expressió"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "s'esperava | al final de l'expressió"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "iterador de seqüència que s'utilitza amb seqüències de diferents mides"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: El Fread ha fallat: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "predefineix MACRO amb el valor EXPR"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'MACRO EXPR'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
-msgstr "defineix la MACRO amb el valor EXPR"
+msgstr "defineix la MACRO amb el valor de l'EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
-msgstr ""
+msgstr "des-defineix la MACRO"
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
-msgstr ""
+msgstr "MACRO"
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "imprimeix l'expansió de la macro de l'EXPR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'EXPR'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
-msgstr "llegeix <FILE:...> en comptes dels fitxers per defecte"
+msgstr "llegeix <FITXER:...> en comptes dels fitxers per defecte"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FITXER:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr "no habilitis cap complement"
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
-msgstr "no verifiquis els resums dels fitxers"
+msgstr "no verifiquis els resums dels paquets"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
-msgstr "no verifiquis les capçaleres de la base de dades en obtenir-les"
+msgstr "no verifiquis les capçaleres de la base de dades quan s'obtinguin"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "no verifiquis les signatures del paquet"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
-msgstr "envia de la sortida estàndard a CMD"
+msgstr "envia de la sortida estàndard a l'ORDRE"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
-msgstr "CMD"
+msgstr "ORDRE"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
-msgstr "utilitza ROOT com a directori d'alt nivell"
+msgstr "utilitza l'ARREL com el directori de nivell superior"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
-msgstr "ROOT"
+msgstr "ARREL"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
-msgstr ""
+msgstr "utilitza la base de dades en el DIRECTORI"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
-msgstr ""
+msgstr "DIRECTORI"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
-msgstr "mostra etiquetes de consulta conegudes"
+msgstr "mostra les etiquetes conegudes de consulta"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
-msgstr "mostra rpmrc final i la configuració de macros"
+msgstr "mostra el rpmrc final i la configuració de les macros"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "proporciona sortides menys detallades"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "proporciona sortides més detallades"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
-msgstr "escriu la versió d'RPM que s'està usant"
+msgstr "escriu la versió del RPM que s'està utilitzant"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
-msgstr "depura la màquina d'estats del fitxer de dades"
+msgstr "depura la màquina d'estats del fitxer de càrrega"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
-msgstr "depura l'E/S de l'rpmio"
+msgstr "depura l'E/S de rpmio"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: la taula d'opcions no està ben configurada (%d)\n"
@@ -1914,23 +2257,23 @@ msgstr "els camins exclosos han de començar per /"
 
 #: lib/poptI.c:64
 msgid "relocations must begin with a /"
-msgstr "les reubicacions han de començar per /"
+msgstr "els trasllats han de començar amb /"
 
 #: lib/poptI.c:67
 msgid "relocations must contain a ="
-msgstr "les reubicacions han de contenir ="
+msgstr "els trasllats han de contenir un ="
 
 #: lib/poptI.c:70
 msgid "relocations must have a / following the ="
-msgstr "les reubicacions han de tenir un / seguit de ="
+msgstr "els trasllats han de tenir un / a continuació del ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
-"instal·la tots els fitxers, fins i tot configuracions que podrien ser "
+"instal·la tots els fitxers, fins i tot les configuracions que podrien ser "
 "ignorades"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1938,152 +2281,162 @@ msgstr ""
 "suprimeix tots els paquets que coincideixen amb <paquet> (normalment es "
 "genera un error si <paquet> especifica múltiples paquets)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
-msgstr "reubica els fitxers en un paquet no reubicable"
+msgstr "trasllada els fitxers al paquet sense translació"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
-msgstr "escriu els bucles de dependències com a avís"
+msgstr "escriu els bucles de dependències com advertències"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "suprimeix (desinstal·la) un paquet"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<paquet>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "no instal·lis fitxers de configuració"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
-msgstr "no instal·lis documentació"
+msgstr "no instal·lis la documentació"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
-msgstr "ignora fitxers amb un component inicial <camí> "
+msgstr "ignora els fitxers amb un component inicial <camí> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<camí>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "abreviatura de --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "actualitza els paquets si ja estan instal·lats"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
-msgstr "<fitxerPaquet>+"
+msgstr "<fitxer del paquet>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
-msgstr "escriu marques durant la instal·lació de paquets (millor amb -v)"
+msgstr "escriu marques durant la instal·lació dels paquets (millor amb -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "no verifiquis l'arquitectura del paquet"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "no verifiquis el sistema operatiu del paquet"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
-msgstr "no comprovis l'espai en disc abans d'instal·lar"
+msgstr "no comprovis l'espai del disc abans d'instal·lar"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "instal·la documentació"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
-msgstr "instal·la paquets"
+msgstr "instal·la els paquets"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "actualitza la base de dades, però no modifiquis el sistema de fitxers"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "no verifiquis les dependències dels paquets"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
-msgstr "no verificar els resums dels fitxers"
+msgstr "no verifiquis els resums dels fitxers"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
-msgstr "no verificar els resums dels fitxers (obsolet)"
+msgstr "no verifiquis els resums dels fitxers (obsolet)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "no instal·lis els contexts de seguretat dels fitxers"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 "no reordenis la instal·lació dels paquets per a satisfer les dependències"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "no executis els scriptlets del paquet"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
-msgstr "no executis cap scriptlet %%pre"
+msgstr "no executis el scriptlet %%pre (si n'hi hagués)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
-msgstr "no executis cap scriptlet %%post"
+msgstr "no executis el scriptlet %%post (si n'hi hagués)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
-msgstr "no executis cap scriptlet %%preun"
+msgstr "no executis el scriptlet %%preun (si n'hi hagués)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
-msgstr "no executis cap scriptlet %%postun"
+msgstr "no executis el scriptlet %%postun (si n'hi hagués)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "no executis el scriptlet %%pretrans (si n'hi hagués)"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "no executis el scriptlet %%posttrans (si n'hi hagués)"
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "no executis cap scriptlet invocat per aquest paquet"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "no executis cap scriptlet %%triggerprein"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "no executis cap scriptlet %%triggerin"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "no executis cap scriptlet %%triggerun"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "no executis cap scriptlet %%triggerpostun"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2091,384 +2444,421 @@ msgstr ""
 "actualitza a una versió antiga del paquet (--force ho fa automàticament en "
 "les actualitzacions)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
-msgstr "escriu els percentatges com a instal·lació de paquets"
+msgstr "escriu els percentatges en la instal·lació dels paquets"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
-msgstr "reubica el paquet a <dir>, si és reubicable"
+msgstr "trasllada el paquet al <dir>, si es pot traslladar"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
-msgstr "reubica els fitxers del camí <vell> al <nou>"
+msgstr "trasllada els fitxers del camí <antic> al <nou>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<vell>=<nou>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "ignora els conflictes de fitxers entre paquets"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "reinstal·la si el paquet ja està present"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "no instal·lis, però digues si funcionarà correctament o no"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
-msgstr "actualitza paquets"
+msgstr "actualitza els paquets"
+
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "reinstal·la els paquets"
 
-#: lib/poptQV.c:67
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
-msgstr "comprova tots els paquets"
+msgstr "consulta o verifica tots els paquets"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
-msgstr "mode de comprovació de signatura"
+msgstr "mode rpm de comprovació de signatura"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
-msgstr "comprova a quins paquets pertany aquest fitxer"
+msgstr "consulta o verifica els paquets a què pertany aquest fitxer"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
-msgstr "comprova paquets en el grup"
+msgstr "consulta o verifica els paquets al grup"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
-msgstr "comprova un paquet"
+msgstr "consulta o verifica un fitxer del paquet"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
-msgstr "comprova quins paquets tenen identificador"
+msgstr "consulta o verifica els paquets amb l'identificador de paquet"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
-msgstr "comprova paquets amb identificació de capçalera"
+msgstr "consulta o verifica els paquets amb l'identificador de capçalera"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
-msgstr "mode de consulta"
+msgstr "mode rpm de consulta"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
-msgstr "comprova una instància de capçalera"
+msgstr "consulta o verifica una instància de capçalera"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
-msgstr "comprova els paquets de la transacció d'instal·lació"
+msgstr "consulta o verifica els paquets des de la transacció d'instal·lació"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "consulta els paquets exigits pel paquet"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
-msgstr "mode de verificació"
+msgstr "mode rpm de verificació"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
-msgstr "comprova les relacions de dependència dels paquets"
+msgstr "consulta o verifica els paquets que requereixen una dependència"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
-msgstr "comprova els paquets que satisfan les relacions de dependència"
+msgstr "consulta o verifica els paquets que proporcionen una dependència"
+
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr "consulta o verifica els paquets que recomanin una dependència"
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr "consulta o verifica els paquets que suggereixin una dependència"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr "consulta o verifica els paquets que ampliïn una dependència"
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr "consulta o verifica els paquets que millorin una dependència"
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
-msgstr "no passis els arguments"
+msgstr "no englobis els arguments"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
-msgstr ""
-"no processis els fitxers que no pertanyin al paquet com a fitxers manifest"
+msgstr "no processis els fitxers que no pertanyin al paquet com els manifests"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "mostra tots els fitxers de configuració"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
-msgstr "mostra llista de fitxers de documentació"
+msgstr "mostra tots els fitxers de documentació"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "mostra llista de fitxers de documentació"
+msgstr "mostra tots els fitxers de llicència"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "mostra tots els fitxers de llicència"
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
-msgstr "mostra informació bàsica del fitxer"
+msgstr "mostra la informació bàsica del fitxer"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "mostra tots els fitxers del paquet"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
-msgstr "omet fitxers %%ghost"
+msgstr "ignora els fitxers %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "ignora els fitxers %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
-msgstr "mostra l'estat dels fitxers de la llista"
+msgstr "mostra els estats dels fitxers llistats"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
-msgstr "no comprovis la mida dels fitxers"
+msgstr "no verifiquis la mida dels fitxers"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
-msgstr "no comprovis l'enllaç simbòlic dels fitxers"
+msgstr "no verifiquis l'enllaç simbòlic dels fitxers"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
-msgstr "no comprovis qui és el propietari dels fitxers"
+msgstr "no verifiquis qui és el propietari dels fitxers"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
-msgstr "no comprovis a quin grup pertanyen els fitxers"
+msgstr "no verifiquis a quin grup pertanyen els fitxers"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
-msgstr "no comprovis la data de modificació dels fitxers"
+msgstr "no verifiquis la data de modificació dels fitxers"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
-msgstr "no comprovis el mode dels fitxers"
+msgstr "no verifiquis el mode dels fitxers"
 
-#: lib/poptQV.c:233
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
+msgstr "no verifiquis els contextos de seguretat dels fitxers"
+
+#: lib/poptQV.c:264
 msgid "don't verify capabilities of files"
 msgstr "no verifiquis les capacitats dels fitxers"
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
-msgstr "no comprovis els contextos de seguretat dels fitxers"
-
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
-msgstr "no comprovis els fitxers del paquet"
+msgstr "no verifiquis els fitxers del paquet"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
-msgstr "no comprovis les relacions de dependència del paquet"
+msgstr "no verifiquis les relacions de dependència del paquet"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "no executis els scripts de verificació"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
-msgstr ""
+msgstr "Falten les funcionalitats rpmlib per a %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
-msgstr "s'espera un paquet de codi font, però s'ha trobat un de binari\n"
+msgstr ""
+"s'esperava un paquet de les fonts, però se n'ha trobat un dels binaris\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
-msgstr "el paquet font no conté un fitxer .spec\n"
+msgstr "el paquet de les fonts no conté cap fitxer .spec\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
-msgstr "ha fallat el desempaquetat de l'arxiu%s%s: %s\n"
+msgstr "ha fallat el desempaquetatge de l'arxiu%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " al fitxer "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "ha fallat %s al fitxer %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "ha fallat %s: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "format incorrecte: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(no conté fitxers)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "reemplaçat    "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "no instal·lat "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "xarxa compartida"
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "color incorrecte "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(cap estat)   "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(%3d desconegut) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "el paquet no té propietari dels fitxers/llistes de grup\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
-msgstr "el paquet no té ni propietari de fitxer ni llistes d'id\n"
+msgstr "el paquet no té ni propietari de fitxer ni llistes d'id.\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "el grup %s no conté cap paquet\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "cap paquet dispara %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "%s mal format: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "cap paquet concorda amb %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "cap paquet necessita %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr "no hi ha cap paquet que recomani %s\n"
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr "no hi ha cap paquet que suggereixi %s\n"
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr "no hi ha cap paquet que ampliï %s\n"
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr "no hi ha cap paquet que millori %s\n"
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "cap paquet proporciona %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "fitxer %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "el fitxer %s no pertany a cap paquet\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "número de paquet invàlid: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
-msgstr ""
+msgstr "no s'ha pogut llegir el registre %u\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
-msgstr "no s'ha instal·lat el paquet %s\n"
+msgstr "el paquet %s no està instal·lat\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "etiqueta desconeguda: «%s»\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
-msgstr ""
+msgstr "%s: ha fallat la importació de la clau %d.\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: ha fallat la lectura de la importació (%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
-"%s: la regió de capçalera inmutable no s'ha pogut llegir. El paquet és "
-"corrupte?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NO ÉS CORRECTE"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "D'ACORD"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (CLAUS NO TROBADES:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (CLAUS NO FIABLES:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
-msgstr "%s: ha fallat l'apertura: %s\n"
+msgstr "%s: ha fallat l'obertura: %s\n"
 
 #: lib/rpmchroot.c:43
 #, c-format
 msgid "Unable to open current directory: %m\n"
-msgstr ""
+msgstr "No es pot obrir el directori actual: %m\n"
 
 #: lib/rpmchroot.c:59 lib/rpmchroot.c:84
 #, c-format
 msgid "%s: chroot directory not set\n"
-msgstr ""
+msgstr "%s: directori chroot sense establir\n"
 
 #: lib/rpmchroot.c:70
 #, c-format
@@ -2478,221 +2868,453 @@ msgstr "No s'ha pogut canviar el directori root: %m\n"
 #: lib/rpmchroot.c:95
 #, c-format
 msgid "Unable to restore root directory: %m\n"
+msgstr "No es pot restaurar el directori arrel: %m\n"
+
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "S'estan generant els %d índexs que falten, si us plau, espereu...\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr "no es pot obrir l'índex %s mitjançant %s - %s (%d)\n"
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "no s'ha establert cap dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: s'ignora"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "s'ha produït un error (%d) en emmagatzemar el registre #%d a %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: ha fallat regexec: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: ha fallat regcomp: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: s'ignora"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: s'ha obtingut malmesa la capçalera #%u -- s'ignora.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: no s'ha pogut llegir la capçalera a 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "no s'ha establert el dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "ha fallat en crear el directori %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "la capçalera #%u en la base de dades és incorrecta -- s'ignora.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "no es pot afegir el registre originalment a %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"no s'ha pogut reconstruir la base de dades: la base de dades original "
+"continua al seu lloc\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "no s'ha pogut substituir l'antiga base de dades amb la nova\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NO "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "SÍ"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr ""
-"Les dependències PreReq:, Provides:, i Obsoletes: disposen de versionatge."
+msgstr "Les dependències PreReq:, Provides: i Obsoletes: suporten versions."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 "els noms de fitxer s'han emmagatzemat com una tupla (dirName,baseName,"
-"dirIndex), no com a camí"
+"dirIndex), no com un camí."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
-msgstr "les dades del paquet es poden comprimir amb el bzip2."
+msgstr "la càrrega del paquet es pot comprimir mitjançant bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
-msgstr "Les dades del paquet es poden comprimir amb xz."
+msgstr "la càrrega del paquet es pot comprimir mitjançant xz."
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
-msgstr "Les dades del paquet es poden comprimir amb bzip2."
+msgstr "la càrrega del paquet es pot comprimir mitjançant lzma."
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
-msgstr "els fitxer de les dades del paquet tenen el prefix «./»."
+msgstr "els fitxers de càrrega del paquet tenen el prefix «./»."
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr ""
 "no s'ha proporcionat implícitament el nom-versió-alliberament del paquet."
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
 msgstr "les etiquetes de la capçalera sempre s'ordenen després de carregar-se."
 
-#: lib/rpmds.c:961
+#: lib/rpmds.c:1249
 msgid "the scriptlet interpreter can use arguments from header."
-msgstr "l'íntèrpret de l'scriptlet pot emprar arguments de la capçalera."
+msgstr "l'intèrpret del scriptlet pot utilitzar arguments de la capçalera."
 
-#: lib/rpmds.c:964
+#: lib/rpmds.c:1252
 msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 "es pot instal·lar un conjunt d'enllaços durs a fitxer sense que estiguin "
 "complets."
 
-#: lib/rpmds.c:967
+#: lib/rpmds.c:1255
 msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 "els scriptlets del paquet poden accedir la base de dades rpm durant la "
-"instal·lació"
+"instal·lació."
 
-#: lib/rpmds.c:971
+#: lib/rpmds.c:1259
 msgid "internal support for lua scripts."
-msgstr "es poden emprar scripts en lua."
+msgstr "es poden utilitzar scripts en lua."
 
-#: lib/rpmds.c:975
+#: lib/rpmds.c:1263
 msgid "file digest algorithm is per package configurable"
 msgstr "l'algorisme de resum de fitxer és configurable per paquet"
 
-#: lib/rpmds.c:979
+#: lib/rpmds.c:1267
 msgid "support for POSIX.1e file capabilities"
 msgstr "suport per a capacitats de fitxer POSIX.1e"
 
-#: lib/rpmds.c:983
+#: lib/rpmds.c:1271
 msgid "package scriptlets can be expanded at install time."
 msgstr ""
+"els scriptlets del paquet es poden expandir en el moment de la instal·lació."
 
-#: lib/rpmds.c:986
+#: lib/rpmds.c:1274
 msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "suporta els fitxers superiors als 4 GB"
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr "compatibilitat per a les dependències enriquides."
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr "op desconegut de dependència enriquida '%.*s'"
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr "Cal el nom"
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr "La dependència enriquida no comença amb '('"
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr "Falten argument a l'op de la dependència enriquida"
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr "Dependència enriquida buida"
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr "Dependència enriquida sense acabar: %s"
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr "No es poden encadenar diferents ops"
+
+#: lib/rpmds.c:1564
+#, fuzzy
+msgid "Can only chain and/or/with ops"
+msgstr "Únicament es poden encadenar ops AND i OR"
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Valor incorrecte del magic"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Capçalera incorrecta o il·legible"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "La mida de la capçalera és massa gran"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "El fitxer és massa gran per a l'arxiu"
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Tipus de fitxer desconegut"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "Falten fitxers"
+
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "No hi ha coincidència de resums"
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Error intern"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "El fitxer de l'arxiu no és a la capçalera"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
+
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " ha fallat - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: (error 0x%x)"
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
-msgstr "ha fallat l'apertura de %s: %s\n"
+msgstr "ha fallat l'obertura de %s: %s\n"
+
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr "S'ha superat el nivell màxim de recursivitat del manifest: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: no és un paquet rpm (o un manifest de paquet)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
-msgstr ""
+msgstr "S'està actualitzant o instal·lant...\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
-msgstr ""
+msgstr "S'està netejant o suprimint...\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "S'està preparant..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
-msgstr ""
+msgstr "S'estan preparant els paquets..."
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Dependències fallides:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: no és un paquet rpm (o un manifest de paquet): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "no es pot instal·lar %s\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "S'està obtenint %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
-msgstr "S'està ometent %s - ha fallat la transferència\n"
+msgstr "s'ignora %s - va fallar la transferència\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
-msgstr "el paquet %s no és reubicable\n"
+msgstr "el paquet %s no es pot traslladar\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "s'ha produït un error en llegir del fitxer %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
-msgstr "\"%s\" especifica múltiples paquets:\n"
+msgstr "«%s» especifica múltiples paquets:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "no es pot obrir %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "S'està instal·lant %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "no és un paquet rpm"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
-msgstr "tipus de signatura invàlida"
+msgstr "tipus de signatura no vàlida"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
-msgstr "versió d'empaquetat RPM no suportada"
+msgstr "versió no suportada d'empaquetatge RPM"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "ha fallat la lectura: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
-msgstr ""
+msgstr "no és un paquet rpm\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
-msgstr ""
+msgstr "no es pot crear el bloqueig %s a %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
-msgstr ""
+msgstr "a l'espera del bloqueig %s a %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
-msgstr ""
+msgstr "Ha fallat el dlopen %s %s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
-msgstr ""
+msgstr "La resolució del símbol %s ha fallat: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr ""
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "Complement %%__%s_%s no configurat\n"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
-msgstr ""
-
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
+msgstr "Complement %s no carregat\n"
 
 #: lib/rpmprob.c:109
 msgid "different"
@@ -2701,12 +3323,12 @@ msgstr "diferent"
 #: lib/rpmprob.c:114
 #, c-format
 msgid "package %s is intended for a %s architecture"
-msgstr "el paquet %s és per a arquitectures %s"
+msgstr "el paquet %s està destinat a una arquitectura %s"
 
 #: lib/rpmprob.c:118
 #, c-format
 msgid "package %s is intended for a %s operating system"
-msgstr "el paquet %s és per a sistemes operatius %s"
+msgstr "el paquet %s està destinat a un sistema operatiu %s"
 
 #: lib/rpmprob.c:122
 #, c-format
@@ -2716,18 +3338,19 @@ msgstr "el paquet %s ja s'ha instal·lat"
 #: lib/rpmprob.c:125
 #, c-format
 msgid "path %s in package %s is not relocatable"
-msgstr "el camí %s del paquet %s no és reubicable"
+msgstr "el camí %s al paquet %s no es pot traslladar"
 
 #: lib/rpmprob.c:130
 #, c-format
 msgid "file %s conflicts between attempted installs of %s and %s"
-msgstr "el fitxer %s té un conflicte amb els intents d'instal·lació de %s i %s"
+msgstr ""
+"el fitxer %s entra amb conflicte entre els intents d'instal·lació de %s i %s"
 
 #: lib/rpmprob.c:135
 #, c-format
 msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
-"el fitxer %s de la instal·lació de %s té un conflicte amb un fitxer del "
+"el fitxer %s de la instal·lació de %s entra amb conflicte amb el fitxer del "
 "paquet %s"
 
 #: lib/rpmprob.c:140
@@ -2739,835 +3362,668 @@ msgstr "ja s'ha instal·lat el paquet %s, que és més nou que %s"
 #, c-format
 msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
-"el paquet a instal·lar %s necessita %<PRIu64>%cB al sistema de fitxers %s"
+"la instal·lació del paquet %s necessita %<PRIu64>%cB al sistema de fitxers %s"
 
 #: lib/rpmprob.c:155
 #, c-format
 msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
-"el paquet a instal·lar %s necessita %<PRIu64> nodes-i al sistema de fitxers "
-"%s"
-
-#: lib/rpmprob.c:159
-#, c-format
-msgid "%s is needed by %s%s"
-msgstr "el paquet %s és requerit per %s%s"
-
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
-msgstr "(instalat) "
-
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
-msgstr "%s té conflictes amb %s%s"
-
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
-msgstr "error desconegut %d en manipular el paquet %s"
-
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
-msgstr "falten el segon ':' a %s:%d\n"
-
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
-msgstr "falta el nom d'arquitectura a %s:%d\n"
-
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
-msgstr "Línia de dades incompleta a %s:%d\n"
-
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
-msgstr "Massa arguments a la línia de dades a %s:%d\n"
-
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr "Número d'arquitectura/S.O. incorrecte: %s (%s:%d)\n"
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr "Línia per defecte incorrecta a %s:%d\n"
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr "Massa arguments a la línia per defecte a %s:%d\n"
-
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "manca ':' (trobat a 0x%02x) a %s:%d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "manca un argument per a %s a %s:%d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr "no s'ha pogut obrir %s a %s:%d: %m\n"
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "falta l'arquitecutra per a %s a %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "opció incorrecte '%s' a %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Sistema desconegut: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "contacteu amb %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "No s'ha pogut obrir %s per a lectura: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "no s'ha muntat la disponibilitat per a emprar scriptlets <lua>\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "No s'ha pogut crear el fitxer temporal per a %s: %s\n"
+"la instal·lació del paquet %s necessita %<PRIu64> nodes-i al sistema de "
+"fitxers %s"
 
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "S'ha produït un error en duplicar el descriptor de fitxer: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "Ha fallat l'scriptlet %s, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s ha fallat l'scriplet, senyal %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "Ha fallat l'scriptlet %s,  estat de sortida %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Format desconegut"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "no es pot obrir la base de dades Packages a %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "hi ha un '(' de més a l'etiqueta del paquet: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "falta '(' a l'etiqueta del paquet: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "falta ')' a l'etiqueta del paquet: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: ha fallat la lectura de la clau pública.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "mida sigh(%d): dolenta, la lectura ha retornat %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "magic sigh: dolent\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "etiquetes sigh: dolentes, número d'etiquetes(%d) fora de rang\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "dades sigh: dolentes, número de bytes(%d) fora de rang\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "blob sigh(%d): dolent, lectura ha retornat %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-"etiqueta sigh[%d]: dolenta, etiqueta %d tipus %d desplaçament %d compte %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "càrrega sigh: dolenta\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "emplenat sigh(%zd): dolent, s'han llegit %zd bytes\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigSize sigh(%zd): dolent, ha fallat fstat(2)\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-"La regió inmutable de la capçalera no s'ha pogut llegir. És possible que el "
-"paquet sigui corrupte\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "Resum MD5:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "Capçalera de resum SHA1:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Capçalera "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "manca   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Dependències insatisfetes per a %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "manca { després de %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "manca } després de %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "el format de l'etiqueta és buit"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "el nom de l'etiqueta és buit"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "etiqueta desconeguda"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "s'esperava ] al final de la matriu"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "no s'esperava ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "no s'esperava }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "s'esperava ? a l'expressió"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "s'esperava { després de ? a l'expressió"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "s'esperava } a l'expressió"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "s'esperava : després de ? a la subexpressió"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "s'esperava { després de : a l'expressió"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "s'esperava | al final de l'expressió"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "iterador de matrius emprat amb matrius de mides diferents"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "no es pot obrir l'índex de %s emprant db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "no s'ha establert cap dbpath\n"
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
+msgstr "el paquet %s és requerit pel paquet %s%s"
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: s'està ignorant"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
+msgstr "(instal·lat) "
 
-#: lib/rpmdb.c:1318
+#: lib/rpmprob.c:163
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "s'ha produït un error (%d) en emmagatzemar el registre #%d a %s\n"
+msgid "%s conflicts with %s%s"
+msgstr "%s entra en conflicte amb %s%s"
 
-#: lib/rpmdb.c:1415
+#: lib/rpmprob.c:167
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: ha fallat regexec: %s\n"
+msgid "%s is obsoleted by %s%s"
+msgstr "%s està devaluat amb %s%s"
 
-#: lib/rpmdb.c:1596
+#: lib/rpmprob.c:172
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: ha fallat regcomp: %s\n"
+msgid "unknown error %d encountered while manipulating package %s"
+msgstr "error desconegut %d en manipular el paquet %s"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: s'està ignorant"
+#: lib/rpmrc.c:222
+#, c-format
+msgid "missing second ':' at %s:%d\n"
+msgstr "falta el segon «:» a %s:%d\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:225
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: s'ha obtingut la capçalera #%u malmesa -- s'està ignorant.\n"
+msgid "missing architecture name at %s:%d\n"
+msgstr "falta el nom d'arquitectura a %s:%d\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:370
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
+msgid "Incomplete data line at %s:%d\n"
+msgstr "Línia incompleta de dades a %s:%d\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:375
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr ""
+msgid "Too many args in data line at %s:%d\n"
+msgstr "Massa arguments a la línia de dades a %s:%d\n"
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:382
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr ""
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr "Número incorrecte d'arch/os: %s (%s:%d)\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:413
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: no s'ha pogut llegir la capçalera a 0x%x\n"
+msgid "Incomplete default line at %s:%d\n"
+msgstr "Línia incompleta per defecte a %s:%d\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:418
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "error(%d) en establir els registres «%s» de l'índex %s\n"
+msgid "Too many args in default line at %s:%d\n"
+msgstr "Massa arguments a la línia per defecte a %s:%d\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:523
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "error(%d) en emmagatzemar el registre «%s» en %s\n"
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "falta un «;» (trobat a 0x%02x) a %s:%d\n"
 
-#: lib/rpmdb.c:2477
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "error(%d) en suprimir el registre «%s» de %s\n"
+msgid "missing argument for %s at %s:%d\n"
+msgstr "falta l'argument per %s a %s:%d\n"
 
-#: lib/rpmdb.c:2551
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "error(%d) en assignar la instància de nou paquet\n"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "no s'ha pogut obrir %s a %s:%d: %m\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "s'ha produït un error (%d) en obtenir «%s» registres de l'índex %s\n"
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "falta l'arquitectura per a %s a %s:%d\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "error(%d) en emmagatzemar el registre %s a %s\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "opció incorrecta «%s» a %s:%d\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "no s'ha establert el dbpath"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr "La lectura del vector auxiliar ha fallat, /proc no està muntat?\n"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "ha fallat en crear el directori %s: %s\n"
+msgid "Unknown system: %s\n"
+msgstr "Sistema desconegut: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "la capçalera #%u de la base de dades és incorrecta -- s'ignorarà.\n"
+msgid "Please contact %s\n"
+msgstr "contacteu amb %s\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "no es pot afegir el registre originalment a %u\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "No s'ha pogut obrir %s per a lectura: %m.\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
-"no s'ha pogut remuntar la base de dades: es continua fent servir la base de "
-"dades original\n"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "no s'ha pogut reemplaçar la base de dades antiga amb la nova\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr "No s'ha cridat cap exec() després del fork() a l'scriptlet de lua\n"
 
-#: lib/rpmdb.c:2949
+#: lib/rpmscript.c:138
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "reemplaçeu els fitxers a %s amb fitxers de %s per a recuperar-ho"
+msgid "Unable to restore current directory: %m"
+msgstr "No s'ha pogut restaurar el directori actual: %m"
 
-#: lib/rpmdb.c:2960
-#, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "no s'ha pogut suprimir el directori %s: %s\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "no s'ha construït amb la compatibilitat cap als scriptlets <lua>\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmscript.c:278
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d error(%d) de %s: %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "No s'ha pogut crear el fitxer temporal per a %s: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmscript.c:313
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d error(%d): %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "S'ha produït un error en duplicar el descriptor de fitxer: %s: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmscript.c:353
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "no es pot obtenir el blocatge %s a %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "compartit"
+msgid "Fwrite failed: %s"
+msgstr "El fwrite ha fallat: %s"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "exclusiu"
-
-#: lib/backend/db3.c:582
+#: lib/rpmscript.c:371
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr ""
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "Ha fallat el scriptlet %s, waitpid(%d) rc %d: %s\n"
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmscript.c:375
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "opció de la bd no reconeguda: s'ignora «%s».\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s ha fallat l'scriplet, senyal %d\n"
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmscript.c:378
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s té un valor numèric invàlid, s'ignorarà\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "Ha fallat el scriptlet %s, estat de sortida %d\n"
+
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Format desconegut"
+
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "instal·la"
+
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "esborra"
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmts.c:100
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s té un valor de tipus «long» massa gran o massa petit, s'ignorarà\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "no es pot obrir la base de dades Packages a %s\n"
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmts.c:199
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr ""
-"%s té un valor de tipus «enter» massa llarg o massa petit, s'ignorarà\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "hi ha un «(» de més a l'etiqueta del paquet: %s\n"
 
-#: plugins/sepolicy.c:218
+#: lib/rpmts.c:217
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr ""
+msgid "missing '(' in package label: %s\n"
+msgstr "falta «(» a l'etiqueta del paquet: %s\n"
 
-#: plugins/sepolicy.c:225
+#: lib/rpmts.c:225
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr ""
+msgid "missing ')' in package label: %s\n"
+msgstr "falta un «)» a l'etiqueta del paquet: %s\n"
 
-#: plugins/sepolicy.c:231
+#: lib/rpmts.c:284
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr ""
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: ha fallat la lectura de la clau pública.\n"
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr ""
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "transacció"
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:152
+#, c-format
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: plugins/sepolicy.c:306
+#: lib/rpmvs.c:158
 #, c-format
-msgid "Failed to begin policy transaction: %s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: plugins/sepolicy.c:337
+#: lib/rpmvs.c:178
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: plugins/sepolicy.c:386
+#: lib/rpmvs.c:188
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: lib/rpmvs.c:195
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to execute %s: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/rpmvs.c:268
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Capçalera "
+
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "No es pot tornar a carregar la capçalera de signatura.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "s'ha ignorat"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "ha fallat"
+
+#: lib/verify.c:263
 #, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr ""
+msgid "Duplicate username or UID for user %s\n"
+msgstr "Duplica el nom de l'usuari o l'UID per a l'usuari %s\n"
 
-#: rpmio/macro.c:185
+#: lib/verify.c:284
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== actiu %d buit %d\n"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr "Duplica el nom del grup o el GID per al grup %s\n"
+
+#: lib/verify.c:395
+msgid "no state"
+msgstr "sense estat"
+
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "estat desconegut"
+
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "falta   %c %s"
+
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Dependències insatisfetes per a %s:\n"
+
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
+msgstr "No es pot restablir el valor de nice: %s"
+
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
+msgstr "No es pot restablir la prioritat de l'E/S: %s"
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(buit)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(buit)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "La macro %%%s té un cos inacabat\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "La macro %%%s té opcions inacabades\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "La macro %%%s té un nom invàlid (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "La macro %%%s té un cos inacabat\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "La macro %%%s té opcions inacabades\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "La macro %%%s té un cos buit\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "La macro %%%s necessita un espai en blanc abans del cos\n"
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
-msgstr "No s'ha expandit la macro %%%s\n"
+msgstr "Ha fallat l'expansió de la macro %%%s\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "La macro %%%s té un nom invàlid (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "La macro %%%s (%s) no s'ha emprat sota el nivell %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr "S'ha definit la macro %%%s però no s'utilitza dins de l'àmbit\n"
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Opció desconeguda %c a %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
+"Hi ha massa nivells de recursivitat en l'expansió de la macro. És probable "
+"que sigui a causa de la declaració recursiva de la macro.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "%c sense terminar: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Un %% precedeix una macro que no es pot analitzar\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "ha fallat la càrrega del fitxer de les macros %s"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== actiu %d buit %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "S'ha produït un error en crear el fitxer temporal %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Fitxer %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
-msgstr "El fitxer %s fa menys de %u bytes\n"
+msgstr "El fitxer %s és inferior als %u bytes\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "no s'ha pogut crear el directori"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[cap]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(cap error)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "error fatal: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "error: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "advertència: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
-msgstr "sintaxi invàlida en l'scriptlet lua: %s\n"
+msgstr "sintaxi no vàlida en el scriptlet lua: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
-msgstr "sintaxi invàlida en l'script lua: %s\n"
+msgstr "sintaxi no vàlida en el script lua: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
-msgstr "ha fallat l'script lua: %s\n"
+msgstr "ha fallat el script lua: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
-msgstr "sintaxi invàlida en el ftixer lua: %s\n"
+msgstr "sintaxi no vàlida al fitxer lua: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "Ha fallat el hook lua: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr ""
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(cap error)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "error fatal: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "error: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "avís: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "l'assignació de memòria (%u bytes) ha retornat NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr "V%d %s/%s %s, id. de la clau %s"
+
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
+msgstr "(cap)"
+
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr "s'ha produït un error en crear el directori temporal %s: %m\n"
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr "s'ha produït un error en crear la FIFO fifo %s: %m\n"
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr "s'ha produït un error en suprimir la FIFO fifo %s: %m\n"
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr "s'ha produït un error en suprimir el directori fifo %s: %m\n"
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
-msgstr "%s: ha fallat l'Fwrite: %s\n"
+msgstr "%s: ha fallat el fwrite: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Ha fallat el fread: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
-msgstr "%s: ha fallat l'Fflush: %s\n"
+msgstr "%s: ha fallat el fflush: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
-msgstr ""
+msgstr "Signatura PGP no suportada\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
-msgstr ""
+msgstr "Algoritme de dispersió PGP no suportat %u\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
-msgstr ""
+msgstr "Algoritme de clau pública PGP no suportat %u\n"
+
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "No es pot executar %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr "El fopen ha fallat\n"
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "No s'ha pogut escriure a la canonada\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "No s'ha pogut crear una canonada per a la signatura: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr "No s'ha pogut llegir des del fitxer %s: %s\n"
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "ha fallat l'execució del gpg (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "el gpg no ha escrit la signatura\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "no es pot llegir la signatura\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
-msgstr "Ha fallat rpmMkTemp\n"
+msgstr "Ha fallat el rpmMkTemp\n"
+
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: ha fallat writeLead: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: El rpmReadSignature ha fallat: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: ha fallat el headerRead: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "No es poden signar els paquets RPM v3\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s ja conté una signatura idèntica i s'ignora\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
-msgstr "%s: ha fallat rpmWriteSignature: %s\n"
+msgstr "%s: ha fallat el rpmWriteSignature: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: ha fallat el writeLead: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
+msgstr "ha fallat la substitució %s: %s\n"
+
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: ha fallat la lectura del manifest: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
-msgstr "no verifiquis la signatura de la capçalera i les dades"
+msgstr "no verifiquis la signatura de la capçalera i la càrrega"
diff --git a/po/cmn.po b/po/cmn.po
new file mode 100644 (file)
index 0000000..23a25cd
--- /dev/null
+++ b/po/cmn.po
@@ -0,0 +1,3935 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# 趙惟倫 <bluebat@member.fsf.org>, 2013
+# 趙惟倫 <bluebat@member.fsf.org>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: RPM\n"
+"Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: Chinese (Mandarin) (http://www.transifex.com/rpm-team/rpm/"
+"language/cmn/)\n"
+"Language: cmn\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"
+
+#: cliutils.c:21 lib/poptI.c:29
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s:%s\n"
+
+#: cliutils.c:27 lib/poptALL.c:56
+#, c-format
+msgid "RPM version %s\n"
+msgstr "RPM 版本 %s\n"
+
+#: cliutils.c:32
+#, c-format
+msgid "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
+msgstr "著作權所有 (C) 1998-2002 - Red Hat, Inc.\n"
+
+#: cliutils.c:33
+#, c-format
+msgid ""
+"This program may be freely redistributed under the terms of the GNU GPL\n"
+msgstr "此程式允許在遵守 GNU GPL 條款的前提下自由散布\n"
+
+#: cliutils.c:53
+#, c-format
+msgid "creating a pipe for --pipe failed: %m\n"
+msgstr "以 --pipe 建立管線時失敗:%m\n"
+
+#: cliutils.c:62
+#, c-format
+msgid "exec failed\n"
+msgstr "執行失敗\n"
+
+#: rpm2archive.c:91 rpm2cpio.c:68
+#, c-format
+msgid "argument is not an RPM package\n"
+msgstr "引數不是 RPM 套件\n"
+
+#: rpm2archive.c:96 rpm2cpio.c:73
+#, c-format
+msgid "error reading header from package\n"
+msgstr "讀取套件的標頭資訊時發生錯誤\n"
+
+#: rpm2archive.c:111 rpm2cpio.c:88
+#, c-format
+msgid "cannot re-open payload: %s\n"
+msgstr "無法重新開啟酬載:%s\n"
+
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
+msgstr "buildroot 已被指定,忽略 %s\n"
+
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
+msgstr "從 <specfile> 透過 %prep (解包原始碼並套用修補程式) 來建置"
+
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
+msgstr "<specfile>"
+
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
+msgstr "從 <specfile> 透過 %build (%prep,然後編譯) 來建置"
+
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
+msgstr "從 <specfile> 透過 %install (%prep,%build,然後安裝) 來建置"
+
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
+msgstr "從 <specfile> 驗證 %files 區段"
+
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
+msgstr "根據 <specfile> 建置原始碼套件與二進位套件"
+
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
+msgstr "根據 <specfile> 只建置二進位套件"
+
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
+msgstr "根據 <specfile> 只建置原始碼套件"
+
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<source package>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr "從 <source package> 透過 %install (%prep,%build,然後安裝) 來建置"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <tarball>"
+msgstr "從 <tarball> 透過 %prep (解包原始碼和套用修補檔) 來建置"
+
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
+msgid "<tarball>"
+msgstr "<tarball>"
+
+#: rpmbuild.c:186
+msgid "build through %build (%prep, then compile) from <tarball>"
+msgstr "從 <tarball> 透過 %build (%prep,然後編譯) 來建置"
+
+#: rpmbuild.c:189
+msgid "build through %install (%prep, %build, then install) from <tarball>"
+msgstr "從 <tarball> 透過 %install (%prep,%build,然後安裝) 來建置"
+
+#: rpmbuild.c:192
+#, c-format
+msgid "verify %files section from <tarball>"
+msgstr "從 <tarball> 驗證 %files 區段"
+
+#: rpmbuild.c:195
+msgid "build source and binary packages from <tarball>"
+msgstr "從 <tarball> 中建置原始碼套件與二進位套件"
+
+#: rpmbuild.c:198
+msgid "build binary package only from <tarball>"
+msgstr "從 <tarball> 中只建置二進位套件"
+
+#: rpmbuild.c:201
+msgid "build source package only from <tarball>"
+msgstr "從 <tarball> 中只建置原始碼套件"
+
+#: rpmbuild.c:205
+msgid "build binary package from <source package>"
+msgstr "從 <source package> 中建置二進位套件"
+
+#: rpmbuild.c:212
+msgid "override build root"
+msgstr "強制覆寫建置根目錄"
+
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
+msgid "remove build tree when done"
+msgstr "完成後移除建置樹"
+
+#: rpmbuild.c:218
+msgid "ignore ExcludeArch: directives from spec file"
+msgstr "忽略 ExcludeArch:根據規格檔的指示"
+
+#: rpmbuild.c:220
+msgid "debug file state machine"
+msgstr "除錯檔案狀態機器"
+
+#: rpmbuild.c:222
+msgid "do not execute any stages of the build"
+msgstr "不執行建置程序裡的任何步驟"
+
+#: rpmbuild.c:224
+msgid "do not verify build dependencies"
+msgstr "不驗證建置相依關係"
+
+#: rpmbuild.c:226
+msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
+msgstr "產生與(舊)rpm v3 封裝相容的套件標頭"
+
+#: rpmbuild.c:230
+#, c-format
+msgid "do not execute %clean stage of the build"
+msgstr "不執行組建的 %clean 階段"
+
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
+#, c-format
+msgid "do not execute %check stage of the build"
+msgstr "不執行組建的 %check 階段"
+
+#: rpmbuild.c:237
+msgid "do not accept i18N msgstr's from specfile"
+msgstr "不接受來自規格檔的 i18N msgstr"
+
+#: rpmbuild.c:239
+msgid "remove sources when done"
+msgstr "完成後移除原始碼檔案"
+
+#: rpmbuild.c:241
+msgid "remove specfile when done"
+msgstr "完成後移除規格檔"
+
+#: rpmbuild.c:243
+msgid "skip straight to specified stage (only for c,i)"
+msgstr "直接跳到指定的階段 (只有用於 c,i)"
+
+#: rpmbuild.c:245
+msgid "override target platform"
+msgstr "無視目標平臺"
+
+#: rpmbuild.c:262
+msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
+msgstr "組建選項中使用 [ <specfile> | <tarball> | <source package> ]:"
+
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "用於所有 rpm 模式和可執行檔案的共同選項:"
+
+#: rpmbuild.c:282
+msgid "Failed build dependencies:\n"
+msgstr "相依性建置失敗:\n"
+
+#: rpmbuild.c:300
+#, c-format
+msgid "Unable to open spec file %s: %s\n"
+msgstr "無法開啟 %s 規格檔:%s\n"
+
+#: rpmbuild.c:363
+#, c-format
+msgid "Failed to open tar pipe: %m\n"
+msgstr "無法開啟 tar 管線:%m\n"
+
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
+#, c-format
+msgid "Failed to read spec file from %s\n"
+msgstr "無法從 %s 讀取規格檔\n"
+
+#: rpmbuild.c:401
+#, c-format
+msgid "Failed to rename %s to %s: %m\n"
+msgstr "無法將 %s 重新命名為 %s:%m\n"
+
+#: rpmbuild.c:479
+#, c-format
+msgid "failed to stat %s: %m\n"
+msgstr "無法檢視 %s 的狀態:%m\n"
+
+#: rpmbuild.c:483
+#, c-format
+msgid "File %s is not a regular file.\n"
+msgstr "%s 不是通常的檔案。\n"
+
+#: rpmbuild.c:490
+#, c-format
+msgid "File %s does not appear to be a specfile.\n"
+msgstr "%s 似乎不是規格檔。\n"
+
+#: rpmbuild.c:556
+#, c-format
+msgid "Building target platforms: %s\n"
+msgstr "建置目標平臺:%s\n"
+
+#: rpmbuild.c:564
+#, c-format
+msgid "Building for target %s\n"
+msgstr "建置目標 %s\n"
+
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "--root (-r) 的引數必須以「/」開頭"
+
+#: rpmdb.c:21
+msgid "initialize database"
+msgstr "初始化資料庫"
+
+#: rpmdb.c:23
+msgid "rebuild database inverted lists from installed package headers"
+msgstr "從安裝的套件標頭重建資料庫的反向列表"
+
+#: rpmdb.c:26
+msgid "verify database files"
+msgstr "驗證資料庫檔案"
+
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
+msgid "Database options:"
+msgstr "資料庫選項:"
+
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "只能指定一個主要工作模式"
+
+#: rpmkeys.c:20
+msgid "verify package signature(s)"
+msgstr "驗證套件簽名"
+
+#: rpmkeys.c:22
+msgid "import an armored public key"
+msgstr "匯入一個受保護的公鑰"
+
+#: rpmkeys.c:24
+msgid "don't import, but tell if it would work or not"
+msgstr "不匯入,但會分辨是否它有作用"
+
+#: rpmkeys.c:27 rpmkeys.c:29
+msgid "list keys from RPM keyring"
+msgstr "列出 RPM 鑰匙圈的金鑰"
+
+#: rpmkeys.c:36
+msgid "Keyring options:"
+msgstr "鑰匙圈選項:"
+
+#: rpmkeys.c:64 rpmsign.c:161
+msgid "no arguments given"
+msgstr "沒有給定引數"
+
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "查詢/驗證所選套件的選項:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "查詢選項 (使用 -q 或 --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "驗證選項 (使用 -V 或 --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "安裝/升級/抹除選項:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "只有查詢/驗證兩種工作模式能被同時實行"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "未預期的查詢旗標"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "不可預料的查詢格式"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "不可預料的查詢來源"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "只有安裝與升級可以強迫執行"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "檔案只能在套件安裝時重新分配位置"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "--prefix 不能和 --relocate 或 --excludepath 同時使用"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr "--relocate 和 --excludepath 只能在安裝新套件時使用"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix 只能在安裝新套件時使用"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "--prefix 的引數必須以「/」開頭"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr "--hash (-h) 只能在套件安裝與抹除時指定"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr "--percent 只能在套件安裝與抹除時指定"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs 只能在套件安裝時指定"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs 只能在套件安裝時指定"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs 只能在套件安裝時指定"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "--excludedocs 和 --includedocs 兩個選項中只能指定一個"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch 只能在套件安裝時指定"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos 只能在套件安裝時指定"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize 只能在套件安裝時指定"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches 只能在套件抹除時指定"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles 只能在套件安裝時指定"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb 只能在套件安裝和抹除時指定"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr "與指令稿停用有關的選項只能在套件安裝和抹除時指定"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr "與觸發停用有關的選項只能在套件安裝和抹除時指定"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr "--nodeps 只能在套件安裝、抹除與驗證時指定"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr "--test 只能在套件安裝與抹除時指定"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "沒有指定要抹除的套件名稱"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "沒有指定要安裝的套件名稱"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "沒有給定查詢引數"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "沒有給定驗證引數"
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr "簽署套件"
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr "簽署套件 (與 --addsign 含義相同)"
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr "刪除套件簽名"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "簽名選項:"
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr "您必須在您的巨集檔案中設定「%%_gpg_name」\n"
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr "將規格檔案剖析到標準輸出"
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr "查詢規格檔案"
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr "操作透過規格所建立的二進位 rpm (預設)"
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr "操作透過規格所建立的原始碼 rpm"
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr "使用以下的查詢格式"
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr "規格選項:"
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr "沒有任何引數用於剖析"
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr "無法開啟暫存檔案:%s\n"
+
+#: build/build.c:125
+#, c-format
+msgid "Unable to open stream: %s\n"
+msgstr "無法開啟串流:%s\n"
+
+#: build/build.c:158
+#, c-format
+msgid "Executing(%s): %s\n"
+msgstr "正在執行(%s):%s\n"
+
+#: build/build.c:163
+#, c-format
+msgid "Exec of %s failed (%s): %s\n"
+msgstr "執行 %s 失敗 (%s):%s\n"
+
+#: build/build.c:172
+#, c-format
+msgid "Error executing scriptlet %s (%s)\n"
+msgstr "執行指令稿片段 %s (%s) 時發生錯誤\n"
+
+#: build/build.c:178
+#, c-format
+msgid "Bad exit status from %s (%s)\n"
+msgstr "來自 %s 的不當離開狀態 (%s)\n"
+
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
+msgid ""
+"\n"
+"\n"
+"RPM build errors:\n"
+msgstr ""
+"\n"
+"\n"
+"RPM 建置錯誤:\n"
+
+#: build/expression.c:215
+msgid "syntax error while parsing ==\n"
+msgstr "剖析 == 時有語法錯誤\n"
+
+#: build/expression.c:245
+msgid "syntax error while parsing &&\n"
+msgstr "剖析 && 時有語法錯誤\n"
+
+#: build/expression.c:254
+msgid "syntax error while parsing ||\n"
+msgstr "剖析 || 時有語法錯誤\n"
+
+#: build/expression.c:304
+msgid "parse error in expression\n"
+msgstr "表述式剖析錯誤\n"
+
+#: build/expression.c:336
+msgid "unmatched (\n"
+msgstr "不符合的 (\n"
+
+#: build/expression.c:368
+msgid "- only on numbers\n"
+msgstr "- 只能用於數字\n"
+
+#: build/expression.c:384
+msgid "! only on numbers\n"
+msgstr "! 只能用於數字\n"
+
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
+msgid "types must match\n"
+msgstr "類型必須符合\n"
+
+#: build/expression.c:439
+msgid "* / not suported for strings\n"
+msgstr "字串不支援 *、/\n"
+
+#: build/expression.c:490
+msgid "- not suported for strings\n"
+msgstr "字串不支援 -\n"
+
+#: build/expression.c:637
+msgid "&& and || not suported for strings\n"
+msgstr "字串不支援 && 和 ||\n"
+
+#: build/expression.c:669
+msgid "syntax error in expression\n"
+msgstr "表述式中有語法錯誤\n"
+
+#: build/files.c:343 build/files.c:524 build/files.c:743
+#, c-format
+msgid "Missing '(' in %s %s\n"
+msgstr "在 %s %s 中有遺漏的「(」\n"
+
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
+#, c-format
+msgid "Missing ')' in %s(%s\n"
+msgstr "在 %s(%s 中有遺漏的「)」\n"
+
+#: build/files.c:378 build/files.c:684
+#, c-format
+msgid "Invalid %s token: %s\n"
+msgstr "無效的 %s 符記:%s\n"
+
+#: build/files.c:490
+#, c-format
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
+
+#: build/files.c:539
+#, c-format
+msgid "Non-white space follows %s(): %s\n"
+msgstr "%s() 之後有非空白空格:%s\n"
+
+#: build/files.c:579
+#, c-format
+msgid "Bad syntax: %s(%s)\n"
+msgstr "不當語法:%s(%s)\n"
+
+#: build/files.c:588
+#, c-format
+msgid "Bad mode spec: %s(%s)\n"
+msgstr "不當模式規格:%s(%s)\n"
+
+#: build/files.c:600
+#, c-format
+msgid "Bad dirmode spec: %s(%s)\n"
+msgstr "不當目錄模式規格:%s(%s)\n"
+
+#: build/files.c:705
+#, c-format
+msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
+msgstr "不尋常的語區長度:「%s」於 %%lang(%s)\n"
+
+#: build/files.c:712
+#, c-format
+msgid "Duplicate locale %s in %%lang(%s)\n"
+msgstr "複製語區 %s 於 %%lang(%s)\n"
+
+#: build/files.c:827
+#, c-format
+msgid "Invalid capability: %s\n"
+msgstr "無效的功能:%s\n"
+
+#: build/files.c:837
+msgid "File capability support not built in\n"
+msgstr "檔案功能支援未內建於\n"
+
+#: build/files.c:888
+#, c-format
+msgid "File must begin with \"/\": %s\n"
+msgstr "檔案必須以「/」開頭:%s\n"
+
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
+#, c-format
+msgid "Unknown file digest algorithm %u, falling back to MD5\n"
+msgstr "不明檔案摘要演算法 %u,權宜落回 MD5\n"
+
+#: build/files.c:1074
+#, c-format
+msgid "File listed twice: %s\n"
+msgstr "列出了兩次的檔案:%s\n"
+
+#: build/files.c:1196
+#, c-format
+msgid "reading symlink %s failed: %s\n"
+msgstr "讀取符號鏈結 %s 失敗:%s\n"
+
+#: build/files.c:1204
+#, c-format
+msgid "Symlink points to BuildRoot: %s -> %s\n"
+msgstr "指向 BuildRoot 的符號鏈結:%s -> %s\n"
+
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
+#, c-format
+msgid "Directory not found: %s\n"
+msgstr "找不到目錄:%s\n"
+
+#: build/files.c:1387 lib/rpminstall.c:449
+#, c-format
+msgid "File not found: %s\n"
+msgstr "找不到檔案:%s\n"
+
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
+#, c-format
+msgid "%s: can't load unknown tag (%d).\n"
+msgstr "%s:無法呼叫不明的標籤 (%d)。\n"
+
+#: build/files.c:1598
+#, c-format
+msgid "%s: public key read failed.\n"
+msgstr "%s:公鑰讀入失敗。\n"
+
+#: build/files.c:1602
+#, c-format
+msgid "%s: not an armored public key.\n"
+msgstr "%s:不是一個受保護的公鑰。\n"
+
+#: build/files.c:1611
+#, c-format
+msgid "%s: failed to encode\n"
+msgstr "%s:編碼失敗\n"
+
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "無法建立目錄"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
+#, c-format
+msgid "File needs leading \"/\": %s\n"
+msgstr "檔案需要以「/」開頭:%s\n"
+
+#: build/files.c:2122
+#, c-format
+msgid "%%dev glob not permitted: %s\n"
+msgstr "%%dev 不允許透過 glob 解析:%s\n"
+
+#: build/files.c:2134
+#, c-format
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
+
+#: build/files.c:2136
+#, c-format
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
+
+#: build/files.c:2171
+#, c-format
+msgid "Could not open %%files file %s: %m\n"
+msgstr "無法開啟 %%files 檔案 %s:%m\n"
+
+#: build/files.c:2182
+#, c-format
+msgid "line: %s\n"
+msgstr "列:%s\n"
+
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
+#, c-format
+msgid "Error reading %%files file %s: %m\n"
+msgstr "讀取 %%files 檔案 %s 時發生錯誤:%m\n"
+
+#: build/files.c:2223
+#, c-format
+msgid "illegal _docdir_fmt %s: %s\n"
+msgstr "不合法的 _docdir_fmt %s:%s\n"
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "透過 glob 解析找不到檔案:%s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
+#, c-format
+msgid "Can't mix special %s with other forms: %s\n"
+msgstr "無法混合特殊 %s 與其他表單:%s\n"
+
+#: build/files.c:2471
+#, c-format
+msgid "More than one file on a line: %s\n"
+msgstr "一列中超過一個檔案:%s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
+#, c-format
+msgid "Bad file: %s: %s\n"
+msgstr "不當檔案:%s:%s\n"
+
+#: build/files.c:2725
+#, c-format
+msgid "Checking for unpackaged file(s): %s\n"
+msgstr "正在檢查未打包的檔案:%s\n"
+
+#: build/files.c:2738
+#, c-format
+msgid ""
+"Installed (but unpackaged) file(s) found:\n"
+"%s"
+msgstr ""
+"找到已安裝 (但未打包) 的檔案:\n"
+"%s"
+
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
+#, c-format
+msgid "Processing files: %s\n"
+msgstr "正在處理檔案:%s\n"
+
+#: build/files.c:3124
+#, c-format
+msgid "Binaries arch (%d) not matching the package arch (%d).\n"
+msgstr "二進位架構 (%d) 無法匹配套件架構 (%d)。\n"
+
+#: build/files.c:3130
+msgid "Arch dependent binaries in noarch package\n"
+msgstr "noarch 套件中有依賴架構的二進位檔\n"
+
+#: build/pack.c:91
+#, c-format
+msgid "create archive failed on file %s: %s\n"
+msgstr "建立檔案 %s 封存時失敗:%s\n"
+
+#: build/pack.c:94
+#, c-format
+msgid "create archive failed: %s\n"
+msgstr "建立封存時失敗:%s\n"
+
+#: build/pack.c:121
+#, c-format
+msgid "Could not open %s file: %s\n"
+msgstr "無法開啟 %s 檔案:%s\n"
+
+#: build/pack.c:138
+#, c-format
+msgid "%s: line: %s\n"
+msgstr "%s: 列:%s\n"
+
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
+
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
+
+#: build/pack.c:198
+#, c-format
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "無法標準化主機名稱:%s\n"
+
+#: build/pack.c:358
+#, c-format
+msgid "Unknown payload compression: %s\n"
+msgstr "不明酬載壓縮:%s\n"
+
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
+
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "讀取策略檔案時失敗:%s\n"
+
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
+
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
+
+#: build/pack.c:520
+#, c-format
+msgid "Could not open %s: %s\n"
+msgstr "無法開啟 %s:%s\n"
+
+#: build/pack.c:527
+#, c-format
+msgid "Unable to write package: %s\n"
+msgstr "無法寫入套件:%s\n"
+
+#: build/pack.c:611
+#, c-format
+msgid "Wrote: %s\n"
+msgstr "已寫入:%s\n"
+
+#: build/pack.c:630
+#, c-format
+msgid "Executing \"%s\":\n"
+msgstr "正在執行「%s」:\n"
+
+#: build/pack.c:633
+#, c-format
+msgid "Execution of \"%s\" failed.\n"
+msgstr "「%s」執行失敗。\n"
+
+#: build/pack.c:637
+#, c-format
+msgid "Package check \"%s\" failed.\n"
+msgstr "套件檢查「%s」失敗。\n"
+
+#: build/pack.c:684
+#, c-format
+msgid "Could not generate output filename for package %s: %s\n"
+msgstr "無法產生套件 %s 的檔案名稱輸出:%s\n"
+
+#: build/pack.c:701
+#, c-format
+msgid "cannot create %s: %s\n"
+msgstr "無法建立 %s:%s\n"
+
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
+#, c-format
+msgid "line %d: second %s\n"
+msgstr "第 %d 列:第二個 %s\n"
+
+#: build/parseChangelog.c:185
+#, c-format
+msgid "bogus date in %%changelog: %s\n"
+msgstr "假造的日期於 %%changelog:%s\n"
+
+#: build/parseChangelog.c:218
+#, c-format
+msgid "%%changelog entries must start with *\n"
+msgstr "%%changelog 條目必須以 * 符號開頭\n"
+
+#: build/parseChangelog.c:226
+#, c-format
+msgid "incomplete %%changelog entry\n"
+msgstr "不完整的 %%changelog 條目\n"
+
+#: build/parseChangelog.c:237
+#, c-format
+msgid "bad date in %%changelog: %s\n"
+msgstr "%%changelog 中含有不當日期:%s\n"
+
+#: build/parseChangelog.c:242
+#, c-format
+msgid "%%changelog not in descending chronological order\n"
+msgstr "%%changelog 並非遞減編年順序\n"
+
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
+#, c-format
+msgid "missing name in %%changelog\n"
+msgstr "%%changelog 中遺漏名稱\n"
+
+#: build/parseChangelog.c:272
+#, c-format
+msgid "no description in %%changelog\n"
+msgstr "%%changelog 中沒有描述\n"
+
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
+#: build/parseDescription.c:32
+#, c-format
+msgid "line %d: Error parsing %%description: %s\n"
+msgstr "第 %d 列:剖析 %%description 時發生錯誤:%s\n"
+
+#: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
+#: build/parseScript.c:321
+#, c-format
+msgid "line %d: Bad option %s: %s\n"
+msgstr "第 %d 列:不當選項 %s:%s\n"
+
+#: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
+#: build/parseScript.c:332
+#, c-format
+msgid "line %d: Too many names: %s\n"
+msgstr "第 %d 列:過多名稱:%s\n"
+
+#: build/parseFiles.c:33
+#, c-format
+msgid "line %d: Error parsing %%files: %s\n"
+msgstr "第 %d 列:剖析 %%files 時發生錯誤:%s\n"
+
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
+#: build/parsePolicies.c:32
+#, c-format
+msgid "line %d: Error parsing %%policies: %s\n"
+msgstr "第 %d 列:剖析 %%policies 發生錯誤:%s\n"
+
+#: build/parsePreamble.c:71
+#, c-format
+msgid "Error parsing tag field: %s\n"
+msgstr "剖析標籤欄位時發生錯誤:%s\n"
+
+#: build/parsePreamble.c:164
+#, c-format
+msgid "line %d: Bad number: %s\n"
+msgstr "第 %d 列:不當的編號:%s\n"
+
+#: build/parsePreamble.c:170
+#, c-format
+msgid "line %d: Bad no%s number: %u\n"
+msgstr "第 %d 列:不當的 no%s 數字:%u\n"
+
+#: build/parsePreamble.c:233
+#, c-format
+msgid "line %d: Bad %s number: %s\n"
+msgstr "第 %d 列:不當的 %s 數字:%s\n"
+
+#: build/parsePreamble.c:247
+#, c-format
+msgid "%s %d defined multiple times\n"
+msgstr "%s %d 被定義許多次\n"
+
+#: build/parsePreamble.c:292
+#, c-format
+msgid "Downloading %s to %s\n"
+msgstr "正在下載 %s 到 %s\n"
+
+#: build/parsePreamble.c:295
+#, c-format
+msgid "Couldn't download %s\n"
+msgstr "無法下載 %s\n"
+
+#: build/parsePreamble.c:439
+#, c-format
+msgid "Architecture is excluded: %s\n"
+msgstr "被排除的架構:%s\n"
+
+#: build/parsePreamble.c:444
+#, c-format
+msgid "Architecture is not included: %s\n"
+msgstr "未包含的架構:%s\n"
+
+#: build/parsePreamble.c:449
+#, c-format
+msgid "OS is excluded: %s\n"
+msgstr "被排除的作業系統:%s\n"
+
+#: build/parsePreamble.c:454
+#, c-format
+msgid "OS is not included: %s\n"
+msgstr "未包含的作業系統:%s\n"
+
+#: build/parsePreamble.c:480
+#, c-format
+msgid "%s field must be present in package: %s\n"
+msgstr "%s 欄位必須出現於套件中:%s\n"
+
+#: build/parsePreamble.c:503
+#, c-format
+msgid "Duplicate %s entries in package: %s\n"
+msgstr "套件中有重複的 %s 條目:%s\n"
+
+#: build/parsePreamble.c:568
+#, c-format
+msgid "Unable to open icon %s: %s\n"
+msgstr "無法開啟圖示 %s:%s\n"
+
+#: build/parsePreamble.c:584
+#, c-format
+msgid "Unable to read icon %s: %s\n"
+msgstr "無法讀取圖示 %s:%s\n"
+
+#: build/parsePreamble.c:594
+#, c-format
+msgid "Unknown icon type: %s\n"
+msgstr "不明的圖示類型:%s\n"
+
+#: build/parsePreamble.c:608
+#, c-format
+msgid "line %d: Tag takes single token only: %s\n"
+msgstr "第 %d 列:標籤只需單一符記:%s\n"
+
+#: build/parsePreamble.c:616
+#, c-format
+msgid "line %d: %s in: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:618
+#, c-format
+msgid "%s in: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:637
+#, c-format
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
+#, c-format
+msgid "line %d: Malformed tag: %s\n"
+msgstr "第 %d 列:格式不當的標籤:%s\n"
+
+#: build/parsePreamble.c:745
+#, c-format
+msgid "line %d: Empty tag: %s\n"
+msgstr "第 %d 列:空的標籤:%s\n"
+
+#: build/parsePreamble.c:806
+#, c-format
+msgid "line %d: Prefixes must not end with \"/\": %s\n"
+msgstr "第 %d 列:前綴不能以「/」結尾:%s\n"
+
+#: build/parsePreamble.c:818
+#, c-format
+msgid "line %d: Docdir must begin with '/': %s\n"
+msgstr "第 %d 列:Docdir 必須以「/」開頭:%s\n"
+
+#: build/parsePreamble.c:831
+#, c-format
+msgid "line %d: Epoch field must be an unsigned number: %s\n"
+msgstr "第 %d 列:Epoch 欄位必須是無正負號的數字:%s\n"
+
+#: build/parsePreamble.c:868
+#, c-format
+msgid "line %d: Bad %s: qualifiers: %s\n"
+msgstr "第 %d 列:不當 %s:修飾詞:%s\n"
+
+#: build/parsePreamble.c:902
+#, c-format
+msgid "line %d: Bad BuildArchitecture format: %s\n"
+msgstr "第 %d 列:不當 BuildArchitecture 格式:%s\n"
+
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
+#, c-format
+msgid "line %d: Only noarch subpackages are supported: %s\n"
+msgstr "第 %d 列:只有支援 noarch 子套裝模組:%s\n"
+
+#: build/parsePreamble.c:934
+#, c-format
+msgid "Internal error: Bogus tag %d\n"
+msgstr "內部錯誤:假造的標籤 %d\n"
+
+#: build/parsePreamble.c:1032
+#, c-format
+msgid "line %d: %s is deprecated: %s\n"
+msgstr "第 %d 列:%s 已過時:%s\n"
+
+#: build/parsePreamble.c:1093
+#, c-format
+msgid "Bad package specification: %s\n"
+msgstr "不當套件規格:%s\n"
+
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
+
+#: build/parsePreamble.c:1144
+#, c-format
+msgid "line %d: Unknown tag: %s\n"
+msgstr "第 %d 列:不明標籤:%s\n"
+
+#: build/parsePreamble.c:1176
+#, c-format
+msgid "%%{buildroot} couldn't be empty\n"
+msgstr "%%{buildroot} 不可是空的\n"
+
+#: build/parsePreamble.c:1180
+#, c-format
+msgid "%%{buildroot} can not be \"/\"\n"
+msgstr "%%{buildroot} 不可為「/」\n"
+
+#: build/parsePrep.c:29
+#, c-format
+msgid "Bad source: %s: %s\n"
+msgstr "不當原始碼:%s:%s\n"
+
+#: build/parsePrep.c:74
+#, c-format
+msgid "No patch number %u\n"
+msgstr "沒有修補編號 %u\n"
+
+#: build/parsePrep.c:76
+#, c-format
+msgid "%%patch without corresponding \"Patch:\" tag\n"
+msgstr "%%patch 卻無相應的「Patch:」標籤\n"
+
+#: build/parsePrep.c:164
+#, c-format
+msgid "No source number %u\n"
+msgstr "沒有原始碼編號 %u\n"
+
+#: build/parsePrep.c:166
+msgid "No \"Source:\" tag in the spec file\n"
+msgstr "規格檔內無「Source:」標籤\n"
+
+#: build/parsePrep.c:300
+#, c-format
+msgid "Error parsing %%setup: %s\n"
+msgstr "剖析 %%setup 時發生錯誤:%s\n"
+
+#: build/parsePrep.c:311
+#, c-format
+msgid "line %d: Bad arg to %%setup: %s\n"
+msgstr "第 %d 列:%%setup 中出現不當引數:%s\n"
+
+#: build/parsePrep.c:326
+#, c-format
+msgid "line %d: Bad %%setup option %s: %s\n"
+msgstr "第 %d 列:不當 %%setup 選項 %s:%s\n"
+
+#: build/parsePrep.c:495
+#, c-format
+msgid "%s: %s: %s\n"
+msgstr "%s: %s: %s\n"
+
+#: build/parsePrep.c:508
+#, c-format
+msgid "Invalid patch number %s: %s\n"
+msgstr "無效的修補編號 %s:%s\n"
+
+#: build/parsePrep.c:535
+#, c-format
+msgid "line %d: second %%prep\n"
+msgstr "第 %d 列:第二個 %%prep\n"
+
+#: build/parseReqs.c:52
+msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
+msgstr "依存字組必須以英數字、_ 或 / 開頭"
+
+#: build/parseReqs.c:57
+msgid "Versioned file name not permitted"
+msgstr "不允許標上版本的檔案名稱"
+
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr ""
+
+#: build/parseReqs.c:232 build/parseReqs.c:307
+msgid "invalid dependency"
+msgstr "無效的依存性"
+
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "所需版本"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
+#, c-format
+msgid "line %d: %s: %s\n"
+msgstr "第 %d 列:%s:%s\n"
+
+#: build/parseScript.c:263
+#, c-format
+msgid "line %d: triggers must have --: %s\n"
+msgstr "第 %d 列:觸發器必須包含 --:%s\n"
+
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
+#, c-format
+msgid "line %d: Error parsing %s: %s\n"
+msgstr "第 %d 列:剖析 %s 時發生錯誤:%s\n"
+
+#: build/parseScript.c:293
+#, c-format
+msgid "line %d: internal script must end with '>': %s\n"
+msgstr "第 %d 列:內部指令稿必須以「>」結尾:%s\n"
+
+#: build/parseScript.c:299
+#, c-format
+msgid "line %d: script program must begin with '/': %s\n"
+msgstr "第 %d 列:指令稿程式必須以「/」開頭:%s\n"
+
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
+#, c-format
+msgid "line %d: Second %s\n"
+msgstr "第 %d 列:第二個 %s\n"
+
+#: build/parseScript.c:386
+#, c-format
+msgid "line %d: unsupported internal script: %s\n"
+msgstr "第 %d 列:不支援的內部指令稿:%s\n"
+
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
+#, c-format
+msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
+msgstr "第 %d 列:解譯器引數不允許存在觸發器中:%s\n"
+
+#: build/parseSpec.c:190
+#, c-format
+msgid "line %d: %s\n"
+msgstr "第 %d 列:%s\n"
+
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
+#, c-format
+msgid "Unable to open %s: %s\n"
+msgstr "無法開啟 %s:%s\n"
+
+#: build/parseSpec.c:351
+#, c-format
+msgid "%s:%d: Argument expected for %s\n"
+msgstr "%s:%d:預期用於 %s 的引數\n"
+
+#: build/parseSpec.c:373
+#, c-format
+msgid "line %d: Unclosed %%if\n"
+msgstr "第 %d 列:未關閉的 %%if\n"
+
+#: build/parseSpec.c:378
+#, c-format
+msgid "line %d: unclosed macro or bad line continuation\n"
+msgstr "第 %d 列:未關閉的巨集或不當的列延續\n"
+
+#: build/parseSpec.c:420
+#, c-format
+msgid "%s:%d: bad %%if condition\n"
+msgstr "%s:%d:不當的 %%if 條件\n"
+
+#: build/parseSpec.c:428
+#, c-format
+msgid "%s:%d: Got a %%else with no %%if\n"
+msgstr "%s:%d:有個 %%else 沒有對應 %%if\n"
+
+#: build/parseSpec.c:439
+#, c-format
+msgid "%s:%d: Got a %%endif with no %%if\n"
+msgstr "%s:%d:有個 %%endif 沒有對應 %%if\n"
+
+#: build/parseSpec.c:460
+#, c-format
+msgid "%s:%d: malformed %%include statement\n"
+msgstr "%s:%d:異常的 %%include 敘述\n"
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr "找不到可供建置的相容架構\n"
+
+#: build/parseSpec.c:912
+#, c-format
+msgid "Package has no %%description: %s\n"
+msgstr "套件沒有 %%description:%s\n"
+
+#: build/policies.c:87
+#, c-format
+msgid "Policy module '%s' duplicated with overlapping types\n"
+msgstr "策略模組 %s 有重複的重疊類型\n"
+
+#: build/policies.c:93
+#, c-format
+msgid "Base modules '%s' and '%s' have overlapping types\n"
+msgstr "基本模組 %s 與 %s 有重疊的類型\n"
+
+#: build/policies.c:101
+msgid "Failed to get policies from header\n"
+msgstr "從標頭提取策略時失敗\n"
+
+#: build/policies.c:154
+#, c-format
+msgid "%%semodule requires a file path\n"
+msgstr "%%semodule 需要檔案路徑\n"
+
+#: build/policies.c:163
+#, c-format
+msgid "Failed to read  policy file: %s\n"
+msgstr "讀取策略檔案時失敗:%s\n"
+
+#: build/policies.c:170
+#, c-format
+msgid "Failed to encode policy file: %s\n"
+msgstr "編碼策略檔案時失敗:%s\n"
+
+#: build/policies.c:187
+#, c-format
+msgid "Failed to determine a policy name: %s\n"
+msgstr "確定策略名稱時失敗:%s\n"
+
+#: build/policies.c:199
+#, c-format
+msgid ""
+"'%s' type given with other types in %%semodule %s. Compacting types to "
+"'%s'.\n"
+msgstr "%s 類型於 %%semodule %s 中與其他類型給定。壓縮類型為 %s。\n"
+
+#: build/policies.c:246
+#, c-format
+msgid "Error parsing %s: %s\n"
+msgstr "剖析 %s 時發生錯誤:%s\n"
+
+#: build/policies.c:252
+#, c-format
+msgid "Expecting %%semodule tag: %s\n"
+msgstr "預期 %%semodule 標籤:%s\n"
+
+#: build/policies.c:262
+#, c-format
+msgid "Missing module path in line: %s\n"
+msgstr "缺少模組路徑於列號:%s\n"
+
+#: build/policies.c:268
+#, c-format
+msgid "Too many arguments in line: %s\n"
+msgstr "太多引數於列號:%s\n"
+
+#: build/policies.c:307
+#, c-format
+msgid "Processing policies: %s\n"
+msgstr "處理策略:%s\n"
+
+#: build/rpmfc.c:160
+#, c-format
+msgid "Ignoring invalid regex %s\n"
+msgstr "忽略無效的正規表示式 %s\n"
+
+#: build/rpmfc.c:266
+#, c-format
+msgid "Couldn't create pipe for %s: %m\n"
+msgstr "無法為 %s 建立管線:%m\n"
+
+#: build/rpmfc.c:289
+#, c-format
+msgid "Couldn't exec %s: %s\n"
+msgstr "無法執行 %s:%s\n"
+
+#: build/rpmfc.c:294 lib/rpmscript.c:320
+#, c-format
+msgid "Couldn't fork %s: %s\n"
+msgstr "無法分支 %s:%s\n"
+
+#: build/rpmfc.c:377
+#, c-format
+msgid "%s failed: %x\n"
+msgstr "%s 失敗:%x\n"
+
+#: build/rpmfc.c:381
+#, c-format
+msgid "failed to write all data to %s: %s\n"
+msgstr "無法寫入所有資料至 %s:%s\n"
+
+#: build/rpmfc.c:1032
+msgid "Empty file classifier\n"
+msgstr "空的檔案分類器\n"
+
+#: build/rpmfc.c:1041
+msgid "No file attributes configured\n"
+msgstr "無設定檔案特性\n"
+
+#: build/rpmfc.c:1060
+#, c-format
+msgid "magic_open(0x%x) failed: %s\n"
+msgstr "magic_open(0x%x) 失敗:%s\n"
+
+#: build/rpmfc.c:1066
+#, c-format
+msgid "magic_load failed: %s\n"
+msgstr "magic_load 失敗:%s\n"
+
+#: build/rpmfc.c:1108
+#, c-format
+msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
+msgstr "檔案「%s」辨識失敗:模式 %06o %s\n"
+
+#: build/rpmfc.c:1309
+#, c-format
+msgid "Finding  %s: %s\n"
+msgstr "正在尋找 %s:%s\n"
+
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
+#, c-format
+msgid "Failed to find %s:\n"
+msgstr "找不到 %s:\n"
+
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
+#, c-format
+msgid "query of specfile %s failed, can't parse\n"
+msgstr "%s 規格檔查詢失敗,無法剖析\n"
+
+#: lib/backend/db3.c:97
+#, c-format
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "無法辨識的資料庫選項:「%s」 已忽略。\n"
+
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s 有無效的數值,略過\n"
+
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s 有過大或過小的 long 數值,略過\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s 有過大或過小的整數值,略過\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "無法取得 %s 於 %s/%s 的鎖定\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "已共享"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "排他"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "無效的索引類型 %x 於 %s/%s\n"
+
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "錯誤(%d) 發生於取得「%s」記錄自 %s 索引:%s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "儲存記錄「%2$s」到 %3$s 時發生錯誤(%1$d)\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "從 %3$s 移除記錄「%2$s」時發生錯誤(%1$d)\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "錯誤(%d) 發生於加入標頭 #%d 記錄\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "錯誤(%d) 發生於移除標頭 #%d 記錄\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "分配新套件實體時發生錯誤(%d)\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
+#, c-format
+msgid "%s is a Delta RPM and cannot be directly installed\n"
+msgstr "%s 是個差異 RPM 而無法直接安裝\n"
+
+#: lib/depends.c:97
+#, c-format
+msgid "Unsupported payload (%s) in package %s\n"
+msgstr "未支援的酬載 (%s) 於套件 %s\n"
+
+#: lib/depends.c:377
+#, c-format
+msgid "package %s was already added, skipping %s\n"
+msgstr "套件 %s 已被加入,跳過 %s\n"
+
+#: lib/depends.c:378
+#, c-format
+msgid "package %s was already added, replacing with %s\n"
+msgstr "套件 %s 已被加入,以 %s 替換\n"
+
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(不是 blob)"
+
+#: lib/formats.c:43
+msgid "(not a number)"
+msgstr "(不是一個數字)"
+
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(不是字串)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(無效型態)"
+
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
+msgstr "%c"
+
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
+msgstr "%Y %b %d %a"
+
+#: lib/formats.c:253
+msgid "(not base64)"
+msgstr "(不是 base64)"
+
+#: lib/formats.c:313
+msgid "(invalid xml type)"
+msgstr "(無效 xml 類型)"
+
+#: lib/formats.c:358
+msgid "(not an OpenPGP signature)"
+msgstr "(不是個 OpenPGP 簽名)"
+
+#: lib/formats.c:369
+#, c-format
+msgid "Invalid date %u"
+msgstr "無效的日期 %u"
+
+#: lib/formats.c:417
+msgid "normal"
+msgstr "一般"
+
+#: lib/formats.c:420 lib/verify.c:393
+msgid "replaced"
+msgstr "已替換"
+
+#: lib/formats.c:423 lib/verify.c:387
+msgid "not installed"
+msgstr "未安裝"
+
+#: lib/formats.c:426 lib/verify.c:389
+msgid "net shared"
+msgstr "已網路分享"
+
+#: lib/formats.c:429 lib/verify.c:391
+msgid "wrong color"
+msgstr "錯誤色彩"
+
+#: lib/formats.c:432
+msgid "missing"
+msgstr "遺失"
+
+#: lib/formats.c:435
+msgid "(unknown)"
+msgstr "(不明)"
+
+#: lib/fsm.c:745
+#, c-format
+msgid "%s saved as %s\n"
+msgstr "%s 已被另存為 %s\n"
+
+#: lib/fsm.c:798
+#, c-format
+msgid "%s created as %s\n"
+msgstr "%s 已建立為 %s \n"
+
+#: lib/fsm.c:1082
+#, c-format
+msgid "%s %s: remove failed: %s\n"
+msgstr "%s %s:移除失敗:%s\n"
+
+#: lib/fsm.c:1083
+msgid "directory"
+msgstr "目錄"
+
+#: lib/fsm.c:1083
+msgid "file"
+msgstr "檔案"
+
+#: lib/header.c:285
+#, c-format
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
+
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
+
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
+
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
+
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
+
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
+
+#: lib/header.c:1841
+#, c-format
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
+
+#: lib/header.c:1876
+#, c-format
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr ""
+
+#: lib/header.c:1885
+#, c-format
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
+
+#: lib/header.c:1890
+#, c-format
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
+
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1909
+#, c-format
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
+
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
+
+#: lib/header.c:1949
+#, c-format
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "無效的欄位寬度"
+
+#: lib/headerfmt.c:362
+#, c-format
+msgid "missing { after %%"
+msgstr ""
+
+#: lib/headerfmt.c:384
+#, c-format
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "空白標籤格式"
+
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "空白標籤名稱"
+
+#: lib/headerfmt.c:413
+#, c-format
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] 預期在陣列的結尾"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "未預期的 ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "未預期的 }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? 預期於表述式中"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ 預期於表述式中的 ? 之後"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} 預期於表述式中"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": 預期跟著 ? 子表述式"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ 預期於表述式中 : 之後"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| 預期於表述式的結尾"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "用於不同大小陣列的陣列迭代器"
+
+#: lib/poptALL.c:154
+#, c-format
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
+
+#: lib/poptALL.c:188
+msgid "predefine MACRO with value EXPR"
+msgstr "預先以值 EXPR 定義 MACRO"
+
+#: lib/poptALL.c:189 lib/poptALL.c:192
+msgid "'MACRO EXPR'"
+msgstr "「MACRO EXPR」"
+
+#: lib/poptALL.c:191
+msgid "define MACRO with value EXPR"
+msgstr "定義 MACRO 值為 EXPR"
+
+#: lib/poptALL.c:194
+msgid "undefine MACRO"
+msgstr ""
+
+#: lib/poptALL.c:195
+msgid "MACRO"
+msgstr ""
+
+#: lib/poptALL.c:197
+msgid "print macro expansion of EXPR"
+msgstr "列印 EXPR 的巨集展開"
+
+#: lib/poptALL.c:198
+msgid "'EXPR'"
+msgstr "「EXPR」"
+
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
+msgid "read <FILE:...> instead of default file(s)"
+msgstr "讀取 <FILE:…> 以代替預設檔案"
+
+#: lib/poptALL.c:203 lib/poptALL.c:222
+msgid "<FILE:...>"
+msgstr "<FILE:…>"
+
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
+msgid "don't verify package digest(s)"
+msgstr "不驗證套件摘要"
+
+#: lib/poptALL.c:213
+msgid "don't verify database header(s) when retrieved"
+msgstr "擷取時不驗證資料庫標頭"
+
+#: lib/poptALL.c:215
+msgid "don't verify package signature(s)"
+msgstr "不驗證套件簽名"
+
+#: lib/poptALL.c:218
+msgid "send stdout to CMD"
+msgstr "發送 stdout 至 CMD"
+
+#: lib/poptALL.c:219
+msgid "CMD"
+msgstr "CMD"
+
+#: lib/poptALL.c:224
+msgid "use ROOT as top level directory"
+msgstr "使用 ROOT 做為最頂層目錄"
+
+#: lib/poptALL.c:225
+msgid "ROOT"
+msgstr "ROOT"
+
+#: lib/poptALL.c:227
+msgid "use database in DIRECTORY"
+msgstr "使用「DIRECTORY」內的資料庫"
+
+#: lib/poptALL.c:228
+msgid "DIRECTORY"
+msgstr "DIRECTORY"
+
+#: lib/poptALL.c:231
+msgid "display known query tags"
+msgstr "顯示已知的查詢標籤"
+
+#: lib/poptALL.c:233
+msgid "display final rpmrc and macro configuration"
+msgstr "顯示完整的 rpmrc 與巨集組態"
+
+#: lib/poptALL.c:235
+msgid "provide less detailed output"
+msgstr "提供較少細節的輸出"
+
+#: lib/poptALL.c:237
+msgid "provide more detailed output"
+msgstr "提供較多細節的輸出"
+
+#: lib/poptALL.c:239
+msgid "print the version of rpm being used"
+msgstr "列印正使用的 rpm 版本資訊"
+
+#: lib/poptALL.c:245
+msgid "debug payload file state machine"
+msgstr "對酬載檔案狀態機器除錯"
+
+#: lib/poptALL.c:251
+msgid "debug rpmio I/O"
+msgstr "除錯 rpmio I/O"
+
+#: lib/poptALL.c:310
+#, c-format
+msgid "%s: option table misconfigured (%d)\n"
+msgstr "%s:選項表格設定不當 (%d)\n"
+
+#: lib/poptI.c:52
+msgid "exclude paths must begin with a /"
+msgstr "被排除的路徑必須以 / 開頭"
+
+#: lib/poptI.c:64
+msgid "relocations must begin with a /"
+msgstr "重新分配位置必須以 / 開頭"
+
+#: lib/poptI.c:67
+msgid "relocations must contain a ="
+msgstr "重新分配位置必須包含一個 ="
+
+#: lib/poptI.c:70
+msgid "relocations must have a / following the ="
+msgstr "重新分配位置必須有個 / 跟在 = 之後"
+
+#: lib/poptI.c:118
+msgid "install all files, even configurations which might otherwise be skipped"
+msgstr "安裝所有檔案,即使組態可能被略過"
+
+#: lib/poptI.c:122
+msgid ""
+"remove all packages which match <package> (normally an error is generated if "
+"<package> specified multiple packages)"
+msgstr ""
+"移除所有符合 <package> 的套件 (如果 <package> 被指定為多個套件,常會導致錯誤"
+"出現)"
+
+#: lib/poptI.c:127
+msgid "relocate files in non-relocatable package"
+msgstr "對不可重新分配位置的套件重新分配檔案位置"
+
+#: lib/poptI.c:131
+msgid "print dependency loops as warning"
+msgstr "列印相依關係迴圈做為警告"
+
+#: lib/poptI.c:135
+msgid "erase (uninstall) package"
+msgstr "抹除 (解除安裝) 套件"
+
+#: lib/poptI.c:135
+msgid "<package>+"
+msgstr "<package>+"
+
+#: lib/poptI.c:138 lib/poptI.c:175
+msgid "do not install configuration files"
+msgstr "不安裝組態檔案"
+
+#: lib/poptI.c:141 lib/poptI.c:180
+msgid "do not install documentation"
+msgstr "不安裝文件"
+
+#: lib/poptI.c:143
+msgid "skip files with leading component <path> "
+msgstr "略過以 <path> 部件開頭的檔案"
+
+#: lib/poptI.c:144
+msgid "<path>"
+msgstr "<path>"
+
+#: lib/poptI.c:147
+msgid "short hand for --replacepkgs --replacefiles"
+msgstr "--replacepkgs 與 --replacefiles 的速寫"
+
+#: lib/poptI.c:151
+msgid "upgrade package(s) if already installed"
+msgstr "如果套件已安裝,便升級套件"
+
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
+msgid "<packagefile>+"
+msgstr "<packagefile>+"
+
+#: lib/poptI.c:154
+msgid "print hash marks as package installs (good with -v)"
+msgstr "套件安裝時列印 Hash 標記 (和 -v 一起用會更好)"
+
+#: lib/poptI.c:157
+msgid "don't verify package architecture"
+msgstr "不要驗證套件架構"
+
+#: lib/poptI.c:160
+msgid "don't verify package operating system"
+msgstr "不要驗證套間作葉系統"
+
+#: lib/poptI.c:163
+msgid "don't check disk space before installing"
+msgstr "安裝前不檢查磁碟空間"
+
+#: lib/poptI.c:165
+msgid "install documentation"
+msgstr "安裝文件"
+
+#: lib/poptI.c:168
+msgid "install package(s)"
+msgstr "安裝套件"
+
+#: lib/poptI.c:171
+msgid "update the database, but do not modify the filesystem"
+msgstr "更新資料庫,但不修改檔案系統"
+
+#: lib/poptI.c:177
+msgid "do not verify package dependencies"
+msgstr "不驗證套件相依性"
+
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
+msgid "don't verify digest of files"
+msgstr "不要驗證檔案的摘要"
+
+#: lib/poptI.c:185
+msgid "don't verify digest of files (obsolete)"
+msgstr "不要驗證檔案的摘要 (棄用)"
+
+#: lib/poptI.c:187
+msgid "don't install file security contexts"
+msgstr "不安裝檔案安全情境資料"
+
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
+msgid "do not reorder package installation to satisfy dependencies"
+msgstr "不重新排列套件安裝順序以滿足相依關係"
+
+#: lib/poptI.c:197
+msgid "do not execute package scriptlet(s)"
+msgstr "不執行套件指令稿片段"
+
+#: lib/poptI.c:201
+#, c-format
+msgid "do not execute %%pre scriptlet (if any)"
+msgstr "不執行 %%pre 指令稿稿片段 (如果有)"
+
+#: lib/poptI.c:204
+#, c-format
+msgid "do not execute %%post scriptlet (if any)"
+msgstr "不執行 %%post 指令稿片段 (如果有)"
+
+#: lib/poptI.c:207
+#, c-format
+msgid "do not execute %%preun scriptlet (if any)"
+msgstr "不執行 %%preun 指令稿片段 (如果有)"
+
+#: lib/poptI.c:210
+#, c-format
+msgid "do not execute %%postun scriptlet (if any)"
+msgstr "不執行 %%postun 指令稿片段 (如果有)"
+
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
+msgid "do not execute any scriptlet(s) triggered by this package"
+msgstr "不執行任何此套件觸發的指令稿片段"
+
+#: lib/poptI.c:222
+#, c-format
+msgid "do not execute any %%triggerprein scriptlet(s)"
+msgstr "不執行任何 %%triggerprein 指令稿片段"
+
+#: lib/poptI.c:225
+#, c-format
+msgid "do not execute any %%triggerin scriptlet(s)"
+msgstr "不執行任何 %%triggerin 指令稿片段"
+
+#: lib/poptI.c:228
+#, c-format
+msgid "do not execute any %%triggerun scriptlet(s)"
+msgstr "不執行任何 %%triggerun 指令稿片段"
+
+#: lib/poptI.c:231
+#, c-format
+msgid "do not execute any %%triggerpostun scriptlet(s)"
+msgstr "不執行任何 %%triggerpostun 指令稿片段"
+
+#: lib/poptI.c:235
+msgid ""
+"upgrade to an old version of the package (--force on upgrades does this "
+"automatically)"
+msgstr "升級到套件的舊版本 (在升級作業中加入 --force 會自動進行)"
+
+#: lib/poptI.c:239
+msgid "print percentages as package installs"
+msgstr "當套件安裝時列印進度百分比"
+
+#: lib/poptI.c:241
+msgid "relocate the package to <dir>, if relocatable"
+msgstr "如果可以重新分配位置,便把套件重新分配至 <dir>"
+
+#: lib/poptI.c:242
+msgid "<dir>"
+msgstr "<dir>"
+
+#: lib/poptI.c:244
+msgid "relocate files from path <old> to <new>"
+msgstr "將檔案從路徑 <old> 重新配置到 <new>"
+
+#: lib/poptI.c:245
+msgid "<old>=<new>"
+msgstr "<old>=<new>"
+
+#: lib/poptI.c:248
+msgid "ignore file conflicts between packages"
+msgstr "忽略套件之間的檔案衝突"
+
+#: lib/poptI.c:251
+msgid "reinstall if the package is already present"
+msgstr "如果套件已經存在則重新安裝"
+
+#: lib/poptI.c:253
+msgid "don't install, but tell if it would work or not"
+msgstr "不安裝,只回報作業是否能運作"
+
+#: lib/poptI.c:256
+msgid "upgrade package(s)"
+msgstr "升級套件"
+
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
+msgid "query/verify all packages"
+msgstr "查詢/驗證所有套件"
+
+#: lib/poptQV.c:77
+msgid "rpm checksig mode"
+msgstr "rpm 檢查簽名模式"
+
+#: lib/poptQV.c:79
+msgid "query/verify package(s) owning file"
+msgstr "查詢/驗證套件擁有的檔案"
+
+#: lib/poptQV.c:81
+msgid "query/verify package(s) in group"
+msgstr "查詢/驗證套件所屬的群組"
+
+#: lib/poptQV.c:83
+msgid "query/verify a package file"
+msgstr "查詢/驗證一個套件檔案"
+
+#: lib/poptQV.c:86
+msgid "query/verify package(s) with package identifier"
+msgstr "以套件的識別符查詢/驗證套件"
+
+#: lib/poptQV.c:88
+msgid "query/verify package(s) with header identifier"
+msgstr "以標頭識別符查詢/驗證套件"
+
+#: lib/poptQV.c:91
+msgid "rpm query mode"
+msgstr "rpm 查詢模式"
+
+#: lib/poptQV.c:93
+msgid "query/verify a header instance"
+msgstr "查詢/驗證標頭實體"
+
+#: lib/poptQV.c:95
+msgid "query/verify package(s) from install transaction"
+msgstr "從安裝異動作業查詢/驗證套件"
+
+#: lib/poptQV.c:97
+msgid "query the package(s) triggered by the package"
+msgstr "查詢套件所觸發的套件"
+
+#: lib/poptQV.c:99
+msgid "rpm verify mode"
+msgstr "rpm 驗證模式"
+
+#: lib/poptQV.c:101
+msgid "query/verify the package(s) which require a dependency"
+msgstr "查詢/驗證需要某些相依套件的套件"
+
+#: lib/poptQV.c:103
+msgid "query/verify the package(s) which provide a dependency"
+msgstr "查詢/驗證提供某些相依套件的套件"
+
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
+msgid "do not glob arguments"
+msgstr "不以 glob 解析引數"
+
+#: lib/poptQV.c:116
+msgid "do not process non-package files as manifests"
+msgstr "不以清單形式處理非套件檔案"
+
+#: lib/poptQV.c:193
+msgid "list all configuration files"
+msgstr "列出所有組態檔案"
+
+#: lib/poptQV.c:195
+msgid "list all documentation files"
+msgstr "列出所有文件檔案"
+
+#: lib/poptQV.c:197
+msgid "list all license files"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "列出所有組態檔案"
+
+#: lib/poptQV.c:201
+msgid "dump basic file information"
+msgstr "傾印基本檔案資訊"
+
+#: lib/poptQV.c:205
+msgid "list files in package"
+msgstr "列出套件內的檔案"
+
+#: lib/poptQV.c:210
+#, c-format
+msgid "skip %%ghost files"
+msgstr "略過 %%ghost 檔案"
+
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "略過 %%ghost 檔案"
+
+#: lib/poptQV.c:223
+msgid "display the states of the listed files"
+msgstr "顯示列出的檔案的狀態"
+
+#: lib/poptQV.c:241
+msgid "don't verify size of files"
+msgstr "不驗證檔案大小"
+
+#: lib/poptQV.c:244
+msgid "don't verify symlink path of files"
+msgstr "不驗證檔案的符號鏈結路徑"
+
+#: lib/poptQV.c:247
+msgid "don't verify owner of files"
+msgstr "不驗證檔案的擁有者"
+
+#: lib/poptQV.c:250
+msgid "don't verify group of files"
+msgstr "不驗證檔案的群組"
+
+#: lib/poptQV.c:253
+msgid "don't verify modification time of files"
+msgstr "不驗證檔案的修改時間"
+
+#: lib/poptQV.c:256 lib/poptQV.c:259
+msgid "don't verify mode of files"
+msgstr "不驗證檔案的模式"
+
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
+msgstr "不驗證檔案的安全情境"
+
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "不驗證檔案的能力"
+
+#: lib/poptQV.c:266
+msgid "don't verify files in package"
+msgstr "不驗證套件內的檔案"
+
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
+msgid "don't verify package dependencies"
+msgstr "不驗證套件的相依關係"
+
+#: lib/poptQV.c:271 lib/poptQV.c:274
+msgid "don't execute verify script(s)"
+msgstr "不執行驗證指令稿"
+
+#: lib/psm.c:146
+#, c-format
+msgid "Missing rpmlib features for %s:\n"
+msgstr "缺少 rpmlib 的特色用於 %s:\n"
+
+#: lib/psm.c:183
+msgid "source package expected, binary found\n"
+msgstr "預期是原始碼套件,但卻找到二進位套件\n"
+
+#: lib/psm.c:194
+msgid "source package contains no .spec file\n"
+msgstr "原始碼套件內未包含 .spec 檔案\n"
+
+#: lib/psm.c:606
+#, c-format
+msgid "unpacking of archive failed%s%s: %s\n"
+msgstr "解包封存檔失敗 %s%s:%s\n"
+
+#: lib/psm.c:607
+msgid " on file "
+msgstr "  於檔案 "
+
+#: lib/query.c:108
+#, c-format
+msgid "incorrect format: %s\n"
+msgstr "格式不正確:%s\n"
+
+#: lib/query.c:120
+msgid "(contains no files)\n"
+msgstr "(未包含檔案)\n"
+
+#: lib/query.c:161
+msgid "normal        "
+msgstr "正常        "
+
+#: lib/query.c:164
+msgid "replaced      "
+msgstr "被替換      "
+
+#: lib/query.c:167
+msgid "not installed "
+msgstr "未安裝 "
+
+#: lib/query.c:170
+msgid "net shared    "
+msgstr "已網路共享    "
+
+#: lib/query.c:173
+msgid "wrong color   "
+msgstr "錯誤色彩   "
+
+#: lib/query.c:176
+msgid "(no state)    "
+msgstr "(無狀態)    "
+
+#: lib/query.c:179
+#, c-format
+msgid "(unknown %3d) "
+msgstr "(不明的 %3d) "
+
+#: lib/query.c:199
+msgid "package has not file owner/group lists\n"
+msgstr "套件內沒有檔案擁有者/群組記錄\n"
+
+#: lib/query.c:233
+msgid "package has neither file owner or id lists\n"
+msgstr "套件內沒有檔案擁有者及 ID 列表\n"
+
+#: lib/query.c:321
+#, c-format
+msgid "group %s does not contain any packages\n"
+msgstr "群組 %s 內不包含任何套件\n"
+
+#: lib/query.c:328
+#, c-format
+msgid "no package triggers %s\n"
+msgstr "沒有套件會觸發 %s\n"
+
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
+#, c-format
+msgid "malformed %s: %s\n"
+msgstr "格式不當的 %s:%s\n"
+
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
+#, c-format
+msgid "no package matches %s: %s\n"
+msgstr "沒有套件符合 %s:%s\n"
+
+#: lib/query.c:387
+#, c-format
+msgid "no package requires %s\n"
+msgstr "沒有套件需要 %s\n"
+
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
+#, c-format
+msgid "no package provides %s\n"
+msgstr "沒有套件提供 %s\n"
+
+#: lib/query.c:455
+#, c-format
+msgid "file %s: %s\n"
+msgstr "檔案 %s:%s\n"
+
+#: lib/query.c:458
+#, c-format
+msgid "file %s is not owned by any package\n"
+msgstr "檔案 %s 不被任何套件擁有\n"
+
+#: lib/query.c:469
+#, c-format
+msgid "invalid package number: %s\n"
+msgstr "無效的套件編號:%s\n"
+
+#: lib/query.c:476
+#, c-format
+msgid "record %u could not be read\n"
+msgstr "記錄 %u 無法讀取\n"
+
+#: lib/query.c:491 lib/rpminstall.c:690
+#, c-format
+msgid "package %s is not installed\n"
+msgstr "套件 %s 尚未安裝\n"
+
+#: lib/query.c:525
+#, c-format
+msgid "unknown tag: \"%s\"\n"
+msgstr "不明的標籤:「%s」\n"
+
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
+#, c-format
+msgid "%s: key %d import failed.\n"
+msgstr "%s:金鑰 %d 匯入失敗。\n"
+
+#: lib/rpmchecksig.c:66
+#, c-format
+msgid "%s: key %d not an armored public key.\n"
+msgstr "%s:金鑰 %d 不是受保護的公鑰。\n"
+
+#: lib/rpmchecksig.c:111
+#, c-format
+msgid "%s: import read failed(%d).\n"
+msgstr "%s:匯入時讀取失敗(%d)。\n"
+
+#: lib/rpmchecksig.c:131
+#, c-format
+msgid "Fread failed: %s"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
+msgstr "不正確"
+
+#: lib/rpmchecksig.c:268
+msgid "OK"
+msgstr "正確"
+
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
+#, c-format
+msgid "%s: open failed: %s\n"
+msgstr "%s:開啟失敗:%s\n"
+
+#: lib/rpmchroot.c:43
+#, c-format
+msgid "Unable to open current directory: %m\n"
+msgstr "無法開啟目前的目錄:%m\n"
+
+#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
+#, c-format
+msgid "%s: chroot directory not set\n"
+msgstr "%s:chroot 目錄未設定\n"
+
+#: lib/rpmchroot.c:70
+#, c-format
+msgid "Unable to change root directory: %m\n"
+msgstr "無法變更根目錄:%m\n"
+
+#: lib/rpmchroot.c:95
+#, c-format
+msgid "Unable to restore root directory: %m\n"
+msgstr "無法還原根目錄:%m\n"
+
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "正在產生 %d 個缺少的索引,請稍待…\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "尚未設定 dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader:跳過"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "儲存記錄 #%2$d 到 %3$s 時發生錯誤(%1$d)\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s:regexec 失敗:%s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s:regcomp 失敗:%s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator:跳過"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb:已擷取損壞的標頭 #%u -- 跳過。\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s:無法讀取位於 0x%x 的標頭\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "尚未設定 dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "建立目錄 %s 時失敗:%s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "在資料庫中有不當的標頭 #%u -- 跳過。\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "無法加入原本位於 %u 的記錄\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "重建資料庫時失敗:原來的資料庫保持原狀\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "以新的資料庫取代舊的資料庫時失敗!\n"
+
+#: lib/rpmds.c:744
+msgid "NO "
+msgstr "否 "
+
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "是"
+
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+msgstr "PreReq:、Provides:、以及 Obsoletes: 相依性支援版本。"
+
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr "檔案名稱儲存為 (dirName、baseName、dirIndex) 字組,而非路徑。"
+
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr "套件酬載可以使用 bzip2 壓縮。"
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr "套件酬載可以使用 xz 壓縮。"
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr "套件酬載可以使用 lzma 壓縮。"
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "套件酬載檔案有「./」前綴。"
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "套件的「名稱-版本-釋出編號」沒有隱含性地提供。"
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "標頭標籤總在載入之後排序。"
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "指令稿片段解譯器可以使用來自標頭的引數。"
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "硬鏈結檔案組也許沒有被完整安裝。"
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr "套件指令稿片段在安裝過程中可以存取 rpm 資料庫。"
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "lua 指令稿的內部支援。"
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr "檔案摘要演算法可依各套件組配"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "支援 POSIX.1e 檔案的能力"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr "套件指令片段可以於安裝期間展開。"
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr "依存性的比較支援附有波折號的版本。"
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "不當魔法數字"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "不當或無法讀取的標頭"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "標頭尺寸過大"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "檔案太大而無法封存"
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "不明檔案類型"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr ""
+
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "摘要不符"
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "內部錯誤"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "在標頭中沒有封存檔"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
+
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " 失敗 - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr ""
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
+#, c-format
+msgid "open of %s failed: %s\n"
+msgstr "開啟 %s 失敗:%s\n"
+
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
+#, c-format
+msgid "%s: not an rpm package (or package manifest)\n"
+msgstr "%s:不是一個 rpm 套件 (或套件清單)\n"
+
+#: lib/rpminstall.c:142
+#, c-format
+msgid "Updating / installing...\n"
+msgstr "更新/安裝…\n"
+
+#: lib/rpminstall.c:144
+#, c-format
+msgid "Cleaning up / removing...\n"
+msgstr "清理/移除…\n"
+
+#: lib/rpminstall.c:193
+msgid "Preparing..."
+msgstr "準備…"
+
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
+msgstr "準備套件…"
+
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
+msgstr "相依關係失敗:\n"
+
+#: lib/rpminstall.c:323
+#, c-format
+msgid "%s: not an rpm package (or package manifest): %s\n"
+msgstr "%s:不是一個 rpm 套件 (或套件清單):%s\n"
+
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
+#, c-format
+msgid "%s cannot be installed\n"
+msgstr "%s 無法安裝\n"
+
+#: lib/rpminstall.c:490
+#, c-format
+msgid "Retrieving %s\n"
+msgstr "擷取 %s\n"
+
+#: lib/rpminstall.c:502
+#, c-format
+msgid "skipping %s - transfer failed\n"
+msgstr "跳過 %s - 轉移失敗\n"
+
+#: lib/rpminstall.c:572
+#, c-format
+msgid "package %s is not relocatable\n"
+msgstr "套件 %s 不能重新分配位置\n"
+
+#: lib/rpminstall.c:603
+#, c-format
+msgid "error reading from file %s\n"
+msgstr "讀取檔案 %s 時發生錯誤\n"
+
+#: lib/rpminstall.c:697
+#, c-format
+msgid "\"%s\" specifies multiple packages:\n"
+msgstr "「%s」指定多個套件:\n"
+
+#: lib/rpminstall.c:736
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "無法開啟 %s:%s\n"
+
+#: lib/rpminstall.c:742
+#, c-format
+msgid "Installing %s\n"
+msgstr "正在安裝 %s\n"
+
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
+msgstr "並非 rpm 套件"
+
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
+msgstr "無效的簽名類型"
+
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
+msgstr "未支援的 RPM 套件版本"
+
+#: lib/rpmlead.c:118
+#, c-format
+msgid "read failed: %s (%d)\n"
+msgstr "讀取失敗:%s (%d)\n"
+
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
+msgstr "並非 rpm 套件\n"
+
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
+#, c-format
+msgid "can't create %s lock on %s (%s)\n"
+msgstr "無法建立 %s 鎖定於 %s (%s)\n"
+
+#: lib/rpmlock.c:133
+#, c-format
+msgid "waiting for %s lock on %s\n"
+msgstr "等待 %s 鎖定於 %s\n"
+
+#: lib/rpmplugins.c:65
+#, c-format
+msgid "Failed to dlopen %s %s\n"
+msgstr "dlopen %s %s 時失敗\n"
+
+#: lib/rpmplugins.c:73
+#, c-format
+msgid "Failed to resolve symbol %s: %s\n"
+msgstr "解析符號 %s 時失敗:%s\n"
+
+#: lib/rpmplugins.c:154
+#, c-format
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr ""
+
+#: lib/rpmplugins.c:199
+#, c-format
+msgid "Plugin %s not loaded\n"
+msgstr "%s 插件未載入\n"
+
+#: lib/rpmprob.c:109
+msgid "different"
+msgstr "不同"
+
+#: lib/rpmprob.c:114
+#, c-format
+msgid "package %s is intended for a %s architecture"
+msgstr "套件 %s 是針對 %s 架構"
+
+#: lib/rpmprob.c:118
+#, c-format
+msgid "package %s is intended for a %s operating system"
+msgstr "套件 %s 是針對 %s 作業系統"
+
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
+msgstr "套件 %s 已經安裝"
+
+#: lib/rpmprob.c:125
+#, c-format
+msgid "path %s in package %s is not relocatable"
+msgstr "在套件 %2$s 中的路徑 %1$s 無法重新分配位置"
+
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
+msgstr "在試圖安裝 %2$s 和 %3$s 之間產生檔案 %1$s 衝突"
+
+#: lib/rpmprob.c:135
+#, c-format
+msgid "file %s from install of %s conflicts with file from package %s"
+msgstr "從 %2$s 安裝的檔案 %1$s 與來自套件 %3$s 的檔案產生衝突"
+
+#: lib/rpmprob.c:140
+#, c-format
+msgid "package %s (which is newer than %s) is already installed"
+msgstr "套件 %s (比 %s 還新) 已經安裝"
+
+#: lib/rpmprob.c:145
+#, c-format
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+msgstr "安裝套件 %s 需要 %<PRIu64>%cB 於 %s 檔案系統之上"
+
+#: lib/rpmprob.c:155
+#, c-format
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+msgstr "安裝套件 %s 需要 %<PRIu64> inodes 於 %s 檔案系統之上"
+
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
+msgstr "%s 被 %s%s 需要"
+
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
+msgstr "(已安裝) "
+
+#: lib/rpmprob.c:163
+#, c-format
+msgid "%s conflicts with %s%s"
+msgstr "%s 與 %s%s 衝突"
+
+#: lib/rpmprob.c:167
+#, c-format
+msgid "%s is obsoleted by %s%s"
+msgstr "%s 已被 %s%s 淘汰"
+
+#: lib/rpmprob.c:172
+#, c-format
+msgid "unknown error %d encountered while manipulating package %s"
+msgstr "遭遇不明錯誤 %d 於處理套件 %s 之時"
+
+#: lib/rpmrc.c:222
+#, c-format
+msgid "missing second ':' at %s:%d\n"
+msgstr "在 %s:%d 處遺漏第二個「:」\n"
+
+#: lib/rpmrc.c:225
+#, c-format
+msgid "missing architecture name at %s:%d\n"
+msgstr "在 %s:%d 處遺漏架構名稱\n"
+
+#: lib/rpmrc.c:370
+#, c-format
+msgid "Incomplete data line at %s:%d\n"
+msgstr "不完整資料列位於 %s:%d\n"
+
+#: lib/rpmrc.c:375
+#, c-format
+msgid "Too many args in data line at %s:%d\n"
+msgstr "在資料列的 %s:%d 中有過多引數\n"
+
+#: lib/rpmrc.c:382
+#, c-format
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr "不當架構/作業系統編號:%s (%s:%d)\n"
+
+#: lib/rpmrc.c:413
+#, c-format
+msgid "Incomplete default line at %s:%d\n"
+msgstr "不完整預設列位於 %s:%d\n"
+
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
+msgstr "在預設列的 %s:%d 中有過多引數\n"
+
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "遺漏「:」(找到 0x%02x) 位於 %s:%d\n"
+
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
+msgstr "%s 遺漏引數位於 %s:%d\n"
+
+#: lib/rpmrc.c:551
+#, c-format
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "無法開啟 %s 於 %s:%d:%m\n"
+
+#: lib/rpmrc.c:564
+#, c-format
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "%s 遺漏架構位於 %s:%d\n"
+
+#: lib/rpmrc.c:632
+#, c-format
+msgid "bad option '%s' at %s:%d\n"
+msgstr "不當選項「%s」位於 %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr "讀取輔助向量時失敗,/proc 未掛載?\n"
+
+#: lib/rpmrc.c:1469
+#, c-format
+msgid "Unknown system: %s\n"
+msgstr "不明系統:%s\n"
+
+#: lib/rpmrc.c:1471
+#, c-format
+msgid "Please contact %s\n"
+msgstr "請聯絡 %s\n"
+
+#: lib/rpmrc.c:1604
+#, c-format
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "無法開啟 %s 以供讀取:%m。\n"
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
+
+#: lib/rpmscript.c:138
+#, c-format
+msgid "Unable to restore current directory: %m"
+msgstr "無法還原目前的目錄:%m"
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "<lua> 指令稿片段支援未內建\n"
+
+#: lib/rpmscript.c:278
+#, c-format
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "無法建立暫存檔用於 %s:%s\n"
+
+#: lib/rpmscript.c:313
+#, c-format
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "無法複製檔案描述符號:%s:%s\n"
+
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr ""
+
+#: lib/rpmscript.c:371
+#, c-format
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s 指令稿片段失敗,waitpid(%d) rc %d:%s\n"
+
+#: lib/rpmscript.c:375
+#, c-format
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s 指令稿片段失敗,信號 %d\n"
+
+#: lib/rpmscript.c:378
+#, c-format
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s 指令稿片段失敗,離開狀態 %d\n"
+
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "不明格式"
+
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "安裝"
+
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "抹除"
+
+#: lib/rpmts.c:100
+#, c-format
+msgid "cannot open Packages database in %s\n"
+msgstr "無法開啟套件資料庫 %s\n"
+
+#: lib/rpmts.c:199
+#, c-format
+msgid "extra '(' in package label: %s\n"
+msgstr "額外的「(」存在於套件標貼中:%s\n"
+
+#: lib/rpmts.c:217
+#, c-format
+msgid "missing '(' in package label: %s\n"
+msgstr "套件標貼遺漏「(」:%s\n"
+
+#: lib/rpmts.c:225
+#, c-format
+msgid "missing ')' in package label: %s\n"
+msgstr "套件標貼遺漏「)」:%s\n"
+
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s:讀取公鑰時失敗。\n"
+
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "異動作業"
+
+#: lib/rpmvs.c:152
+#, c-format
+msgid "%s tag %u: invalid type %u"
+msgstr ""
+
+#: lib/rpmvs.c:158
+#, c-format
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
+
+#: lib/rpmvs.c:178
+#, c-format
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
+
+#: lib/rpmvs.c:188
+#, c-format
+msgid "%s tag %u: invalid size %u"
+msgstr ""
+
+#: lib/rpmvs.c:195
+#, c-format
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
+
+#: lib/rpmvs.c:206
+#, c-format
+msgid "%s: tag %u: invalid hex"
+msgstr ""
+
+#: lib/rpmvs.c:261
+#, c-format
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
+
+#: lib/rpmvs.c:268
+#, c-format
+msgid "%s%s"
+msgstr ""
+
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
+
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "標頭 "
+
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
+
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "無法重新載入簽名標頭。\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "已跳過"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "已失敗"
+
+#: lib/verify.c:263
+#, c-format
+msgid "Duplicate username or UID for user %s\n"
+msgstr ""
+
+#: lib/verify.c:284
+#, c-format
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr ""
+
+#: lib/verify.c:395
+msgid "no state"
+msgstr ""
+
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr ""
+
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "遺漏      %c %s"
+
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "未滿足 %s 的依存性:\n"
+
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
+msgstr ""
+
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
+
+#: rpmio/digest_nss.c:79
+#, c-format
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
+msgstr "%3d>%*s(清空)"
+
+#: rpmio/macro.c:316
+#, c-format
+msgid "%3d<%*s(empty)\n"
+msgstr "%3d<%*s(清空)\n"
+
+#: rpmio/macro.c:483
+#, c-format
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "巨集 %%%s 具有未終結的選項\n"
+
+#: rpmio/macro.c:495 rpmio/macro.c:533
+#, c-format
+msgid "Macro %%%s has unterminated body\n"
+msgstr "巨集 %%%s 具有未終結的主體\n"
+
+#: rpmio/macro.c:551
+#, c-format
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
+
+#: rpmio/macro.c:557
+#, c-format
+msgid "Macro %%%s has empty body\n"
+msgstr "巨集 %%%s 具有空的主體\n"
+
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
+#, c-format
+msgid "Macro %%%s failed to expand\n"
+msgstr "巨集 %%%s 展開時失敗\n"
+
+#: rpmio/macro.c:607
+#, c-format
+msgid "Macro %%%s has illegal name (%%undefine)\n"
+msgstr "巨集 %%%s 具有無效的名稱 (%%undefine)\n"
+
+#: rpmio/macro.c:637
+#, c-format
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
+
+#: rpmio/macro.c:761
+#, c-format
+msgid "Unknown option %c in %s(%s)\n"
+msgstr "在 %2$s(%3$s) 中有不明的選項 %1$c\n"
+
+#: rpmio/macro.c:1055
+msgid ""
+"Too many levels of recursion in macro expansion. It is likely caused by "
+"recursive macro declaration.\n"
+msgstr "在巨集展開中有太多層的遞迴。它似乎是遞迴的巨集宣告所造成的。\n"
+
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
+#, c-format
+msgid "Unterminated %c: %s\n"
+msgstr "未終結的 %c:%s\n"
+
+#: rpmio/macro.c:1182
+#, c-format
+msgid "A %% is followed by an unparseable macro\n"
+msgstr "在無法剖析的巨集之後跟著一個 %%\n"
+
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== 作用中 %d 清空 %d\n"
+
+#: rpmio/rpmfileutil.c:258
+#, c-format
+msgid "error creating temporary file %s: %m\n"
+msgstr "建立暫存檔 %s 時發生錯誤:%m\n"
+
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
+#, c-format
+msgid "File %s: %s\n"
+msgstr "檔案 %s:%s\n"
+
+#: rpmio/rpmfileutil.c:332
+#, c-format
+msgid "File %s is smaller than %u bytes\n"
+msgstr "檔案 %s 小於 %u 位元組\n"
+
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[無]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(無錯誤)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "嚴重錯誤:"
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "錯誤:"
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "警告:"
+
+#: rpmio/rpmlua.c:523
+#, c-format
+msgid "invalid syntax in lua scriptlet: %s\n"
+msgstr "無效的語法於 lua 指令稿片段:%s\n"
+
+#: rpmio/rpmlua.c:541
+#, c-format
+msgid "invalid syntax in lua script: %s\n"
+msgstr "無效的語法於 lua 指令稿:%s\n"
+
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
+#, c-format
+msgid "lua script failed: %s\n"
+msgstr "lua 指令稿失敗:%s\n"
+
+#: rpmio/rpmlua.c:560
+#, c-format
+msgid "invalid syntax in lua file: %s\n"
+msgstr "lua 檔案內有無效語法:%s\n"
+
+#: rpmio/rpmlua.c:756
+#, c-format
+msgid "lua hook failed: %s\n"
+msgstr "lua 攔截指令失敗:%s\n"
+
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "記憶體配置 (%u 位元組) 回傳 NULL。\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr "V%d %s/%s %s,金鑰識別號 %s"
+
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr "(無)"
+
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
+#, c-format
+msgid "%s: Fwrite failed: %s\n"
+msgstr "%s: Fwrite 失敗:%s\n"
+
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s:Fread 失敗:%s\n"
+
+#: sign/rpmgensig.c:177
+#, c-format
+msgid "%s: Fflush failed: %s\n"
+msgstr "%s:Fflush 失敗:%s\n"
+
+#: sign/rpmgensig.c:202
+msgid "Unsupported PGP signature\n"
+msgstr "未支援的 PGP 簽名\n"
+
+#: sign/rpmgensig.c:208
+#, c-format
+msgid "Unsupported PGP hash algorithm %u\n"
+msgstr "未支援的 PGP 雜湊演算法 %u\n"
+
+#: sign/rpmgensig.c:221
+#, c-format
+msgid "Unsupported PGP pubkey algorithm %u\n"
+msgstr "未支援的 PGP 公鑰演算法 %u\n"
+
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "無法執行 %s:%s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
+#, c-format
+msgid "Could not read from file %s: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:312
+#, c-format
+msgid "gpg exec failed (%d)\n"
+msgstr "gpg 執行失敗 (%d)\n"
+
+#: sign/rpmgensig.c:354
+msgid "gpg failed to write signature\n"
+msgstr "寫入簽名時 gpg 失敗\n"
+
+#: sign/rpmgensig.c:371
+msgid "unable to read the signature\n"
+msgstr "無法讀取簽名\n"
+
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
+msgid "rpmMkTemp failed\n"
+msgstr "rpmMkTemp 失敗\n"
+
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
+#, c-format
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
+
+#: sign/rpmgensig.c:682
+#, c-format
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s:rpmReadSignature 失敗:%s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s:headerRead 失敗:%s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "無法簽署 RPM v3 套件\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s 已經含有相同的簽名,跳過\n"
+
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
+#, c-format
+msgid "%s: rpmWriteSignature failed: %s\n"
+msgstr "%s:rpmWriteSignature 失敗:%s\n"
+
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s:writeLead 失敗:%s\n"
+
+#: sign/rpmgensig.c:812
+#, c-format
+msgid "replacing %s failed: %s\n"
+msgstr "置換 %s 時失敗:%s\n"
+
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
+#, c-format
+msgid "%s: read manifest failed: %s\n"
+msgstr "%s:讀取清單失敗:%s\n"
+
+#: tools/rpmgraph.c:219
+msgid "don't verify header+payload signature"
+msgstr "不驗證標頭+酬載簽名"
index 91f1a9843950d12fd822e7e2eb5294c1318e5458..0c6f4b151ff849d66e2aad073f3825802739ca1d 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,10 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Czech (http://www.transifex.com/rpm-team/rpm/language/cs/)\n"
 "Language: cs\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,498 +43,560 @@ msgstr "Tento program lze volně šířit podle podmínek GNU GPL\n"
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "vytvoření roury pro --pipe selhalo: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "spuštění selhalo\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "parametr není RPM balíček\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "chyba při při čtení hlavičky balíčku\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "nemohu znovu otevřít payload: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Volby dotazů (s -q nebo --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Vollby kontroly (s -V nebo --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Volby pro Instalaci/Aktualizaci/Mazání:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Společné volby pro všechny rpm režimy a spustitelné soubory:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "najednou lze provést jen jeden typ dotazu či ověření"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "neočekávaný příznak pro dotaz"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "neočekávaný formát dotazu"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "neočekávaný zdroj dotazu"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "specifikovat lze jen jeden hlavní režim"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "soubory mohou být přemístěny jen při instalaci balíčků"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "nemohu použít --prefix s --relocate nebo --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate a --excludepath je možno použít jen při instalaci nových balíčků"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix je možno použít jen při instalaci nových balíčků"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "parametry pro --prefix musejí začínat znakem /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs může být použit jen při instalaci balíčků"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs může být použit jen při instalaci balíčků"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs může být použit jen při instalaci balíčků"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "použít lze jen jeden z parametrů --excludedocs a --includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch může být použit jen při instalaci balíčků"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos může být použit jen při instalaci balíčků"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize může být použit jen při instalaci balíčků"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches může být použit jen při instalaci balíčků"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles může být použit jen při instalaci balíčků"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb může být použit jen při instalaci a odstraňování balíčků"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"volba pro potlačení skriptů může být použita jen při instalaci nebo při "
-"odstraňování balíčků"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"volba pro potlačení triggerů může být použita jen při instalaci nebo "
-"odstraňování balíčků"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "parametry pro --root (-r) musejí začínat znakem /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "nezadány žádné balíčky pro vymazání"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "nezadány žádné balíčky pro instalaci"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "k dotazu nezadány žádné parametry"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "pro kontrolu nezadány žádné balíčky"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot byl již nastaven, ignoruji %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "sestavení podle %prep (rozbalení zdrojových kódů a aplikace patchů) podle "
 "<spec_soubor>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<spec_soubor>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "sestavení podle %build (%prep, pak kompilace) podle <spec_soubor>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "sestavení podle %install (%prep, %build, pak install) podle <spec_soubor>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "kontrola části %files ve <spec_soubor>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "vytvoření zdrojového a binárního balíčku podle <spec_soubor>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "vytvoření pouze binárního balíčku podle <spec_soubor>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "vytvoření zdrojového balíčku podle <spec_soubor>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<zdrojový balíček>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr "sestavení podle %%install (včetně %prep, %build) ze <zdrojový balíček>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "sestavení podle %prep (rozbalení zdrojových kódů, aplikace patchů) z "
 "<tar_soubor>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tar_soubor>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "sestavení podle %build (%prep, pak kompilace) z <tar_soubor>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "sestavení podle %%install (%prep, %build, pak install) z <tar_soubor>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "kontrola části %files z <tar_soubor>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "vytvoření zdrojového a binárního balíčku z <tar_soubor>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "vytvoření pouze binárního balíčku z <tar_soubor>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "vytvoření pouze zdrojového balíčku z <tar_soubor>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "vytvoření binárního balíčku ze <zdrojový balíček>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<zdrojový balíček>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr "sestavení podle %%install (včetně %prep, %build) ze <zdrojový balíček>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "build root předefinován"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "po dokončení odstranit sestavovací strom"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignorovat ExcludeArch: direktivy ve spec souboru"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "ladit nástroj stavu souborů"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "nespouštět žádné etapy vytváření balíčku"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "nekontrolovat závislosti balíčků"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "neakceptovat i18N popisky ze spec souboru"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "po dokončení odstranit zdrojové kódy"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "po dokončení odstranit spec soubor"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "přeskočit přímo na určenou etapu (pouze pro c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "cílová platforma předefinována"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 "Sestavovací volby s [ <spec_soubor> | <tar_soubor> | <zdrojový_balíček> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Společné volby pro všechny rpm režimy a spustitelné soubory:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Chybné závislosti při sestavování:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Nelze otevřít spec soubor %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Nelze otevřít rouru pro tar: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Nelze číst spec soubor z %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Nelze přejmenovat %s na %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "nemohu zjistit stav %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Soubor %s není obyčejný soubor.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Nezdá se, že by %s byl spec soubor.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Sestavuji cílové platformy: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Sestavuji pro cíl %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "parametry pro --root (-r) musejí začínat znakem /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "inicializuj databázi"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr "znovu sestav obrácené seznamy z instalovaných hlaviček balíčků"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "zkontrolovat databázové soubory"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Volby databáze:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "specifikovat lze jen jeden hlavní režim"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "ověřit podpis v balíčku"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "importuj obrněný veřejný klíč"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "nezadány žádné parametry"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Volby dotazů (s -q nebo --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Vollby kontroly (s -V nebo --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Volby pro Instalaci/Aktualizaci/Mazání:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "najednou lze provést jen jeden typ dotazu či ověření"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "neočekávaný příznak pro dotaz"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "neočekávaný formát dotazu"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "neočekávaný zdroj dotazu"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "soubory mohou být přemístěny jen při instalaci balíčků"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "nemohu použít --prefix s --relocate nebo --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate a --excludepath je možno použít jen při instalaci nových balíčků"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix je možno použít jen při instalaci nových balíčků"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "parametry pro --prefix musejí začínat znakem /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs může být použit jen při instalaci balíčků"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs může být použit jen při instalaci balíčků"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs může být použit jen při instalaci balíčků"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "použít lze jen jeden z parametrů --excludedocs a --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch může být použit jen při instalaci balíčků"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos může být použit jen při instalaci balíčků"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize může být použit jen při instalaci balíčků"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches může být použit jen při instalaci balíčků"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles může být použit jen při instalaci balíčků"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb může být použit jen při instalaci a odstraňování balíčků"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"volba pro potlačení skriptů může být použita jen při instalaci nebo při "
+"odstraňování balíčků"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"volba pro potlačení triggerů může být použita jen při instalaci nebo "
+"odstraňování balíčků"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "nezadány žádné balíčky pro vymazání"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "nezadány žádné balíčky pro instalaci"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "k dotazu nezadány žádné parametry"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "pro kontrolu nezadány žádné balíčky"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "podepsat balíček (identické s --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "vymazat podpisy balíčku"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Volby signatury:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Nemohu spustit %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Je nutné nastavit \"%%_gpg_name\" ve vašem souboru maker\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Vložte heslovou frázi: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Heslová fráze je v pořádku.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "použij následující formát dotazů"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -543,32 +605,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Provádění(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Spuštění %s selhalo (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Špatný návratový kód z %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -578,235 +645,315 @@ msgstr ""
 "\n"
 "chyby sestavení RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "chyba syntaxe při zpracování ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "chyba syntaxe při zpracování &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "chyba syntaxe při zpracování ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "chyba při parsování ve výrazu\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "nedoplněná (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- jen na číslech\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! jen na číslech\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "typy musí souhlasit\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / nejsou podporovány pro řetězce\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- není podporováno pro řetězce\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& a || není podporováno pro řetězce\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "chyba syntaxe ve výrazu\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Chybí '(' v %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Chybí ')' v %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Neplatný %s token: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Chybějící %s v %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Následuje neprázdný znak %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Špatná syntaxe: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Špatná práva spec: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Špatná práva adresáře: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Soubor musí začínat na \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Soubor uveden dvakrát: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Symbolická linka ukazuje na BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Soubor nenalezen: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: nemohu nahrát neznámou značku (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: čtení veřejného klíče selhalo.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: není obrněný veřejný klíč.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Soubor potřebuje úvodní \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Soubor nenalezen globem: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Nemohu otevřít %%files soubor %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "řádek: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Soubor nenalezen globem: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Špatný soubor: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Špatný vlastník/skupina: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Kontroluji nezabalené soubory: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -815,548 +962,605 @@ msgstr ""
 "Nalezeny instalované, ale nezabalené soubory:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: řádek: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Nemohu získat jméno počítače: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Nemohu zapsat payload do %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Nemohu přečíst payload z %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Nemohu získat jméno počítače: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Neznámá komprese payloadu: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Nemohu vytvořit nezměnitelný region hlavičky.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Nelze otevřít dočasný soubor.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Nemohu zapsat dočasnou hlavičku\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Nelze číst spec soubor z %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Špatná CSA data\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Nemohu znovu přečíst hlavičku podpisu.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Nemohu otevřít %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Nemohu zapsat balíček: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Nemohu otevřít cíl pro podepsání %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Nemohu přečíst hlavičku z %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Nemohu zapsat hlavičku do %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Zapsáno: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Nemohu vygenerovat jméno souboru pro balíček %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "nemohu vytvořit %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "řádek: %d: druhý %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "Položky v %%changelog musí začínat znakem *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "nekompletní položka v %%changelog\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "špatný datum v %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog není seřazen sestupně podle času\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "chybějící jméno v %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "žádný popis v %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "řádek %d: Chyba při parsování %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "řádek %d: špatná volba %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "řádek %d: Příliš mnoho jmen: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "řádek %d: Balíček neexistuje: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "řádek %d: Druhé description\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "řádek %d: Chyba při parsování %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "řádek %d: Špatné číslo: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "řádek %d: Špatné číslo %s: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Architektura je vyřazena: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Architektura není zahrnuta: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS je vyřazen: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS není zahrnut: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "Položka %s musí být v balíčku přítomna: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Duplikovaná položka %s v balíčku: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Nemohu otevřít ikonu %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Nemohu přečíst ikonu %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Neznámý typ ikony: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "řádek %d: Značka má jen jeden token: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
+#, c-format
+msgid "line %d: %s in: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
 msgstr ""
 
-#: build/parsePreamble.c:623
-#, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "řádek %d: Počkozená značka: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "řádek %d: Prázdná značka: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "řádek %d: Prefixy nesmí končit znakem \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "řádek %d: Docdir musí začínat na '/': %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "řádek %d: Špatné určení %s: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "řádek %d: Špatný formát BuildArchitecture: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Interní chyba: Špatná značka: %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Špatná specifikace balíčku: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Balíček již existuje: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "řádek %d: Neznámá značka: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Špatný zdrojový soubor: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Chyba při parsování %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "řádek %d: Špatný parametr v %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "řádek %d: Špatná volba v %%setup %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Neplatné číslo záplaty %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "řádek %d: druhý %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "řádek %d: spouště (triggery) musí mít --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "řádek %d: Chyba při parsování %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "řádek %d: vnitřní skript musí končit na '>': %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "řádek %d: jméno skriptu musí začínat na '/': %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "řádek %d: Druhý %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "řádek %d: nepodporovaný interní skript: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "řádek %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Nemohu otevřít %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: %%else bez počítečního %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: %%endif bez počátečního %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Nenalezeny žádné kompatibilní architektury pro sestavení\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Balíček nemá žádné %%description: %s\n"
@@ -1427,450 +1631,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Nemohu vytvořit rouru pro %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Nemohu spustit %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Nemohu provést fork %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) selhalo: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load selhal: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Hledám   %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Selhalo vyhledání %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "dotaz na spec soubor %s selhal, nemohu parsovat\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(chyba: 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Špatné magické číslo"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Špatná nebo nečitelná hlavička"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "nerozpoznaný db parametr: \"%s\" ignorován.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Velikost hlavičky je přiliš velká"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s má neplatnou číselnou hodnotu, přeskakuji\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s má příliš velkou nebo příliš malou long hodnotu, přeskakuji\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s má příliš velkou nebo příliš malou int hodnotu, přeskakuji\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "nemohu získat zámek %s na %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "sdílen"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "exkluzivní"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Neznámý typ souboru"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "chyba(%d) při ukládání záznamu \"%s\" do %s\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Chybějící hardlink(y)"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "chyba(%d) v odstraňování \"%s\" z %s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Interní chyba"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Soubor z archivu není v hlavičce"
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "chyba(%d) při alokaci nové instance balíčku\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr "selhal - "
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s is a Delta RPM a nemůže být přímo instalován\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Nepodporovaný payload (%s) in balíčku %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "balíček %s byl již přidán, přeskakuji %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "balíček %s byl již přidán, nahrazuji ho s %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(není blob)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(není číslo)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr ""
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(neplatný typ)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(není base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(neplatný typ)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(není blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(neplatný typ xml)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(není OpenPGP podpis)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "uživatel %s neexistuje - použit uživatel root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "skupina %s neexistuje - použita skupina root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s uloženo jako %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s vytvořen jako %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "značka[%d]: ŠPATNÁ, značka %d typ %d offset %d počet %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: ŠPATNÁ, není v hexa\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: ŠPATNÁ, není binární\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: ŠPATNÁ, není binární\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "velikost blobu(%d): ŠPATNÁ, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "offset regionu: ŠPATNÝ, značka %d typ %d offset %d počet %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "trailer regionu: ŠPATNÝ, značka %d typ %d offset %d počet %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "velikost regionu: ŠPATNÁ, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr velikost (%d): ŠPATNÁ, čtení vrátilo %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic: ŠPATNÝ\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr značky: ŠPATNÉ, počet značek (%d) mimo rozsah\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hdr data: ŠPATNÁ, bajtů (%d) mimo rozsah\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr blob(%zd): ŠPATNÝ, čtení vrátilo %d\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "prázdný formát značky"
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "nahrátí hdr: ŠPATNÉ\n"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "prázdné jméno značky"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature selhalo: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Žádný podpis k dispozici\n"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "na konci pole očekáváno ]"
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead selhal: %s"
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "neočekávaná ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "neočekávaná }"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "ve výrazu očekáván ?"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "ve výrazu je po ? očekávána {"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "ve výrazu je očekávána }"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "v podvýrazu je po ? očekávána :"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "ve výrazu je po : očekávána {"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "na konci výrazu je očekáváno |"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "iterátor pole použitý s poli jiné délky"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread selhalo: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "předefinuj <makro> s hodnotou <výraz>"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'<makro> <výraz>'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "definuj <makro> s hodnotou <výraz>"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "vypsat expanzi makra <výraz>"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'<výraz>'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "číst <soubor:...> místo implicitního souboru"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<SOUBOR:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "nekontrolovat souhrny balíčku"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "nekontrolovat získané hlavičky databáze"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "nekontrolovat podpisy balíčku"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "odeslat stdout do <příkazu>"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "<příkaz>"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "použít <adr> jako adresář nejvyšší úrovně"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "<adr>"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "zobrazit známé značky pro dotazy"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "zobrazit finální konfiguraci rpmrc a maker"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "poskytnout výstu s méně detaily"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "poskytnout detailnější výstup"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "vypsat používanou verzi rpm"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "ladit nástroj stavu souboru payload"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "ladit rpmio I/O"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: tabulka voleb špatně nakonfigurována (%d)\n"
@@ -1891,12 +2206,12 @@ msgstr "přemístění musejí obsahovat ="
 msgid "relocations must have a / following the ="
 msgstr "přemístění musejí mít za znakem = znak /"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "nainstalovat všechny soubory i konfigurace, které by se jinak mohly vynechat"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1904,151 +2219,161 @@ msgstr ""
 "odstranit všechny balíčky odpovídající <balíčku> (obvykle se generuje chyba, "
 "specifikuje-li <balíček> více balíčků)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "přemístění souborů v nepřemístitelném balíčku"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "zobraz závislostní smyčky jako varování"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "smazat (deinstalovat) balíček"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<balíček>"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "neinstaluj konfigurační soubory"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "neinstalovat dokumentaci"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "přeskočit soubory s úvodní cestou <cesta> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<cesta>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "zkratka pro --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "aktualizace balíčku jestliže je již nainstalován"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<soubor_balíčku>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "během instalace balíčku zobrazit dvojité křížky (dobré s -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "nekontrolovat architekturu balíčku"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "nekontrolovat operační systém balíčku"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "nekontrolovat volné místo na disku před instalací"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "nainstalovat dokumentaci"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "nainstalovat balíčky"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "upravit databázi, ale neupravovat systém souborovů"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "nekontrolovat závislosti balíčků"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "neinstalovat bezpečnostní kontexty souboru"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "pro vyřešení závislostí neměnit pořadí instalace balíčků"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "nespouštět žádné skripty určené pro balíčky"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "nespouštět žádné skripty (jsou-li nějaké)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "nespouštět žádné skripty (jsou-li nějaké)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "nespouštět žádné skripty (jsou-li nějaké)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "nespouštět žádné skripty (jsou-li nějaké)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "nespouštět žádné skripty aktivované tímto balíčkem"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "nespouštět žádné skripty určené pro balíčky"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "nespouštět žádné instalační skripty"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "nespouštět žádné instalační skripty"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "nespouštět žádné instalační skripty"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2056,599 +2381,866 @@ msgstr ""
 "aktualizovat na starou verzi balíčku (--force to dělá při aktualizacích "
 "automaticky)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "během instalace balíčku zobrazit procenta"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "přemístit soubory do <adr>, jsou-li přemístitelné"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<adresář>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "přemístit soubory ze <staré_cesty> do <nové_cesty>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<stará_cesta>=<nová_cesta>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "ignoruj souborové konflikty mezi balíčky"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "přeinstalovat, i když je již balíček přítomen"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "neinstalovat ale sdělit, zda-li by to fungovalo či nikoli"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "aktualizace balíčku"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "dotázat/ověřit všechny balíčky"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "režim rpm checksig"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "dotaz/ověření balíčků vlastnícího soubor"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "dotaz/ověření balíčků ve skupině"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "dotázat/ověřit soubor balíčku"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "dotaz/ověření balíčků s identifikátorem balíčku"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "dotaz/ověření balíčků s hlavičkovým identifikátorem"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "režim dotazů"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "dotaz/ověření hlavičkové instance"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "dotaz/ověření balíčků z instalační transakce"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "dotaz na balíčky aktivované balíčkem"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "režim kontroly"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "dotaz/ověření balíčků vyžadujících závislost"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "dotaz/ověření balíčků poskytujících závislost"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "neseparuj argumenty"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "nezpracovávej nebalíčkové soubory jako seznamy"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "vypsat všechny konfigurační soubory"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "vypsat všechny soubory s dokumentací"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "vypsat všechny soubory s dokumentací"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "vypsat všechny konfigurační soubory"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "zobrazit základní informace o souborech"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "vypsat soubory v balíčku"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "vynechat %%ghost soubory"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "vynechat %%ghost soubory"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "zobrazit stav vypsaných souborů"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "nekontrolovat velikost souborů"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "nekontrolovat cesty symbolických linek"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "nekontrolovat vlastníka souborů"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "nekontrolovat skupinu souborů"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "nekontrolovat čas změny souboru"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "nekontrolovat mód souborů"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr ""
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "nekontrolovat bezpečnostní kontexty souboru"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr ""
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "nekontrolovat soubory v balíčku"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "nekontrolovat závislosti balíčků"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "nespouštět kontrolní skripty"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "očekávám balíček se zdrojovými kódy, nalezen však binární\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "zdrojový balíček neobsahuje .spec soubor\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "rozbalování archívu selhalo %s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " na souboru "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s selhal na souboru %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s selhalo: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "nesprávný formát: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(neobsahuje žádné soubory)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normální      "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "nahrazen      "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "neinstalován  "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "sdílen v síti "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "špatná barva  "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(chybí stav)  "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(neznámý %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "balíček nemá vlastníka souboru ani seznamy skupin\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "balíček nemá vlastníka souboru ani seznamy id\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "skupina %s neobsahuje žádné balíčky\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "žádný balíček neaktivuje %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "poškozený %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "žádný balíček se neshoduje s %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "žádný balíček nevyžaduje %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "žádný balíček neposkytuje %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "soubor %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "soubor %s nevlastní žádný balíček\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "neplatné číslo balíčku: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "balíček %s není nainstalován\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "neznámá značka: \"%s\"\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: importní čtení selhalo(%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
-"%s: Nezměnitelná oblast hlavičky nemůže být čtena. Poškozený balíček?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NENÍ OK"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr "(CHYBĚJÍCÍ KLÍČE:"
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
+#, c-format
+msgid "%s: open failed: %s\n"
+msgstr "%s: otevření selhalo: %s\n"
+
+#: lib/rpmchroot.c:43
+#, c-format
+msgid "Unable to open current directory: %m\n"
+msgstr ""
+
+#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
+#, c-format
+msgid "%s: chroot directory not set\n"
+msgstr ""
+
+#: lib/rpmchroot.c:70
+#, c-format
+msgid "Unable to change root directory: %m\n"
+msgstr "Není možné změnit kořenový adresář: %m\n"
+
+#: lib/rpmchroot.c:95
+#, c-format
+msgid "Unable to restore root directory: %m\n"
+msgstr ""
+
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "nebyla nastavena dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: přeskakuji"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "chyba(%d) ukládání záznamu #%d do %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec selhal: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp selhal: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: přeskakuji"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: poškozená hlavička #%u získáno -- přeskakuji.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: nemohu číst hlavičku na 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "žádný dbpath nebyl nastaven"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "selhání při vytváření adresáře %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "hlavička #%u v databázi je špatná -- přeskakuji.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "nemohu přidat záznam původně na %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "selhalo znovusestavení databáze: původní databáze zůstává na místě\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "selhalo nahrazení staré databáze novou databází!\n"
+
+#: lib/rpmds.c:744
+msgid "NO "
+msgstr "NE "
+
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "ANO"
+
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+msgstr "PreReq:, Provides:, a Obsoletes: verze pro podporu závislostí."
+
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr "jména souborů uložená jako diName,baseName,dirIndex, ne jako cesta."
+
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr "payload balíčku může být komprimován pomocí bzip2."
 
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr ""
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr "payload balíčku může být komprimován pomocí lzma."
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "soubory payloadu balíčku mají předponu \"./\"."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "NVR balíčku není implicitně zprostředkována."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "značky hlavičky jsou vždy setřízeny po nahrátí."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "interpret skriptletů může použít argumenty z hlavičky."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "hardlinkovaný soubor může být instalován bez toho, aby byl kompletní."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr "skriptlety balíčku mohou přistupovat k rpm databázi při instalaci."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "interní podpora pro lua skripty."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr ""
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr "(NEDŮVĚRYHODNÉ KLÍČE:"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
 
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
-#, c-format
-msgid "%s: open failed: %s\n"
-msgstr "%s: otevření selhalo: %s\n"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
 
-#: lib/rpmchroot.c:43
+#: lib/rpmfi.c:810
 #, c-format
-msgid "Unable to open current directory: %m\n"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
+#: lib/rpmfi.c:817
 #, c-format
-msgid "%s: chroot directory not set\n"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmchroot.c:70
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "Unable to change root directory: %m\n"
-msgstr "Není možné změnit kořenový adresář: %m\n"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
 
-#: lib/rpmchroot.c:95
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "Unable to restore root directory: %m\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr "NE "
-
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr "ANO"
-
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr "PreReq:, Provides:, a Obsoletes: verze pro podporu závislostí."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Špatné magické číslo"
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
-msgstr "jména souborů uložená jako diName,baseName,dirIndex, ne jako cesta."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Špatná nebo nečitelná hlavička"
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
-msgstr "payload balíčku může být komprimován pomocí bzip2."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Velikost hlavičky je přiliš velká"
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr "payload balíčku může být komprimován pomocí lzma."
-
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "soubory payloadu balíčku mají předponu \"./\"."
-
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "NVR balíčku není implicitně zprostředkována."
-
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "značky hlavičky jsou vždy setřízeny po nahrátí."
-
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "interpret skriptletů může použít argumenty z hlavičky."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Neznámý typ souboru"
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "hardlinkovaný soubor může být instalován bez toho, aby byl kompletní."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr "skriptlety balíčku mohou přistupovat k rpm databázi při instalaci."
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "interní podpora pro lua skripty."
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Interní chyba"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr ""
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Soubor z archivu není v hlavičce"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr ""
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr "selhal - "
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "otevření %s selhalo: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Připravuji..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Selhalé závislosti:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: není rpm balíčkem (nebo seznamem balíčků): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s nemůže být nainstalován\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Získávám %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "balíček %s není přemístitelný\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "chyba při vytváření dočasného souboru %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "nemohu otevřít %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Instaluji: %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "není rpm balíček"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "nepovolený typ podpisu"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "nepodporovaná verze RPM balíčku"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "čtení selhalo: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "jiný"
@@ -2722,796 +3314,633 @@ msgstr ""
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "neznámá chyba %d vznikla při manipulaci s balíčkem %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "chybí druhé ':' na %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "chybí jméno architektury na %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Neúplný datový řádek %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Příliš mnoho argumentů na datovém řádku na %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Špatné číslo architektury nebo operačního systému: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Neúplný implicitní řádek na %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Příliš mnoho argumentů v implicitním řádku na %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "chybějící ':' (nalezeno 0x%02x) na %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "chybí argument pro %s na %s:%d\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr "nemohu otevřít %s na %s:%d: %m\n"
 
-#: lib/rpmrc.c:536
+#: lib/rpmrc.c:564
 #, c-format
 msgid "missing architecture for %s at %s:%d\n"
 msgstr "chybí arcitektura pro %s na %s:%d\n"
 
-#: lib/rpmrc.c:603
+#: lib/rpmrc.c:632
 #, c-format
 msgid "bad option '%s' at %s:%d\n"
 msgstr "špatný parametr'%s' na %s:%d\n"
 
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Neznámý systém: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Prosím kontaktujte %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Nemohu otevřít %s pro čtení: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "%s scriptlet selhal, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s skriplet selhal, signál %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "provedení %s skripletu selhalo, návratový kód: %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "nemohu otevřít Packages databázi v %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "nadbytečná '(' v názvu balíčku: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "chybějící '(' v názvu balíčku: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "chybějící ')' v názvu balíčku: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh velikost(%d): ŠPATNÁ, čtení vrátilo %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic: ŠPATNÁ\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh značky: ŠPATNÉ, počet značek(%d) mimo rozsah\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh data: ŠPATNÁ, počet bajtů(%d) mimo rozsah\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d): ŠPATNÝ, čtení vrátilo %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh značka[%d]: šPATNÝ, značka %d typ %d offset %d počet %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh nahání: šPATNÉ\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh zarovnání(%zd): ŠPATNÉ, čtení %zd bajtů\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd): ŠPATNÁ, fstat(2) selhal\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "Nezměnitelná oblast hlavičky nemůže být čtena. Poškozený balíček?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5 digest:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "SHA1 digest v hlavičce:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Hlavička "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "chybí     %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Nesplněné závislosti pro %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "chybí { po %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "po %{ chybí }"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "prázdný formát značky"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "prázdné jméno značky"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "neznámá značka"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "na konci pole očekáváno ]"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "neočekávaná ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "neočekávaná }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "ve výrazu očekáván ?"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "ve výrazu je po ? očekávána {"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "ve výrazu je očekávána }"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "v podvýrazu je po ? očekávána :"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "ve výrazu je po : očekávána {"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "na konci výrazu je očekáváno |"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "iterátor pole použitý s poli jiné délky"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "nemohu otevřít %s index pomocí db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "nebyla nastavena dbpath\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: přeskakuji"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "chyba(%d) ukládání záznamu #%d do %s\n"
+msgid "Unknown system: %s\n"
+msgstr "Neznámý systém: %s\n"
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec selhal: %s\n"
+msgid "Please contact %s\n"
+msgstr "Prosím kontaktujte %s\n"
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp selhal: %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Nemohu otevřít %s pro čtení: %m.\n"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: přeskakuji"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
 
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: poškozená hlavička #%u získáno -- přeskakuji.\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) removing header #%d record\n"
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmscript.c:313
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: nemohu číst hlavičku na 0x%x\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmscript.c:353
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "chyba(%d) nastavování \"%s\" záznamů z %s indexu\n"
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2467
+#: lib/rpmscript.c:371
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "chyba(%d) při ukládání záznamu \"%s\" do %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s scriptlet selhal, waitpid(%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2477
+#: lib/rpmscript.c:375
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "chyba(%d) v odstraňování \"%s\" z %s\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s skriplet selhal, signál %d\n"
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:378
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "chyba(%d) při alokaci nové instance balíčku\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "provedení %s skripletu selhalo, návratový kód: %d\n"
 
-#: lib/rpmdb.c:2644
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "chyba(%d) získávání \"%s\" záznamů z %s indexu\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr ""
 
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "chyba(%d) při ukládání záznamu %s do %s\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "žádný dbpath nebyl nastaven"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "selhání při vytváření adresáře %s: %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "nemohu otevřít Packages databázi v %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmts.c:199
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "hlavička #%u v databázi je špatná -- přeskakuji.\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "nadbytečná '(' v názvu balíčku: %s\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmts.c:217
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "nemohu přidat záznam původně na %u\n"
-
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr "selhalo znovusestavení databáze: původní databáze zůstává na místě\n"
-
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "selhalo nahrazení staré databáze novou databází!\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "chybějící '(' v názvu balíčku: %s\n"
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:225
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "nahraď soubory v %s soubory z %s k obnovení"
+msgid "missing ')' in package label: %s\n"
+msgstr "chybějící ')' v názvu balíčku: %s\n"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:284
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "selhalo odstranění adresáře %s: %s\n"
+msgid "%s: reading of public key failed.\n"
+msgstr ""
 
-#: lib/backend/db3.c:33
-#, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d chyba(%d) z %s: %s\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmvs.c:152
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d chyba(%d): %s\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmvs.c:158
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "nemohu získat zámek %s na %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "sdílen"
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "exkluzivní"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:178
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:188
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "nerozpoznaný db parametr: \"%s\" ignorován.\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s má neplatnou číselnou hodnotu, přeskakuji\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:206
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s má příliš velkou nebo příliš malou long hodnotu, přeskakuji\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:261
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s má příliš velkou nebo příliš malou int hodnotu, přeskakuji\n"
+msgid "%s%s %s"
+msgstr ""
 
-#: plugins/sepolicy.c:218
-#, c-format
-msgid "Failed to decode policy for %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:231
-#, c-format
-msgid "Failed to write %s policy to file %s\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Hlavička "
+
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Nemohu znovu přečíst hlavičku podpisu.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: lib/verify.c:263
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: lib/verify.c:284
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:448
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr ""
+msgid "missing   %c %s"
+msgstr "chybí     %c %s"
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr ""
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Nesplněné závislosti pro %s:\n"
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:185
-#, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktivní %d prázdné %d\n"
-
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(prázdné)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(prázdné)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Makro %%%s má neukončené tělo\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Makro %%%s má neukončené parametry\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Makro %%%s má nepřípustné jméno (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Makro %%%s má neukončené tělo\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Makro %%%s má neukončené parametry\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Makro %%%s má prázdné tělo\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Selhalo vyhodnocení makra %%%s\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Makro %%%s má nedovolené jméno (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Makro %%%s (%s) nebylo použito pod úrovní %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Neznámý parametr %c v %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Neukončené %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Po %% následuje nezpracovatelné makro\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktivní %d prázdné %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(žádná chyba)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "fatální chyba:"
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "chyba: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "varování: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "neplatná syntax v lua skriptletu: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "neplatná syntax v lua skriptu: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "lua skript selhal: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "neplatné syntax v lua souboru: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "lua obsloužení selhalo: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "alokace paměti (%u bajtů) vrátila NULL.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(žádná chyba)"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "fatální chyba:"
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "chyba: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "varování: "
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "alokace paměti (%u bajtů) vrátila NULL.\n"
+msgid "error creating fifo %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite selhalo: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread selhalo: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush selhal: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Nemohu spustit %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Nemohu vytvořit rouru pro podepsání: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "spuštění gpg selhalo (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg selhal při zápisu podpisu\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "nemohu přečíst podpis\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp selhal\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead selhalo: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature selhalo: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: Fwrite selhalo: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead selhalo: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: čtení seznamu selhalo: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "neověřuj podpis hlavičky a payloadu"
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
deleted file mode 100644 (file)
index a71ef75..0000000
+++ /dev/null
@@ -1,3484 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# This file is distributed under the same license as the PACKAGE package.
-# 
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: RPM\n"
-"Report-Msgid-Bugs-To: http://rpm.org/\n"
-"POT-Creation-Date: 2012-11-05 10:07+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
-"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/rpm/language/cs_CZ/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: cs_CZ\n"
-"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-
-#: cliutils.c:21 lib/poptI.c:29
-#, c-format
-msgid "%s: %s\n"
-msgstr ""
-
-#: cliutils.c:27 lib/poptALL.c:55
-#, c-format
-msgid "RPM version %s\n"
-msgstr ""
-
-#: cliutils.c:32
-#, c-format
-msgid "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
-msgstr ""
-
-#: cliutils.c:33
-#, c-format
-msgid ""
-"This program may be freely redistributed under the terms of the GNU GPL\n"
-msgstr ""
-
-#: cliutils.c:53
-#, c-format
-msgid "creating a pipe for --pipe failed: %m\n"
-msgstr ""
-
-#: cliutils.c:63
-#, c-format
-msgid "exec failed\n"
-msgstr ""
-
-#: rpm2cpio.c:63
-#, c-format
-msgid "argument is not an RPM package\n"
-msgstr ""
-
-#: rpm2cpio.c:68
-#, c-format
-msgid "error reading header from package\n"
-msgstr ""
-
-#: rpm2cpio.c:83
-#, c-format
-msgid "cannot re-open payload: %s\n"
-msgstr ""
-
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr ""
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr ""
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr ""
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr ""
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr ""
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr ""
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr ""
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr ""
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr ""
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr ""
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid ""
-"--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr ""
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr ""
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr ""
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr ""
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr ""
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr ""
-
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr ""
-
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:129
-#, c-format
-msgid "verify %files section from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:142
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
-msgid "<tarball>"
-msgstr ""
-
-#: rpmbuild.c:145
-msgid "build through %build (%prep, then compile) from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:148
-msgid "build through %install (%prep, %build, then install) from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:151
-#, c-format
-msgid "verify %files section from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:154
-msgid "build source and binary packages from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:157
-msgid "build binary package only from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:160
-msgid "build source package only from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:164
-msgid "build binary package from <source package>"
-msgstr ""
-
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr ""
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-
-#: rpmbuild.c:171
-msgid "override build root"
-msgstr ""
-
-#: rpmbuild.c:173
-msgid "remove build tree when done"
-msgstr ""
-
-#: rpmbuild.c:175
-msgid "ignore ExcludeArch: directives from spec file"
-msgstr ""
-
-#: rpmbuild.c:177
-msgid "debug file state machine"
-msgstr ""
-
-#: rpmbuild.c:179
-msgid "do not execute any stages of the build"
-msgstr ""
-
-#: rpmbuild.c:181
-msgid "do not verify build dependencies"
-msgstr ""
-
-#: rpmbuild.c:183
-msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
-msgstr ""
-
-#: rpmbuild.c:187
-#, c-format
-msgid "do not execute %clean stage of the build"
-msgstr ""
-
-#: rpmbuild.c:189
-#, c-format
-msgid "do not execute %check stage of the build"
-msgstr ""
-
-#: rpmbuild.c:192
-msgid "do not accept i18N msgstr's from specfile"
-msgstr ""
-
-#: rpmbuild.c:194
-msgid "remove sources when done"
-msgstr ""
-
-#: rpmbuild.c:196
-msgid "remove specfile when done"
-msgstr ""
-
-#: rpmbuild.c:198
-msgid "skip straight to specified stage (only for c,i)"
-msgstr ""
-
-#: rpmbuild.c:200 rpmspec.c:34
-msgid "override target platform"
-msgstr ""
-
-#: rpmbuild.c:217
-msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
-msgstr ""
-
-#: rpmbuild.c:237
-msgid "Failed build dependencies:\n"
-msgstr ""
-
-#: rpmbuild.c:255
-#, c-format
-msgid "Unable to open spec file %s: %s\n"
-msgstr ""
-
-#: rpmbuild.c:317
-#, c-format
-msgid "Failed to open tar pipe: %m\n"
-msgstr ""
-
-#: rpmbuild.c:336
-#, c-format
-msgid "Failed to read spec file from %s\n"
-msgstr ""
-
-#: rpmbuild.c:348
-#, c-format
-msgid "Failed to rename %s to %s: %m\n"
-msgstr ""
-
-#: rpmbuild.c:419
-#, c-format
-msgid "failed to stat %s: %m\n"
-msgstr ""
-
-#: rpmbuild.c:423
-#, c-format
-msgid "File %s is not a regular file.\n"
-msgstr ""
-
-#: rpmbuild.c:430
-#, c-format
-msgid "File %s does not appear to be a specfile.\n"
-msgstr ""
-
-#: rpmbuild.c:496
-#, c-format
-msgid "Building target platforms: %s\n"
-msgstr ""
-
-#: rpmbuild.c:504
-#, c-format
-msgid "Building for target %s\n"
-msgstr ""
-
-#: rpmdb.c:22
-msgid "initialize database"
-msgstr ""
-
-#: rpmdb.c:24
-msgid "rebuild database inverted lists from installed package headers"
-msgstr ""
-
-#: rpmdb.c:27
-msgid "verify database files"
-msgstr ""
-
-#: rpmdb.c:33
-msgid "Database options:"
-msgstr ""
-
-#: rpmkeys.c:24
-msgid "verify package signature(s)"
-msgstr ""
-
-#: rpmkeys.c:26
-msgid "import an armored public key"
-msgstr ""
-
-#: rpmkeys.c:28
-msgid "don't import, but tell if it would work or not"
-msgstr ""
-
-#: rpmkeys.c:31 rpmkeys.c:33
-msgid "list keys from RPM keyring"
-msgstr ""
-
-#: rpmkeys.c:40
-msgid "Keyring options:"
-msgstr ""
-
-#: rpmkeys.c:64 rpmsign.c:144
-msgid "no arguments given"
-msgstr ""
-
-#: rpmsign.c:25
-msgid "sign package(s)"
-msgstr ""
-
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
-msgstr ""
-
-#: rpmsign.c:29
-msgid "delete package signatures"
-msgstr ""
-
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr ""
-
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr ""
-
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
-msgstr ""
-
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr ""
-
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
-msgstr ""
-
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr ""
-
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
-msgstr ""
-
-#: rpmspec.c:28
-msgid "query spec file(s)"
-msgstr ""
-
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
-msgstr ""
-
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
-msgstr ""
-
-#: rpmspec.c:36 lib/poptQV.c:189
-msgid "use the following query format"
-msgstr ""
-
-#: rpmspec.c:45
-msgid "Spec options:"
-msgstr ""
-
-#: rpmspec.c:90
-msgid "no arguments given for parse"
-msgstr ""
-
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
-msgstr ""
-
-#: build/build.c:126
-#, c-format
-msgid "Unable to open stream: %s\n"
-msgstr ""
-
-#: build/build.c:161
-#, c-format
-msgid "Executing(%s): %s\n"
-msgstr ""
-
-#: build/build.c:168
-#, c-format
-msgid "Exec of %s failed (%s): %s\n"
-msgstr ""
-
-#: build/build.c:177
-#, c-format
-msgid "Error executing scriptlet %s (%s)\n"
-msgstr ""
-
-#: build/build.c:184
-#, c-format
-msgid "Bad exit status from %s (%s)\n"
-msgstr ""
-
-#: build/build.c:291
-msgid ""
-"\n"
-"\n"
-"RPM build errors:\n"
-msgstr ""
-
-#: build/expression.c:216
-msgid "syntax error while parsing ==\n"
-msgstr ""
-
-#: build/expression.c:246
-msgid "syntax error while parsing &&\n"
-msgstr ""
-
-#: build/expression.c:255
-msgid "syntax error while parsing ||\n"
-msgstr ""
-
-#: build/expression.c:305
-msgid "parse error in expression\n"
-msgstr ""
-
-#: build/expression.c:337
-msgid "unmatched (\n"
-msgstr ""
-
-#: build/expression.c:369
-msgid "- only on numbers\n"
-msgstr ""
-
-#: build/expression.c:385
-msgid "! only on numbers\n"
-msgstr ""
-
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
-msgid "types must match\n"
-msgstr ""
-
-#: build/expression.c:440
-msgid "* / not suported for strings\n"
-msgstr ""
-
-#: build/expression.c:491
-msgid "- not suported for strings\n"
-msgstr ""
-
-#: build/expression.c:638
-msgid "&& and || not suported for strings\n"
-msgstr ""
-
-#: build/expression.c:671
-msgid "syntax error in expression\n"
-msgstr ""
-
-#: build/files.c:327 build/files.c:496 build/files.c:710
-#, c-format
-msgid "Missing '(' in %s %s\n"
-msgstr ""
-
-#: build/files.c:337 build/files.c:632 build/files.c:720 build/files.c:779
-#, c-format
-msgid "Missing ')' in %s(%s\n"
-msgstr ""
-
-#: build/files.c:362 build/files.c:651
-#, c-format
-msgid "Invalid %s token: %s\n"
-msgstr ""
-
-#: build/files.c:465
-#, c-format
-msgid "Missing %s in %s %s\n"
-msgstr ""
-
-#: build/files.c:511
-#, c-format
-msgid "Non-white space follows %s(): %s\n"
-msgstr ""
-
-#: build/files.c:547
-#, c-format
-msgid "Bad syntax: %s(%s)\n"
-msgstr ""
-
-#: build/files.c:556
-#, c-format
-msgid "Bad mode spec: %s(%s)\n"
-msgstr ""
-
-#: build/files.c:568
-#, c-format
-msgid "Bad dirmode spec: %s(%s)\n"
-msgstr ""
-
-#: build/files.c:672
-#, c-format
-msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
-msgstr ""
-
-#: build/files.c:679
-#, c-format
-msgid "Duplicate locale %s in %%lang(%s)\n"
-msgstr ""
-
-#: build/files.c:794
-#, c-format
-msgid "Invalid capability: %s\n"
-msgstr ""
-
-#: build/files.c:804
-msgid "File capability support not built in\n"
-msgstr ""
-
-#: build/files.c:853
-#, c-format
-msgid "File must begin with \"/\": %s\n"
-msgstr ""
-
-#: build/files.c:974
-#, c-format
-msgid "Unknown file digest algorithm %u, falling back to MD5\n"
-msgstr ""
-
-#: build/files.c:1002
-#, c-format
-msgid "File listed twice: %s\n"
-msgstr ""
-
-#: build/files.c:1124
-#, c-format
-msgid "reading symlink %s failed: %s\n"
-msgstr ""
-
-#: build/files.c:1132
-#, c-format
-msgid "Symlink points to BuildRoot: %s -> %s\n"
-msgstr ""
-
-#: build/files.c:1346
-#, c-format
-msgid "Directory not found: %s\n"
-msgstr ""
-
-#: build/files.c:1347
-#, c-format
-msgid "File not found: %s\n"
-msgstr ""
-
-#: build/files.c:1538
-#, c-format
-msgid "%s: can't load unknown tag (%d).\n"
-msgstr ""
-
-#: build/files.c:1544
-#, c-format
-msgid "%s: public key read failed.\n"
-msgstr ""
-
-#: build/files.c:1548
-#, c-format
-msgid "%s: not an armored public key.\n"
-msgstr ""
-
-#: build/files.c:1557
-#, c-format
-msgid "%s: failed to encode\n"
-msgstr ""
-
-#: build/files.c:1602
-#, c-format
-msgid "File needs leading \"/\": %s\n"
-msgstr ""
-
-#: build/files.c:1626
-#, c-format
-msgid "%%dev glob not permitted: %s\n"
-msgstr ""
-
-#: build/files.c:1639
-#, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr ""
-
-#: build/files.c:1640 lib/rpminstall.c:426
-#, c-format
-msgid "File not found by glob: %s\n"
-msgstr ""
-
-#: build/files.c:1676
-#, c-format
-msgid "Could not open %%files file %s: %m\n"
-msgstr ""
-
-#: build/files.c:1683
-#, c-format
-msgid "line: %s\n"
-msgstr ""
-
-#: build/files.c:1690
-#, c-format
-msgid "Error reading %%files file %s: %m\n"
-msgstr ""
-
-#: build/files.c:1712
-#, c-format
-msgid "illegal _docdir_fmt %s: %s\n"
-msgstr ""
-
-#: build/files.c:1866
-#, c-format
-msgid "Can't mix special %s with other forms: %s\n"
-msgstr ""
-
-#: build/files.c:1883
-#, c-format
-msgid "More than one file on a line: %s\n"
-msgstr ""
-
-#: build/files.c:2011
-#, c-format
-msgid "Bad file: %s: %s\n"
-msgstr ""
-
-#: build/files.c:2036 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr ""
-
-#: build/files.c:2070
-#, c-format
-msgid "Checking for unpackaged file(s): %s\n"
-msgstr ""
-
-#: build/files.c:2083
-#, c-format
-msgid ""
-"Installed (but unpackaged) file(s) found:\n"
-"%s"
-msgstr ""
-
-#: build/files.c:2114
-#, c-format
-msgid "Processing files: %s\n"
-msgstr ""
-
-#: build/files.c:2127
-#, c-format
-msgid "Binaries arch (%d) not matching the package arch (%d).\n"
-msgstr ""
-
-#: build/files.c:2133
-msgid "Arch dependent binaries in noarch package\n"
-msgstr ""
-
-#: build/pack.c:50
-#, c-format
-msgid "create archive failed on file %s: %s\n"
-msgstr ""
-
-#: build/pack.c:53
-#, c-format
-msgid "create archive failed: %s\n"
-msgstr ""
-
-#: build/pack.c:80
-#, c-format
-msgid "Could not open %s file: %s\n"
-msgstr ""
-
-#: build/pack.c:96
-#, c-format
-msgid "%s: line: %s\n"
-msgstr ""
-
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr ""
-
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:206
-#, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr ""
-
-#: build/pack.c:310
-#, c-format
-msgid "Unknown payload compression: %s\n"
-msgstr ""
-
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr ""
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr ""
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr ""
-
-#: build/pack.c:440
-#, c-format
-msgid "Could not open %s: %s\n"
-msgstr ""
-
-#: build/pack.c:452
-#, c-format
-msgid "Unable to write package: %s\n"
-msgstr ""
-
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr ""
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr ""
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:523
-#, c-format
-msgid "Wrote: %s\n"
-msgstr ""
-
-#: build/pack.c:542
-#, c-format
-msgid "Executing \"%s\":\n"
-msgstr ""
-
-#: build/pack.c:545
-#, c-format
-msgid "Execution of \"%s\" failed.\n"
-msgstr ""
-
-#: build/pack.c:549
-#, c-format
-msgid "Package check \"%s\" failed.\n"
-msgstr ""
-
-#: build/pack.c:598
-#, c-format
-msgid "Could not generate output filename for package %s: %s\n"
-msgstr ""
-
-#: build/pack.c:615
-#, c-format
-msgid "cannot create %s: %s\n"
-msgstr ""
-
-#: build/parseBuildInstallClean.c:35
-#, c-format
-msgid "line %d: second %s\n"
-msgstr ""
-
-#: build/parseChangelog.c:114
-#, c-format
-msgid "bogus date in %%changelog: %s\n"
-msgstr ""
-
-#: build/parseChangelog.c:146
-#, c-format
-msgid "%%changelog entries must start with *\n"
-msgstr ""
-
-#: build/parseChangelog.c:154
-#, c-format
-msgid "incomplete %%changelog entry\n"
-msgstr ""
-
-#: build/parseChangelog.c:169
-#, c-format
-msgid "bad date in %%changelog: %s\n"
-msgstr ""
-
-#: build/parseChangelog.c:174
-#, c-format
-msgid "%%changelog not in descending chronological order\n"
-msgstr ""
-
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
-#, c-format
-msgid "missing name in %%changelog\n"
-msgstr ""
-
-#: build/parseChangelog.c:200
-#, c-format
-msgid "no description in %%changelog\n"
-msgstr ""
-
-#: build/parseDescription.c:32
-#, c-format
-msgid "line %d: Error parsing %%description: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
-#, c-format
-msgid "line %d: Bad option %s: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
-#, c-format
-msgid "line %d: Too many names: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr ""
-
-#: build/parseFiles.c:33
-#, c-format
-msgid "line %d: Error parsing %%files: %s\n"
-msgstr ""
-
-#: build/parsePolicies.c:32
-#, c-format
-msgid "line %d: Error parsing %%policies: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:69
-#, c-format
-msgid "Error parsing tag field: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:162
-#, c-format
-msgid "line %d: Bad number: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:168
-#, c-format
-msgid "line %d: Bad no%s number: %u\n"
-msgstr ""
-
-#: build/parsePreamble.c:231
-#, c-format
-msgid "line %d: Bad %s number: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:245
-#, c-format
-msgid "%s %d defined multiple times\n"
-msgstr ""
-
-#: build/parsePreamble.c:290
-#, c-format
-msgid "Downloading %s to %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:293
-#, c-format
-msgid "Couldn't download %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:432
-#, c-format
-msgid "Architecture is excluded: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:437
-#, c-format
-msgid "Architecture is not included: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:442
-#, c-format
-msgid "OS is excluded: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:447
-#, c-format
-msgid "OS is not included: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:473
-#, c-format
-msgid "%s field must be present in package: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:496
-#, c-format
-msgid "Duplicate %s entries in package: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:554
-#, c-format
-msgid "Unable to open icon %s: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:570
-#, c-format
-msgid "Unable to read icon %s: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:580
-#, c-format
-msgid "Unknown icon type: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:594
-#, c-format
-msgid "line %d: Tag takes single token only: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:614
-#, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:617
-#, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:623
-#, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:646
-#, c-format
-msgid "line %d: Malformed tag: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:654
-#, c-format
-msgid "line %d: Empty tag: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:715
-#, c-format
-msgid "line %d: Prefixes must not end with \"/\": %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:727
-#, c-format
-msgid "line %d: Docdir must begin with '/': %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:740
-#, c-format
-msgid "line %d: Epoch field must be an unsigned number: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:777
-#, c-format
-msgid "line %d: Bad %s: qualifiers: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:804
-#, c-format
-msgid "line %d: Bad BuildArchitecture format: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:814
-#, c-format
-msgid "line %d: Only noarch subpackages are supported: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:830
-#, c-format
-msgid "Internal error: Bogus tag %d\n"
-msgstr ""
-
-#: build/parsePreamble.c:915
-#, c-format
-msgid "line %d: %s is deprecated: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:978
-#, c-format
-msgid "Bad package specification: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:1015
-#, c-format
-msgid "line %d: Unknown tag: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:1047
-#, c-format
-msgid "%%{buildroot} couldn't be empty\n"
-msgstr ""
-
-#: build/parsePreamble.c:1051
-#, c-format
-msgid "%%{buildroot} can not be \"/\"\n"
-msgstr ""
-
-#: build/parsePrep.c:28
-#, c-format
-msgid "Bad source: %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:73
-#, c-format
-msgid "No patch number %u\n"
-msgstr ""
-
-#: build/parsePrep.c:75
-#, c-format
-msgid "%%patch without corresponding \"Patch:\" tag\n"
-msgstr ""
-
-#: build/parsePrep.c:152
-#, c-format
-msgid "No source number %u\n"
-msgstr ""
-
-#: build/parsePrep.c:154
-msgid "No \"Source:\" tag in the spec file\n"
-msgstr ""
-
-#: build/parsePrep.c:261
-#, c-format
-msgid "Error parsing %%setup: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:272
-#, c-format
-msgid "line %d: Bad arg to %%setup: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:287
-#, c-format
-msgid "line %d: Bad %%setup option %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:446
-#, c-format
-msgid "%s: %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:459
-#, c-format
-msgid "Invalid patch number %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:486
-#, c-format
-msgid "line %d: second %%prep\n"
-msgstr ""
-
-#: build/parseReqs.c:112
-msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
-msgstr ""
-
-#: build/parseReqs.c:137
-msgid "Versioned file name not permitted"
-msgstr ""
-
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr ""
-
-#: build/parseReqs.c:165
-msgid "invalid dependency"
-msgstr ""
-
-#: build/parseReqs.c:181
-#, c-format
-msgid "line %d: %s: %s\n"
-msgstr ""
-
-#: build/parseScript.c:192
-#, c-format
-msgid "line %d: triggers must have --: %s\n"
-msgstr ""
-
-#: build/parseScript.c:202 build/parseScript.c:265
-#, c-format
-msgid "line %d: Error parsing %s: %s\n"
-msgstr ""
-
-#: build/parseScript.c:214
-#, c-format
-msgid "line %d: internal script must end with '>': %s\n"
-msgstr ""
-
-#: build/parseScript.c:220
-#, c-format
-msgid "line %d: script program must begin with '/': %s\n"
-msgstr ""
-
-#: build/parseScript.c:258
-#, c-format
-msgid "line %d: Second %s\n"
-msgstr ""
-
-#: build/parseScript.c:301
-#, c-format
-msgid "line %d: unsupported internal script: %s\n"
-msgstr ""
-
-#: build/parseScript.c:318
-#, c-format
-msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
-msgstr ""
-
-#: build/parseSpec.c:209
-#, c-format
-msgid "line %d: %s\n"
-msgstr ""
-
-#: build/parseSpec.c:252
-#, c-format
-msgid "Unable to open %s: %s\n"
-msgstr ""
-
-#: build/parseSpec.c:286
-#, c-format
-msgid "%s:%d: Argument expected for %s\n"
-msgstr ""
-
-#: build/parseSpec.c:308
-#, c-format
-msgid "line %d: Unclosed %%if\n"
-msgstr ""
-
-#: build/parseSpec.c:313
-#, c-format
-msgid "line %d: unclosed macro or bad line continuation\n"
-msgstr ""
-
-#: build/parseSpec.c:355
-#, c-format
-msgid "%s:%d: bad %%if condition\n"
-msgstr ""
-
-#: build/parseSpec.c:363
-#, c-format
-msgid "%s:%d: Got a %%else with no %%if\n"
-msgstr ""
-
-#: build/parseSpec.c:374
-#, c-format
-msgid "%s:%d: Got a %%endif with no %%if\n"
-msgstr ""
-
-#: build/parseSpec.c:392
-#, c-format
-msgid "%s:%d: malformed %%include statement\n"
-msgstr ""
-
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
-msgstr ""
-
-#: build/parseSpec.c:703
-#, c-format
-msgid "Package has no %%description: %s\n"
-msgstr ""
-
-#: build/policies.c:87
-#, c-format
-msgid "Policy module '%s' duplicated with overlapping types\n"
-msgstr ""
-
-#: build/policies.c:93
-#, c-format
-msgid "Base modules '%s' and '%s' have overlapping types\n"
-msgstr ""
-
-#: build/policies.c:101
-msgid "Failed to get policies from header\n"
-msgstr ""
-
-#: build/policies.c:154
-#, c-format
-msgid "%%semodule requires a file path\n"
-msgstr ""
-
-#: build/policies.c:163
-#, c-format
-msgid "Failed to read  policy file: %s\n"
-msgstr ""
-
-#: build/policies.c:170
-#, c-format
-msgid "Failed to encode policy file: %s\n"
-msgstr ""
-
-#: build/policies.c:187
-#, c-format
-msgid "Failed to determine a policy name: %s\n"
-msgstr ""
-
-#: build/policies.c:199
-#, c-format
-msgid ""
-"'%s' type given with other types in %%semodule %s. Compacting types to "
-"'%s'.\n"
-msgstr ""
-
-#: build/policies.c:246
-#, c-format
-msgid "Error parsing %s: %s\n"
-msgstr ""
-
-#: build/policies.c:252
-#, c-format
-msgid "Expecting %%semodule tag: %s\n"
-msgstr ""
-
-#: build/policies.c:262
-#, c-format
-msgid "Missing module path in line: %s\n"
-msgstr ""
-
-#: build/policies.c:268
-#, c-format
-msgid "Too many arguments in line: %s\n"
-msgstr ""
-
-#: build/policies.c:307
-#, c-format
-msgid "Processing policies: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:108
-#, c-format
-msgid "Ignoring invalid regex %s\n"
-msgstr ""
-
-#: build/rpmfc.c:204
-#, c-format
-msgid "Couldn't create pipe for %s: %m\n"
-msgstr ""
-
-#: build/rpmfc.c:229
-#, c-format
-msgid "Couldn't exec %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:234 lib/rpmscript.c:255
-#, c-format
-msgid "Couldn't fork %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:317
-#, c-format
-msgid "%s failed: %x\n"
-msgstr ""
-
-#: build/rpmfc.c:321
-#, c-format
-msgid "failed to write all data to %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
-msgid "Empty file classifier\n"
-msgstr ""
-
-#: build/rpmfc.c:918
-msgid "No file attributes configured\n"
-msgstr ""
-
-#: build/rpmfc.c:938
-#, c-format
-msgid "magic_open(0x%x) failed: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:944
-#, c-format
-msgid "magic_load failed: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:986
-#, c-format
-msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
-msgstr ""
-
-#: build/rpmfc.c:1166
-#, c-format
-msgid "Finding  %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
-#, c-format
-msgid "Failed to find %s:\n"
-msgstr ""
-
-#: build/spec.c:404
-#, c-format
-msgid "query of specfile %s failed, can't parse\n"
-msgstr ""
-
-#: lib/cpio.c:364
-#, c-format
-msgid "(error 0x%x)"
-msgstr ""
-
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr ""
-
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr ""
-
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr ""
-
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr ""
-
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr ""
-
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr ""
-
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr ""
-
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr ""
-
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr ""
-
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr ""
-
-#: lib/depends.c:68
-#, c-format
-msgid "%s is a Delta RPM and cannot be directly installed\n"
-msgstr ""
-
-#: lib/depends.c:72
-#, c-format
-msgid "Unsupported payload (%s) in package %s\n"
-msgstr ""
-
-#: lib/depends.c:348
-#, c-format
-msgid "package %s was already added, skipping %s\n"
-msgstr ""
-
-#: lib/depends.c:349
-#, c-format
-msgid "package %s was already added, replacing with %s\n"
-msgstr ""
-
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
-msgid "(not a number)"
-msgstr ""
-
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
-msgstr ""
-
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
-msgstr ""
-
-#: lib/formats.c:314
-msgid "(not base64)"
-msgstr ""
-
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr ""
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr ""
-
-#: lib/formats.c:384
-msgid "(invalid xml type)"
-msgstr ""
-
-#: lib/formats.c:434
-msgid "(not an OpenPGP signature)"
-msgstr ""
-
-#: lib/formats.c:446
-#, c-format
-msgid "Invalid date %u"
-msgstr ""
-
-#: lib/formats.c:512
-msgid "normal"
-msgstr ""
-
-#: lib/formats.c:515
-msgid "replaced"
-msgstr ""
-
-#: lib/formats.c:518
-msgid "not installed"
-msgstr ""
-
-#: lib/formats.c:521
-msgid "net shared"
-msgstr ""
-
-#: lib/formats.c:524
-msgid "wrong color"
-msgstr ""
-
-#: lib/formats.c:527
-msgid "missing"
-msgstr ""
-
-#: lib/formats.c:530
-msgid "(unknown)"
-msgstr ""
-
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
-#, c-format
-msgid "%s saved as %s\n"
-msgstr ""
-
-#: lib/fsm.c:1543
-#, c-format
-msgid "%s created as %s\n"
-msgstr ""
-
-#: lib/fsm.c:1845
-#, c-format
-msgid "%s %s: remove failed: %s\n"
-msgstr ""
-
-#: lib/fsm.c:1846
-msgid "directory"
-msgstr ""
-
-#: lib/fsm.c:1846
-msgid "file"
-msgstr ""
-
-#: lib/package.c:146
-#, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr ""
-
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr ""
-
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr ""
-
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr ""
-
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr ""
-
-#: lib/package.c:296
-#, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr ""
-
-#: lib/package.c:322 lib/signature.c:142
-#, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:331 lib/signature.c:151
-#, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:358 lib/signature.c:185
-#, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr ""
-
-#: lib/package.c:427
-#, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr ""
-
-#: lib/package.c:436
-#, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/package.c:452
-#, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr ""
-
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr ""
-
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
-msgstr ""
-
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr ""
-
-#: lib/package.c:629 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
-#, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr ""
-
-#: lib/poptALL.c:157
-msgid "predefine MACRO with value EXPR"
-msgstr ""
-
-#: lib/poptALL.c:158 lib/poptALL.c:161
-msgid "'MACRO EXPR'"
-msgstr ""
-
-#: lib/poptALL.c:160
-msgid "define MACRO with value EXPR"
-msgstr ""
-
-#: lib/poptALL.c:163
-msgid "print macro expansion of EXPR"
-msgstr ""
-
-#: lib/poptALL.c:164
-msgid "'EXPR'"
-msgstr ""
-
-#: lib/poptALL.c:166 lib/poptALL.c:180
-msgid "read <FILE:...> instead of default file(s)"
-msgstr ""
-
-#: lib/poptALL.c:167 lib/poptALL.c:181
-msgid "<FILE:...>"
-msgstr ""
-
-#: lib/poptALL.c:170
-msgid "don't verify package digest(s)"
-msgstr ""
-
-#: lib/poptALL.c:172
-msgid "don't verify database header(s) when retrieved"
-msgstr ""
-
-#: lib/poptALL.c:174
-msgid "don't verify package signature(s)"
-msgstr ""
-
-#: lib/poptALL.c:177
-msgid "send stdout to CMD"
-msgstr ""
-
-#: lib/poptALL.c:178
-msgid "CMD"
-msgstr ""
-
-#: lib/poptALL.c:183
-msgid "use ROOT as top level directory"
-msgstr ""
-
-#: lib/poptALL.c:184
-msgid "ROOT"
-msgstr ""
-
-#: lib/poptALL.c:186
-msgid "use database in DIRECTORY"
-msgstr ""
-
-#: lib/poptALL.c:187
-msgid "DIRECTORY"
-msgstr ""
-
-#: lib/poptALL.c:190
-msgid "display known query tags"
-msgstr ""
-
-#: lib/poptALL.c:192
-msgid "display final rpmrc and macro configuration"
-msgstr ""
-
-#: lib/poptALL.c:194
-msgid "provide less detailed output"
-msgstr ""
-
-#: lib/poptALL.c:196
-msgid "provide more detailed output"
-msgstr ""
-
-#: lib/poptALL.c:198
-msgid "print the version of rpm being used"
-msgstr ""
-
-#: lib/poptALL.c:204
-msgid "debug payload file state machine"
-msgstr ""
-
-#: lib/poptALL.c:210
-msgid "debug rpmio I/O"
-msgstr ""
-
-#: lib/poptALL.c:277
-#, c-format
-msgid "%s: option table misconfigured (%d)\n"
-msgstr ""
-
-#: lib/poptI.c:52
-msgid "exclude paths must begin with a /"
-msgstr ""
-
-#: lib/poptI.c:64
-msgid "relocations must begin with a /"
-msgstr ""
-
-#: lib/poptI.c:67
-msgid "relocations must contain a ="
-msgstr ""
-
-#: lib/poptI.c:70
-msgid "relocations must have a / following the ="
-msgstr ""
-
-#: lib/poptI.c:114
-msgid ""
-"install all files, even configurations which might otherwise be skipped"
-msgstr ""
-
-#: lib/poptI.c:118
-msgid ""
-"remove all packages which match <package> (normally an error is generated if"
-" <package> specified multiple packages)"
-msgstr ""
-
-#: lib/poptI.c:123
-msgid "relocate files in non-relocatable package"
-msgstr ""
-
-#: lib/poptI.c:127
-msgid "print dependency loops as warning"
-msgstr ""
-
-#: lib/poptI.c:131
-msgid "erase (uninstall) package"
-msgstr ""
-
-#: lib/poptI.c:131
-msgid "<package>+"
-msgstr ""
-
-#: lib/poptI.c:134 lib/poptI.c:171
-msgid "do not install configuration files"
-msgstr ""
-
-#: lib/poptI.c:137 lib/poptI.c:176
-msgid "do not install documentation"
-msgstr ""
-
-#: lib/poptI.c:139
-msgid "skip files with leading component <path> "
-msgstr ""
-
-#: lib/poptI.c:140
-msgid "<path>"
-msgstr ""
-
-#: lib/poptI.c:143
-msgid "short hand for --replacepkgs --replacefiles"
-msgstr ""
-
-#: lib/poptI.c:147
-msgid "upgrade package(s) if already installed"
-msgstr ""
-
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
-msgid "<packagefile>+"
-msgstr ""
-
-#: lib/poptI.c:150
-msgid "print hash marks as package installs (good with -v)"
-msgstr ""
-
-#: lib/poptI.c:153
-msgid "don't verify package architecture"
-msgstr ""
-
-#: lib/poptI.c:156
-msgid "don't verify package operating system"
-msgstr ""
-
-#: lib/poptI.c:159
-msgid "don't check disk space before installing"
-msgstr ""
-
-#: lib/poptI.c:161
-msgid "install documentation"
-msgstr ""
-
-#: lib/poptI.c:164
-msgid "install package(s)"
-msgstr ""
-
-#: lib/poptI.c:167
-msgid "update the database, but do not modify the filesystem"
-msgstr ""
-
-#: lib/poptI.c:173
-msgid "do not verify package dependencies"
-msgstr ""
-
-#: lib/poptI.c:179 lib/poptQV.c:204 lib/poptQV.c:206
-msgid "don't verify digest of files"
-msgstr ""
-
-#: lib/poptI.c:181
-msgid "don't verify digest of files (obsolete)"
-msgstr ""
-
-#: lib/poptI.c:183
-msgid "don't install file security contexts"
-msgstr ""
-
-#: lib/poptI.c:187
-msgid "do not reorder package installation to satisfy dependencies"
-msgstr ""
-
-#: lib/poptI.c:191
-msgid "do not execute package scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:195
-#, c-format
-msgid "do not execute %%pre scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:198
-#, c-format
-msgid "do not execute %%post scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:201
-#, c-format
-msgid "do not execute %%preun scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:204
-#, c-format
-msgid "do not execute %%postun scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:207
-msgid "do not execute any scriptlet(s) triggered by this package"
-msgstr ""
-
-#: lib/poptI.c:210
-#, c-format
-msgid "do not execute any %%triggerprein scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:213
-#, c-format
-msgid "do not execute any %%triggerin scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:216
-#, c-format
-msgid "do not execute any %%triggerun scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:219
-#, c-format
-msgid "do not execute any %%triggerpostun scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
-msgid ""
-"upgrade to an old version of the package (--force on upgrades does this "
-"automatically)"
-msgstr ""
-
-#: lib/poptI.c:231
-msgid "print percentages as package installs"
-msgstr ""
-
-#: lib/poptI.c:233
-msgid "relocate the package to <dir>, if relocatable"
-msgstr ""
-
-#: lib/poptI.c:234
-msgid "<dir>"
-msgstr ""
-
-#: lib/poptI.c:236
-msgid "relocate files from path <old> to <new>"
-msgstr ""
-
-#: lib/poptI.c:237
-msgid "<old>=<new>"
-msgstr ""
-
-#: lib/poptI.c:240
-msgid "ignore file conflicts between packages"
-msgstr ""
-
-#: lib/poptI.c:243
-msgid "reinstall if the package is already present"
-msgstr ""
-
-#: lib/poptI.c:245
-msgid "don't install, but tell if it would work or not"
-msgstr ""
-
-#: lib/poptI.c:248
-msgid "upgrade package(s)"
-msgstr ""
-
-#: lib/poptQV.c:67
-msgid "query/verify all packages"
-msgstr ""
-
-#: lib/poptQV.c:69
-msgid "rpm checksig mode"
-msgstr ""
-
-#: lib/poptQV.c:71
-msgid "query/verify package(s) owning file"
-msgstr ""
-
-#: lib/poptQV.c:73
-msgid "query/verify package(s) in group"
-msgstr ""
-
-#: lib/poptQV.c:75
-msgid "query/verify a package file"
-msgstr ""
-
-#: lib/poptQV.c:78
-msgid "query/verify package(s) with package identifier"
-msgstr ""
-
-#: lib/poptQV.c:80
-msgid "query/verify package(s) with header identifier"
-msgstr ""
-
-#: lib/poptQV.c:83
-msgid "rpm query mode"
-msgstr ""
-
-#: lib/poptQV.c:85
-msgid "query/verify a header instance"
-msgstr ""
-
-#: lib/poptQV.c:87
-msgid "query/verify package(s) from install transaction"
-msgstr ""
-
-#: lib/poptQV.c:89
-msgid "query the package(s) triggered by the package"
-msgstr ""
-
-#: lib/poptQV.c:91
-msgid "rpm verify mode"
-msgstr ""
-
-#: lib/poptQV.c:93
-msgid "query/verify the package(s) which require a dependency"
-msgstr ""
-
-#: lib/poptQV.c:95
-msgid "query/verify the package(s) which provide a dependency"
-msgstr ""
-
-#: lib/poptQV.c:98
-msgid "do not glob arguments"
-msgstr ""
-
-#: lib/poptQV.c:100
-msgid "do not process non-package files as manifests"
-msgstr ""
-
-#: lib/poptQV.c:171
-msgid "list all configuration files"
-msgstr ""
-
-#: lib/poptQV.c:173
-msgid "list all documentation files"
-msgstr ""
-
-#: lib/poptQV.c:175
-msgid "dump basic file information"
-msgstr ""
-
-#: lib/poptQV.c:179
-msgid "list files in package"
-msgstr ""
-
-#: lib/poptQV.c:184
-#, c-format
-msgid "skip %%ghost files"
-msgstr ""
-
-#: lib/poptQV.c:191
-msgid "display the states of the listed files"
-msgstr ""
-
-#: lib/poptQV.c:209
-msgid "don't verify size of files"
-msgstr ""
-
-#: lib/poptQV.c:212
-msgid "don't verify symlink path of files"
-msgstr ""
-
-#: lib/poptQV.c:215
-msgid "don't verify owner of files"
-msgstr ""
-
-#: lib/poptQV.c:218
-msgid "don't verify group of files"
-msgstr ""
-
-#: lib/poptQV.c:221
-msgid "don't verify modification time of files"
-msgstr ""
-
-#: lib/poptQV.c:224 lib/poptQV.c:227
-msgid "don't verify mode of files"
-msgstr ""
-
-#: lib/poptQV.c:230
-msgid "don't verify capabilities of files"
-msgstr ""
-
-#: lib/poptQV.c:233
-msgid "don't verify file security contexts"
-msgstr ""
-
-#: lib/poptQV.c:235
-msgid "don't verify files in package"
-msgstr ""
-
-#: lib/poptQV.c:237 tools/rpmgraph.c:218
-msgid "don't verify package dependencies"
-msgstr ""
-
-#: lib/poptQV.c:240 lib/poptQV.c:243
-msgid "don't execute verify script(s)"
-msgstr ""
-
-#: lib/psm.c:212
-#, c-format
-msgid "Missing rpmlib features for %s:\n"
-msgstr ""
-
-#: lib/psm.c:254
-msgid "source package expected, binary found\n"
-msgstr ""
-
-#: lib/psm.c:307
-msgid "source package contains no .spec file\n"
-msgstr ""
-
-#: lib/psm.c:836
-#, c-format
-msgid "unpacking of archive failed%s%s: %s\n"
-msgstr ""
-
-#: lib/psm.c:837
-msgid " on file "
-msgstr ""
-
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
-#, c-format
-msgid "incorrect format: %s\n"
-msgstr ""
-
-#: lib/query.c:123
-msgid "(contains no files)\n"
-msgstr ""
-
-#: lib/query.c:156
-msgid "normal        "
-msgstr ""
-
-#: lib/query.c:159
-msgid "replaced      "
-msgstr ""
-
-#: lib/query.c:162
-msgid "not installed "
-msgstr ""
-
-#: lib/query.c:165
-msgid "net shared    "
-msgstr ""
-
-#: lib/query.c:168
-msgid "wrong color   "
-msgstr ""
-
-#: lib/query.c:171
-msgid "(no state)    "
-msgstr ""
-
-#: lib/query.c:174
-#, c-format
-msgid "(unknown %3d) "
-msgstr ""
-
-#: lib/query.c:194
-msgid "package has not file owner/group lists\n"
-msgstr ""
-
-#: lib/query.c:225
-msgid "package has neither file owner or id lists\n"
-msgstr ""
-
-#: lib/query.c:314
-#, c-format
-msgid "group %s does not contain any packages\n"
-msgstr ""
-
-#: lib/query.c:321
-#, c-format
-msgid "no package triggers %s\n"
-msgstr ""
-
-#: lib/query.c:332 lib/query.c:351 lib/query.c:367
-#, c-format
-msgid "malformed %s: %s\n"
-msgstr ""
-
-#: lib/query.c:342 lib/query.c:357 lib/query.c:372
-#, c-format
-msgid "no package matches %s: %s\n"
-msgstr ""
-
-#: lib/query.c:380
-#, c-format
-msgid "no package requires %s\n"
-msgstr ""
-
-#: lib/query.c:388
-#, c-format
-msgid "no package provides %s\n"
-msgstr ""
-
-#: lib/query.c:420
-#, c-format
-msgid "file %s: %s\n"
-msgstr ""
-
-#: lib/query.c:423
-#, c-format
-msgid "file %s is not owned by any package\n"
-msgstr ""
-
-#: lib/query.c:434
-#, c-format
-msgid "invalid package number: %s\n"
-msgstr ""
-
-#: lib/query.c:441
-#, c-format
-msgid "record %u could not be read\n"
-msgstr ""
-
-#: lib/query.c:454 lib/rpminstall.c:654
-#, c-format
-msgid "package %s is not installed\n"
-msgstr ""
-
-#: lib/query.c:488
-#, c-format
-msgid "unknown tag: \"%s\"\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:44
-#, c-format
-msgid "%s: key %d import failed.\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:48
-#, c-format
-msgid "%s: key %d not an armored public key.\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:93
-#, c-format
-msgid "%s: import read failed(%d).\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:119
-#, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
-msgstr ""
-
-#: lib/rpmchecksig.c:386
-msgid "OK"
-msgstr ""
-
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr ""
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ""
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr ""
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ""
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
-#, c-format
-msgid "%s: open failed: %s\n"
-msgstr ""
-
-#: lib/rpmchroot.c:43
-#, c-format
-msgid "Unable to open current directory: %m\n"
-msgstr ""
-
-#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
-#, c-format
-msgid "%s: chroot directory not set\n"
-msgstr ""
-
-#: lib/rpmchroot.c:70
-#, c-format
-msgid "Unable to change root directory: %m\n"
-msgstr ""
-
-#: lib/rpmchroot.c:95
-#, c-format
-msgid "Unable to restore root directory: %m\n"
-msgstr ""
-
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr ""
-
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr ""
-
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr ""
-
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
-msgstr ""
-
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
-msgstr ""
-
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
-msgstr ""
-
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr ""
-
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr ""
-
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr ""
-
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr ""
-
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr ""
-
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr ""
-
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr ""
-
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr ""
-
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr ""
-
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr ""
-
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr ""
-
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
-msgstr ""
-
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
-msgstr ""
-
-#: lib/rpmgi.c:136
-#, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
-msgstr ""
-
-#: lib/rpminstall.c:141
-#, c-format
-msgid "Updating / installing...\n"
-msgstr ""
-
-#: lib/rpminstall.c:143
-#, c-format
-msgid "Cleaning up / removing...\n"
-msgstr ""
-
-#: lib/rpminstall.c:192
-msgid "Preparing..."
-msgstr ""
-
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
-msgstr ""
-
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
-msgstr ""
-
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
-msgstr ""
-
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
-msgstr ""
-
-#: lib/rpminstall.c:542
-#, c-format
-msgid "package %s is not relocatable\n"
-msgstr ""
-
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
-msgstr ""
-
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:706
-#, c-format
-msgid "Installing %s\n"
-msgstr ""
-
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
-msgstr ""
-
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
-msgstr ""
-
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
-msgstr ""
-
-#: lib/rpmlead.c:123
-#, c-format
-msgid "read failed: %s (%d)\n"
-msgstr ""
-
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
-msgstr ""
-
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
-msgstr ""
-
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
-msgstr ""
-
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
-msgstr ""
-
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
-msgstr ""
-
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr ""
-
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
-msgstr ""
-
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
-#: lib/rpmprob.c:109
-msgid "different"
-msgstr ""
-
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
-msgstr ""
-
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
-msgstr ""
-
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
-msgstr ""
-
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
-msgstr ""
-
-#: lib/rpmprob.c:130
-#, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
-msgstr ""
-
-#: lib/rpmprob.c:135
-#, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
-msgstr ""
-
-#: lib/rpmprob.c:140
-#, c-format
-msgid "package %s (which is newer than %s) is already installed"
-msgstr ""
-
-#: lib/rpmprob.c:145
-#, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
-msgstr ""
-
-#: lib/rpmprob.c:155
-#, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
-msgstr ""
-
-#: lib/rpmprob.c:159
-#, c-format
-msgid "%s is needed by %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
-msgstr ""
-
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
-msgstr ""
-
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr ""
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:494
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:511 lib/rpmrc.c:543
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:522
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr ""
-
-#: lib/rpmrc.c:535
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:602
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:926
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1348
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Please contact %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1590
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr ""
-
-#: lib/rpmts.c:192
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:210
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:218
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:278
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1085
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr ""
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1409
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1409
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr ""
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr ""
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr ""
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr ""
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr ""
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr ""
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr ""
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr ""
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr ""
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr ""
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr ""
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr ""
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ""
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr ""
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr ""
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr ""
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr ""
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr ""
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr ""
-
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr ""
-
-#: lib/rpmdb.c:2250
-#, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr ""
-
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr ""
-
-#: lib/rpmdb.c:2382
-#, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr ""
-
-#: lib/rpmdb.c:2448
-#, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr ""
-
-#: lib/rpmdb.c:2644
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr ""
-
-#: lib/rpmdb.c:2875
-#, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2910
-#, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr ""
-
-#: lib/rpmdb.c:2924
-#, c-format
-msgid "cannot add record originally at %u\n"
-msgstr ""
-
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr ""
-
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr ""
-
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr ""
-
-#: lib/rpmdb.c:2960
-#, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr ""
-
-#: lib/backend/db3.c:33
-#, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr ""
-
-#: lib/backend/db3.c:36
-#, c-format
-msgid "db%d error(%d): %s\n"
-msgstr ""
-
-#: lib/backend/db3.c:500
-#, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr ""
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr ""
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr ""
-
-#: lib/backend/db3.c:582
-#, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:144
-#, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:181
-#, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:190
-#, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:199
-#, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr ""
-
-#: plugins/sepolicy.c:218
-#, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:231
-#, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr ""
-
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr ""
-
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr ""
-
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
-msgstr ""
-
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
-#, c-format
-msgid "%s failed with exit code %i\n"
-msgstr ""
-
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr ""
-
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr ""
-
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
-
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
-
-#: plugins/sepolicy.c:594
-#, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr ""
-
-#: rpmio/macro.c:185
-#, c-format
-msgid "======================== active %d empty %d\n"
-msgstr ""
-
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
-msgstr ""
-
-#: rpmio/macro.c:364
-#, c-format
-msgid "%3d<%*s(empty)\n"
-msgstr ""
-
-#: rpmio/macro.c:537 rpmio/macro.c:575
-#, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr ""
-
-#: rpmio/macro.c:594
-#, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr ""
-
-#: rpmio/macro.c:600
-#, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr ""
-
-#: rpmio/macro.c:605
-#, c-format
-msgid "Macro %%%s has empty body\n"
-msgstr ""
-
-#: rpmio/macro.c:611
-#, c-format
-msgid "Macro %%%s failed to expand\n"
-msgstr ""
-
-#: rpmio/macro.c:649
-#, c-format
-msgid "Macro %%%s has illegal name (%%undefine)\n"
-msgstr ""
-
-#: rpmio/macro.c:743
-#, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr ""
-
-#: rpmio/macro.c:825
-#, c-format
-msgid "Unknown option %c in %s(%s)\n"
-msgstr ""
-
-#: rpmio/macro.c:1048
-msgid ""
-"Too many levels of recursion in macro expansion. It is likely caused by "
-"recursive macro declaration.\n"
-msgstr ""
-
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
-#, c-format
-msgid "Unterminated %c: %s\n"
-msgstr ""
-
-#: rpmio/macro.c:1175
-#, c-format
-msgid "A %% is followed by an unparseable macro\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:245
-#, c-format
-msgid "error creating temporary file %s: %m\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
-#, c-format
-msgid "File %s: %s\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:319
-#, c-format
-msgid "File %s is smaller than %u bytes\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr ""
-
-#: rpmio/rpmlua.c:506
-#, c-format
-msgid "invalid syntax in lua scriptlet: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:522
-#, c-format
-msgid "invalid syntax in lua script: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
-#, c-format
-msgid "lua script failed: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:541
-#, c-format
-msgid "invalid syntax in lua file: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:709
-#, c-format
-msgid "lua hook failed: %s\n"
-msgstr ""
-
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr ""
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr ""
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr ""
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr ""
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr ""
-
-#: rpmio/rpmmalloc.c:25
-#, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr ""
-
-#: rpmio/rpmpgp.c:1008
-#, c-format
-msgid "V%d %s/%s %s, key ID %s"
-msgstr ""
-
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
-msgstr ""
-
-#: sign/rpmgensig.c:87
-#, c-format
-msgid "%s: Fwrite failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:97
-#, c-format
-msgid "%s: Fflush failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:125
-msgid "Unsupported PGP signature\n"
-msgstr ""
-
-#: sign/rpmgensig.c:131
-#, c-format
-msgid "Unsupported PGP hash algorithm %u\n"
-msgstr ""
-
-#: sign/rpmgensig.c:144
-#, c-format
-msgid "Unsupported PGP pubkey algorithm %u\n"
-msgstr ""
-
-#: sign/rpmgensig.c:174
-#, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr ""
-
-#: sign/rpmgensig.c:216
-#, c-format
-msgid "gpg exec failed (%d)\n"
-msgstr ""
-
-#: sign/rpmgensig.c:246
-msgid "gpg failed to write signature\n"
-msgstr ""
-
-#: sign/rpmgensig.c:263
-msgid "unable to read the signature\n"
-msgstr ""
-
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
-msgid "rpmMkTemp failed\n"
-msgstr ""
-
-#: sign/rpmgensig.c:501
-#, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr ""
-
-#: sign/rpmgensig.c:525
-#, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:531
-#, c-format
-msgid "%s: rpmWriteSignature failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:545
-#, c-format
-msgid "replacing %s failed: %s\n"
-msgstr ""
-
-#: tools/rpmgraph.c:142
-#, c-format
-msgid "%s: read manifest failed: %s\n"
-msgstr ""
-
-#: tools/rpmgraph.c:220
-msgid "don't verify header+payload signature"
-msgstr ""
index b0e76551c851e8eb4e8f3e34458b17b5f625edd0..e4675eeb9bbc6a5bde0ab534e8a3dd455d03d520 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -7,10 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Danish (http://www.transifex.com/rpm-team/rpm/language/da/)\n"
 "Language: da\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,490 +43,552 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "eksekvering mislykkedes\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "parameter er ikke en RPM-pakke\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "fejl ved læsning af hovedet på pakke\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "kan ikke genåbne pakkeindhold: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Forespørgselstilvalg (med -q eller --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Verifikationstilvalg (med -V eller --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "kun én af forespørgsel/verificér kan udføres ad gangen"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "uventet forespørgselsflag"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "uventet forespørgselsformat"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "uventet forespørgselskilde"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "kun ét hovedtilvalg kan angives"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "filer kan kun omrokeres under installation"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr ""
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr "--relocate og --excludepath kan kun bruges, når nye pakker installeres"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix kan kun bruges, når nye pakker installeres"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "parametre til --prefix skal starte med et /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs kan kun angives ved installation"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs kan kun angives ved installation"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs kan kun angives ved installation"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "kun én af --excludedocs og --includedocs kan angives"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch kan kun angives ved installation"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos kan kun angives ved installation"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize kan kun angives ved installation"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches kan kun angives ved installation"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles kan kun angives ved installation"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb kan kun angives ved installation og sletning"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "parameteren til --root (-r) skal starte med et /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr ""
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "ingen pakker angivet ved installation"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "ingen parametre angivet ved forespørgsel"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "ingen parametre angivet ved verifikation"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr ""
 "buildroot allerede angivet, ignorerer %s\n"
 "\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr "opbyg gennem %prep (udpak kilder og påfør lapper) ud fra <spec-fil>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<spec-fil>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "opbyg gennem %build (%prep, så oversæt) ud fra <spec-fil>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr "opbyg gennem %install (%prep, %build, så installér) ud fra <spec-fil>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "verificér afsnittet %files ud fra <spec-fil>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "opbyg kilde- og binærpakke ud fra <spec-fil>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "opbyg kun binærpakke ud fra <spec-fil>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "opbyg kun kildepakke ud fra <spec-fil>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<kildepakke>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"opbyg gennem %install (%prep, %build, så installér) ud fra <kildepakke>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr "opbyg gennem %prep (udpak kilder og påfør lapper) ud fra <tararkiv>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tararkiv>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "opbyg gennem %build (%prep, så oversæt) ud fra <tararkiv>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "opbyg gennem %install (%prep, %build, så installér) ud fra <tararkiv>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "verificér afsnittet %files fra <tararkiv>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "opbyg kilde- og binærpakker ud fra <tararkiv>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "opbyg kun binærpakke ud fra <tararkiv>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "opbyg kun kildepakke ud fra <tararkiv>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "opbyg binærpakke ud fra <kildepakke>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<kildepakke>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"opbyg gennem %install (%prep, %build, så installér) ud fra <kildepakke>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "gennemtving opbygningsrod"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "fjern bygge-træ ved afslutning"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignorér 'ExcludeArch':-angivelser fra spec-fil"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr ""
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "udfør ingen stadier af opbygningen"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "acceptér ikke i18N msgstr'er fra spec-fil"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "fjern kilder ved afslutning"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "fjern spec-fil ved afslutning"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "spring direkte til angivet stadium (kun for c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "gennemtving målplatform"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "Opbygningstilvalg med [ <spec-fil> | <tararkiv> | <kildepakke> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Kan ikke åbne spec-fil %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Kunne ikke åbne tar-videreførsel: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Kunne ikke læse spec-fil fra %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Kunne ikke omdøbe %s til %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "kunne ikke finde %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Filen %s er ikke en regulær fil.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Filen %s synes ikke at være en spec-fil.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Opbygger mål-platforme: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Opbygger for mål %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "parameteren til --root (-r) skal starte med et /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "initialisér database"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr "genopbyg omvendte databaselister ud fra installerede pakkehoveder"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr ""
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Databasetilvalg:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "kun ét hovedtilvalg kan angives"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Forespørgselstilvalg (med -q eller --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Verifikationstilvalg (med -V eller --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr ""
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "kun én af forespørgsel/verificér kan udføres ad gangen"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "uventet forespørgselsflag"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "uventet forespørgselsformat"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "uventet forespørgselskilde"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "filer kan kun omrokeres under installation"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr ""
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr "--relocate og --excludepath kan kun bruges, når nye pakker installeres"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix kan kun bruges, når nye pakker installeres"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "parametre til --prefix skal starte med et /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs kan kun angives ved installation"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs kan kun angives ved installation"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs kan kun angives ved installation"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "kun én af --excludedocs og --includedocs kan angives"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch kan kun angives ved installation"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos kan kun angives ved installation"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize kan kun angives ved installation"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches kan kun angives ved installation"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles kan kun angives ved installation"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb kan kun angives ved installation og sletning"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr ""
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "ingen pakker angivet ved installation"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "ingen parametre angivet ved forespørgsel"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "ingen parametre angivet ved verifikation"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr ""
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr "Signaturtilvalg"
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
 msgstr ""
 
-#: rpmsign.c:108
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "Signaturtilvalg"
+
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Du skal angive \"%%_gpg_name\" i din makrofil\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Indtast adgangskode: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Adgangskode godkendt.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "brug følgende forespørgselsformat"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -535,32 +597,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Udfører(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Udførelse af %s mislykkedes (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Fejl-afslutningsstatus fra %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -570,785 +637,922 @@ msgstr ""
 "\n"
 "RPM opbygningsfejl:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "syntaksfejl under tolkning af ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "syntaksfejl under tolkning af &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "syntaksfejl under tolkning af ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "tolkningsfejl i udtryk\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "uparret (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- kun for tal\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! kun for tal\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "typer skal passe sammen\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / understøttes ikke for strenge\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- understøttes ikke for strenge\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& og || understøttes ikke for strenge\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "syntaksfejl i udtryk\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Manglende '(' i %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Manglende ')' i %s %s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Ugyldigt %s-symbol: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Ikke-mellemrum efterfølger %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Ugyldig syntaks: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Ugyldig tilstandsangivelse: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Ugyldig dirmode-spec: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Fil skal begynde med \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Fil angivet to gange: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Symbolsk lænke peger på BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Fil ikke fundet: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Fil kræver foranstillet \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Fil ikke fundet med glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "linie: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
+#, c-format
+msgid "illegal _docdir_fmt %s: %s\n"
+msgstr ""
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Fil ikke fundet med glob: %s\n"
+
+#: build/files.c:2431
 #, c-format
-msgid "illegal _docdir_fmt %s: %s\n"
+msgid "Special file in generated file list: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Ugyldig fil: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Ugyldig ejer/gruppe: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Kunne ikke kanonisere værtsnavn: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Kunne ikke skrive pakkeindhold til %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Kunne ikke læse pakkeindhold fra %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Kunne ikke kanonisere værtsnavn: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Kunne ikke åbne midlertidig fil.\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Kunne ikke læse spec-fil fra %s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Ugyldige CSA-data\n"
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Kunne ikke åbne %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Kunne ikke skrive pakke: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Kunne ikke åbne sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Kunne ikke læse hoved fra %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Kunne ikke skrive hoved til %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Skrev: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Kunne ikke generere filnavn til oprettelse af pakke %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "kan ikke oprette %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "linie %d: anden %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "'%%changelog'-indgange skal starte med *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "ufærdig '%%changelog'-indgang\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "ugyldig dato i %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "navn mangler i %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "ingen beskrivelse i %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "linie %d: Fejl ved tolkning af %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "linie %d: Ugyldigt tilvalg %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "line %d: For mange navne: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "line %d: Pakken eksisterer ikke: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "linie %d: Anden beskrivelse\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "linie %d: Fejl ved tolkning af %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "linie %d: Ugyldigt tal: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "linie %d: Ugyldigt %s-tal: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Arkitekturen er ekskluderet: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Arkitekturen er ikke inkluderet: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS er ekskluderet: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS is ikke inkluderet: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "'%s'-felt skal være tilstede i pakke : %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Flere '%s'-indgange i pakke: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Kunne ikke åbne ikon %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Kunne ikke læse ikon %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Ukendt ikontype: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "linie %d: Forkert udformet mærke: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "linie %d: Tomt mærke: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "linie %d: Præfikser kan ikke ende på \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "linie %d: Docdir skal starte med '/': %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "linie %d: Ugyldig %s: angivere: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "linie %d: Ugyldigt 'BuildArchitecture'-format: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Intern fejl: Falsk mærke %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Ugyldig pakkeangivelse: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Pakken eksisterer allerede: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "linie %d: Ukendt mærke: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Ugyldig kilde: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Fejl ved tolking af %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "linie %d: Ugyldigt '%%setup'-tilvalg %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "linie %d: anden %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "linie %d: udløsere skal have --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "linie %d: Fejl under tolkning af %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "linie %d: skriptprogram skal starte med '/': %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "linie %d: Anden %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "linie %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr ""
 "Kunne ikke åbne %s: %s\n"
 "\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: Fik et %%else uden et %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: Fik et %%endif uden et %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Pakke har ingen %%description: %s\n"
@@ -1419,450 +1623,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Kunne ikke udføre %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Kunne ikke fraspalte ny proces til %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Kunne ikke finde %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "forespørgsel af spec-fil %s mislykkedes, kunne ikke tolkes\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(fejl 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Ugyldigt magisk tal"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Ugyldigt/ulæseligt hoved"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Hovedstørrelse er for stor"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s har ugyldig talværdi, overspringes\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s har for stor eller lille 'long'-værdi, overspringes\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s har for stor eller lille heltalsværdi, overspringes\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "kan ikke opnå %s lås på %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "delt"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "eksklusiv"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Ukendt filtype"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Intern fejl"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " mislykkedes - "
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "fejl(%d) under allokering af ny pakkeinstans\n"
 
-#: lib/depends.c:68
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(ikke et tal)"
 
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
+#: lib/formats.c:44
+msgid "(not a string)"
 msgstr ""
 
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
 msgstr ""
 
-#: lib/formats.c:314
-msgid "(not base64)"
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
+#: lib/formats.c:253
+msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "bruger %s eksisterer ikke - bruger root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "gruppe %s eksisterer ikke - bruger root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s gemt som %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s oprettet som %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1833
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1841
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1876
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1885
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1890
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1909
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:452
+#: lib/header.c:1949
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:362
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:384
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Ingen tilgængelig signatur\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "tomt mærkeformat"
 
-#: lib/package.c:581
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "tomt mærkenavn"
+
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: headerRead failed: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] forventet ved slutningen af tabel"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "uventet ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "uventet }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? forventet i udtryk"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ forventet efter ? i udtryk"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} forventet i udtryk"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": forventet efter ?-underudtryk"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ forventet efter : i udtryk"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| forventet ved slutningen af udtryk"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread mislykkedes: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
-msgid "print macro expansion of EXPR"
+#: lib/poptALL.c:197
+msgid "print macro expansion of EXPR"
+msgstr ""
+
+#: lib/poptALL.c:198
+msgid "'EXPR'"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "Specify target platform"
 msgstr ""
 
-#: lib/poptALL.c:174
-msgid "'EXPR'"
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "vis kendte forespørgselsmærker"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "vis den endelige rpmrc og makrokonfiguration"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "medtag mindre detaljerede oplysninger"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "medtag mere detaljerede oplysninger"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "vis versionen af rpm som benyttes"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "aflus rpmio I/O"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1883,13 +2198,13 @@ msgstr "omrokeringer skal indeholde et ="
 msgid "relocations must have a / following the ="
 msgstr "i omrokeringer skal = efterfølges af /"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "installér alle filer -- også konfigurationsfiler, der ellers skulle "
 "overspringes"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1897,152 +2212,162 @@ msgstr ""
 "fjern alle pakker, som passer med <pakke> (normalt ville det medføre en "
 "fejl, hvis <pakke> angav flere pakker)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "slet (afinstallér) pakke"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr ""
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "installér ikke dokumentation"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "overspring filer med foranstillet komponent <sti> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr ""
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "forkortelse for --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<pakkefil>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "udlæs #'er efterhånden som pakken installeres (virker sammen med -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "tjek ikke pakkens arkitektur"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "tjek ikke pakkens operativsystem"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "tjek ikke om der er diskplads, før der installeres"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "installér dokumentation"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "opdatér databasen, men rør ikke filsystemet"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "undlad at tjekke pakkers afhængighedskrav"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 "ændr ikke pakkernes installationsrækkefølge for at opfylde afhængigheder"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2050,368 +2375,407 @@ msgstr ""
 "opgradér til en ældre version af pakken (--force gør ikke dette automatisk "
 "ved opgraderinger)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "vis procenter efterhånden som pakken installeres"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "omdirigér pakken til <katalog>, hvis omdirigérbar"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<katalog>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr ""
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "geninstallér hvis pakken allerede er installeret"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "installér ikke, men fortæl om det ville lykkes eller ej"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "forespørg/verificér alle pakker"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "forespørg/verificér pakke(r), der ejer filen"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "forespørg/verificér pakke(r) i gruppen"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "rpm forespørgselstilstand"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "forespørg pakke(r), der udløses af pakken"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "rpm verifikationstilstand"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "forespørg/verificér pakke(r), der stiller et krav"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "forespørg/verificér pakke(r), der tilfredsstiller et krav"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "vis alle konfigurationsfiler"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "vis alle dokumentationsfiler"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "vis alle dokumentationsfiler"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "vis alle konfigurationsfiler"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "vis grundlæggende filinformation"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "vis liste over filerne i pakken"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "vis filernes status"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr ""
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr ""
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr ""
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr ""
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr ""
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "verificér ikke filerne i pakke"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr ""
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "kildepakke forventet, binær fundet\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "kildepakke indeholder ingen .spec-fil\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "udpakning af arkiv mislykkedes%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " for fil "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "ugyldigt format: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "erstattet     "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "ej installeret"
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "ej delt       "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(ingen status)"
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(ukendt %3d)  "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "pakke har hverken filejerskabs- eller id-lister\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "gruppe %s indeholder ingen pakker\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "ingen pakker udløser %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "ingen pakker kræver %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "ingen pakker tilfører %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "fil %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "filen %s tilhører ingen pakke\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "ugyldigt pakkenummer: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "pakken %s er ikke installeret\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "IKKE O.K."
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "O.K."
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (MANGLENDE NØGLER:    "
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (IKKE-BETROEDE NØGLER:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: åbning mislykkedes: %s\n"
@@ -2436,212 +2800,441 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "der er ikke sat nogen dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: kan ikke læse hoved ved 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "der ikke sat nogen dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr ""
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "kunne ikke genopbygge database: original-databasen beholdes\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "kunne ikke erstatte gammel database med ny database!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr ""
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr ""
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr ""
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr ""
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr ""
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr ""
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr ""
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr ""
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr ""
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Ugyldigt magisk tal"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Ugyldigt/ulæseligt hoved"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Hovedstørrelse er for stor"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Ukendt filtype"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Intern fejl"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " mislykkedes - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "åbning af %s mislykkedes %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Forbereder..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s kunne ikke installeres\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Modtager %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "fejl ved læsning fra filen %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "kunne ikke åbne %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Installerer %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr ""
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr ""
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "læsning mislykkedes: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr ""
@@ -2716,798 +3309,635 @@ msgstr ""
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "ukendt fejl %d under arbejdet med pakken %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "manglende andet ':' ved %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "manglende navn på arkitektur ved %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Ufærdig datalinie ved %s:%d\n"
 
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
-msgstr "For mange parametre på datalinie ved %s:%d\n"
-
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr "Ugyldigt arch/os-tal: %s (%s:%d)\n"
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr "Ufuldstændig standardlinie ved %s:%d\n"
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr "For mange parametre i standardlinie ved %s:%d\n"
-
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "manglende  ':' (fandt 0x%02x) ved %s:%d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "manglende parameter til %s ved %s:%d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr ""
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "manglende arkitektur for %s ved %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "ugyldig tilvalg '%s' ved %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr ""
-"Ukendt system: %s\n"
-"\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "kunne ikke åbne Packages-database i %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr ""
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr ""
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "manglende { efter %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "manglende } efter %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "tomt mærkeformat"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "tomt mærkenavn"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "ukendt mærke"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] forventet ved slutningen af tabel"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "uventet ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "uventet }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? forventet i udtryk"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ forventet efter ? i udtryk"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} forventet i udtryk"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": forventet efter ?-underudtryk"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ forventet efter : i udtryk"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| forventet ved slutningen af udtryk"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
+#: lib/rpmrc.c:375
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
+msgid "Too many args in data line at %s:%d\n"
+msgstr "For mange parametre på datalinie ved %s:%d\n"
 
-#: lib/rpmdb.c:191
+#: lib/rpmrc.c:382
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "kan ikke åbne '%s'-indeks ved brug af db%d - %s (%d)\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr "Ugyldigt arch/os-tal: %s (%s:%d)\n"
 
-#: lib/rpmdb.c:516
+#: lib/rpmrc.c:413
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
+msgid "Incomplete default line at %s:%d\n"
+msgstr "Ufuldstændig standardlinie ved %s:%d\n"
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "der er ikke sat nogen dbpath\n"
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
+msgstr "For mange parametre i standardlinie ved %s:%d\n"
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr ""
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "manglende  ':' (fandt 0x%02x) ved %s:%d\n"
 
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr ""
+msgid "missing argument for %s at %s:%d\n"
+msgstr "manglende parameter til %s ved %s:%d\n"
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:551
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:564
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr ""
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "manglende arkitektur for %s ved %s:%d\n"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmrc.c:632
+#, c-format
+msgid "bad option '%s' at %s:%d\n"
+msgstr "ugyldig tilvalg '%s' ved %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "Unknown system: %s\n"
 msgstr ""
+"Ukendt system: %s\n"
+"\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/rpmdb.c:2382
-#, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: kan ikke læse hoved ved 0x%x\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "fejl(%d) under allokering af ny pakkeinstans\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:353
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "fejl(%d) ved hentning af \"%s\"-poster fra '%s'-indekset\n"
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:371
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "fejl(%d) ved gemning af post %s i %s\n"
-
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "der ikke sat nogen dbpath"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:375
 #, c-format
-msgid "failed to create directory %s: %s\n"
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:378
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
-#, c-format
-msgid "cannot add record originally at %u\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr "kunne ikke genopbygge database: original-databasen beholdes\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "kunne ikke erstatte gammel database med ny database!\n"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:100
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "erstat filer i %s med filer fra %s for at genoprette"
+msgid "cannot open Packages database in %s\n"
+msgstr "kunne ikke åbne Packages-database i %s\n"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:199
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "kunne ikke fjerne katalog %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d fejl(%d) fra %s: %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:225
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d fejl(%d): %s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "kan ikke opnå %s lås på %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "delt"
+msgid "%s: reading of public key failed.\n"
+msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "eksklusiv"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s har ugyldig talværdi, overspringes\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s har for stor eller lille 'long'-værdi, overspringes\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s har for stor eller lille heltalsværdi, overspringes\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
+
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktiv %d tom %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(tom)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(tom)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Makroen %%%s har et uafsluttet indhold (body)\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Makroen %%%s har uafsluttede parametre\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Makroen %%%s har et ugyldig navn (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Makroen %%%s har et uafsluttet indhold (body)\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Makroen %%%s har uafsluttede parametre\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Makroen %%%s har intet indhold\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Makroen %%%s kunne ikke udfoldes\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Makroen %%%s har ugyldigt navn (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Makro %%%s (%s) blev ikke brugt under niveau %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Ukendt tilvalg %c i %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Uafsluttet %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Et %% efterfølges af en makro, der ikke kan tolkes\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktiv %d tom %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Fil %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Filen %s er mindre end %u byte\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(ingen fejl)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "fatal fejl: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "fejl: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "advarsel: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "hukommelsesallokering (%u byte) returnerede NULL.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(ingen fejl)"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "fatal fejl: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "fejl: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "advarsel: "
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "hukommelsesallokering (%u byte) returnerede NULL.\n"
+msgid "error creating fifo %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite mislykkedes: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread mislykkedes: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg kunne ikke skrive signaturen\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "kunne ikke læse signaturen\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead mislykkedes: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature mislykkedes: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead mislykkedes: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: læs manifest mislykkedes: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 95c691d2825922a0452f1a315522101d9668be86..b13a32257b3f78662a7ad224e5c3eb946cd90fb8 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -3,17 +3,17 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Roman Spirgi <bigant@fedoraproject.org>, 2012.
-# Roman Spirgi <rspirgi@gmail.com>, 2011.
+# Ettore Atalan <atalanttore@googlemail.com>, 2016
+# Roman Spirgi <bigant@fedoraproject.org>, 2012
+# Roman Spirgi <rspirgi@gmail.com>, 2011
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-12-10 20:59+0000\n"
-"Last-Translator: Roman Spirgi <bigant@fedoraproject.org>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/rpm/language/"
-"de/)\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: German (http://www.transifex.com/rpm-team/rpm/language/de/)\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,558 +46,626 @@ msgstr ""
 #: cliutils.c:53
 #, c-format
 msgid "creating a pipe for --pipe failed: %m\n"
-msgstr "erzeugen einer Pipe für --pipe fehlgeschlagen: %m\n"
+msgstr "Erzeugen einer Pipe für --pipe fehlgeschlagen: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "Ausführung fehlgeschlagen\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "Argument ist kein RPM-Paket\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "Fehler beim Lesen des Paket-Headers\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
-msgstr "Kann Nutzdaten nicht erneut öffnen: %s\n"
+msgstr "Nutzdaten können nicht erneut geöffnet werden: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Abfragen/überprüfen der Paketauswahl:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Abfrage-Optionen (mit -q oder --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Überprüfungsoptionen (mit -V oder --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Installations-/Aktualisierungs-/Deinstallationsoptionen:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Gemeinsame Optionen für alle RPM-Modi und Ausführungen:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr ""
-"Nur eine Art von Abfragen/Überprüfungen kann jeweils durchgeführt werden"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "Unerwartete Abfrage-Parameter"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "Unerwartetes Abfrage-Format"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "Unerwartete Abfrage-Quelle"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "Nur ein wichtiger Modus kann angegeben werden"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "Nur Installation und Upgrade kann erzwungen werden"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "Dateien können nur bei der Paket-Installation verschoben werden"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr ""
-"--prefix kann nicht zusammen mit --relocate oder --excludepath verwendet "
-"werden"
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
+msgstr "BuildRoot wurde bereits angegeben, %s wird ignoriert\n"
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
-"--relocate und --excludepath dürfen nur bei der Installation neuer Pakete "
-"benutzt werden"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix darf nur bei der Installation neuer Pakete benutzt werden"
+"%prep (Quellen entpacken, Patches übernehmen) der <Spec-Datei> durchlaufen"
 
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "Argumente für --prefix müssen mit einem / beginnen"
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
+msgstr "<Spec-Datei>"
 
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
-"--hash (-h) kann nur während der Paket-Installation oder -Deinstallation "
-"angegeben werden"
+"%build (%prep, anschließendes Kompilieren) der <Spec-Datei> durchlaufen"
 
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
-"--percent kann nur während der Paket-Installation oder -Deinstallation "
-"angegeben werden"
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs darf nur während der Paket-Installation angegeben werden"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs darf nur während der Paket-Installation angegeben werden"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs darf nur während der Paket-Installation angegeben werden"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "entweder --excludedocs oder --includedocs darf angegeben werden"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch darf nur während der Paket-Installation angegeben werden"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos darf nur während der Paket-Installation angegeben werden"
+"%install (%prep, %build, anschließendes Installieren) der <Spec-Datei> "
+"durchlaufen"
 
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize darf nur während der Paket-Installation angegeben werden"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
+msgstr "%files-Abschnitt der <Spec-Datei> überprüfen"
 
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-"--allmatches darf nur während der Paket-Deinstallation angegeben werden"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
+msgstr "Quell- und Binär-Paket von <Spec-Datei> bauen"
 
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles darf nur während der Paket-Installation angegeben werden"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
+msgstr "Nur ein Binär-Paket von <Spec-Datei> bauen"
 
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"--justdb darf nur während der Paket-Installation oder -Deinstallation "
-"angegeben werden"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
+msgstr "Nur ein Quell-Paket von <Spec-Datei> bauen"
 
-#: rpmqv.c:221
+#: rpmbuild.c:161
+#, c-format
 msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
-"Optionen zum Deaktivieren von Skripten können nur während der Paket-"
-"Installation oder -Deinstallation angegeben werden"
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"Optionen zum Deaktivieren von Trigger können nur während der Paket-"
-"Installation oder -Deinstallation angegeben werden"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<Quell-Paket>"
 
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
-"--nodeps kann nur während der Paket-Installation, -Deinstallation und -"
-"Überprüfung angegeben werden"
 
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
-"--test kann nur während der Paket-Installation oder -Deinstallation "
-"angegeben werden"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "Argumente für --root (-r) müssen mit einem / beginnen"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "Es wurden keine Pakete für die Deinstallation angegeben"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "Es wurden keine Pakete für die Installation angegeben"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "Es wurden keine Argumente für die Abfrage angegeben"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "Es wurden keine Argumente für die Überprüfung angegeben"
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr "BuildRoot wurde bereits angegeben, ignoriere %s\n"
+"%install (%prep, %build, anschließendes Installieren) des <Quell-Pakets> "
+"durchlaufen"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:170
 #, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
+msgid "verify %files section from <source package>"
 msgstr ""
-"%prep (Quellen entpacken, Patches übernehmen) der <Spec-Datei> durchlaufen"
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr "<Spec-Datei>"
 
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
-"%build (%prep, anschliessendes Kompilieren) der <Spec-Datei> durchlaufen"
 
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
-"%install (%prep, %build, anschliessendes Installieren) der <Spec-Datei> "
-"durchlaufen"
-
-#: rpmbuild.c:129
-#, c-format
-msgid "verify %files section from <specfile>"
-msgstr "Überprüfe %files-Abschnitt der <Spec-Datei>"
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
-msgstr "Baue Source- und Binär-Paket von <Spec-Datei>"
-
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
-msgstr "Baue nur ein Binär-Paket von <Spec-Datei>"
-
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
-msgstr "Baue nur ein Source-Paket von <Spec-Datei>"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "%prep (Quellen entpacken, Patches übernehmen) des <Tar-Archivs> durchlaufen"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<Tar-Archiv>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
-"%build (%prep, anschliessendes Kompilieren) des <Tar-Archivs> durchlaufen"
+"%build (%prep, anschließendes Kompilieren) des <Tar-Archivs> durchlaufen"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
-"%install (%prep, %build, anschliessendes Installieren) des <Tar-Archivs> "
+"%install (%prep, %build, anschließendes Installieren) des <Tar-Archivs> "
 "durchlaufen"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
-msgstr "Überprüfe %files-Abschnitt des <Tar-Archivs>"
+msgstr "%files-Abschnitt des <Tar-Archivs> überprüfen"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
-msgstr "Baue Source- und Binär-Paket vom <Tar-Archiv>"
+msgstr "Quell- und Binär-Paket vom <Tar-Archiv> bauen"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
-msgstr "Baue nur ein Binär-Paket vom <Tar-Archiv>"
+msgstr "Nur ein Binär-Paket vom <Tar-Archiv> bauen"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
-msgstr "Baue nur ein Source-Paket vom <Tar-Archiv>"
+msgstr "Nur ein Quell-Paket vom <Tar-Archiv> bauen"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
-msgstr "Baue ein Binär-Paket vom <Source-Paket>"
+msgstr "Ein Quell-Paket vom <Source-Paket> bauen"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<Source-Paket>"
+#: rpmbuild.c:212
+msgid "override build root"
+msgstr "BuildRoot überschreiben"
 
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
-"%install (%prep, %build, anschliessendes Installieren) des <Source-Pakets> "
-"durchlaufen"
-
-#: rpmbuild.c:171
-msgid "override build root"
-msgstr "Überschreibe BuildRoot"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "Erstellungsdateibaum nach Beendigung löschen"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ExcludeArch ignorieren: Anweisungen der Spec-Datei"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
-msgstr "Debugge Datei-Status"
+msgstr "Datei-Status debuggen"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "Keine der Phasen des Erstellungsvorganges ausführen"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "Keine Überprüfung der Paket-Abhängigkeiten"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
-"Generiere Paket-Header, die mit veralteten RPM-Paketen (v3) kompatibel sind"
+"Paket-Header generieren, die mit veralteten RPM-Paketen (v3) kompatibel sind"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
+msgstr "%clean-Abschnitt des Bauvorgangs nicht ausführen"
+
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
-msgstr ""
+msgstr "%check-Abschnitt des Bauvorgangs nicht ausführen"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "Keine i18n-Übersetzungen der Spec-Datei zulassen"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "Quelldateien nach Beendigung löschen"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "Spec-Datei nach Beendigung löschen"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
-msgstr "Springe direkt zur angegeben Phase (nur für c, i)"
+msgstr "Direkt zur angegeben Phase springen (nur für c, i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
-msgstr "Überschreibe Zielplattform"
+msgstr "Zielplattform überschreiben"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
-"Erstellungsoptionen mit [ <Spec-Datei> | <Tar-Archiv> | <Source-Paket> ]:"
+"Erstellungsoptionen mit [ <Spec-Datei> | <Tar-Archiv> | <Quell-Paket> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Gemeinsame Optionen für alle RPM-Modi und Ausführungen:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Fehlgeschlagene Paket-Abhängigkeiten:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Die Spec-Datei %s kann nicht geöffnet werden: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Die Tar-Pipe konnte nicht geöffnet werden: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
-msgstr "Konnte Spec-Datei von %s nicht lesen\n"
+msgstr "Spec-Datei konnte nicht von %s gelesen werden\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
-msgstr "Konnte %s nicht in %s umbenennen: %m\n"
+msgstr "%s konnte nicht in %s umbenannt werden: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "Aufruf von stat für %s nicht möglich: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
-msgstr "Die Datei %s ist keine normale Datei.\n"
+msgstr "Die Datei %s ist keine reguläre Datei.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Die Datei %s scheint keine Spec-Datei zu sein.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
-msgstr "Baue für die Zielplattform(en): %s\n"
+msgstr "Für folgende Zielplattform(en) wird gebaut: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
-msgstr "Baue für das Ziel %s\n"
+msgstr "Für das Ziel %s wird gebaut\n"
+
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "Argumente für --root (-r) müssen mit einem / beginnen"
 
-#: rpmdb.c:22
+#: rpmdb.c:21
 msgid "initialize database"
-msgstr "Initialisiere Datenbank"
+msgstr "Datenbank initialisieren"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
-"Erstelle invertierte Datenbank-Liste anhand der installierten Paket-Header"
+"Invertierte Datenbank-Liste anhand der installierten Paket-Header erstellen"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
-msgstr "Überprüfe Datenbank-Dateien"
+msgstr "Datenbank-Dateien überprüfen"
+
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr "Datenbank in die Header-Liste in der Standardeingabe exportieren"
 
-#: rpmdb.c:33
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr "Datenbank aus der Header-Liste in der Standardeingabe importieren"
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Datenbank-Optionen:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "Nur ein Hauptmodus kann angegeben werden"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
-msgstr "Überprüfe Paket-Signatur(en)"
+msgstr "Paket-Signatur(en) überprüfen"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
-msgstr "Importiere einen gepanzerten öffentlichen Schlüssel"
+msgstr "Einen gepanzerten öffentlichen Schlüssel importieren"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
+"Nicht importieren, aber ermitteln, ob es funktionieren würde oder nicht"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "Schlüssel des RPM-Schlüsselbundes auflisten"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Signatur-Optionen:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "Es wurden keine Argumente angegeben"
 
-#: rpmsign.c:25
-msgid "sign package(s)"
-msgstr "Paket(e) signieren"
-
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
-msgstr "Signiere Paket(e) (identisch mit --addsign)"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Abfragen/überprüfen der Paketauswahl:"
 
-#: rpmsign.c:29
-msgid "delete package signatures"
-msgstr "Lösche Paket-Signatur(en)"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Abfrage-Optionen (mit -q oder --query):"
 
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr "Signatur-Optionen:"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Überprüfungsoptionen (mit -V oder --verify):"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Konnte %s nicht ausführen: %s\n"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Installations-/Aktualisierungs-/Deinstallationsoptionen:"
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
-msgstr "\"%%_gpg_name\" muss in der Makro-Datei gesetzt sein\n"
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr ""
+"Nur eine Art von Abfragen/Überprüfungen kann jeweils durchgeführt werden"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Bitte das Passwort eingeben: "
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "Unerwartete Abfrage-Parameter"
 
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Das Passwort ist richtig.\n"
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "Unerwartetes Abfrage-Format"
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr ""
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "Unerwartete Abfrage-Quelle"
 
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
-msgstr ""
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "Nur Installation und Aktualisierung kann erzwungen werden"
 
-#: rpmspec.c:28
-msgid "query spec file(s)"
-msgstr "Spec-Datei(en) abfragen"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "Dateien können nur bei der Paket-Installation verschoben werden"
 
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
 msgstr ""
-"Arbeite mit dem binären RPMS, das aus der Spezifikation erstellt wurde "
-"(Standard)"
+"--prefix kann nicht zusammen mit --relocate oder --excludepath verwendet "
+"werden"
 
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
-msgstr "Arbeite mit Quell-RPM, das aus der Spezifikation erstellt wurde"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate und --excludepath dürfen nur bei der Installation neuer Pakete "
+"benutzt werden"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix darf nur bei der Installation neuer Pakete benutzt werden"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "Argumente für --prefix müssen mit einem / beginnen"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+"--hash (-h) kann nur während der Paket-Installation oder -Deinstallation "
+"angegeben werden"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+"--percent kann nur während der Paket-Installation oder -Deinstallation "
+"angegeben werden"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs darf nur während der Paket-Installation angegeben werden"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs darf nur während der Paket-Installation angegeben werden"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs darf nur während der Paket-Installation angegeben werden"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "entweder --excludedocs oder --includedocs darf angegeben werden"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch darf nur während der Paket-Installation angegeben werden"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos darf nur während der Paket-Installation angegeben werden"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize darf nur während der Paket-Installation angegeben werden"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+"--allmatches darf nur während der Paket-Deinstallation angegeben werden"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles darf nur während der Paket-Installation angegeben werden"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"--justdb darf nur während der Paket-Installation oder -Deinstallation "
+"angegeben werden"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"Optionen zum Deaktivieren von Skripten können nur während der Paket-"
+"Installation oder -Deinstallation angegeben werden"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"Optionen zum Deaktivieren von Trigger können nur während der Paket-"
+"Installation oder -Deinstallation angegeben werden"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps kann nur während der Paket-Installation, -Deinstallation und -"
+"Überprüfung angegeben werden"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+"--test kann nur während der Paket-Installation oder -Deinstallation "
+"angegeben werden"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "Es wurden keine Pakete für die Deinstallation angegeben"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "Es wurden keine Pakete für die Installation angegeben"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "Es wurden keine Argumente für die Abfrage angegeben"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "Es wurden keine Argumente für die Überprüfung angegeben"
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr "Paket(e) signieren"
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr "Paket(e) signieren (identisch mit --addsign)"
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr "Paket-Signatur(en) löschen"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "Signatur-Optionen:"
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr "»%%_gpg_name« muss in der Makro-Datei gesetzt sein\n"
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr "Auswertung der Spec-Datei(en) in die Standardausgabe leiten"
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr "Spec-Datei(en) abfragen"
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr ""
+"Mit den binären RPMs arbeiten, die aus der Spezifikation erstellt wurden "
+"(Standard)"
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr "Mit Quell-RPM arbeiten, das aus der Spezifikation erstellt wurde"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "Folgendes Abfrage-Format benutzen"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "Spec-Optionen:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
-msgstr ""
+msgstr "Keine Argumente zur Auswertung angegeben"
 
 #: build/build.c:120
 #, c-format
 msgid "Unable to open temp file: %s\n"
 msgstr "Temp-Datei konnte nicht geöffnet werden: %s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
-msgstr "Stream konnte nicht geöffnet werden: %s\n"
+msgstr "Datenstrom konnte nicht geöffnet werden: %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Ausführung(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Ausführung von %s fehlgeschlagen (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
-msgstr ""
+msgstr "Fehler bei der Ausführung des Skriptlets %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Fehler-Status beim Beenden von %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -607,235 +675,315 @@ msgstr ""
 "\n"
 "Fehler beim Bauen des RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
-msgstr "Syntax-Fehler beim Parsen von ==\n"
+msgstr "Syntax-Fehler beim Auswerten von ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
-msgstr "Syntax-Fehler beim Parsen von &&\n"
+msgstr "Syntax-Fehler beim Auswerten von &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
-msgstr "Syntax-Fehler beim Parsen von ||\n"
+msgstr "Syntax-Fehler beim Auswerten von ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
-msgstr "Fehler beim Parsen des Ausdrucks\n"
+msgstr "Fehler beim Auswerten des Ausdrucks\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "Unerwartete (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- nur bei Zahlen\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! nur bei Zahlen\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "Typen müssen übereinstimmen\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
-msgstr "* / nicht unterstützt für Strings\n"
+msgstr "* / nicht unterstützt für Zeichenketten\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
-msgstr "- nicht unterstützt für Strings\n"
+msgstr "- nicht unterstützt für Zeichenketten\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
-msgstr "&& und || nicht unterstützt für Strings\n"
+msgstr "&& und || nicht unterstützt für Zeichenketten\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "Syntax-Fehler im Ausdruck\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
-msgstr "Fehlende '(' bei %s %s\n"
+msgstr "Fehlende »(« bei %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
-msgstr "Fehlende ')' bei %s(%s\n"
+msgstr "Fehlende »)« bei %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
-msgstr "Ungültiges %s Zeichen: %s\n"
+msgstr "Ungültiges %s-Zeichen: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Fehlendes %s bei %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
-msgstr "Druckbarem Zeichen folgt %s(): %s\n"
+msgstr "Darstellbarem Zeichen folgt %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Ungültiger Syntax: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Ungültige Dateiberechtigungen: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Ungültige Verzeichnisberechtigungen: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
-msgstr ""
+msgstr "Ungültige Länge der Locale: »%s« in %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
-msgstr ""
+msgstr "Doppelte Locale %s in %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Ungültige Fähigkeit: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Dateifähigkeits-Unterstützung nicht eingebaut\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
-msgstr "Datei muss mit \"/\" beginnen: %s\n"
+msgstr "Datei muss mit »/« beginnen: %s\n"
+
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
-msgstr "Unbekannter Datei--Auszug-Algorithmus %u, gehe zurück zu MD5\n"
+msgstr "Unbekannter Prüfsummen-Algorithmus %u, es wird auf MD5 ausgewichen\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Datei doppelt aufgelistet: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
-msgstr ""
+msgstr "Lesen des symbolischen Links %s fehlgeschlagen: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Symbolischer Link zeigt auf den BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "Pfad ist außerhalb von BuildRoot: %s\n"
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "Verzeichnis nicht gefunden: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Datei nicht gefunden: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Kein Verzeichnis: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
-msgstr "%s: Kann den unbekannten Tag (%d) nicht laden.\n"
+msgstr "%s: Unbekannter Tag (%d) kann nicht geladen werden.\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: Lesen des öffentlichen Schlüssels fehlgeschlagen.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: Ist kein gepanzerter öffentlicher Schlüssel.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: Verschlüsselung fehlgeschlagen\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "Erzeugen des Verzeichnisses fehlgeschlagen"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
-msgstr "Datei benötigt führenden \"/\": %s\n"
+msgstr "Datei benötigt führenden »/«: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
-msgstr ""
+msgstr "%%dev-glob ist unzulässig: %s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "Verzeichnis von Glob nicht gefunden: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Datei von \"glob\" nicht gefunden: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
-msgstr "Datei %s aus %%files konnte nicht geöffnet: %m\n"
+msgstr "Datei %s aus %%files konnte nicht geöffnet werden: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "Zeile: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr "Leere Datei %s in %%files\n"
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
-msgstr ""
+msgstr "Fehler beim Lesen der Datei %s in %%files: %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
+msgstr "Ungültiges _docdir_fmt %s: %s\n"
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Datei von »glob« nicht gefunden: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
-msgstr ""
+msgstr "Spezielles %s kann nicht mit anderen Formen gemischt werden: %s\n"
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
+msgstr "Mehr als eine Datei in einer Zeile: %s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Ungültige Datei: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Ungültiger Eigentümer/Gruppe: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
-msgstr "Prüfe auf nicht gepackte Datei(en): %s\n"
+msgstr "Auf nicht gepackte Datei(en) wird geprüft: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -844,554 +992,612 @@ msgstr ""
 "Installierte (aber nicht gepackte) Datei(en) gefunden:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
-msgstr "Verarbeite Daten: %s\n"
+msgstr "Dateien werden verarbeitet: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
+"Architektur der Binärdateien (%d) entspricht nicht der Paketarchitektur "
+"(%d).\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
-msgstr "Architekturabhängige Binärdateien in noarch-Paket\n"
+msgstr "Architekturabhängige Binärdateien in »noarch«-Paket\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
-msgstr ""
+msgstr "Erstellen der Archivdatei fehlgeschlagen bei Datei %s: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
-msgstr ""
+msgstr "Erstellen der Archivdatei fehlgeschlagen: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
-msgstr ""
-"Konnte %s-Datei nicht öffnen: %s\n"
-"\n"
+msgstr "%s-Datei konnte nicht geöffnet werden: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: Zeile: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Rechnername konnte nicht erkannt werden: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Konnte Nutzdaten nicht nach %s schreiben: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Konnte Nutzdaten von %s nicht lesen: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Rechnername konnte nicht erkannt werden: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
-msgstr "Unbekannte Nutzdaten.Kompression: %s\n"
+msgstr "Unbekannte Nutzdaten-Kompression: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Konnte keine unveränderliche Header-Region erstellen.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Kann temporäre Datei nicht öffnen.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr "Datei %s kann nicht durchsucht werden: %s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Kann den temporären Header nicht schreiben\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Lesen der Richtlinien-Datei fehlgeschlagen: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Ungültige CSA-Daten\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Kann den Header der Signatur nicht erneut laden.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
-msgstr "Konnte %s nicht öffnen: %s\n"
+msgstr "%s konnte nicht geöffnet werden: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
-msgstr "Kann das Paket nicht schreiben: %s\n"
-
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Konnte Signatur-Ziel %s nicht öffnen: %s\n"
+msgstr "Paket konnte nicht geschrieben werden: %s\n"
 
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Konnte Header von %s nicht lesen: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Konnte Header nicht nach %s schreiben: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Erstellt: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
-msgstr "Ausschluss \"%s\":\n"
+msgstr "»%s« wird ausgeführt:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
-msgstr "Ausschluss von \"%s\" fehlgeschlagen.\n"
+msgstr "Ausführung von »%s« ist fehlgeschlagen.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
-msgstr "Paket-Prüfung \"%s\" fehlgeschlagen.\n"
+msgstr "Paket-Prüfung »%s« fehlgeschlagen.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
-msgstr "Konnte den Dateinamen für das Paket %s nicht generieren: %s\n"
+msgstr "Dateiname für das Paket %s konnte nicht generiert werden: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
-msgstr "Kann Datei %s nicht erstellen: %s\n"
+msgstr "%s konnte nicht erstellt werden: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "Zeile %d: Zweites %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
-msgstr ""
+msgstr "Ungültiges Datum in %%changelog: %s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "%%changelog-Einträge müssen mit einem * beginnen\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "Unvollständiger %%changelog-Eintrag\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "Ungültiges Datum im %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog ist nicht in absteigender Reihenfolge\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
-msgstr "Fehlender Name im %%changelog\n"
+msgstr "Name im %%changelog fehlt\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "Keine Beschreibung im %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "Zeile %d: zweites %%changelog\n"
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
-msgstr "Zeile %d: Fehler beim Parsen von %%description: %s\n"
+msgstr "Zeile %d: Fehler beim Auswerten von %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "Zeile %d: Ungültige Option %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "Zeile %d: Zu viele Namen: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "Zeile: %d: Paket existiert nicht: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "Zeile %d: Zweite Beschreibung\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
-msgstr "Zeile %d: Fehler beim Parsen von %%files: %s\n"
+msgstr "Zeile %d: Fehler beim Auswerten von %%files: %s\n"
+
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
 
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
-msgstr "Zeile %d: Fehler beim Parsen von %%policies: %s\n"
+msgstr "Zeile %d: Fehler beim Auswerten von %%policies: %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
-msgstr ""
+msgstr "Fehler beim Auswerten des Tag-Feldes: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "Zeile %d: Ungültige Nummer: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "Zeile %d: Ungültige no%s-Nummer: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
-msgstr "Zeile %d: Ungültige %s Nummer: %s\n"
+msgstr "Zeile %d: Ungültige %s-Nummer: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d ist mehrfach definiert\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
-msgstr "%s herunterladen nach %s\n"
+msgstr "%s wird nach %s heruntergeladen\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 "%s konnte nicht heruntergeladen werden\n"
 "\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Architektur ist ausgeschlossen: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Architektur ist nicht einbezogen: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "Betriebssystem ist ausgeschlossen: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "Betriebssystem ist nicht einbezogen: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "%s-Feld muss im Paket vorhanden sein: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Doppelte %s-Einträge im Paket: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
-msgstr "Kann Icon %s nicht öffnen: %s\n"
+msgstr "Symbol %s kann nicht geöffnet werden: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
-msgstr "Kann Icon %s nicht lesen: %s\n"
+msgstr "Symbol %s kann nicht gelesen werden: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
-msgstr "Unbekannter Icon-Typ: %s\n"
+msgstr "Unbekannter Symbol-Typ: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "Zeile %d: Tag benötigt nur ein Zeichen: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "Zeile %d: Ungültiges Zeichen '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr "Zeile %d: %s in: %s\n"
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "Zeile %d: Ungültiges Zeichen in: %s\n"
+msgid "%s in: %s\n"
+msgstr "%s in: %s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "Zeile %d: Ungültiges Zeichen \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr "Ungültiges Zeichen '%c' (0x%x)"
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr "Ungültige Sequenz \"..\""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "Zeile %d: Missgebildeter Tag: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "Zeile %d: Leerer Tag: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
-msgstr "Zeile %d: Präfixe dürfen nicht mit einem \"/\" enden: %s\n"
+msgstr "Zeile %d: Präfixe dürfen nicht mit einem »/« enden: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
-"Zeile %d: Das Dokumentationsverzeichnis muss mit einem \"/\" beginnen: %s\n"
+"Zeile %d: Das Dokumentationsverzeichnis muss mit einem »/« beginnen: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "Zeile %d: Das Epoch-Feld muss eine vorzeichenlose Zahl sein: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "Zeile %d: Ungültig %s: Kennzeichner: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "Zeile %d: Ungültiges BuildArchitecture-Format: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
-msgstr "Zeile %d: Nur noarch-Unterpakete werden unterstützt: %s\n"
+msgstr "Zeile %d: Nur »noarch«-Unterpakete werden unterstützt: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Interner Fehler: Falscher Tag %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "Zeile %d: %s ist veraltet: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Ungültige Paket-Spezifikation: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Paket ist bereits vorhanden: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "Zeile %d: Unbekannter Tag: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} kann nicht leer sein\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
-msgstr "%%{buildroot} kann nicht \"/\" sein\n"
+msgstr "%%{buildroot} kann nicht »/« sein\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Ungültige Quelle: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
-msgstr "Keine Patch-Nummer %u\n"
+msgstr "Kein Patch mit der Nummer %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
-msgstr "%%patch ohne korrespondierenden \"Patch:\"-Tag\n"
+msgstr "%%patch ohne korrespondierenden »Patch:«-Tag\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
-msgstr "Keine Source-Nummer %u\n"
+msgstr "Keine Quelle mit der Nummer %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
-msgstr "Kein \"Source\"-Tag in Spec-Datei\n"
+msgstr "Kein »Source«-Tag in Spec-Datei\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
-msgstr "Fehler beim Parsen von %%setup: %s\n"
+msgstr "Fehler beim Auswerten von %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "Zeile %d: Ungültiges Argument für %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "Zeile %d: Ungültige %%setup-Option %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Ungültige Patch-Nummer %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "Zeile %d: Zweites %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
-"Token mit Abhängigkeiten müssen alphanumerisch, mit '_' oder '/' beginnen"
+"Token mit Abhängigkeiten müssen mit alphanumerischem Zeichen, »_« oder »/« "
+"beginnen"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
-msgstr ""
+msgstr "Versionierter Dateiname ist nicht erlaubt"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "Version benötigt"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "Ungültige Abhängigkeit"
 
-#: build/parseReqs.c:181
-#, c-format
-msgid "line %d: %s: %s\n"
-msgstr ""
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "Version wird benötigt"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
+#, c-format
+msgid "line %d: %s: %s\n"
+msgstr "Zeile %d: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "Zeile %d: Trigger benötigen --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
-msgstr "Zeile %d: Fehler beim Parsen von %s: %s\n"
+msgstr "Zeile %d: Fehler beim Auswerten von %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
-msgstr "Zeile %d: Internes Skript muss mit '>' enden: %s\n"
+msgstr "Zeile %d: Internes Skript muss mit »>« enden: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
-msgstr "Zeile %d: Skript/Programm muss mit '/' beginnen: %s\n"
+msgstr "Zeile %d: Skript/Programm muss mit »/« beginnen: %s\n"
+
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "Zeile %d: Zweites %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "Zeile %d: Nicht unterstütztes internes Skript: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
 #, c-format
-msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
+msgid "line %d: file trigger condition must begin with '/': %s"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseScript.c:410
+#, c-format
+msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
+msgstr "Zeile %d: Interpreter-Argumente sind in Triggern nicht erlaubt: %s\n"
+
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "Zeile %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Öffnen von %s fehlgeschlagen: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
-msgstr ""
+msgstr "%s:%d: Argument wurde für %s erwartet\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
-msgstr ""
+msgstr "Zeile %d: Nicht geschlossenes %%if\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
-msgstr ""
+msgstr "Zeile %d: Nicht geschlossenes Makro oder ungültige Zeilenfortsetzung\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
-msgstr ""
+msgstr "%s:%d: Ungültige %%if-Bedingung\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: %%else ohne %%if erhalten\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: %%endif ohne %%if erhalten\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
+msgstr "%s:%d: missgebildete %%include-Anweisung\n"
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr "Kodierung %s wird vom System nicht unterstützt\n"
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr "Pakt %s: Ungültige %s-Kodierung in %s: %s - %s\n"
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
-msgstr "Keine für das Bauen kompatible Architektur gefunden\n"
+msgstr "Keine für das Bauen kompatiblen Architekturen gefunden\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Paket hat keine %%description: %s\n"
@@ -1422,7 +1628,7 @@ msgstr ""
 #: build/policies.c:163
 #, c-format
 msgid "Failed to read  policy file: %s\n"
-msgstr "Lesevorgang fehlgeschlagen  Richtlinien-Datei: %s\n"
+msgstr "Lesen der Richtlinien-Datei fehlgeschlagen: %s\n"
 
 #: build/policies.c:170
 #, c-format
@@ -1440,478 +1646,594 @@ msgid ""
 "'%s' type given with other types in %%semodule %s. Compacting types to "
 "'%s'.\n"
 msgstr ""
+"»%s«-Type zusammen mit anderen Typen in %%semodule %s angegeben. Typen "
+"werden zu »%s« zusammengefasst.\n"
 
 #: build/policies.c:246
 #, c-format
 msgid "Error parsing %s: %s\n"
-msgstr "Fehler beim Parsen von %s: %s\n"
+msgstr "Fehler beim Auswerten von %s: %s\n"
 
 #: build/policies.c:252
 #, c-format
 msgid "Expecting %%semodule tag: %s\n"
 msgstr ""
-"Erwarte %%semodule Kennzeichen: %s\n"
+"%%semodule-Tag wird erwartet: %s\n"
 "\n"
 
 #: build/policies.c:262
 #, c-format
 msgid "Missing module path in line: %s\n"
-msgstr "Fehlender Modul-Pfad bei Zeile %s\n"
+msgstr "Fehlender Modul-Pfad in Zeile: %s\n"
 
 #: build/policies.c:268
 #, c-format
 msgid "Too many arguments in line: %s\n"
-msgstr "Zu viele Argumente in der Datenzeile bei %s\n"
+msgstr "Zu viele Argumente in der Zeile: %s\n"
 
 #: build/policies.c:307
 #, c-format
 msgid "Processing policies: %s\n"
-msgstr "Verarbeite Richtlinien: %s\n"
+msgstr "Richtlinien werden verarbeitet: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
-msgstr "Ungültiger Regex-Ausdruck %s wird ignoriert\n"
+msgstr "Ungültiger regulärer Ausdruck %s wird ignoriert\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
-msgstr "Konnte keine Pipe für %s erzeugen: %m\n"
+msgstr "Pipe für %s konnte nicht erzeugt werden: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
-msgstr "Konnte %s nicht ausführen: %s\n"
+msgstr "%s konnte nicht ausgeführt werden: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
-msgstr "Konnte fork %s nicht ausführen: %s\n"
+msgstr "fork %s konnte nicht ausgeführt werden: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s fehlgeschlagen: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
-msgstr "Konnte nicht all Daten nach %s: %s schreiben\n"
-
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Umwandlung von %s in einen langen Integer fehlgeschlagen.\n"
+msgstr "Nicht alle Daten konnten nach %s geschrieben werden: %s\n"
 
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
-msgstr ""
+msgstr "Leerer Dateiklassifizierer\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "Keine Dateiattribute konfiguriert\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) fehlgeschlagen: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load fehlgeschlagen: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
-msgstr "Erkennung der Datei \"%s\" fehlgeschlagen: Modus %06o %s\n"
+msgstr "Erkennung der Datei »%s« fehlgeschlagen: Modus %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
-msgstr "Finde %s: %s\n"
+msgstr "%s wird gesucht: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
-msgstr "Fehlgeschlagenes zu finden %s:\n"
+msgstr "%s konnte nicht gefunden werden:\n"
+
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
 
-#: build/spec.c:404
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
-msgstr "Abfragen der Spec-Datei %s fehlgeschlagen, kann nicht geparst werden\n"
+msgstr ""
+"Abfragen der Spec-Datei %s fehlgeschlagen, kann nicht ausgewertet werden\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(Fehler 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s Fehler(%d) von %s: %s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Ungültige Magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s Fehler(%d): %s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Ungültiger Header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "Unbekannte Datenbank-Option: »%s« wird ignoriert.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Header zu gross"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s hat einen ungültigen numerischen Wert, wird übersprungen\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s hat einen zu großen oder zu kleinen Wert, wird übersprungen\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
 msgstr ""
+"%s hat einen zu großen oder zu kleinen Integer-Wert, wird übersprungen\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Unbekannter Datei-Typ"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "Keine %s-Sperre auf %s/%s\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Fehlende harte Verlinkung(en)"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "gemeinsam"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Prüfsumme stimmt nicht überein"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "exklusiv"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Interner Fehler"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "Ungültiger Indextyp %x auf %s/%s\n"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Archiv-Datei nicht im Header"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "Fehler(%d) beim Holen der Datensätze »%s« aus dem %s-Index: %s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " fehlgeschlagen - "
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "Fehler(%d) beim Speichern des Datensatzes »%s« in %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "Fehler(%d) beim Entfernen des Datensatzes »%s« aus %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "Fehler(%d) beim Hinzufügen des Datensatzes für Header #%d\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "Fehler(%d) beim Entfernen des Datensatzes für Header #%d\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "Fehler(%d) beim Reservieren einer neuen Paket-Instanz\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
-msgstr "%s ist ein Delta RPM und kann nicht direkt installiert werden\n"
+msgstr "%s ist ein Delta-RPM und kann nicht direkt installiert werden\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
-msgstr "Nicht unterstütze Nutzlast (%s) in Paket %s\n"
+msgstr "Nicht unterstütze Nutzdaten (%s) in Paket %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
-msgstr "Paket %s wurde bereits hinzugefügt, überspringe %s\n"
+msgstr "Paket %s wurde bereits hinzugefügt, %s wird übersprungen\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
-msgstr "Paket %s wurde bereits hinzugefügt, ersetze es durch %s\n"
+msgstr "Paket %s wurde bereits hinzugefügt, wird durch %s ersetzt\n"
+
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(kein Blob)"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(keine Nummer)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(keine Zeichenkette)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(ungültiger Typ)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(nicht Base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(ungültiger Typ)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(kein Blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(ungültiger XML-Typ)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(keine OpenPGP-Signatur)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr "Ungültiges Datum %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normal"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "ersetzt"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "nicht installiert"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "Netzwerk-Mitbenutzung"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "Falsche Farbe"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "fehlt"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(unbekannt)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(kein String)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "Benutzer %s existiert nicht - benutze Root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "Gruppe %s existiert nicht - benutze Root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s als %s gesichert\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s erstellt als %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
-msgstr ""
+msgstr "%s %s: Entfernen fehlgeschlagen: %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
-msgstr ""
+msgstr "Verzeichnis"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
-msgstr ""
+msgstr "Datei"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "Tag[%d]: UNGÜLTIG, Tag %d, Typ %d, Offset %d, Count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: UNGÜLTIG, nicht hexadezimal\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: UNGÜLTIG, nicht binär\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: UNGÜLTIG, nicht binär\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "Blob-Grösse(%d): UNGÜLTIG, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr ""
+
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "Regionsoffset: UNGÜLTIG, Tag %d, Typ %d, Offset %d, Zähler %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "Regionstrailer: UNGÜLTIG, Tag %d, Typ %d, Offset %d, Zähler %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "Regionsgrösse: UNGÜLTIG, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr Grösse(%d): UNGÜLTIG, lesen lieferte %d zurück\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic: UNGÜLTIG\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr Tags: UNGÜLTIG, Nummer der Tags (%d) ausserhalb des Bereichs\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "ungültige Feldbreite"
+
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hdr Tags: UNGÜLTIG, Nummer der Bytes (%d) ausserhalb des Bereichs\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr Blob(%zd): UNGÜLTIG, lesen lieferte %d zurück\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "hdr Load: UNGÜLTIG\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "Leeres Tag-Format"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature fehlgeschlagen: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "Leerer Tag-Name"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Keine Signatur verfügbar\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead fehlgeschlagen: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] erwartet am Ende des Arrays"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "Unerwartete ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "Unerwartete }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? im Ausdruck erwartet"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ nach dem ? im Ausdruck erwartet"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} im Ausdruck erwartet"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": erwartet ein ? im Unterausdruck"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ nach dem : im Ausdruck erwartet"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| am Ende des Ausdrucks erwartet"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "Zählvariable wird mit ungleich großem Array benutzt"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread fehlgeschlagen: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
+"%s: Fehler: --pipe wurde mehrmals angegeben (inkompatible »popt«-Aliase?)\n"
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "MAKRO mit Wert AUSDRUCK vordefinieren"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
-msgstr "'MAKRO AUSDRUCK'"
+msgstr "»MAKRO AUSDRUCK«"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "MAKRO mit Wert AUSDRUCK definieren"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
-msgstr ""
+msgstr "Definition von MAKRO zurücksetzen"
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
-msgstr ""
+msgstr "MAKRO"
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "Makro-Ausdehnung des AUSDRUCKS anzeigen"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
-msgstr "'AUSDRUCK'"
+msgstr "»AUSDRUCK«"
+
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
-msgstr "lese <DATEI:...> anstatt der Standard-Datei(en)"
+msgstr "<DATEI:...> anstatt der Standard-Datei(en) lesen"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<DATEI:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr "Keinerlei Plugins aktivieren"
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
-msgstr "Paket-Kurzfassung nicht überprüfen"
+msgstr "Paket-Prüfsummen nicht verifizieren"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "Datenbank-Header beim Abrufen nicht überprüfen"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "Paket-Signatur(en) nicht überprüfen"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
-msgstr "Sende Standardausgabe an CMD"
+msgstr "Standardausgabe an CMD senden"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
-msgstr "benutze WURZELVERZEICHNIS als oberstes Verzeichnis"
+msgstr "WURZELVERZEICHNIS als oberstes Verzeichnis verwenden"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "WURZELVERZEICHNIS"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr "Datenbank in VERZEICHNIS benutzen"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "VERZEICHNIS"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
-msgstr "Zeige bekannte Abfrage-Tags"
+msgstr "Bekannte Abfrage-Tags anzeigen"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
-msgstr "Zeige endgültige rpmrc- und Makro-Konfiguration"
+msgstr "Endgültige rpmrc- und Makro-Konfiguration anzeigen"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
-msgstr "Zeige weniger informative Ausgabe"
+msgstr "Weniger informative Ausgabe anzeigen"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
-msgstr "Zeige detailliertere Ausgabe"
+msgstr "Detailliertere Ausgabe anzeigen"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
-msgstr "Zeige benutzte RPM-Version"
+msgstr "Benutzte RPM-Version anzeigen"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
-msgstr "Debugge Nutzdaten-Dateistatus"
+msgstr "Nutzdaten-Dateistatus debuggen"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
-msgstr "Debugge rpmio Ein-/Ausgabe"
+msgstr "rpmio-Ein-/Ausgabe debuggen"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: Optionstabelle ist falsch konfiguriert (%d)\n"
@@ -1932,166 +2254,176 @@ msgstr "Verschiebungen müssen ein = enthalten"
 msgid "relocations must have a / following the ="
 msgstr "Verschiebungen müssen einen / nach dem = enthalten"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
-"Installiere alle Dateien, sogar Konfigurationsdateien, die sonst "
+"Alle Dateien installieren, sogar Konfigurationsdateien, die sonst "
 "möglicherweise übersprungen werden"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
-"Entferne alle Pakete, die mit <Paket> übereinstimmen (normalerweise wird "
+"Alle Pakete entfernen, die mit <Paket> übereinstimmen (normalerweise wird "
 "eine Fehlermeldung angezeigt, wenn <Paket> auf mehrere Pakete zutrifft)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
-msgstr "Verschiebe Dateien eines nicht verschiebbaren Pakets"
+msgstr "Dateien eines nicht verschiebbaren Pakets verschieben"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
-msgstr "Zeige Abhängigkeitsschleifen als Warnung"
+msgstr "Abhängigkeitsschleifen als Warnung anzeigen"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
-msgstr "Lösche (deinstalliere) Paket"
+msgstr "Paket löschen (deinstallieren)"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<Paket>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
-msgstr "Installiere keine Konfigurationsdateien"
+msgstr "Keine Konfigurationsdateien installieren"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
-msgstr "Installiere keine Dokumentation"
+msgstr "Keine Dokumentation installieren"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
-msgstr "Überspringe Dateien mit beginnendem <Pfad> "
+msgstr "Dateien überspringen, die mit <Pfad> beginnen"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<Pfad>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "Abkürzung für --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
-msgstr "Aktualisiere Paket(e), wenn bereits installiert"
+msgstr "Paket(e) aktualisieren, wenn bereits installiert"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<Paket-Datei>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
-msgstr "Zeige Rautezeichen während der Installation (empfehlenswert mit -v)"
+msgstr "Rautezeichen während der Installation (empfehlenswert mit -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "Keine Überprüfung der Paket-Architektur"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "Keine Überprüfung des Paket-Betriebssystems"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "Keine Überprüfung des Festplattenspeichers vor der Installation"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
-msgstr "Installiere Dokumentation"
+msgstr "Dokumentation installieren"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
-msgstr "Installiere Paket(e)"
+msgstr "Paket(e) installieren"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
-msgstr "Aktualisiere die Datenbank, aber verändere nichts im Dateisystem"
+msgstr "Die Datenbank aktualisieren, aber nichts im Dateisystem verändern"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "Keine Überprüfung der Paket-Abhängigkeiten"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "Keine Überprüfung der Prüfsumme der Dateien"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "Keine Überprüfung der Prüfsumme der Dateien (veraltet)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
-msgstr "Installiere keine Sicherheitskontext-Dateien"
+msgstr "Keine Sicherheitskontext-Dateien installieren"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 "Paket-Installation nicht neu sortieren, um die Abhängigkeiten zu erfüllen"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "Keine Paket-Scriptlets ausführen"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "%%pre-Scriptlet nicht ausführen (wenn vorhanden)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "%%post-Scriptlet nicht ausführen (wenn vorhanden)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "%%preun-Scriptlet nicht ausführen (wenn vorhanden)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "%%postun-Scriptlet nicht ausführen (wenn vorhanden)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "%%pretrans-Scriptlet nicht ausführen (wenn vorhanden)"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "%%posttrans-Scriptlet nicht ausführen (wenn vorhanden)"
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "Keine Scriptlets dieses Pakets ausführen"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "%%triggerprein-Scriptlets nicht ausführen"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "%%triggerin-Scriptlets nicht ausführen"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "%%triggerun-Scriptlets nicht ausführen"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "%%triggerpostun-Scriptlets nicht ausführen"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "keine Erfassungaktionen ausführen"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2099,373 +2431,411 @@ msgstr ""
 "Aktualisierung auf eine alte Version des Pakets (--force macht das bei "
 "Aktualisierungen automatisch)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
-msgstr "Zeige Prozentangabe bei der Paket-Installation"
+msgstr "Prozentangabe bei der Paket-Installation anzeigen"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
-"Verschiebe das Paket, wenn es verschiebbar ist, in das Verzeichnis "
-"<Verzeichnis>"
+"Das Paket, wenn es verschiebbar ist, in das Verzeichnis <Verzeichnis> "
+"verschieben"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<Verzeichnis>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
-msgstr "verschiebe Dateien von <alter Pfad> nach <neuer Pfad>"
+msgstr "Dateien von <alter Pfad> nach <neuer Pfad> verschieben"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<alter Pfad>=<neuer Pfad>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
-msgstr "Ignoriere Datei-Konflikte zwischen Paketen"
+msgstr "Datei-Konflikte zwischen Paketen ignorieren"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
-msgstr "Installiere erneut, wenn das Paket bereits vorhanden ist"
+msgstr "Erneut installieren, wenn das Paket bereits vorhanden ist"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "Nicht installieren - nur anzeigen, ob es funktionieren würde"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "Paket(e) aktualisieren"
 
-#: lib/poptQV.c:67
-msgid "query/verify all packages"
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "Paket(e) erneut installieren"
+
+#: lib/poptQV.c:75
+msgid "query/verify all packages"
 msgstr "Abfrage aller Pakete"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "Abfrage-Modus der Signatur"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "Abfragen/überprüfen eines Pakets, das die Datei besitzt"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "Abfragen/überprüfen eines Pakets einer Gruppe"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "Abfragen/überprüfen einer Paket-Datei"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "Abfragen/überprüfen von Paketen mit der Paket-Kennung"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "Abfragen/überprüfen von Paketen mit Header-Kennung"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "Abfrage-Modus"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "Abfragen/überprüfen einer Header-Instanz"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "Abfragen/überprüfen von Paketen einer Installation"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "Abfragen eines Pakets gesteuert vom Paket"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "Überprüfungsmodus"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "Abfrage nach Paketen, die die Fähigkeit benötigen"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "Abfrage nach Paketen, die die Fähigkeit bereitstellen"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
-msgstr "\"Globe\" nicht nach Argumenten"
+msgstr "»Globe« nicht nach Argumenten"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "Dateien nicht als Paket-Liste verarbeiten"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "Alle Konfigurationsdateien anzeigen"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "Alle Dokumentationsdateien anzeigen"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "Alle Dokumentationsdateien anzeigen"
+msgstr "Alle Lizenzdateien anzeigen"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "Alle Lizenzdateien anzeigen"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "Grundlegende Datei-Informationen auflisten"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "Alle Dateien im Paket auflisten"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
-msgstr "Überspringe %%ghost-Dateien"
+msgstr "%%ghost-Dateien überspringen"
+
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "%%ghost-Dateien überspringen"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "Anzeigen der Zustände der aufgelisteten Dateien"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
-msgstr "Keine Grössenüberprüfung der Dateien"
+msgstr "Keine Größenüberprüfung der Dateien"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "Keine Überprüfung der symbolischen Links der Dateien"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "Keine Überprüfung der Eigentümer der Dateien"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "Keine Überprüfung der Gruppen der Dateien"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "Keine Überprüfung der letzten Bearbeitungszeit der Dateien"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "Keine Überprüfung der Berechtigungen der Dateien"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "Keine Fähigkeitsprüfung der Dateien"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "Keine Überprüfung des Sicherheitskontexts"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "Keine Fähigkeitsprüfung der Dateien"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "Keine Überprüfung der Dateien im Paket"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "Keine Überprüfung der Paket-Abhängigkeiten"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "Kein(e) Überprüfungsskript(e) ausführen"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "Fehlende rpmlib-Features für %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
-msgstr "Source-Paket erwartet, Binär-Paket entdeckt\n"
+msgstr "Quell-Paket erwartet, Binär-Paket entdeckt\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
-msgstr "Source-Paket enthält keine Spec-Datei\n"
+msgstr "Quell-Paket enthält keine Spec-Datei\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "Entpacken des Archivs fehlgeschlagen%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " bei Datei "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s fehlgeschlagen bei Datei %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s fehlgeschlagen: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "Ungültiges Format: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(enthält keine Dateien)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "ersetzt       "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "nicht installiert"
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
-msgstr "geshared      "
+msgstr "im Netz freigegeben"
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "falsche Farbe "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(kein Status) "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(unbekannt %3d)"
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "Paket hat keine Eigentümer-/Gruppen-Liste\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "Paket weder Eigentümer- noch ID-Liste\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "Gruppe %s enthält keine Pakete\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "Keine Paket-Trigger %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "Missgebildet: %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "Kein Paket stimmt mit %s überein: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "Kein Paket benötigt %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr "Kein Paket empfiehlt %s\n"
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr "Kein Paket schlägt %s vor\n"
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr "Kein Paket erweitert %s\n"
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
-msgstr "Kein Paket bietet %s\n"
+msgstr "Kein Paket stellt %s bereit\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "Datei %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "Die Datei %s gehört zu keinem Paket\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "Ungültige Paket-Nummer: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
-msgstr "Eintrag %u konnte nicht gelesen werden\n"
+msgstr "Datensatz %u konnte nicht gelesen werden\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "Das Paket %s ist nicht installiert\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
-msgstr "Unbekannter Tag: \"%s\"\n"
+msgstr "Unbekannter Tag: »%s«\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 "%s: Import des Schlüssels %d fehlgeschlagen.\n"
 "\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
-msgstr "%s: Schlüssel %d nicht gesicherter öffentlicher Schlüssel.\n"
+msgstr "%s: Schlüssel %d ist kein gesicherter öffentlicher Schlüssel.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: Importieren fehlgeschlagen (%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
-"%s: Immuner Header-Bereich konnte nicht gelesen werden. Korruptes Paket?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NICHT OK"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (FEHLENDE SCHLÜSSEL:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (UNBESTÄTIGTE SCHLÜSSEL:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: Öffnen fehlgeschlagen: %s\n"
@@ -2483,228 +2853,454 @@ msgstr "%s: chroot-Verzeichnis nicht gesetzt\n"
 #: lib/rpmchroot.c:70
 #, c-format
 msgid "Unable to change root directory: %m\n"
-msgstr "Wechseln des Wurzel.Verzeichnis fehlgeschlagen: %m\n"
+msgstr "Wechseln des Wurzelverzeichnisses fehlgeschlagen: %m\n"
 
 #: lib/rpmchroot.c:95
 #, c-format
 msgid "Unable to restore root directory: %m\n"
-msgstr "Root-Verzeichnis kann nicht wiederhergestellt werden: %m\n"
+msgstr "Wurzelverzeichnis kann nicht wiederhergestellt werden: %m\n"
+
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "%d fehlende(r) Index(e), bitte warten...\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr "%s-Index kann nicht mittels %s geöffnet werden - %s (%d)\n"
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "Datenbank-Pfad wurde nicht gesetzt\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: wird übersprungen"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "Fehler(%d) beim Speichern des Datensatzes #%d in %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec fehlgeschlagen: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp fehlgeschlagen: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: wird übersprungen"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: Beschädigten Header #%u erhalten -- wird übersprungen.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: Header bei 0x%x kann nicht gelesen werden\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "Datenbank-Pfad wurde nicht gesetzt"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "Anlegen des Verzeichnisses %s fehlgeschlagen: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "Header #%u in der Datenbank ist ungültig -- wird übersprungen.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "Ursprünglicher Datensatz %u kann nicht hinzugefügt werden\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"Neu bauen der Datenbank fehlgeschlagen: Datenbank verbleibt entsprechend\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "Konnte die alte Datenbank nicht durch die neue ersetzen!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NEIN "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "JA"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr "PreReq:, Provides:, und Obsoletes: unterstützen Versionen."
+msgstr ""
+"»PreReq:«-, »Provides:«- und »Obsoletes:«-Abhängigkeiten unterstützen "
+"Versionen."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 "Dateiname(n) als (dirName,baseName,dirIndex)-Tupel gespeichert, nicht als "
 "Pfad."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "Paket-Nutzdaten können mit bzip2 komprimiert werden."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr "Paket-Nutzdaten können mit xz komprimiert werden."
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr "Paket-Nutzdaten können mit lzma komprimiert werden."
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
-msgstr "Dateien der Paket-Nutzdaten haben \"./\" als Präfix"
+msgstr "Dateien der Paket-Nutzdaten haben »./« als Präfix"
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr "Paket Name-Version-Release wird nicht unbedingt bereitgestellt."
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
 msgstr "Header-Tags werden immer nach dem Laden sortiert."
 
-#: lib/rpmds.c:961
+#: lib/rpmds.c:1249
 msgid "the scriptlet interpreter can use arguments from header."
 msgstr "Der Scriptlet-Interpreter kann Argumente aus dem Header benutzen."
 
-#: lib/rpmds.c:964
+#: lib/rpmds.c:1252
 msgid "a hardlink file set may be installed without being complete."
-msgstr ""
-"Eine harte Verlinkung kann auch ohne eine komplette Installation angelegt "
-"werden."
+msgstr "Eine harte Dateiverknüpfung ohne Ziel ist installierbar."
 
-#: lib/rpmds.c:967
+#: lib/rpmds.c:1255
 msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 "Paket-Scriptlets können während der Installation auf die RPM-Datenbank "
 "zugreifen."
 
-#: lib/rpmds.c:971
+#: lib/rpmds.c:1259
 msgid "internal support for lua scripts."
 msgstr "Interne Unterstützung für LUA-Scripte"
 
-#: lib/rpmds.c:975
+#: lib/rpmds.c:1263
 msgid "file digest algorithm is per package configurable"
 msgstr "Datei-Prüfsummen-Algorithmus ist pro Paket konfigurierbar"
 
-#: lib/rpmds.c:979
+#: lib/rpmds.c:1267
 msgid "support for POSIX.1e file capabilities"
 msgstr "Unterstützung für POSIX.1e-Dateifähigkeiten"
 
-#: lib/rpmds.c:983
+#: lib/rpmds.c:1271
 msgid "package scriptlets can be expanded at install time."
 msgstr "Paket-Scriptlets können während der Installation entpackt werden."
 
-#: lib/rpmds.c:986
+#: lib/rpmds.c:1274
 msgid "dependency comparison supports versions with tilde."
+msgstr "Abhängigkeitsvergleich unterstützt Versionen mit Tilde."
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "Dateien größer als 4 GB werden unterstützt"
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr "Name wird benötigt"
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Ungültige Magic"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Ungültiger oder unlesbarer Header"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Header zu groß"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "Datei ist zu groß für das Archiv"
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Unbekannter Datei-Typ"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "Fehlende Datei(en)"
+
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Prüfsummen stimmen nicht überein"
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Interner Fehler"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Archiv-Datei nicht im Header"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
+
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " fehlgeschlagen - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: (Fehler 0x%x)"
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "Öffnen von %s fehlgeschlagen: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: Kein RPM-Paket (oder Paket-Liste)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
-msgstr ""
-"Aktualisierung/ Installation...\n"
-"\n"
+msgstr "Aktualisierung/ Installation …\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
-msgstr "Aufräumen/ Entfernen...\n"
+msgstr "Aufräumen/ Entfernen …\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
-msgstr "Vorbereiten..."
+msgstr "Vorbereiten …"
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
-msgstr "Pakete vorbereiten..."
+msgstr "Pakete vorbereiten …"
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
-msgstr "Fehlgeschlagende Abhängigkeiten:\n"
+msgstr "Fehlgeschlagene Abhängigkeiten:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: Kein RPM-Paket (oder Paket-Liste): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s kann nicht installiert werden\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
-msgstr "Empfange %s\n"
+msgstr "%s wird geholt\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
-msgstr "überspringe %s - Übertragung fehlgeschlagen\n"
+msgstr "%s wird übersprungen - Übertragung fehlgeschlagen\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "Paket %s ist nicht verschiebbar\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "Fehler beim Lesen von Datei %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
-msgstr "\"%s\" bezeichnet mehrere Pakete:\n"
+msgstr "»%s« bezeichnet mehrere Pakete:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
-msgstr "Kann %s nicht öffnen: %s\n"
+msgstr "%s kann nicht geöffnet werden: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
-msgstr "Installiere %s\n"
+msgstr "%s wird installiert\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "ist kein RPM-Paket"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
-msgstr "Illegaler Signatur-Typ"
+msgstr "Ungültiger Signatur-Typ"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "nicht unterstützte RPM-Paket-Version"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "Lesen fehlgeschlagen: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "kein RPM-Paket\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
-msgstr ""
-"kann keine %s Blockierung auf %s (%s) erstellen\n"
-"\n"
+msgstr "%s-Sperre auf %s kann nicht erstellt werden (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
-msgstr "warte auf %s Blockierung auf %s\n"
+msgstr "Auf %s-Sperre auf %s wird gewartet\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
-msgstr "Dlopen %s %s fehlgeschlagen\n"
+msgstr "»dlopen« %s %s fehlgeschlagen\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
-msgstr "Auflösen des Symbols fehlgeschlagen %s: %s\n"
+msgstr "Auflösen des Symbols %s fehlgeschlagen: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr ""
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "Plugin %%__%s_%s ist nicht konfiguriert\n"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
-msgstr "Plugin %s nicht geladen\n"
-
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
+msgstr "Plugin %s ist nicht geladen\n"
 
 #: lib/rpmprob.c:109
 msgid "different"
@@ -2767,814 +3363,654 @@ msgstr "%s wird benötigt von %s%s"
 
 #: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
 msgid "(installed) "
-msgstr "(installiert) "
-
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
-msgstr "%s kollidiert mit %s%s"
-
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
-msgstr "%s wird ersetzt durch %s%s"
-
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
-msgstr "Unbekannter Fehler %d trat während dem Verarbeiten des Pakets %s auf"
-
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
-msgstr "Fehlender zweiter ':' bei %s:%d\n"
-
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
-msgstr "Fehlender Architektur-Name bei %s:%d\n"
-
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
-msgstr "Unvollständige Datenzeile bei %s:%d\n"
-
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
-msgstr "Zu viele Argumente in der Datenzeile bei %s:%d\n"
-
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr "Ungültige Architektur/Betriebssystem-Nummer: %s (%s:%d)\n"
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr "Unvollständige Standardzeile bei %s:%d\n"
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr "Zu viele Argumente in der Standardzeile bei %s:%d\n"
-
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "Fehlender ':' (0x%02x gefunden) bei %s:%d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "Fehlendes Argument für %s bei %s:%d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr "Kann %s bei %s:%d nicht öffnen: %m\n"
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "Fehlende Architektur für %s bei %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "Ungültige Option '%s' bei %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Unbekanntes System: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Bitte (in Englisch) %s kontaktieren\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Kann %s nicht zum Lesen öffnen: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "<lua>-Scriptlet-Unterstützung nicht eingebaut\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Konnte keine temporäre Datei erzeugen für %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Konnte Datei-Beschreiber nicht duplizieren: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "%s Scriptlet fehlgeschlagen, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s Scriptlet fehlgeschlagen, Signal %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "%s Scriptlet fehlgeschlagen, Beenden-Status %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Unbekanntes Format"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "installieren"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "löschen"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "Kann Paket-Datenbank in %s nicht öffnen\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "Zusätzliche '(' im Paket-Bezeichnung: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "Fehlende '(' im Paket-Label: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "Fehlende ')' im Paket-Bezeichung: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: Lesen des öffentlichen Schlüssels fehlgeschlagen.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "Transaktion"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh-Grösse(%d): UNGÜLTIG, lesen lieferte %d zurück\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh Magic: UNGÜLTIG\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh-Tags: UNGÜLTIG, Nummer der Tags (%d) ausserhalb des Bereichs\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh-Daten: UNGÜLTIG, Nummer der Bytes (%d) ausserhalb des Bereichs\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh-Blob(%d): UNGÜLTIG, lesen lieferte %d zurück\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh-Tag[%d]: UNGÜLTIG, Tag %d, Typ %d, Offset %d, Zähler %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh-Load: UNGÜLTIG\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh-Pad(%zd): UNGÜLTIG, lese %zd Byte\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd): UNGÜLTIG, fstat(2) fehlgeschlagen\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "Immuner Header-Bereich konnte nicht gelesen werden. Korruptes Paket?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5-Kurzfassung: "
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "SHA1-Kurzfassung des Headers: "
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Header "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "übersprungen"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "fehlgeschlagen"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "fehlend   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Unerfüllte Abhängigkeiten für %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "Fehlende { nach %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "Fehlende } nach %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "Leeres Tag-Format"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "Unbekannter Tag"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "Unbekannter Tag"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] erwartet am Ende des Arrays"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "Unerwartete ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "Unerwartete }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? im Ausdruck erwartet"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ nach dem ? im Ausdruck erwartet"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} im Ausdruck erwartet"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": erwartet ein ? im Unterausdruck"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ nach dem : im Ausdruck erwartet"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| am Ende des Ausdrucks erwartet"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "Zählvariable wird mit ungleich grossem Array benutzt"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "Generiere %d fehlende Index(e), bitte warten...\n"
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "Kann den %s-Index nicht öffnen, benutze db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "Kein Datenbank-Pfad wurde gesetzt\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: Überspringe"
+msgstr "(installiert) "
 
-#: lib/rpmdb.c:1318
+#: lib/rpmprob.c:163
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "Fehler(%d) beim Speichern des Eintrags #%d in %s\n"
+msgid "%s conflicts with %s%s"
+msgstr "%s kollidiert mit %s%s"
 
-#: lib/rpmdb.c:1415
+#: lib/rpmprob.c:167
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec fehlgeschlagen: %s\n"
+msgid "%s is obsoleted by %s%s"
+msgstr "%s wird ersetzt durch %s%s"
 
-#: lib/rpmdb.c:1596
+#: lib/rpmprob.c:172
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp fehlgeschlagen: %s\n"
+msgid "unknown error %d encountered while manipulating package %s"
+msgstr "Unbekannter Fehler %d trat während dem Verarbeiten des Pakets %s auf"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: Überspringe"
+#: lib/rpmrc.c:222
+#, c-format
+msgid "missing second ':' at %s:%d\n"
+msgstr "Fehlender zweiter »:« bei %s:%d\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:225
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: Beschädigten Header #%u erhalten -- überspringe.\n"
+msgid "missing architecture name at %s:%d\n"
+msgstr "Fehlender Architektur-Name bei %s:%d\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:370
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
+msgid "Incomplete data line at %s:%d\n"
+msgstr "Unvollständige Datenzeile bei %s:%d\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:375
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr ""
+msgid "Too many args in data line at %s:%d\n"
+msgstr "Zu viele Argumente in der Datenzeile bei %s:%d\n"
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:382
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr ""
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr "Ungültige Architektur-/Betriebssystem-Nummer: %s (%s:%d)\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:413
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: Kann den Header bei 0x%x nicht lesen\n"
+msgid "Incomplete default line at %s:%d\n"
+msgstr "Unvollständige Standardzeile bei %s:%d\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:418
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "Fehler(%d) beim Setzen von \"%s\"-Einträgen des %s-Indexes\n"
+msgid "Too many args in default line at %s:%d\n"
+msgstr "Zu viele Argumente in der Standardzeile bei %s:%d\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:523
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "Fehler(%d) beim Speichern des Eintrags \"%s\" in %s\n"
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "Fehlender »:« (0x%02x gefunden) bei %s:%d\n"
 
-#: lib/rpmdb.c:2477
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "Fehler(%d) beim Entfernen des Eintrags \"%s\" aus %s\n"
+msgid "missing argument for %s at %s:%d\n"
+msgstr "Fehlendes Argument für %s bei %s:%d\n"
 
-#: lib/rpmdb.c:2551
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "Fehler(%d) beim Reservieren einer neuen Paket-Instanz\n"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "%s bei %s:%d kann nicht geöffnet werden: %m\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "Fehler(%d) beim Lesen \"%s\"-Einträgen des %s-Indexes\n"
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "Fehlende Architektur für %s bei %s:%d\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "Fehler(%d) beim Speichern des Eintrags %s in %s\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "Ungültige Option »%s« bei %s:%d\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "Kein Datenbank-Pfad wurde gesetzt"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr ""
+"»Auxiliary vector« kann nicht gelesen werden, ist /proc nicht eingehängt?\n"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "Erzeugen des Verzeichnises %s fehlgeschlagen: %s\n"
+msgid "Unknown system: %s\n"
+msgstr "Unbekanntes System: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "Header #%u in der Datenbank ist ungültig -- überspringe.\n"
+msgid "Please contact %s\n"
+msgstr "Bitte (in Englisch) %s kontaktieren\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "Kann ursprünglichen Eintrag %u nicht hinzufügen\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "%s kann nicht zum Lesen geöffnet werden: %m.\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
-"Neu bauen der Datenbank fehlgeschlagen: Datenbank verbleibt entsprechend\n"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "Konnte die alte Datenbank nicht durch die neue ersetzen!\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmscript.c:138
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "Ersetze Dateien in %s mit Dateien aus %s für eine Wiederherstellung"
+msgid "Unable to restore current directory: %m"
+msgstr "Aktuelles Verzeichnis kann nicht wiederhergestellt werden: %m"
 
-#: lib/rpmdb.c:2960
-#, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "Entfernen des Verzeichnisses %s fehlgeschlagen: %s\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "<lua>-Scriptlet-Unterstützung nicht eingebaut\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmscript.c:278
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d-Fehler (%d) von %s: %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Temporäre Datei für %s konnte nicht angelegt werden: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmscript.c:313
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d-Fehler (%d): %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Datei-Deskriptor konnte nicht dupliziert werden: %s: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmscript.c:353
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "Keine %s-Sperre auf %s/%s\n"
+msgid "Fwrite failed: %s"
+msgstr "Fwrite fehlgeschlagen: %s"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "verteilt"
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "exklusiv"
-
-#: lib/backend/db3.c:582
+#: lib/rpmscript.c:371
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr ""
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s Scriptlet fehlgeschlagen, waitpid(%d) rc %d: %s\n"
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmscript.c:375
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "Unbekannte Datenbank-Option: \"%s\" ignoriert.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s Scriptlet fehlgeschlagen, Signal %d\n"
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmscript.c:378
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s hat einen ungültigen numerischen Wert, übersprungen\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s Scriptlet fehlgeschlagen, Beenden-Status %d\n"
+
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Unbekanntes Format"
+
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "installieren"
+
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "löschen"
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmts.c:100
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s hat einen zu grossen oder zu kleinen Wert, übersprungen\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "Paket-Datenbank in %s kann nicht geöffnet werden\n"
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmts.c:199
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s hat einen zu grossen oder zu kleinen Integer-Wert, übersprungen\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "Zusätzliche »(« in Paket-Bezeichnung: %s\n"
 
-#: plugins/sepolicy.c:218
+#: lib/rpmts.c:217
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr ""
+msgid "missing '(' in package label: %s\n"
+msgstr "Fehlende »(« in Paket-Bezeichnung: %s\n"
 
-#: plugins/sepolicy.c:225
+#: lib/rpmts.c:225
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr ""
+msgid "missing ')' in package label: %s\n"
+msgstr "Fehlende »)« in Paket-Bezeichnung: %s\n"
 
-#: plugins/sepolicy.c:231
+#: lib/rpmts.c:284
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr ""
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: Lesen des öffentlichen Schlüssels fehlgeschlagen.\n"
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr ""
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "Transaktion"
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:152
+#, c-format
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: plugins/sepolicy.c:306
+#: lib/rpmvs.c:158
 #, c-format
-msgid "Failed to begin policy transaction: %s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: plugins/sepolicy.c:337
+#: lib/rpmvs.c:178
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: plugins/sepolicy.c:386
+#: lib/rpmvs.c:188
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: lib/rpmvs.c:195
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to execute %s: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/rpmvs.c:268
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Header "
+
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Header der Signatur kann nicht erneut geladen werden.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "übersprungen"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "fehlgeschlagen"
+
+#: lib/verify.c:263
+#, c-format
+msgid "Duplicate username or UID for user %s\n"
+msgstr "Doppelter Benutzername oder Benutzer-ID für Benutzer %s\n"
+
+#: lib/verify.c:284
+#, c-format
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr "Doppelter Gruppenname oder Gruppen-ID für Gruppe %s\n"
+
+#: lib/verify.c:395
+msgid "no state"
+msgstr "kein Status"
+
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "unbekannter Status"
+
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "fehlend   %c %s"
+
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Unerfüllte Abhängigkeiten für %s:\n"
+
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktiv %d  leer %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(leer)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(leer)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Makro %%%s hat keinen terminierten Hauptteil\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Makro %%%s hat nicht terminierte Optionen\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Makro %%%s hat einen ungültigen Namen (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Makro %%%s hat einen nicht terminierten Hauptteil\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Makro %%%s hat keine terminierten Optionen\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Makro %%%s hat einen leeren Hauptteil\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "Makro %%%s benötigt Leerzeichen vor dem Hauptteil\n"
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Makro %%%s konnte nicht erweitert werden\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Makro %%%s hat einen ungültigen Namen (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Makro %%%s (%s) wurde nicht unter Level %d benutzt\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
+"Makro %%%s ist definiert, wird aber nicht innerhalb des Bereichs verwendet\n"
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Unbekannte Option %c in %s (%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
+"Zu viele Rekursionsebenen bei der Expansion des Makros. Dies wird "
+"wahrscheinlich durch eine rekursive Makro-Deklaration verursacht.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Nicht terminiertes %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
-msgstr "Ein %% ist gefolgt von einem nicht parsbaren Makro\n"
+msgstr "Auf %% folgt ein nicht auswertbares Makro\n"
+
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "Laden der Makro-Datei %s ist fehlgeschlagen"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktiv %d  leer %d\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "Fehler beim Erstellen der temporären Datei %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Datei %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Datei %s ist kleiner als %u Byte\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "Erzeugen des Verzeichnises fehlgeschlagen"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[kein]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(kein Fehler)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "Schwerwiegender Fehler: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "Fehler: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "Warnung: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
-msgstr "Ungültige Syntax in lua-Scriptlet: %s\n"
+msgstr "Ungültige Syntax in Lua-Scriptlet: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
-msgstr "Ungültige Syntax in lua-Script: %s\n"
+msgstr "Ungültige Syntax in Lua-Script: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
-msgstr "lua-Script fehlgeschlagen: %s\n"
+msgstr "Lua-Script fehlgeschlagen: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
-msgstr "Ungültige Syntax in lua-Datei: %s\n"
+msgstr "Ungültige Syntax in Lua-Datei: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
-msgstr "lua hook fehlgeschlagen: %s\n"
-
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr ""
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(kein Fehler)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "Schwerwiegender Fehler: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "Fehler: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "Warnung: "
+msgstr "Lua-Hook fehlgeschlagen: %s\n"
 
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "Speicherbelegung (%u Byte) lieferte NULL zurück.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, Schlüssel-ID %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
+msgstr "(keine)"
+
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite fehlgeschlagen: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: »fread« fehlgeschlagen: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush fehlgeschlagen: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
-msgstr ""
+msgstr "Nicht unterstützte PGP-Signatur\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
-msgstr ""
+msgstr "Nicht unterstützter PGP-Prüfsummenalgorithmus %u\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
-msgstr ""
+msgstr "Nicht unterstützter PGP-Algorithmus %u für öffentlichen Schlüssel\n"
+
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "%s konnte nicht ausgeführt werden: %s\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr "Fopen fehlgeschlagen\n"
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "In die Pipe konnte nicht geschrieben werden\n"
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Konnte kein Pipe zum Signieren erzeugen: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr "Aus Datei %s konnte nicht gelesen werden: %s\n"
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
-msgstr "GPG fehlgeschlagen (%d)\n"
+msgstr "Ausführung von GPG fehlgeschlagen (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "GPG konnte die Signatur nicht schreiben\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
-msgstr "Konnte die Signatur nicht lesen\n"
+msgstr "Signatur konnte nicht gelesen werden\n"
+
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMk Temp fehlgeschlagen\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead fehlgeschlagen: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature fehlgeschlagen: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: headerRead fehlgeschlagen: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "RPM-Pakete der Version 3 können nicht signiert werden\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s enthält bereits eine identische Signatur, wird übersprungen\n"
+
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature fehlgeschlagen: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead fehlgeschlagen: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
+msgstr "Ersetzen von %s fehlgeschlagen: %s\n"
+
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: Lesen der Paket-Liste fehlgeschlagen: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "Keine Überprüfung der Header- und Nutzdaten-Signatur"
index 4eb643396debae40769150e0a93f0525e877d276..76d02aed3301b64782d95fde3d8a294add54d105 100644 (file)
--- a/po/el.po
+++ b/po/el.po
@@ -3,15 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Duke_Dux <duke.dux@gmail.com>, 2011.
+# Duke_Dux <duke.dux@gmail.com>, 2011
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Greek (http://www.transifex.com/projects/p/rpm/language/el/)\n"
+"Language-Team: Greek (http://www.transifex.com/rpm-team/rpm/language/el/)\n"
 "Language: el\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,487 +46,549 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "δημιουργία μίας σωλήνωσης για --αποτυχία σωλήνωσης: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "αποτυχία εκτέλεσης\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "το όρισμα αυτό δεν είναι ένα RPM πακέτο\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "σφάλμα κατά την ανάγνωση της κεφαλίδας από το πακέτο\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "δεν γίνεται το επανάνοιγμα του ωφέλιμου φόρτου: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
 msgstr ""
 
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Επιλογές επαλήθευσης (με -V ή --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Επιλογές Εγκατάστασης/Αναβάθμισης/Διαγραφής:"
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
+msgstr ""
 
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Κοινές επιλογές για όλα τα εκτελέσιμα και τις λειτουργίες rpm:"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
+msgstr ""
 
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:125
-msgid "unexpected query flags"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
 msgstr ""
 
-#: rpmqv.c:128
-msgid "unexpected query format"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
 msgstr ""
 
-#: rpmqv.c:131
-msgid "unexpected query source"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
 msgstr ""
 
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
 
-#: rpmqv.c:161
+#: rpmbuild.c:167 rpmbuild.c:208
 msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
 
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
+#: rpmbuild.c:183
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
+msgid "<tarball>"
 msgstr ""
 
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
+#: rpmbuild.c:186
+msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
+#: rpmbuild.c:189
+msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
+#: rpmbuild.c:192
+#, c-format
+msgid "verify %files section from <tarball>"
 msgstr ""
 
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
+#: rpmbuild.c:195
+msgid "build source and binary packages from <tarball>"
 msgstr ""
 
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
+#: rpmbuild.c:198
+msgid "build binary package only from <tarball>"
 msgstr ""
 
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
+#: rpmbuild.c:201
+msgid "build source package only from <tarball>"
 msgstr ""
 
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
+#: rpmbuild.c:205
+msgid "build binary package from <source package>"
 msgstr ""
 
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
+#: rpmbuild.c:212
+msgid "override build root"
 msgstr ""
 
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:216
+msgid "remove build tree when done"
 msgstr ""
 
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
+#: rpmbuild.c:218
+msgid "ignore ExcludeArch: directives from spec file"
 msgstr ""
 
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
+#: rpmbuild.c:220
+msgid "debug file state machine"
 msgstr ""
 
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
+#: rpmbuild.c:222
+msgid "do not execute any stages of the build"
 msgstr ""
 
-#: rpmqv.c:256
-msgid "no packages given for erase"
+#: rpmbuild.c:224
+msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmqv.c:290
-msgid "no packages given for install"
+#: rpmbuild.c:226
+msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
+#: rpmbuild.c:230
+#, c-format
+msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmqv.c:314
-msgid "no arguments given for verify"
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
 msgstr ""
 
-#: rpmbuild.c:99
+#: rpmbuild.c:234
 #, c-format
-msgid "buildroot already specified, ignoring %s\n"
+msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
+#: rpmbuild.c:237
+msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
+#: rpmbuild.c:239
+msgid "remove sources when done"
 msgstr ""
 
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
+#: rpmbuild.c:241
+msgid "remove specfile when done"
 msgstr ""
 
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+#: rpmbuild.c:243
+msgid "skip straight to specified stage (only for c,i)"
+msgstr ""
+
+#: rpmbuild.c:245
+msgid "override target platform"
 msgstr ""
 
-#: rpmbuild.c:129
+#: rpmbuild.c:262
+msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
+msgstr ""
+
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Κοινές επιλογές για όλα τα εκτελέσιμα και τις λειτουργίες rpm:"
+
+#: rpmbuild.c:282
+msgid "Failed build dependencies:\n"
+msgstr ""
+
+#: rpmbuild.c:300
 #, c-format
-msgid "verify %files section from <specfile>"
+msgid "Unable to open spec file %s: %s\n"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
+#: rpmbuild.c:363
+#, c-format
+msgid "Failed to open tar pipe: %m\n"
 msgstr ""
 
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
 msgstr ""
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:389
+#, c-format
+msgid "Failed to read spec file from %s\n"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:401
 #, c-format
-msgid "build through %prep (unpack sources and apply patches) from <tarball>"
+msgid "Failed to rename %s to %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
-msgid "<tarball>"
+#: rpmbuild.c:479
+#, c-format
+msgid "failed to stat %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:145
-msgid "build through %build (%prep, then compile) from <tarball>"
+#: rpmbuild.c:483
+#, c-format
+msgid "File %s is not a regular file.\n"
 msgstr ""
 
-#: rpmbuild.c:148
-msgid "build through %install (%prep, %build, then install) from <tarball>"
+#: rpmbuild.c:490
+#, c-format
+msgid "File %s does not appear to be a specfile.\n"
 msgstr ""
 
-#: rpmbuild.c:151
+#: rpmbuild.c:556
 #, c-format
-msgid "verify %files section from <tarball>"
+msgid "Building target platforms: %s\n"
 msgstr ""
 
-#: rpmbuild.c:154
-msgid "build source and binary packages from <tarball>"
+#: rpmbuild.c:564
+#, c-format
+msgid "Building for target %s\n"
 msgstr ""
 
-#: rpmbuild.c:157
-msgid "build binary package only from <tarball>"
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
 msgstr ""
 
-#: rpmbuild.c:160
-msgid "build source package only from <tarball>"
+#: rpmdb.c:21
+msgid "initialize database"
 msgstr ""
 
-#: rpmbuild.c:164
-msgid "build binary package from <source package>"
+#: rpmdb.c:23
+msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
+#: rpmdb.c:26
+msgid "verify database files"
 msgstr ""
 
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
+#: rpmdb.c:28
+msgid "export database to stdout header list"
 msgstr ""
 
-#: rpmbuild.c:171
-msgid "override build root"
+#: rpmdb.c:31
+msgid "import database from stdin header list"
 msgstr ""
 
-#: rpmbuild.c:173
-msgid "remove build tree when done"
+#: rpmdb.c:38
+msgid "Database options:"
 msgstr ""
 
-#: rpmbuild.c:175
-msgid "ignore ExcludeArch: directives from spec file"
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
 msgstr ""
 
-#: rpmbuild.c:177
-msgid "debug file state machine"
+#: rpmkeys.c:20
+msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmbuild.c:179
-msgid "do not execute any stages of the build"
+#: rpmkeys.c:22
+msgid "import an armored public key"
 msgstr ""
 
-#: rpmbuild.c:181
-msgid "do not verify build dependencies"
+#: rpmkeys.c:24
+msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmbuild.c:183
-msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
+#: rpmkeys.c:27 rpmkeys.c:29
+msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmbuild.c:187
-#, c-format
-msgid "do not execute %clean stage of the build"
+#: rpmkeys.c:36
+msgid "Keyring options:"
 msgstr ""
 
-#: rpmbuild.c:189
-#, c-format
-msgid "do not execute %check stage of the build"
+#: rpmkeys.c:64 rpmsign.c:161
+msgid "no arguments given"
 msgstr ""
 
-#: rpmbuild.c:192
-msgid "do not accept i18N msgstr's from specfile"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
 msgstr ""
 
-#: rpmbuild.c:194
-msgid "remove sources when done"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
 msgstr ""
 
-#: rpmbuild.c:196
-msgid "remove specfile when done"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Επιλογές επαλήθευσης (με -V ή --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Επιλογές Εγκατάστασης/Αναβάθμισης/Διαγραφής:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
 msgstr ""
 
-#: rpmbuild.c:198
-msgid "skip straight to specified stage (only for c,i)"
+#: rpmqv.c:126
+msgid "unexpected query flags"
 msgstr ""
 
-#: rpmbuild.c:200 rpmspec.c:34
-msgid "override target platform"
+#: rpmqv.c:129
+msgid "unexpected query format"
 msgstr ""
 
-#: rpmbuild.c:217
-msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
+#: rpmqv.c:132
+msgid "unexpected query source"
 msgstr ""
 
-#: rpmbuild.c:237
-msgid "Failed build dependencies:\n"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
 msgstr ""
 
-#: rpmbuild.c:255
-#, c-format
-msgid "Unable to open spec file %s: %s\n"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
 msgstr ""
 
-#: rpmbuild.c:317
-#, c-format
-msgid "Failed to open tar pipe: %m\n"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
 msgstr ""
 
-#: rpmbuild.c:336
-#, c-format
-msgid "Failed to read spec file from %s\n"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
 
-#: rpmbuild.c:348
-#, c-format
-msgid "Failed to rename %s to %s: %m\n"
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
 msgstr ""
 
-#: rpmbuild.c:419
-#, c-format
-msgid "failed to stat %s: %m\n"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
 msgstr ""
 
-#: rpmbuild.c:423
-#, c-format
-msgid "File %s is not a regular file.\n"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmbuild.c:430
-#, c-format
-msgid "File %s does not appear to be a specfile.\n"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmbuild.c:496
-#, c-format
-msgid "Building target platforms: %s\n"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
 
-#: rpmbuild.c:504
-#, c-format
-msgid "Building for target %s\n"
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
 msgstr ""
 
-#: rpmdb.c:22
-msgid "initialize database"
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr ""
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
 msgstr ""
 
-#: rpmdb.c:24
-msgid "rebuild database inverted lists from installed package headers"
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmdb.c:27
-msgid "verify database files"
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
 msgstr ""
 
-#: rpmdb.c:33
-msgid "Database options:"
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
 msgstr ""
 
-#: rpmkeys.c:24
-msgid "verify package signature(s)"
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
 msgstr ""
 
-#: rpmkeys.c:26
-msgid "import an armored public key"
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmkeys.c:28
-msgid "don't import, but tell if it would work or not"
+#: rpmqv.c:258
+msgid "no packages given for erase"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
-msgid "list keys from RPM keyring"
+#: rpmqv.c:292
+msgid "no packages given for install"
 msgstr ""
 
-#: rpmkeys.c:40
-msgid "Keyring options:"
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
-msgid "no arguments given"
+#: rpmqv.c:318
+msgid "no arguments given for verify"
 msgstr ""
 
-#: rpmsign.c:25
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr ""
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
+#: rpmsign.c:37
+msgid "sign package(s) files"
 msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
+#: rpmsign.c:39
+msgid "use file signing key <key>"
 msgstr ""
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
 msgstr ""
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
+#: rpmsign.c:49
+msgid "Signature options:"
 msgstr ""
 
-#: rpmsign.c:117
+#: rpmsign.c:101
 #, c-format
-msgid "Pass phrase is good.\n"
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr ""
 
-#: rpmsign.c:123
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr ""
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -535,473 +597,546 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr ""
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr ""
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr ""
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
 "RPM build errors:\n"
 msgstr ""
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr ""
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr ""
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr ""
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr ""
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr ""
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr ""
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr ""
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr ""
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr ""
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr ""
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr ""
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr ""
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr ""
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr ""
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr ""
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr ""
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
-#, c-format
-msgid "Bad file: %s: %s\n"
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2039 build/parsePrep.c:33
+#: build/files.c:2657
 #, c-format
-msgid "Bad owner/group: %s\n"
+msgid "Bad file: %s: %s\n"
 msgstr ""
 
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
 msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
 msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr ""
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr ""
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:434
 #, c-format
-msgid "Could not open %s: %s\n"
+msgid "Failed to read %jd bytes in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:452
-#, c-format
-msgid "Unable to write package: %s\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:468
+#: build/pack.c:453
 #, c-format
-msgid "Unable to open sigtarget %s: %s\n"
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:479
+#: build/pack.c:520
 #, c-format
-msgid "Unable to read header from %s: %s\n"
+msgid "Could not open %s: %s\n"
 msgstr ""
 
-#: build/pack.c:489
+#: build/pack.c:527
 #, c-format
-msgid "Unable to write header to %s: %s\n"
+msgid "Unable to write package: %s\n"
 msgstr ""
 
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr ""
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr ""
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr ""
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
+#: build/parseFiles.c:33
 #, c-format
-msgid "line %d: Second description\n"
+msgid "line %d: Error parsing %%files: %s\n"
 msgstr ""
 
-#: build/parseFiles.c:33
+#: build/parseFiles.c:73
 #, c-format
-msgid "line %d: Error parsing %%files: %s\n"
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
@@ -1009,341 +1144,410 @@ msgstr ""
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr ""
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr ""
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr ""
@@ -1414,450 +1618,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr ""
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
 msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
 msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
 msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Το μέγεθος της κεφαλίδας είναι πολύ μεγάλο"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Άγνωστος τύπος αρχείου"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:810
+msgid "shared"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Εσωτερικό σφάλμα"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
 msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr ""
 
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
+#: lib/formats.c:44
+msgid "(not a string)"
 msgstr ""
 
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
 msgstr ""
 
-#: lib/formats.c:314
-msgid "(not base64)"
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
+#: lib/formats.c:253
+msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr ""
+
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
+msgid "unknown tag: \"%s\""
 msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr ""
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr ""
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr ""
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr ""
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr ""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr ""
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
 msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr ""
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr ""
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr ""
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr ""
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr ""
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1878,1620 +2193,1735 @@ msgstr ""
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr ""
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr ""
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr ""
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr ""
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr ""
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr ""
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr ""
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr ""
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr ""
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr ""
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr ""
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr ""
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr ""
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr ""
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr ""
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr ""
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr ""
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/poptQV.c:176
+#: lib/poptQV.c:197
 msgid "list all license files"
 msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+msgid "list all artifact files"
+msgstr ""
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr ""
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr ""
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr ""
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr ""
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr ""
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr ""
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr ""
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr ""
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr ""
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr ""
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr ""
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr ""
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr ""
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr ""
 
-#: lib/query.c:172
-msgid "wrong color   "
+#: lib/query.c:173
+msgid "wrong color   "
+msgstr ""
+
+#: lib/query.c:176
+msgid "(no state)    "
+msgstr ""
+
+#: lib/query.c:179
+#, c-format
+msgid "(unknown %3d) "
+msgstr ""
+
+#: lib/query.c:199
+msgid "package has not file owner/group lists\n"
+msgstr ""
+
+#: lib/query.c:233
+msgid "package has neither file owner or id lists\n"
+msgstr ""
+
+#: lib/query.c:321
+#, c-format
+msgid "group %s does not contain any packages\n"
+msgstr ""
+
+#: lib/query.c:328
+#, c-format
+msgid "no package triggers %s\n"
+msgstr ""
+
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
+#, c-format
+msgid "malformed %s: %s\n"
+msgstr ""
+
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
+#, c-format
+msgid "no package matches %s: %s\n"
+msgstr ""
+
+#: lib/query.c:387
+#, c-format
+msgid "no package requires %s\n"
+msgstr ""
+
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
+#, c-format
+msgid "no package provides %s\n"
+msgstr ""
+
+#: lib/query.c:455
+#, c-format
+msgid "file %s: %s\n"
+msgstr ""
+
+#: lib/query.c:458
+#, c-format
+msgid "file %s is not owned by any package\n"
+msgstr ""
+
+#: lib/query.c:469
+#, c-format
+msgid "invalid package number: %s\n"
+msgstr ""
+
+#: lib/query.c:476
+#, c-format
+msgid "record %u could not be read\n"
+msgstr ""
+
+#: lib/query.c:491 lib/rpminstall.c:690
+#, c-format
+msgid "package %s is not installed\n"
+msgstr ""
+
+#: lib/query.c:525
+#, c-format
+msgid "unknown tag: \"%s\"\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
+#, c-format
+msgid "%s: key %d import failed.\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:66
+#, c-format
+msgid "%s: key %d not an armored public key.\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:111
+#, c-format
+msgid "%s: import read failed(%d).\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:131
+#, c-format
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/query.c:175
-msgid "(no state)    "
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/query.c:178
-#, c-format
-msgid "(unknown %3d) "
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/query.c:198
-msgid "package has not file owner/group lists\n"
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
 
-#: lib/query.c:229
-msgid "package has neither file owner or id lists\n"
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/query.c:318
-#, c-format
-msgid "group %s does not contain any packages\n"
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
 msgstr ""
 
-#: lib/query.c:325
-#, c-format
-msgid "no package triggers %s\n"
+#: lib/rpmchecksig.c:268
+msgid "OK"
 msgstr ""
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
-msgid "malformed %s: %s\n"
+msgid "%s: open failed: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/rpmchroot.c:43
 #, c-format
-msgid "no package matches %s: %s\n"
+msgid "Unable to open current directory: %m\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
 #, c-format
-msgid "no package requires %s\n"
+msgid "%s: chroot directory not set\n"
 msgstr ""
 
-#: lib/query.c:392
+#: lib/rpmchroot.c:70
 #, c-format
-msgid "no package provides %s\n"
+msgid "Unable to change root directory: %m\n"
 msgstr ""
 
-#: lib/query.c:424
+#: lib/rpmchroot.c:95
 #, c-format
-msgid "file %s: %s\n"
+msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/query.c:427
+#: lib/rpmdb.c:72
 #, c-format
-msgid "file %s is not owned by any package\n"
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/query.c:438
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
 #, c-format
-msgid "invalid package number: %s\n"
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/query.c:445
-#, c-format
-msgid "record %u could not be read\n"
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
-#, c-format
-msgid "package %s is not installed\n"
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
 msgstr ""
 
-#: lib/query.c:492
+#: lib/rpmdb.c:988
 #, c-format
-msgid "unknown tag: \"%s\"\n"
+msgid "error(%d) storing record #%d into %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmdb.c:1100
 #, c-format
-msgid "%s: key %d import failed.\n"
+msgid "%s: regexec failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmdb.c:1281
 #, c-format
-msgid "%s: key %d not an armored public key.\n"
+msgid "%s: regcomp failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
-#, c-format
-msgid "%s: import read failed(%d).\n"
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmdb.c:1531
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
+#: lib/rpmdb.c:2061
 #, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+msgid "%s: cannot read header at 0x%x\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "OK"
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ") "
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:393
-msgid ")"
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmdb.c:2520
 #, c-format
-msgid "%s: open failed: %s\n"
+msgid "failed to create directory %s: %s\n"
 msgstr ""
 
-#: lib/rpmchroot.c:43
+#: lib/rpmdb.c:2557
 #, c-format
-msgid "Unable to open current directory: %m\n"
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
+#: lib/rpmdb.c:2572
 #, c-format
-msgid "%s: chroot directory not set\n"
+msgid "cannot add record originally at %u\n"
 msgstr ""
 
-#: lib/rpmchroot.c:70
-#, c-format
-msgid "Unable to change root directory: %m\n"
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
 msgstr ""
 
-#: lib/rpmchroot.c:95
-#, c-format
-msgid "Unable to restore root directory: %m\n"
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr ""
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr ""
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr ""
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
 msgstr ""
 
-#: lib/rpmds.c:961
+#: lib/rpmds.c:1249
 msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmds.c:964
+#: lib/rpmds.c:1252
 msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpmds.c:967
+#: lib/rpmds.c:1255
 msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpmds.c:971
+#: lib/rpmds.c:1259
 msgid "internal support for lua scripts."
 msgstr ""
 
-#: lib/rpmds.c:975
+#: lib/rpmds.c:1263
 msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmds.c:979
+#: lib/rpmds.c:1267
 msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmds.c:983
+#: lib/rpmds.c:1271
 msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmds.c:986
+#: lib/rpmds.c:1274
 msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmgi.c:136
-#, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpminstall.c:141
-#, c-format
-msgid "Updating / installing...\n"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpmds.c:1410
 #, c-format
-msgid "Cleaning up / removing...\n"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpmds.c:1544
 #, c-format
-msgid "package %s is not relocatable\n"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpminstall.c:706
+#: lib/rpmfi.c:810
 #, c-format
-msgid "Installing %s\n"
-msgstr ""
-
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
-msgstr ""
-
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
-msgstr ""
-
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmlead.c:123
+#: lib/rpmfi.c:817
 #, c-format
-msgid "read failed: %s (%d)\n"
-msgstr ""
-
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "can't create %s lock on %s (%s)\n"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "waiting for %s lock on %s\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
 msgstr ""
 
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr ""
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Το μέγεθος της κεφαλίδας είναι πολύ μεγάλο"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Άγνωστος τύπος αρχείου"
 
-#: lib/rpmprob.c:109
-msgid "different"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Εσωτερικό σφάλμα"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
+#: lib/rpmfi.c:2389
+msgid " failed - "
 msgstr ""
 
-#: lib/rpmprob.c:130
+#: lib/rpmfi.c:2392
 #, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmprob.c:135
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+msgid "open of %s failed: %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:140
+#: lib/rpmgi.c:144
 #, c-format
-msgid "package %s (which is newer than %s) is already installed"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:145
+#: lib/rpmgi.c:155
 #, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmprob.c:155
+#: lib/rpminstall.c:142
 #, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpmprob.c:159
+#: lib/rpminstall.c:144
 #, c-format
-msgid "%s is needed by %s%s"
+msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
+#: lib/rpminstall.c:193
+msgid "Preparing..."
 msgstr ""
 
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpmprob.c:172
+#: lib/rpminstall.c:323
 #, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:194
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "missing second ':' at %s:%d\n"
+msgid "%s cannot be installed\n"
 msgstr ""
 
-#: lib/rpmrc.c:197
+#: lib/rpminstall.c:490
 #, c-format
-msgid "missing architecture name at %s:%d\n"
+msgid "Retrieving %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:342
+#: lib/rpminstall.c:502
 #, c-format
-msgid "Incomplete data line at %s:%d\n"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpmrc.c:347
+#: lib/rpminstall.c:572
 #, c-format
-msgid "Too many args in data line at %s:%d\n"
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpmrc.c:354
+#: lib/rpminstall.c:603
 #, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+msgid "error reading from file %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:385
+#: lib/rpminstall.c:697
 #, c-format
-msgid "Incomplete default line at %s:%d\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpmrc.c:390
+#: lib/rpminstall.c:736
 #, c-format
-msgid "Too many args in default line at %s:%d\n"
+msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:495
+#: lib/rpminstall.c:742
 #, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgid "Installing %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
 msgstr ""
 
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/rpmrc.c:603
+#: lib/rpmlead.c:118
 #, c-format
-msgid "bad option '%s' at %s:%d\n"
+msgid "read failed: %s (%d)\n"
 msgstr ""
 
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/rpmrc.c:1349
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
-msgid "Unknown system: %s\n"
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmrc.c:1350
+#: lib/rpmlock.c:133
 #, c-format
-msgid "Please contact %s\n"
+msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:1591
+#: lib/rpmplugins.c:65
 #, c-format
-msgid "Unable to open %s for reading: %m.\n"
+msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:75
+#: lib/rpmplugins.c:73
 #, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:221
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmscript.c:248
+#: lib/rpmplugins.c:199
 #, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+#: lib/rpmprob.c:109
+msgid "different"
 msgstr ""
 
-#: lib/rpmscript.c:276
+#: lib/rpmprob.c:114
 #, c-format
-msgid "%s scriptlet failed, signal %d\n"
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/rpmscript.c:279
+#: lib/rpmprob.c:118
 #, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/rpmte.c:869
-msgid "erase"
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
 msgstr ""
 
-#: lib/rpmts.c:92
+#: lib/rpmprob.c:125
 #, c-format
-msgid "cannot open Packages database in %s\n"
+msgid "path %s in package %s is not relocatable"
 msgstr ""
 
-#: lib/rpmts.c:191
+#: lib/rpmprob.c:130
 #, c-format
-msgid "extra '(' in package label: %s\n"
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/rpmts.c:209
+#: lib/rpmprob.c:135
 #, c-format
-msgid "missing '(' in package label: %s\n"
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/rpmts.c:217
+#: lib/rpmprob.c:140
 #, c-format
-msgid "missing ')' in package label: %s\n"
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/rpmts.c:273
+#: lib/rpmprob.c:145
 #, c-format
-msgid "%s: reading of public key failed.\n"
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/rpmts.c:1087
-msgid "transaction"
+#: lib/rpmprob.c:155
+#, c-format
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/signature.c:90
+#: lib/rpmprob.c:159
 #, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
+msgid "%s is needed by %s%s"
 msgstr ""
 
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
 msgstr ""
 
-#: lib/signature.c:101
+#: lib/rpmprob.c:163
 #, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/signature.c:107
+#: lib/rpmprob.c:167
 #, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+msgid "%s is obsoleted by %s%s"
 msgstr ""
 
-#: lib/signature.c:123
+#: lib/rpmprob.c:172
 #, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
+msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 
-#: lib/signature.c:196
+#: lib/rpmrc.c:222
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "missing second ':' at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
+#: lib/rpmrc.c:225
+#, c-format
+msgid "missing architecture name at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:219
+#: lib/rpmrc.c:370
 #, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+msgid "Incomplete data line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpmrc.c:375
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
+msgid "Too many args in data line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmrc.c:382
+#, c-format
+msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr ""
 
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+#: lib/rpmrc.c:413
+#, c-format
+msgid "Incomplete default line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:489
-msgid "Header "
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:530
+#: lib/rpmrc.c:551
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "skipped"
+#: lib/rpmrc.c:564
+#, c-format
+msgid "missing architecture for %s at %s:%d\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "failed"
+#: lib/rpmrc.c:632
+#, c-format
+msgid "bad option '%s' at %s:%d\n"
 msgstr ""
 
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
+msgid "Unknown system: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:336
-msgid "invalid field width"
+#: lib/rpmrc.c:1471
+#, c-format
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:342
-msgid "missing { after %"
+#: lib/rpmrc.c:1604
+#, c-format
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/headerfmt.c:375
-msgid "empty tag format"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/headerfmt.c:386
-msgid "empty tag name"
+#: lib/rpmscript.c:138
+#, c-format
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/headerfmt.c:393
-msgid "unknown tag"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
+#: lib/rpmscript.c:278
+#, c-format
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
+#: lib/rpmscript.c:313
+#, c-format
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:435
-msgid "unexpected }"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
 msgstr ""
 
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
+#: lib/rpmscript.c:371
+#, c-format
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
+#: lib/rpmscript.c:375
+#, c-format
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
+#: lib/rpmscript.c:378
+#, c-format
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
 msgstr ""
 
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
 
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
+#: lib/rpmte.c:730
+msgid "erase"
 msgstr ""
 
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
+#: lib/rpmts.c:100
+#, c-format
+msgid "cannot open Packages database in %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:97
+#: lib/rpmts.c:199
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:191
+#: lib/rpmts.c:217
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:516
+#: lib/rpmts.c:225
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmvs.c:152
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmvs.c:158
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmvs.c:188
+#, c-format
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmvs.c:195
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmvs.c:206
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmvs.c:261
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmvs.c:268
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
+msgid "%s%s"
 msgstr ""
 
-#: lib/rpmdb.c:2448
-#, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: lib/rpmdb.c:2644
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
 msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: lib/rpmdb.c:2875
-#, c-format
-msgid "failed to create directory %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/verify.c:263
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/verify.c:284
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/verify.c:448
 #, c-format
-msgid "replace files in %s with files from %s to recover"
+msgid "missing   %c %s"
 msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/verify.c:503
 #, c-format
-msgid "failed to remove directory %s: %s\n"
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: lib/backend/db3.c:33
+#: plugins/prioreset.c:29
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: lib/backend/db3.c:36
+#: plugins/prioreset.c:40
 #, c-format
-msgid "db%d error(%d): %s\n"
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
 
-#: lib/backend/db3.c:500
-#, c-format
-msgid "cannot get %s lock on %s/%s\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
+#: rpmio/digest_nss.c:79
+#, c-format
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
+#: rpmio/macro.c:286
+#, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr ""
 
-#: lib/backend/db3.c:582
+#: rpmio/macro.c:316
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%3d<%*s(empty)\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: rpmio/macro.c:483
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: rpmio/macro.c:551
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: rpmio/macro.c:557
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: rpmio/macro.c:562
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "Macro %%%s needs whitespace before body\n"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: rpmio/macro.c:566
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "Macro %%%s failed to expand\n"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: rpmio/macro.c:607
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: rpmio/macro.c:637
+#, c-format
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: rpmio/macro.c:761
+#, c-format
+msgid "Unknown option %c in %s(%s)\n"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: rpmio/macro.c:1055
+msgid ""
+"Too many levels of recursion in macro expansion. It is likely caused by "
+"recursive macro declaration.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:337
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:386
+#: rpmio/macro.c:1182
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: rpmio/macro.c:1197
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "failed to load macro file %s"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: rpmio/macro.c:1578
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "======================== active %d empty %d\n"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: rpmio/rpmfileutil.c:258
 #, c-format
-msgid "Failed to execute %s: %s\n"
+msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "File %s: %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: rpmio/rpmfileutil.c:332
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: rpmio/rpmlog.c:194
+msgid "error: "
 msgstr ""
 
-#: plugins/sepolicy.c:594
-#, c-format
-msgid "Failed to extract policy from %s\n"
+#: rpmio/rpmlog.c:195
+msgid "warning: "
 msgstr ""
 
-#: rpmio/macro.c:185
+#: rpmio/rpmlua.c:523
 #, c-format
-msgid "======================== active %d empty %d\n"
+msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/rpmlua.c:541
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:364
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
-msgid "%3d<%*s(empty)\n"
+msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/rpmlua.c:560
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/rpmlua.c:756
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/rpmmalloc.c:25
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
 #, c-format
-msgid "Macro %%%s has empty body\n"
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/rpmpgp.c:1127
 #, c-format
-msgid "Macro %%%s failed to expand\n"
+msgid "V%d %s/%s %s, key ID %s"
 msgstr ""
 
-#: rpmio/macro.c:649
-#, c-format
-msgid "Macro %%%s has illegal name (%%undefine)\n"
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/rpmsq.c:37
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "exiting on signal %d from pid %d\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: sign/rpmgensig.c:54
 #, c-format
-msgid "Unknown option %c in %s(%s)\n"
+msgid "error creating temp directory %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1048
-msgid ""
-"Too many levels of recursion in macro expansion. It is likely caused by "
-"recursive macro declaration.\n"
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "Unterminated %c: %s\n"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: sign/rpmgensig.c:91
 #, c-format
-msgid "A %% is followed by an unparseable macro\n"
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: sign/rpmgensig.c:167
 #, c-format
-msgid "error creating temporary file %s: %m\n"
+msgid "%s: Fwrite failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: sign/rpmgensig.c:173
 #, c-format
-msgid "File %s: %s\n"
+msgid "%s: Fread failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:319
+#: sign/rpmgensig.c:177
 #, c-format
-msgid "File %s is smaller than %u bytes\n"
+msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: sign/rpmgensig.c:202
+msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: sign/rpmgensig.c:208
 #, c-format
-msgid "invalid syntax in lua scriptlet: %s\n"
+msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: sign/rpmgensig.c:221
 #, c-format
-msgid "invalid syntax in lua script: %s\n"
+msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "lua script failed: %s\n"
+msgid "Could not exec %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
-#, c-format
-msgid "invalid syntax in lua file: %s\n"
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "lua hook failed: %s\n"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: sign/rpmgensig.c:312
+#, c-format
+msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
+#: sign/rpmgensig.c:354
+msgid "gpg failed to write signature\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
+#: sign/rpmgensig.c:371
+msgid "unable to read the signature\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
 msgstr ""
 
-#: rpmio/rpmmalloc.c:25
-#, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1008
-#, c-format
-msgid "V%d %s/%s %s, key ID %s"
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
+msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
-#, c-format
-msgid "%s: Fwrite failed: %s\n"
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s: Fflush failed: %s\n"
+msgid "%s already contains identical file signatures\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
-msgid "Unsupported PGP signature\n"
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "Unsupported PGP hash algorithm %u\n"
+msgid "%s: rpmReadSignature failed: %s"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:689
 #, c-format
-msgid "Unsupported PGP pubkey algorithm %u\n"
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:722
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "%s already contains identical signature, skipping\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
-msgid "gpg exec failed (%d)\n"
+msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
-msgid "gpg failed to write signature\n"
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:263
-msgid "unable to read the signature\n"
+#: sign/rpmgensig.c:812
+#, c-format
+msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
-msgid "rpmMkTemp failed\n"
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
-#, c-format
-msgid "%s already contains identical signature, skipping\n"
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
 msgstr ""
 
-#: sign/rpmgensig.c:525
-#, c-format
-msgid "%s: writeLead failed: %s\n"
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:531
-#, c-format
-msgid "%s: rpmWriteSignature failed: %s\n"
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:545
-#, c-format
-msgid "replacing %s failed: %s\n"
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index c8ba14a6e2f9c0f623be16a90f2794ecd2e1602b..b7deda7a23ce6bd2e3c5d37290a743a066f1cafd 100644 (file)
--- a/po/eo.po
+++ b/po/eo.po
@@ -3,16 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Keith Bowes <zooplah@gmail.com>, 2013.
-# Keith <zooplah@gmail.com>, 2011.
+# Keith Bowes <zooplah@gmail.com>, 2011,2013
+# Keith Bowes <zooplah@gmail.com>, 2011
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2013-01-13 06:09+0000\n"
-"Last-Translator: Keith Bowes <zooplah@gmail.com>\n"
-"Language-Team: Esperanto (http://www.transifex.com/projects/p/rpm/language/"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: Esperanto (http://www.transifex.com/rpm-team/rpm/language/"
 "eo/)\n"
 "Language: eo\n"
 "MIME-Version: 1.0\n"
@@ -48,500 +48,565 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "krei pipon por --pipe malsukcesis: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "plenumo malsukcesis\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
-msgstr "parametro ne estas RPM-pako\n"
+msgstr "parametro ne estas RPM-pako\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
-msgstr "eraro dum legi kapon de pako\n"
+msgstr "eraro dum legi kapon de pako\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "ne eblas remalfermi ŝarĝon: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Elektoj por mendu/konstatu elektitan pakon:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Mendantaj elektoj (kun -q aŭ --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Konstatantaj elektoj (kun -V aŭ --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Elektoj por instali/promocii/forigi:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Kutimaj elektoj por ĉiuj rpm-aj reĝimoj kaj programoj:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "unu tipon de mendu/konstatu oni rajtas fari je fojo"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "neatenditaj mendo-flagoj"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "neatendita mendo-aranĝo"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "neatendita mendo-fonto"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "nur unu ĉefa reĝimo povas esti specifita"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "nur instalado kaj promociado povas esti devigita"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "dosieroj nur povas esti relokitaj dum pako-instalado"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "--prefix malkongruas kun --relocate kaj - -excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate kaj --excludepath povas esti uzata nur dum instali novajn pakojn"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix povas esti uzata nur dum instali novajn pakojn"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "parametroj de --prefix devas komenciĝi per /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr "--hash (-h) nur eblas dum pakaĵa instalado aŭ forigado"
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr "--percent nur eblas dum pakaĵa instalado aŭ forigado"
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "oni povas specifi la parametron --replacepkgs nur dum pako-instalado"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "oni povas specifi la parametron --excludedocs nur dum pako-instalado"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "oni povas specifi la parametron --includedocs nur dum pako-instalado"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "oni ne rajtas kune uzi la parametrojn --excludedocs kaj --includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "oni povas specifi la parametron --ignorearch nur dum pako-instalado"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "oni povas specifi la parametron --ignoreos nur dum pako-instalado"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "oni povas specifi la parametron --ignoresize nur dum pako-instalado"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "oni povas specifi la parametron --hash (-h) nur dum pako-forviŝado"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "oni povas specifi la parametron --allfiles nur dum pako-instalado"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"oni povas specifi la parametron --justdb nur dum instalado kaj forviŝado de "
-"pako"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"oni povas uzi parametrojn por malaktivigi programetojn nur dum instalado kaj "
-"forviŝado de pako"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"oni povas uzi parametrojn por malaktivigi instigilojn nur dum instalado kaj "
-"forviŝado de pako"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-"oni povas specifi la parametron --nodeps nur dum instalado, konstatado kaj "
-"forviŝado de pako"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-"oni povas specifi la parametron --hash (-h) nur dum instalado kaj forviŝado "
-"de pako"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "argumentoj de --root (-r) devas komenciĝi per /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "neniuj pakoj donitaj por forigi"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "neniuj pakoj donitaj por instali"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "neniuj parametroj donitaj por mendi"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "neniuj argumentoj donitaj por konstati"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot jam specifita, %s ignorata\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr "munti per %prep (elpaki fontotekstojn kaj fliki) laŭ <spec-dosiero>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<spec-dosiero>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "munti per %build (%prep, tiam traduki) laŭ <spec-dosiero>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr "munti per %install (%prep, %build, tiam instali) laŭ <spec-dosiero>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "konstati la sekcion %file laŭ <spec-dosiero>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
-msgstr "munti fontotekstan kaj plenumeblan pakojn laŭ <spec-dosiero>"
+msgstr "munti fontotekstan kaj plenumeblan pakojn laŭ <spec-dosiero>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
-msgstr "munti nur plenumeblan pakon laŭ <spec-dosiero>"
+msgstr "munti nur plenumeblan pakon laŭ <spec-dosiero>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
-msgstr "munti nur fontotekstan pakon laŭ <spec-dosiero>"
+msgstr "munti nur fontotekstan pakon laŭ <spec-dosiero>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+"muntado per %prep (malpaki fontotekstojn kaj apliki flikaĵojn) laŭ "
+"<fontoteksta pakaĵo>"
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<fontoteksta pakaĵo>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr "munti per %build (%prep, poste traduki) laŭ <fontoteskta pakaĵo>"
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"munti per %install (%prep, %build, tiam instali) laŭ <fontoteksta pakaĵo>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr "konstati sekcion %files laŭ <fontoteksta pakaĵo>"
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr "munti fontotekstajn kaj plenumeblajn pakaĵojn laŭ <fontoteksta pakaĵo>"
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr "munti nur plenumeblan pakaĵon laŭ <fontoteksta pakaĵo>"
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr "munti nur fontotekstan pakaĵon laŭ <fontoteksta pakaĵo>"
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr "munti per %prep (elpaki fontotekstojn kaj fliki) laŭ <tar-dosiero>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tar-dosiero>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "munti per %build (%prep, tiam traduki) laŭ <tar-dosiero>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "munti per %install (%prep, %build, tiam instali) laŭ <tar-dosiero>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "konstati sekcion %files laŭ <tar-dosiero>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
-msgstr "munti fontotekstan kaj plenumeblan pakojn laŭ <tar-dosiero>"
+msgstr "munti fontotekstan kaj plenumeblan pakojn laŭ <tar-dosiero>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
-msgstr "munti nur plenumeblan pakon laŭ <tar-dosiero>"
+msgstr "munti nur plenumeblan pakon laŭ <tar-dosiero>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
-msgstr "munti nur fontotekstan pakon laŭ <tar-dosiero>"
+msgstr "munti nur fontotekstan pakon laŭ <tar-dosiero>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
-msgstr "munti plenumeblan pakon laŭ <fontoteksta pako>"
-
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<fontoteksta pako>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"munti per %install (%prep, %build, tiam instali) laŭ <fontoteksta pako>"
+msgstr "munti plenumeblan pakaĵon laŭ <fontoteksta pakaĵo>"
 
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "superregi muntan radikon"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr "plenumi muntaĵon en la nuna dosierujo"
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "forigi muntan arbon post finita"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
-msgstr "ignoru la direktivojn ExcludeArch: el spec-dosiero"
+msgstr "ignori la direktivojn ExcludeArch: el spec-dosiero"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "senerarigi dosierstatan maŝinon"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
-msgstr "ne plenumigu iun ajn etapon de la muntado"
+msgstr "ne plenumigi iun ajn etapon de la muntado"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
-msgstr "ne konstatu muntaĵo-dependaĵojn"
+msgstr "ne konstati muntaĵo-dependaĵojn"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
-msgstr "generu pako-kapo(j)n kongrua(j)n kun (malmoderna) pakado de rpm 3"
+msgstr "generi pakaĵo-kapo(j)n kongrua(j)n kun (malmoderna) pakado de rpm 3"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr "ne plenumigi la etapon %clean por la muntado"
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr "Ne plenumigu stadion %prep de la munto"
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr "ne plenumigi la etapon %check por la muntado"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
-msgstr "ne akceptu tradukojn el spec-dosiero"
+msgstr "ne akcepti tradukojn el spec-dosiero"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "forigi fontotekstojn post kiam finita"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "forigi spec-dosieron post kiam finita"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "preterlasi rekte al specifita etapo (nur por c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "superregi celan platformon"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
-"Multaj elektoj je [ <spec-dosiero> |  <tar-dosiero> | <fontoteksta pako> ]:"
+"Multaj elektoj je [ <spec-dosiero> |  <tar-dosiero> | <fontoteksta pako> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Kutimaj elektoj por ĉiuj rpm-aj reĝimoj kaj programoj:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Malsukcesintaj muntaj dependaĵoj:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Ne eblas malfermi spec-dosieron %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Malsukcesis malfermi tar-tubon: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr "Trovis pli ol unu spec-dosieron en %s\n"
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Malsukcesis legi spec-dosieron je %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Malsukcesis alinomi %s al %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "malsukcesis stat-i: %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Dosiero %s ne estas regula dosiero.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Dosiero %s ne aspektas kiel spec-dosiero.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Platformoj por kiu munti: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Muntanta por celon %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "argumentoj de --root (-r) devas komenciĝi per /"
+
+#: rpmdb.c:21
 msgid "initialize database"
-msgstr "iniciatu datumbazon"
+msgstr "iniciati datumbazon"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
-msgstr "remuntu listojn inversigitajn de la datumbazo el instalitaj pako-kapoj"
+msgstr ""
+"remunti listojn inversigitajn de la datumbazo el instalitaj pakaĵo-kapoj"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
-msgstr "konstatu datumbazajn dosierojn"
+msgstr "konstati datumbazajn dosierojn"
+
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr "eksporta datumbazo al ĉefeliga ĉapolisto"
 
-#: rpmdb.c:33
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr "importa datumbazo el ĉefeniga ĉapolisto"
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Datumbazo-elektoj:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "nur unu ĉefa reĝimo povas esti specifita"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
-msgstr "konstatu pako-pretendo(j)n"
+msgstr "konstati pakaĵo-pretendo(j)n"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
-msgstr "importu ŝirmitan publikan ŝlosilon"
+msgstr "importi ŝirmitan publikan ŝlosilon"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
-msgstr "ne importu, sed diru al ĝi se ĝi funkcius aŭ ne"
+msgstr "ne importi, sed diri al ĝi se ĝi funkcius aŭ ne"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "listigi ŝlosilojn el RPM-ŝlosilaro"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Ŝlosilaro-elektoj:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "neniuj parametroj donitaj"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Elektoj por mendi/konstati elektitan pakaĵon:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Mendantaj elektoj (kun -q aŭ --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Konstatantaj elektoj (kun -V aŭ --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Elektoj por instali/promocii/forigi:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "unu tipon de mendo/konstato oni rajtas fari je fojo"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "neatenditaj mendo-flagoj"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "neatendita mendo-aranĝo"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "neatendita mendo-fonto"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "nur instalado kaj promociado povas esti devigita"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "dosieroj nur povas esti relokitaj dum pakaĵo-instalado"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "--prefix malkongruas kun --relocate kaj - -excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate kaj --excludepath povas esti uzata nur dum instali novajn pakaĵojn"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix povas esti uzata nur dum instali novajn pakaĵojn"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "parametroj de --prefix devas komenciĝi per /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr "--hash (-h) nur eblas dum pakaĵa instalado aŭ forigado"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr "--percent nur eblas dum pakaĵa instalado aŭ forigado"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "oni povas specifi la parametron --replacepkgs nur dum pakaĵo-instalado"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "oni povas specifi la parametron --excludedocs nur dum pakaĵo-instalado"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "oni povas specifi la parametron --includedocs nur dum pakaĵo-instalado"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "oni ne rajtas kune uzi la parametrojn --excludedocs kaj --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "oni povas specifi la parametron --ignorearch nur dum pakaĵo-instalado"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "oni povas specifi la parametron --ignoreos nur dum pakaĵo-instalado"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "oni povas specifi la parametron --ignoresize nur dum pakaĵo-instalado"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "oni povas specifi la parametron --hash (-h) nur dum pakaĵo-forviŝado"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "oni povas specifi la parametron --allfiles nur dum pakaĵo-instalado"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"oni povas specifi la parametron --justdb nur dum instalado kaj forviŝado de "
+"pakaĵo"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"oni povas uzi parametrojn por malaktivigi skriptojn nur dum instalado kaj "
+"forviŝado de pakaĵo"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"oni povas uzi parametrojn por malaktivigi instigilojn nur dum instalado kaj "
+"forviŝado de pakaĵo"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"oni povas specifi la parametron --nodeps nur dum instalado, konstatado kaj "
+"forviŝado de pakaĵo"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+"oni povas specifi la parametron --hash (-h) nur dum instalado kaj forviŝado "
+"de pakaĵo"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "neniuj pakaĵoj donitaj por forigi"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "neniuj pakaĵoj donitaj por instali"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "neniuj parametroj donitaj por mendi"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "neniuj argumentoj donitaj por konstati"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
-msgstr "pretendi pako(j)n"
+msgstr "pretendi pako(j)n"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
-msgstr "pretendi pako(j)n (identa je --addsign)"
+msgstr "pretendi pako(j)n (identa je --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
-msgstr "forigi pako-pretendojn"
+msgstr "forigi pakaĵo-pretendojn"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
 
-#: rpmsign.c:35
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Pretendo-elektojn:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Ne eblas plenumigi: %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Vi devas valorizi \"%%_gpg_name\" en via makro-dosiero\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Enmetu pasfrazon:"
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Pasfrazo bonas.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr "Kontrolado de pasfrazo malsukcesis aŭ GPG-ŝlosilo eksvalidiĝis.\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr "montri ĉe ordinara eligo spec-dosiero(j)n"
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr "konstati spec-dosiero(j)n"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
-msgstr "operaciu je dekumaj rpm-oj generitaj de spec (apriora)"
+msgstr "operacii je dekumaj rpm-oj generitaj de spec (apriora)"
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr "operacii je fontotekstaj rpm-oj generitaj de spec"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "uzu la jenan mendo-formaton"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "Spec-elektoj:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr "neniuj parametroj donitaj por analizi"
 
@@ -550,32 +615,37 @@ msgstr "neniuj parametroj donitaj por analizi"
 msgid "Unable to open temp file: %s\n"
 msgstr "Ne eblas malfermi provizoran dosieron: %s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr "Ne eblas malfermi fluon: %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Plenumiganta (%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Plenumigo de %s malsukcesis (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
-msgstr "Eraro dum plenumigi pako-programeto(j)n %s (%s)\n"
+msgstr "Eraro dum plenumigi pakaĵo-skripteton %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Misa elirstato el %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -585,235 +655,315 @@ msgstr ""
 "\n"
 "Muntaj eraroj ĉe RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "sintaksa eraro dum analizi ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "sintaksa eraro dum analizi &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "Sintaksa eraro dum analizi ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "analiza eraro ĉe esprimo\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "( sen )\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- nur por nobroj\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! nur por nombroj\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "tipoj devas esti kongruaj\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / ne por ĉenoj\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- no por ĉenoj\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& kaj || ne por ĉenoj\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "sintaksa eraro en esprimo\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Manka '(' en %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Manka ')' en %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Nevalida ero %s: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Manka %s en %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Blankospacoj ne povas sekvi: %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Fuŝa sintakso: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Fuŝa reĝimo-specifo: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Fuŝa dosierujo-specifo: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr "Neordinara longo de lokaĵaro: \"%s\" en %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr "Duplika lokaĵaro %s en %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Nevalida kapablo: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Dosiero-kapabla rego ne integra\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Dosiero devas komenciĝi per \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "Nekonata algoritmo %u por dosieraj resumoj, uzanta je MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Dosiero listigita dufoje: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "legado de mola ligilo %s malsukcesis: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
-msgstr "Mola ligilo almontras al BuildRoot: %s -> %s\n"
+msgstr "Mola ligilo almontras al BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "Vojo estas ekster buildroot: %s\n"
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "Dosierujo ne trovita: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Dosiero ne trovita: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Ne dosierujo: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: ne eblas ŝargi nekonatan etikedon (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: legi publikan ŝlosilon malsukcesis.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: ne ŝirmita publika ŝlosilo.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: malsukcesis kodiĝi\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "malsukcesis krei dosierujon"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Dosiero devas havi antaŭan \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "Amaso %%dev ne permesata:%s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "Dosierujo ne trovita laŭ amaso: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Dosiero ne trovita laŭ amaso: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Ne eblis malfermi %%files file %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "linio: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr "Vaka dosiero %%files %s\n"
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "eraro dum legi dosieron %%files %s: %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr "nepermesita _docdir_fmt %s: %s\n"
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Dosiero ne trovita laŭ amaso: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr "Ne eblas kunmiksi specialan %s-on kun aliaj formoj: %s\n"
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr "Pli ol unu dosiero en linio: %s\n"
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Fuŝa dosiero: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Fuŝa estro/grupo: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Kontrolanta ne pakita(j)n dosiero(j)n: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -822,554 +972,613 @@ msgstr ""
 "Insalita(j) (sed ne pakita(j) dosiero(j) trovita(j):\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Procedanta dosierojn: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 "Platformo (%d) de la plenumebla dosiero ne kongruas la pakaĵan platformon "
 "(%d).\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
-msgstr "Platformo-dependaj dosieroj en platformo-sendependa pako\n"
+msgstr "Platformo-dependaj dosieroj en platformo-sendependa pako\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr "kreado de arkivo malsukcesis ĉe dosiero %s: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr "kreado de arkivo malsukcesis: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "Ne eblis malfermi dosieron %s: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: linio: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Ne eblis kanonigi gastiganto-nomon: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Ne eblas skribi ŝarĝon al %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Ne eblas legi ŝarĝon el %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Ne eblis kanonigi gastiganto-nomon: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Nekonata kunpremo-tipo de ŝarĝo: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Ne eblas krei regionon por neŝanĝebla kapo.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Ne eblas malfermi provizoran dosieron.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr "Ne eblis serĉi en dosiero %s: %s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Ne eblas skribi provizoran kapon\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Malsukcesis legi konduto-dosieron: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Fuŝa CSA-datumo\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Ne eblas reŝargi pretendo-kapon.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Ne eblas malfermi: %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
-msgstr "Ne eblas skribi pakon: %s\n"
-
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Ne eblas malfermi celon %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Ne eblas legi kapon el %s: %s\n"
+msgstr "Ne eblas skribi pakaĵon: %s\n"
 
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Ne eblas skribi kapon al %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Skribis: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
-msgstr "Plenumiĝanta \"%s\":\n"
+msgstr "Plenumigo de \"%s\":\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Plenumigo de \"%s\" malsukcesis.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
-msgstr "Pako-controlo \"%s\" malsukcesis.\n"
+msgstr "Pakaĵo-kontrolo \"%s\" malsukcesis.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
-msgstr "Ne eblas generi eligan dosiernomon por pako %s: %s\n"
+msgstr "Ne eblas generi eligan dosiernomon por pako %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "ne eblas krei %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "line %d: dua %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr "fuŝa dato en %%changelog: %s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "eroj %%changelog devas komenciĝi per *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "nefinita ero %%changelog\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "fuŝa dato en %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog ne en malsupreniranta historia ordigo\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "manka nomo en %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "neniu priskribo en %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "linio %d: dua %%changelog\n"
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "linio %d: Eraro dum analizo de %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "linio %d: Fuŝa elekto %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "linio %d: Tro da nomoj: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "linio %d: Pako ne ekzistas: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "linio %d: dua priskribo\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "linio %d: Eraro dum analizo de %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr "linio %d: Eraro dum analizo de %%policies: %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr "Eraro dum analizo de etikeda kampo: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "linio %d: Fuŝa numero: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "linio %d: Fuŝa numero no%s: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "linio %d: Fuŝa numero %s: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d difinita plurfoje\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "Elŝutanta el %s al %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "Ne eblis elŝuti: %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Platformo estas ne malpermesata: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Platformo estas ne inkluzivita: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "Operaciumo estas ekskluzivita: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "Operaciumo estas ne inkluzivita: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
-msgstr "kampo %s devas ĉeesti en pako: %s\n"
+msgstr "kampo %s devas ĉeesti en pako: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
-msgstr "Duplikaj eroj %s en pako: %s\n"
+msgstr "Duplikaj eroj %s en pako: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Ne eblas malfermi piktogramon %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Ne eblas legi piktogramon %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Nekonata piktogramo-tipo: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "linio %d: Etikedo devas havi nur unu eron: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "linio %d: Nevalida signo '%c' en: %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr "linio %d: %s en: %s\n"
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "linio %d: Nevalida signo en: %s\n"
+msgid "%s in: %s\n"
+msgstr "%s en: %s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "linio %d: Nevalida sinsekvo \"..\" en: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr "Nevalida signo '%c' (0x%x)"
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr "Vevalida sinsekvo \"..\""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "linio %d: Misformita etikedo: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "linio %d: Vaka etikedo: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "linio %d: Oni ne rajtas fini prefikson kun \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "linio %d: Docdir devas komenciĝi per '/': %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "linio %d: Epoko-kampo devas esti sensignuma: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "linio %d: Fuŝa %s: kvalifikiloj: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "linio %d: Fuŝa aranĝo de BuildArchitecture: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
-msgstr "linio %d: Nur subpakoj noarch estas permesataj: %s\n"
+msgstr "linio %d: Nur subpakoj noarch estas permesataj: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Interna eraro: Fuŝa etikedo %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "linio %d: %s estas malfavorita: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
-msgstr "Fuŝa pako-specifo: %s\n"
+msgstr "Fuŝa pako-specifo: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Pako jam ekzistas: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "linio %d: Nekonata etikedo: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} devas ne vaki\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "ne eblas, ke %%{buildroot} estu \"/\"\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Fuŝa fonto: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Neniu flikaĵa numero %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch sen responda etikedo \"Patch:\"\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Neniu fonta numero %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "Neniu etikedo \"Source:\" en la spec-dosiero\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Eraro dum analizo de %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "linio %d: Fuŝa elekto ĉe %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "linio %d: Fuŝa elekto ĉe %%setup %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Nevalida flikaĵo-numero %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "linio %d: dua %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr "Dependaĵo-eroj devas komenciĝi per nombro, litero, '_' aŭ '/'"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr "Dosiernomo kun eldono ne permesata"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "Eldono necesas"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr "Neniuj riĉaj dependaĵoj permesataj por tiu tipo"
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "nevalida dependaĵo"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "Eldono necesas"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr "Nur absolutaj vojoj estas permesataj en dosieraj instigiloj"
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+"Instigilo plenumata de la sama pakaĵo jam estas difinita en spec-dosiero"
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr "linio %d: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "linio %d: instigiloj devas enhavi: --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "linio %d: Eraro dum analizo de %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
-msgstr "linio %d: ena programeto devas finiĝi per '>': %s\n"
+msgstr "linio %d: interna skripto devas finiĝi per '>': %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
-msgstr "linio %d: programeto devas komenciĝi per '/': %s\n"
+msgstr "linio %d: skripto devas komenciĝi per '/': %s\n"
+
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+"linio %d: Prioritatoj estas permesataj nur por dosieraj instigiloj: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "linio %d: Dua %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
-msgstr "linio %d: ne rekonas enan programeton: %s\n"
+msgstr "linio %d: ne rekonas internan skripton: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 "lino %d: interpretilaj parametroj ne estas permesataj en instigiloj: %s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "linio %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr "Makroo etendita en komento en linio %d: %s\n"
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Ne eblas malfermi: %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr "%s: %d: Parametroj anticipitaj por %s\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr "linio %d: Nefermita %%if\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr "linio %d: nefinita makroo aŭ fuŝa linio-daŭrigo\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr "%s:%d: fuŝa kondiĉo ĉe %%if\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d %%else sen %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: %%endif sen %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr "%s:%d: misformita frazo %%include\n"
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr "kodoprezento %s ne regata de sistemo\n"
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr "Pakaĵo %s: nevalida kodoprezento %s en %s: %s - %s\n"
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Neniuj kongruaj platformoj trovitaj por muntaĵo\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
-msgstr "Pako ne enhavas: %%description: %s\n"
+msgstr "Pako ne enhavas: %%description: %s\n"
 
 #: build/policies.c:87
 #, c-format
@@ -1439,450 +1648,564 @@ msgstr "Tro da parametroj en linio: %s\n"
 msgid "Processing policies: %s\n"
 msgstr "Traktanta kondutojn: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "Ignoris nevalidan regulesprimon %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Ne eblis krei tubon por %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Ne eblis plenumigi: %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Ne eblis forki: %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s malsukcesis: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "malsukcesis skribi ĉiujn datumojn al %s: %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Konvertado de %s al longa entjero malsukcesis.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr "Vaka dosiero-klasifikilo\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "Neniuj dosieraj atributoj elektitaj\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) malsukcesis: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load malsukcesis: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Rekono de dosiero \"%s\" malsukcesis: reĝimo %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Serĉi:  %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Malsukcesis trovi: %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "mendo de spec-dosiero %s malsukcesis, ne eblas analizi\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(eraro 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "eraro %s(%d) el %s: %s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Fuŝa magiaĵo"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "eraro %s(%d): %s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Fuŝa kapo"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "nekonata elekto en db: \"%s\" ignorita.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Kapo-grando tro granda"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s haves nevalidan nombran valoron, preterlasita\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr "Dosiero tro granda por arkivo"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr ""
+"%s havas tro grandan aŭ mangrandan longentjeran valoron, preterlasita\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Nekonata dosiertipo"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
+"%s havas tro grandan aŭ malgrandan mallongentjeran valoron, preterlasita\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Manka(j) malmola(j) ligilo(j)"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "ne eblas atingi ŝloson %s ĉe %s/%s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Malkongrueco ĉe resumo"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "kunuzata"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Interna eraro"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "ekskluziva"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Arkivo-dosiero ne en kapo"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "nevalida indeksa tipo %x ĉe %s/%s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " malsukcesis - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "eraro(%d) dum ricevi rikordojn \"%s\" el indekso %s: %s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "eraro(%d) konservi rikordon \"%s\" en %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "eraro(%d) dum forigi rikordon \"%s\" el %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "eraro(%d) aldonanta en kapo rikordon #%d\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "eraro(%d) foriganta el kapo rikordon #%d\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "eraro(%d) dum generi novan okazon de pakaĵo\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s estas Pera RPM kaj ne estas rekte instalebla\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
-msgstr "Ne komprenata ŝarĝo (%s) en pako %s\n"
+msgstr "Ne komprenata ŝarĝo (%s) en pako %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
-msgstr "pako %s jam aldoniĝis, preterlasanta %s\n"
+msgstr "pako %s jam aldoniĝis, preterlasanta %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
-msgstr "pako %s jam aldoniĝis, anstataŭigante per %s\n"
+msgstr "pakaĵo %s jam aldoniĝis, anstataŭigante per %s\n"
+
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(ne amaso)"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(ne cifero)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(ne ĉeno)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(nevalida tipo)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%Y-%d-%b (%a)"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(ne base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(nevalida tipo)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(ne amaso)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(nevalida XML-tipo)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(ne OpenPGP-pretendo)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr "Nevalida dato %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normala"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "anstataŭita"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "ne instalita"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "rete kunuzita"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "malĝusta koloro"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "manka"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(nekonata)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(ne ĉeno)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "uzanto %s ne ekzistas - mi uzos la ĉefuzanton\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "grupo %s ne ekzistas - uzos la ĉefgrupon\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s konservita kiel %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s kreita kiel %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr "%s %s: forigo malsukcesis: %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr "dosierujo"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr "dosiero"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr "preterlasanta %sn %s kun nekonstatebla pretendo\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
 
-#: lib/package.c:149
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr "hdr-ŝarĝo: FUŜA"
+
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
+
+#: lib/header.c:1797
 #, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr "preterlanata je %s kun nekonstatebla pretendo\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr "regiona etikedo: FUŜA, etikedo %d tipo %d deŝovo %d nombro %d"
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1805
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "etikedo[%d]: FUŜä, etikedo %d tipo %d malsameco %d numero %d\n"
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr "regiona deŝovo: FUŜA, etikedo %d tipo %d deŝovo %d nombro %d"
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "nu SHA1: FUŜA, ne deksesuma\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr "regiona vosto: FUŜA, etikedo %d tipo %d deŝovo %d nombro %d"
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "nu RSA: FUŜA, ne plenumebla\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "nu DSA: FUŜA, ne plenumebla\n"
+#: lib/header.c:1841
+#, c-format
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1876
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "amaso-grando (%d): FUŜA, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr "hdr-grando (%d): FUŜA, legado donis valoron %d"
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr "hdr-magio: FUŜA"
+
+#: lib/header.c:1885
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
-msgstr "regiona etikedo: FUŜA, etikedo %d tipo %d malsameco %d numero %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr "hdr-etikedoj: FUŜA, nombro da etikedoj(%d) ekster skalo"
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1890
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "regiona malsameco: FUŜA, etikedo %d tipo %d malsameco %d numero %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr "hdr-datumoj: FUŜAJ, nombro da bajto(%d) ekster skalo"
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1900
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "regiona antaŭaĵo: FUŜA, etikedo %d tipo %d malsameco %d numero %d\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr "hdr-maso(%zd): FUŜA, legado donis la valoron %d"
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1909
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "regiona grandeco, FUŜA, ril(%d) > il(%d)\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr "suspira pad(%zd): FUŜA, legis %zd bajtojn"
+
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1949
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "kapo-grando(%d), FUŜA, lego donis la valoron %d\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr "maso-grando (%d): FUŜA, 8 + 16 * il(%d) + dl(%d)"
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "kapo-magiaĵo: FUŜA\n"
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "nevalida kampa larĝo"
 
-#: lib/package.c:436
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "kapo-etikedoj: FUŜA, nombro da etikedoj (%d) ekster skalo\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "kapo-datumoj: FUŜA, numero da bajtoj(%d) ekster skalo\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "vaka etikeda aranĝo"
+
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "vaka etikeda nomo"
 
-#: lib/package.c:452
+#: lib/headerfmt.c:413
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "kapo-amaso(%zd): FUŜA donis la valoron %d\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] anticipita je fino de tabelo"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "neatendita ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "neatendita }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? atendita en esprimo"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ atendita post ? en esprimo"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} atendita en esprimo"
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "kapo-ŝargo: FUŜA\n"
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": atendita post subesprimo kun ?"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignure malsucksis: %s"
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ atendita post : en esprimo"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Neniu pretendo havebla\n"
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| atendita je la fino de la esprimo"
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead malsukcesis: %s"
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "tabela iteraciilo uzata kun tabeloj kun diversaj grandoj"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread malsukcesis: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
+"%s: eraro: pli ol unu --pipe specifita (ĉu nekongruaj popt-kromnomoj?)\n"
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
-msgstr "anataŭdifini MAKROO kun valoro ESPR"
+msgstr "anataŭdifini MAKROO-on kun valoro ESPR"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'MAKROO ESPR'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "difini MAKROON kun valoro EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
-msgstr ""
+msgstr "maldefini MAKROO-on"
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
-msgstr ""
+msgstr "MAKROO"
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
-msgstr "eligu makroan vastiĝon de ESPR"
+msgstr "eligi makroan etendiĝon de ESPR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'ESPR'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
-msgstr "legu <DOSIERON:...> anstataŭ apriora(j)n dosiero(j)n"
+msgstr "legi <DOSIERON:...> anstataŭ apriora(j)n dosiero(j)n"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<DOSIERO:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr "aktivigi neniujn kromprogramojn"
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
-msgstr "ne konstatu pako-resumo(j)n"
+msgstr "ne konstati pakaĵo-resumo(j)n"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
-msgstr "ne konstatu datumbazo-kapo(j)n kiam akiritajn"
+msgstr "ne konstati datumbazo-kapo(j)n kiam akiritajn"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
-msgstr "ne konstatu pako-pretendo(j)n"
+msgstr "ne konstati pakaĵo-pretendo(j)n"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
-msgstr "sendu ordinaran eligon al KMD"
+msgstr "sendi ordinaran eligon al KMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "KMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
-msgstr "uzu RADIKON kiel komenco-dosierujon"
+msgstr "uzi RADIKON kiel komenco-dosierujon"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "RADIKO"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
-msgstr "uzu datumbazon en DOSIERUJO"
+msgstr "uzi datumbazon en DOSIERUJO"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "DOSIERUJO"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
-msgstr "elmontru konatajn mendo-etikedojn"
+msgstr "elmontri konatajn mendo-etikedojn"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
-msgstr "elmontru finan agordon de rpmrc kaj makrooj"
+msgstr "elmontri finan agordon de rpmrc kaj makrooj"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
-msgstr "eligu malpli detale"
+msgstr "eligi malpli detale"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
-msgstr "eligu pli detale"
+msgstr "eligi pli detale"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
-msgstr "eligu la eldonon de rpm, kion vi uzas"
+msgstr "eligi la eldonon de rpm, kion vi uzas"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
-msgstr "senerarigu la statmaŝinan dosieron de la ŝarĝo"
+msgstr "senerarigi la statmaŝinan dosieron de la ŝarĝo"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
-msgstr "senarigu rpmio-eneligon"
+msgstr "senarigi rpmio-eneligon"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: elekta tabelo misagordita H%d)\n"
@@ -1903,532 +2226,581 @@ msgstr "relokiĝoj devas enhavi la signon ="
 msgid "relocations must have a / following the ="
 msgstr "/ devas veni post = en relokiĝoj"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
-"instalu ĉiujn dosierojn, eĉ elektoj, kiuj aliokaze eble estus preterlasitaj"
+"instali ĉiujn dosierojn, eĉ elektoj, kiuj aliokaze eble estus preterlasitaj"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
-"forigu ĉiujn pakojn, kiuj kongruas al <pako> (ordinare eraro estas generita "
-"se <pako> specifis plurajn pakojn)"
+"forigi ĉiujn pakaĵojn, kiuj kongruas al <pakaĵo> (ordinare eraro estas "
+"generita se <pakaĵo> specifis plurajn pakaĵojn)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
-msgstr "reloku dosierojn en pako, kiu ne estas relokebla"
+msgstr "reloki dosierojn en pakaĵo, kiu ne estas relokebla"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
-msgstr "eligu dependaĵaj spinojn kiel avertojn"
+msgstr "eligi dependaĵaj spinojn kiel avertojn"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
-msgstr "forigu (malinstalu) pakon"
+msgstr "forigi (malinstali) pakaĵon"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
-msgstr "<pako>+"
+msgstr "<pako>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
-msgstr "ne instalu agordo-dosierojn"
+msgstr "ne instali agordo-dosierojn"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
-msgstr "ne instalu dokumentaron"
+msgstr "ne instali dokumentaron"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
-msgstr "preterlasu dosierojn kun antaŭa komponanto <pado>"
+msgstr "preterlasi dosierojn kun antaŭa komponanto <pado>"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<pado>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "mallongigo de --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
-msgstr "promociu pako(j)n se jam instalitaj"
+msgstr "promocii pakaĵo(j)n se jam instalitajn"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
-msgstr "<pakodosiero>+"
+msgstr "<pakodosiero>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
-msgstr "eligu kradojn dum pako-instaladon (bona kun -v)"
+msgstr "eligi kradojn dum pakaĵo-instalado (bona kun -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
-msgstr "ne konstatu pako-platformon"
+msgstr "ne konstati pakaĵo-platformon"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
-msgstr "ne konstatu pako-operaciumon"
+msgstr "ne konstati pakaĵo-operaciumon"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
-msgstr "ne kontrolu diskspacon antaŭ ol instali"
+msgstr "ne kontroli diskspacon antaŭ ol instali"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
-msgstr "instalu dokumentaron"
+msgstr "instali dokumentaron"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
-msgstr "instalu pako(j)n"
+msgstr "instali pakaĵo(j)n"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
-msgstr "aktualigu la datumbazon, sed ne modifu la dosiersistemon"
+msgstr "aktualigi la datumbazon, sed ne modifi la dosiersistemon"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
-msgstr "ne konstatu pako-dependaĵojn"
+msgstr "ne konstati pakaĵo-dependaĵojn"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
-msgstr "ne konstatu resumojn de dosieroj"
+msgstr "ne konstati resumojn de dosieroj"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
-msgstr "ne konstatu resumojn de dosieroj (malaktuale)"
+msgstr "ne konstati resumojn de dosieroj (malaktuale)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
-msgstr "ne instalu dosiero-sekurecaj kuntekstoj"
+msgstr "ne instali dosiero-sekurecaj kuntekstoj"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
-msgstr "ne reordigu pako-instaladon por kontentigi dependaĵojn"
+msgstr "ne reordigi pakaĵo-instaladon por kontentigi dependaĵojn"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
-msgstr "ne plenumigu pako-programeto(j)n"
+msgstr "ne plenumigi pakaĵo-skripteton"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
-msgstr "ne plenumigu la programetojn %%pre (se ekzistas)"
+msgstr "ne plenumigi la skriptetojn %%pre (se ekzistas)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
-msgstr "ne plenumigu la programetojn %%post (se ekzistas)"
+msgstr "ne plenumigi la skriptetojn %%post (se ekzistas)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
-msgstr "ne plenumigu la programetojn %%preun (se ekzistas)"
+msgstr "ne plenumigi la skriptetojn %%preun (se ekzistas)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
-msgstr "ne plenumigu la programetojn %%postun (se ekzistas)"
+msgstr "ne plenumigi la skriptetojn %%postun (se ekzistas)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "ne plenumigi skripteton %%pretrans (se ekzistas)"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "ne plenumigi skripteton %%posttrans (se ekzistas)"
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
-msgstr "ne plenumigu iu(j)n ajn programeto(j)n okazigita(j)n de ĉi tiu pako"
+msgstr "ne plenumigi iu(j)n ajn skripteto(j)n instigita(j)n de ĉi tiu pakaĵo"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
-msgstr "ne plenumigu programeto(j)n %%triggerprein"
+msgstr "ne plenumigi skripteto(j)n %%triggerprein"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
-msgstr "ne plenumigu la programeto(j)n %%triggerin"
+msgstr "ne plenumigi la skripteto(j)n %%triggerin"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
-msgstr "ne plenumigu la programeto(j)n %%triggerun"
+msgstr "ne plenumigi la skripteto(j)n %%triggerun"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
-msgstr "ne plenumigu la programeto(j)n %%triggerpostrun"
-
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "ne plenumu ian ajn kolekto-agon"
+msgstr "ne plenumigi la skripteto(j)n %%triggerpostrun"
 
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
-"malpromocii al malfreŝa eldono de la pako (--force aŭtomate faras tion)"
+"malpromocii al malfreŝa eldono de la pako (--force aŭtomate faras tion)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
-msgstr "eligu elcentojn kiel la pako instaliĝas"
+msgstr "eligi elcentojn kiel la pakaĵo instaliĝas"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
-msgstr "reloku la pakon al <dosierujo>, se relokeblan"
+msgstr "reloki la pakaĵon al <dosierujo>, se relokeblan"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dosiero>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "reloki dosierojn de pado <malnova> al <nova>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<malnova>=<nova>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
-msgstr "ignoru dosierajn konfliktojn inter pakoj"
+msgstr "ignori dosierajn konfliktojn inter pakaĵoj"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
-msgstr "reinstalu se la pako jam ĉeestas"
+msgstr "reinstali se la pakaĵo jam ĉeestas"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
-msgstr "ne instalu; nur montru ĉu ĝi funkcius aŭ ne"
+msgstr "ne instali; nur montri ĉu ĝi funkcius aŭ ne"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
-msgstr "promociu pako(j)n"
+msgstr "promocii pakaĵo(j)n"
+
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "reinstali pakaĵo(j)n"
 
-#: lib/poptQV.c:67
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
-msgstr "mendu/konstatu ĉiujn pakojn"
+msgstr "mendi/konstati ĉiujn pakaĵojn"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "reĝimo kontroli konstaton de rpm"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
-msgstr "mendu/konstatu pako(j)n havanta(j) dosieron"
+msgstr "mendi/konstati pakaĵo(j)n havanta(j) dosieron"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
-msgstr "mendu/konstatu pako(j)n en grupo"
+msgstr "mendi/konstati pakaĵo(j)n en grupo"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
-msgstr "mendu/konstatu pako-dosieron"
+msgstr "mendi/konstati pakaĵo-dosieron"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
-msgstr "mendu/konstatu pako(j)n per pako-identigilo"
+msgstr "mendi/konstati pakaĵo(j)n per pakaĵo-identigilo"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
-msgstr "mendu/konstatu pako(j)n per kapo-identigilo"
+msgstr "mendi/konstati pakaĵo(j)n per kapo-identigilo"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "rpm-mendanta reĝimo"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
-msgstr "mendu/konstatu kapo-okazon"
+msgstr "mendi/konstati kapo-okazon"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
-msgstr "mendu/konstatu pako(j)n el instalo-interago"
+msgstr "mendi/konstati pakaĵo(j)n el instalo-interago"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
-msgstr "mendi la pako(j)n okazigitaj de la pako"
+msgstr "mendi la pakaĵo(j)n okazigitaj de la pakaĵo"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "rpm-konstata reĝimo"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
-msgstr "mendu/konstatu la pako(j)n, kiuj postulas dependaĵon"
+msgstr "mendi/konstati la pakaĵo(j)n, kiuj postulas dependaĵon"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
-msgstr "mendu/konstatu la pako(j)n, kiujn havigas dependaĵon"
+msgstr "mendi/konstati la pakaĵo(j)n, kiujn havigas dependaĵon"
+
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr "mendi/konstati la pakaĵo(j)n, kiu(j) rekomendas dependaĵon"
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr "mendi/konstati la pakaĵo(j)n, kiu(j) konsilas dependaĵon"
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr "mendi/konstati la pakaĵo(j)n, kiu(j) kompletigas dependaĵon"
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr "mendi/konstati la pakaĵo(j)n, kiu(j) plibonigas dependaĵon"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
-msgstr "ne kunfandu parametrojn"
+msgstr "ne kunfandi parametrojn"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
-msgstr "ne procedu ne pako-dosierojn kiel manifestojn"
+msgstr "ne procedi ne pakaĵo-dosierojn kiel manifestojn"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
-msgstr "listigu ĉiujn agordo-dosierojn"
+msgstr "listigi ĉiujn agordo-dosierojn"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
-msgstr "listigu ĉiujn dokumento-dosierojn"
+msgstr "listigi ĉiujn dokumento-dosierojn"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "listigu ĉiujn dokumento-dosierojn"
+msgstr "listigu ĉiujn permesilo-dosierojn"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "listigu ĉiujn permesilo-dosierojn"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
-msgstr "ŝutu bazajn informojn pri dosieroj"
+msgstr "ŝuti bazajn informojn pri dosieroj"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
-msgstr "listigu dosierojn en pako"
+msgstr "listigi dosierojn en pakaĵo"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
-msgstr "preterlasu %%fantomo-dosierojn"
+msgstr "preterlasi %%ghost-dosierojn"
+
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "preterlasi %%ghost-dosierojn"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "elmontri la statojn de la listigitaj dosieroj"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
-msgstr "ne konstatu la grandon de la dosieroj"
+msgstr "ne konstati la grandon de la dosieroj"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
-msgstr "ne konstatu ligilajn padojn de dosieroj"
+msgstr "ne konstati ligilajn padojn de dosieroj"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
-msgstr "ne konstatu estrecon de dosiero"
+msgstr "ne konstati estrecon de dosiero"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
-msgstr "ne konstatu grupon de dosiero"
+msgstr "ne konstati grupon de dosiero"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
-msgstr "ne konstatu modifo-tempon de dosieroj"
+msgstr "ne konstati modifo-tempon de dosieroj"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
-msgstr "ne konstatu permesojn de dosieroj"
-
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "ne konstatu kapablojn de dosieroj"
+msgstr "ne konstati permesojn de dosieroj"
 
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
-msgstr "ne konstatu sekureco-kuntekstojn"
+msgstr "ne konstati sekureco-kuntekstojn"
+
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "ne konstati kapablojn de dosieroj"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
-msgstr "ne konstatu dosierojn en pako"
+msgstr "ne konstati dosierojn en pakaĵo"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
-msgstr "ne konstatu pako-dependaĵojn"
+msgstr "ne konstati pakaĵo-dependaĵojn"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
-msgstr "ne plenumigu konstato-programo(j)n"
+msgstr "ne plenumigi konstato-skripto(j)n"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "Mankantaj trajtoj en rpmlib por %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
-msgstr "fontoteksta pako atendita, plenumebla trovita\n"
+msgstr "fontoteksta pako atendita, plenumebla trovita\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
-msgstr "fontoteksta pako enhavas neniun spec-dosieron\n"
+msgstr "fontoteksta pako enhavas neniun spec-dosieron\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "Elpakado de arkivo malsukcesis%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " ĉe dosiero"
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s malsukcesis ĉe dosiero %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s malsukcesis: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "malĝusta aranĝo: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(enhavas neniujn dosierojn)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normala       "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "anstataŭigita   "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "ne instalita  "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "rete kunuzata "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "malĝŭsta koloro"
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(neniu stato) "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(nekonata %3d)"
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
-msgstr "pako ne enhavas listojn de dosieraj estroj kaj grupoj\n"
+msgstr "pako ne enhavas listojn de dosieraj estroj kaj grupoj\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
-msgstr "pako enhavas nek dosieran estron nek identigilajn listojn\n"
+msgstr "pako enhavas nek dosieran estron nek identigilajn listojn\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
-msgstr "grupo %s ne enhavas iujn pakojn\n"
+msgstr "grupo %s ne enhavas iujn pakojn\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
-msgstr "neniuj pako-instigiloj %s\n"
+msgstr "neniuj pako-instigiloj %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "misformita %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
-msgstr "neniu pako kongruas kun %s: %s\n"
+msgstr "neniu pako kongruas kun %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
-msgstr "neniu pako postulas: %s\n"
+msgstr "neniu pakaĵo postulas: %s\n"
+
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr "neniuj pakaĵoj rekomendas je %s\n"
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr "neniuj pakaĵoj konsilas je %s\n"
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr "neniuj pakaĵoj kompletigas je %s\n"
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr "neniuj pakaĵoj plibonigas je %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
-msgstr "neniu pako provizas: %s\n"
+msgstr "neniu pako provizas: %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "dosiero %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
-msgstr "neniu pako estras dosieron %s\n"
+msgstr "neniu pako estras dosieron %s\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
-msgstr "nevalida pako-numero: %s\n"
+msgstr "nevalida pako-numero: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "ne eblas legi rikordon %u\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
-msgstr "pako %s ne estas instalita\n"
+msgstr "pako %s ne estas instalita\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "nekonata etikedo: \"%s\"\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s: malsukcesis importi ŝlosilon %d.\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s: ŝlosilo %d ne estas ŝirmita publika ŝlosilo.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: importa legado malsukcesis (%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr "%s: headerRead malsukcesis: %s\n"
+msgid "Fread failed: %s"
+msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
-msgstr "%s: Ne eblis legi neŝanĝeblan kapan regionon. Ĉu koruptita pako?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NEBONA"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "BONA"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr "(MANKAJ ŜLOSILOJ:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr "NEFIDINDAJ ŜLOSILOJ:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: malsukcesis malfermi: %s\n"
@@ -2436,7 +2808,7 @@ msgstr "%s: malsukcesis malfermi: %s\n"
 #: lib/rpmchroot.c:43
 #, c-format
 msgid "Unable to open current directory: %m\n"
-msgstr "Ne eblas malfermi aktualan dosierujon: %m\n"
+msgstr "Ne eblas malfermi nunan dosierujon: %m\n"
 
 #: lib/rpmchroot.c:59 lib/rpmchroot.c:84
 #, c-format
@@ -2453,214 +2825,444 @@ msgstr "Ne eblas ŝanĝi radikan dosierujon: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "Ne eblas restarigi radikan dosierujon: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "Generanta %d mankajn indekso(j)n, bonvolu atendi...\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr "ne eblas malfermi indekson %s per %s - %s (%d)\n"
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "neniu dbpath estis valorizita\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: preterlasanta"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "eraro (%d) konservanta rikordon #%d al en %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec malsukcesis: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp malsukcesis: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: preterlasanta"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: difektita kapo #%u akirita -- preterlasanta.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: ne eblas legi kapon en 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "neniu dbpath estis valorizita"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "malsukcesis krei dosierujon %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "kapo #%u en datumbazo estas fuŝa -- preterlasanta.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "ne eblas aldoni rikordon devene el %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "malsukcesis remunti datumbazon: neŝanĝita datumbazo restas\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "malsukcesis anstataŭigi la malnovan datumbazon per la nova!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NE "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "JES"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr "Dependaĵoj de PreReq:, Provides:, kaj Obseletes: eblas havi eldonojn."
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr ""
+"dosiernomo(j) konservitaj kiel (dirName, basNem, dirIndex) triopo, ne kiel "
+"pado."
+
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr "pakaĵo-ŝarĝo eblas esti kunpremita per bzip2."
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr "pakaĵo-ŝarĝo eblas esti kunpremita per xz."
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr "pakaĵo-ŝarĝo eblas esti kunpremita per lzma."
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "pakaĵo-ŝarĝa(j) dosiero(j) havas prefikson \"./\"."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "la nomo, eldono kaj promocio de pakaĵo ne subkomprenita."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "kapaj tagoj ĉiam estas ordigitaj post ŝargiĝi."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "la skripteta interpretilo povas uzi parametrojn de la kapo."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "aro da malmolaj ligiloj povas esti instalita sen esti kompleta."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr "pakaĵo-skriptetojn rajtas atingi la rpm-datumbazon dum instali."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "interna komprena de lua-skriptoj."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr "dosiero-resuma algoritmo estas aparte agordeble por ĉiu pakaĵo"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "rego de kapabloj de dosieroj laŭ POSIX.1e"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr "pakaĵo-skriptoj eblas etendiĝi dum instalado."
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr "dependaĵa komparo komprenas eldonojn kun tildo."
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "regas dosierojn pli grandajn ol 4GB"
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr "rego por riĉaj dependaĵoj."
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr "Nekonata riĉdependaĵa operacio '%.*s'"
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr "Nomo postulata"
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr "Riĉa dependaĵo ne komenciĝas per '('"
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr "Mankanta argumento al riĉdependaĵa operacio"
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr "Vaka riĉa dependaĵo"
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr "Nefinita riĉa dependaĵo: %s"
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr "Ne eblas ĉenigi diversajn operaciojn"
+
+#: lib/rpmds.c:1564
+#, fuzzy
+msgid "Can only chain and/or/with ops"
+msgstr "Eblas ĉenigi nur la operaciojn AND kaj OR"
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr "Rubo post riĉa dependaĵo"
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
 msgstr ""
-"dosiernomo(j) konservitaj kiel (dirName, basNem, dirIndex) triopo, ne kiel "
-"pado."
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
-msgstr "pako-ŝarĝo eblas esti kunpremita per bzip2."
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
-msgstr "pako-ŝarĝo eblas esti kunpremita per xz."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr "pako-ŝarĝo eblas esti kunpremita per lzma."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Fuŝa magiaĵo"
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "pako-ŝarĝa(j) dosiero(j) havas prefikson \"./\"."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Fuŝa kapo"
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "la nomo, eldono kaj promocio de pako ne subkomprenita."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Kapo-grando tro granda"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "kapaj tagoj ĉiam estas ordigitaj post ŝargiĝi."
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "Dosiero tro granda por arkivo"
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "la programeta interpretilo povas uzi parametrojn de la kapo."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Nekonata dosiertipo"
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "aro da malmolaj ligiloj povas esti instalita sen esti kompleta."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "Mankanta(j) dosiero(j)"
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr "pakaĵo-programetojn rajtas atingi la rpm-datumbazon dum instali."
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Malkongrueco ĉe resumo"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "interna komprena de lua-programetoj."
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Interna eraro"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr "dosiero-resuma algoritmo estas aparte agordeble por ĉiu pako"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Arkivo-dosiero ne en kapo"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "rego de kapabloj de dosieroj laŭ POSIX.1e"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr "pako-programetoj eblas etendiĝi dum insntalado."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " malsukcesis - "
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
-msgstr "dependaĵa komparo komprenas eldonojn kun tildo."
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: eroro 0x%x)"
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "malfermo de %s malsukcesis: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr "Superis maksimuman nivelon de manifest-rikurso: %s\n"
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
-msgstr "%s: ne rpm-pako (aŭ pako-manifesto)\n"
+msgstr "%s: ne rpm-pakaĵo (aŭ pakaĵo-manifesto)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr "Ĝisdatiganta / instalanta...\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr "Forviŝanta / Foriganta...\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Pretiganta..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr "Pretiganta pakaĵojn..."
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
-msgstr "Malhavaj dependaĵoj:\n"
+msgstr "Mankantaj dependaĵoj:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
-msgstr "%s: ne rpm-pako (aŭ pako-manifesto): %s\n"
+msgstr "%s: ne rpm-pakaĵo (aŭ pakaĵo-manifesto): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s ne eblas instaliĝi\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
-msgstr "Riceviĝas %s\n"
+msgstr "Ricevanta je %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "transigo de %s malsukcesis - preterlasanta\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
-msgstr "pako %s ne estas relokebla\n"
+msgstr "pako %s ne estas relokebla\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "eraro dum legi dosieron %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
-msgstr "\"%s\" specifas plurajn pakojn:\n"
+msgstr "\"%s\" specifas plurajn pakojn:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "ne eblas malfermiĝi %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Instaliĝas %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
-msgstr "ne rpm-pako"
+msgstr "ne rpm-pako"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "nevalida pretenda tipo"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
-msgstr "nekomprenata RPM-paka eldono"
+msgstr "nekomprenata RPM-pakaĵa eldono"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "malsukcesis legi: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
-msgstr "ne rpm-pako\n"
+msgstr "ne rpm-pako\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "ne eblas krei ŝloson %s ĉe %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "atendis ŝloson %s ĉe %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr "ddlopen malsukcesis ĉe %s %s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "Solvi simbolon %s malsukcesis: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "Malsukcesis etendi makroon %%__collection_%s\n"
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "Kromprogramo %%__%s_%s ne agordita\n"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "Kromprogramo %s ne ŝargita\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr "Malsukcesis solvi en kromprogramo %s la simbolon %s: %s\n"
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "malsama"
@@ -2668,22 +3270,22 @@ msgstr "malsama"
 #: lib/rpmprob.c:114
 #, c-format
 msgid "package %s is intended for a %s architecture"
-msgstr "pako %s ne intenciĝis por platformo %s"
+msgstr "pako %s ne intenciĝis por platformo %s"
 
 #: lib/rpmprob.c:118
 #, c-format
 msgid "package %s is intended for a %s operating system"
-msgstr "pako %s ne intenciĝis por operaciumo %s"
+msgstr "pako %s ne intenciĝis por operaciumo %s"
 
 #: lib/rpmprob.c:122
 #, c-format
 msgid "package %s is already installed"
-msgstr "pako %s jam instaliĝis"
+msgstr "pako %s jam instaliĝis"
 
 #: lib/rpmprob.c:125
 #, c-format
 msgid "path %s in package %s is not relocatable"
-msgstr "pado %s en pako %s ne estas relokebla"
+msgstr "pado %s en pako %s ne estas relokebla"
 
 #: lib/rpmprob.c:130
 #, c-format
@@ -2693,22 +3295,22 @@ msgstr "dosiero %s faras konfliktojn inter provaj instalaĵoj de %s kaj %s"
 #: lib/rpmprob.c:135
 #, c-format
 msgid "file %s from install of %s conflicts with file from package %s"
-msgstr "dosiero %s el instalo de %s konfliktas kun dosiero el pako %s"
+msgstr "dosiero %s el instalo de %s konfliktas kun dosiero el pako %s"
 
 #: lib/rpmprob.c:140
 #, c-format
 msgid "package %s (which is newer than %s) is already installed"
-msgstr "pako %s (kiu estas pli freŝa ol %s) jam instaliĝis"
+msgstr "pako %s (kiu estas pli freŝa ol %s) jam instaliĝis"
 
 #: lib/rpmprob.c:145
 #, c-format
 msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
-msgstr "instali pakon %s bezonas iun %<PRIu64>%cB en la dosiersistemo %s"
+msgstr "instali pakon %s bezonas iun %<PRIu64>%cB en la dosiersistemo %s"
 
 #: lib/rpmprob.c:155
 #, c-format
 msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
-msgstr "instali pakon %s bezonas inodojn %<PRIu64> en la dosiersistemo %s"
+msgstr "instali pakon %s bezonas inodojn %<PRIu64> en la dosiersistemo %s"
 
 #: lib/rpmprob.c:159
 #, c-format
@@ -2732,637 +3334,354 @@ msgstr "%s malaktualiĝas per %s%s"
 #: lib/rpmprob.c:172
 #, c-format
 msgid "unknown error %d encountered while manipulating package %s"
-msgstr "nekonata eraro %d okazis dum manipuli pakon %s"
+msgstr "nekonata eraro %d okazis dum manipuli pakon %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "manka dua ':' ĉe %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "manka platforma nomo ĉe %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Nefinita datuma linio ĉe %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Tro da parametroj en datuma linio je %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Fuŝa platforma/operaciuma numero: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr "Nefinita apriora linio ĉe %s:%d\n"
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr "Tro da parametrojn ĉe apriora linio ĉe %s:%d\n"
-
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "manka ':' (trovita 0x%02x) ĉe %s:%d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "manka parametro por %s ĉe %s:%d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr "%s ne malfermeblas ĉe %s:%d: %m\n"
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "manka platformo por %s ĉe %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "Fuŝa elekto '%s' ĉe %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr "Malsukcesis legi helpan vektoron, ĉu /proc ne surmetita?\n"
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Nekonata operaciumo: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Bonvolu kontakti %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "%s ne malfermeblas por legiĝi: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr "Ne eblas restarigi aktualan dosierujon: %m"
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "rego por <lua>-programetojn ne estas integraj\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Ne eblis krei provizoran dosieron por %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Ne eblis dupliki dosieran priskribilon %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "programeto %s malsukcesis, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "programeto %s malsukcesis, signalo %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "programeto %s malsukcesis, elira stato %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "nekonata formato"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "instali"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "forviŝi"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "ne eblas malfermi pako-datumbazon en %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "aldona '(' en pako-etikedo: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "manka '(' en pako-etikedo: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "manka ')' en pako-etikedo: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: legi la publikan ŝlosilon malsukcesis.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "interago"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "suspira grando(%d): FUŜA, legado donis: %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "suspira magiaĵo: FUŜA\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "suspiraj etikedoj: FUŜA, numero da etiketoj (%d) ne en la skalo\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "suspiraj etikedoj: FUŜA, numero da bajtoj (%d) ne en la skalo\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "suspira amaso(%d): FUŜA, donis: %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "suspira etikedo[%d], FUŜA, etikedo %d tipo %d malsameco %d nombro %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "suspira ŝarĝo: FUŜA\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "suspira pad(%zd): FUŜA, leginta %zd bajtojn\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "suspira sigSize(%zd): FUŜA, fstat(2) malsukcesis\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "Neŝanĝebla kapa regiono ne eblas legiĝi. Ĉu koruptita pako?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr "Ne povas pretendi pakaĵojn el RPM-v3\n"
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5-resumo:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "SHA1-resuma kapo:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Kapo"
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr "Konstati pretendon: FUŜAJ PARAMETROJ (%d %p %d %p %p)\n"
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "preterlasita"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "malsukcesa"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "manka   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Malkontentaj dependaĵoj por %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr "nevalida kampa larĝo"
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "manka { post %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "manka } post %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "vaka etikeda aranĝo"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "vaka etikeda nomo"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "nekonata etikedo"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] anticipita je fino de tabelo"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "neatendita ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "neatendita }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? atendita en esprimo"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ atendita post ? en esprimo"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} atendita en esprimo"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": atendita post subesprimo kun ?"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ atendita post : en esprimo"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| atendita je la fino de la esprimo"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "tabela iteraciilo uzata kun tabeloj kun diversaj grandoj"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "Generanta %d mankajn indekso(j)n, bonvolu atendi...\n"
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "ne eblas malfermi indekson %s per db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr "eraro(%d) dum ricevi rikordojn \"%s\" el indekso %s: %s\n"
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "neniu dbpath estis valorizita\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: preterlasanta"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "eraro (%d) konservanta rikordon #%d al en %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec malsukcesis: %s\n"
-
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:413
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp malsukcesis: %s\n"
+msgid "Incomplete default line at %s:%d\n"
+msgstr "Nefinita apriora linio ĉe %s:%d\n"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: preterlasanta"
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
+msgstr "Tro da parametrojn ĉe apriora linio ĉe %s:%d\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:523
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: difektita kapo #%u akirita -- preterlasanta.\n"
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "manka ':' (trovita 0x%02x) ĉe %s:%d\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr "eraro(%d:%s) akiranta sekvan ŝlosilon el indekso %s\n"
+msgid "missing argument for %s at %s:%d\n"
+msgstr "manka parametro por %s ĉe %s:%d\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "eraro(%d) aldonanta en kapo rikordon #%d\n"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "%s ne malfermeblas ĉe %s:%d: %m\n"
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "eraro(%d) foriganta el kapo rikordon #%d\n"
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "manka platformo por %s ĉe %s:%d\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:632
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: ne eblas legi kapon en 0x%x\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "Fuŝa elekto '%s' ĉe %s:%d\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr "Malsukcesis legi helpan vektoron, ĉu /proc ne surmetita?\n"
+
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "eraro(%d): elekti rikordojn \"%s\" el indekso %s\n"
+msgid "Unknown system: %s\n"
+msgstr "Nekonata operaciumo: %s\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "eraro(%d) konservi rikordon \"%s\" en %s\n"
+msgid "Please contact %s\n"
+msgstr "Bonvolu kontakti %s\n"
 
-#: lib/rpmdb.c:2477
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "eraro(%d) dum forigi rikordon \"%s\" el %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "%s ne malfermeblas por legiĝi: %m.\n"
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr "Neniu exec() vokita post fork() en lua-skripteto\n"
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "eraro(%d) dum generi novan okazon de pako\n"
+msgid "Unable to restore current directory: %m"
+msgstr "Ne eblas restarigi nunan dosierujon: %m"
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "rego por <lua>-programetojn ne estas integraj\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "eraro(%d) akiranta rikordojn \"%s\" el indekso %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Ne eblis krei provizoran dosieron por %s: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "eraro(%d) konservis rikordon %s en %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Ne eblis dupliki dosieran priskribilon %s: %s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "neniu dbpath estis valorizita"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr "Malsukcesis Fwrite: %s"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "malsukcesis krei dosierujon %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "skripteto %s malsukcesis, waitpid(%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "kapo #%u en datumbazo estas fuŝa -- preterlasanta.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "skripteto %s malsukcesis, signalo %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "ne eblas aldoni rikordon devene el %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "skripteto %s malsukcesis, elira stato %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr "malsukcesis remunti datumbazon: neŝanĝita datumbazo restas\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "nekonata formato"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "malsukcesis anstataŭigi la malnovan datumbazon per la nova!\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "instali"
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "anstataŭigi dosierojn en %s per dosieroj el %s por reatingi"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "forviŝi"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "malsukcesis reatingi dosierujon %s: %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "ne eblas malfermi pakaĵo-datumbazon en %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d eraro(%d) el %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "aldona '(' en pakaĵo-etikedo: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d eraro(%d): %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "manka '(' en pakaĵo-etikedo: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "ne eblas atingi ŝloson %s ĉe %s/%s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "manka ')' en pakaĵo-etikedo: %s\n"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "kunuzata"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: legi la publikan ŝlosilon malsukcesis.\n"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "ekskluziva"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "interago"
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr "nevalida indeksa tipo %x ĉe %s/%s\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "nekonata elekto en db: \"%s\" ignorita.\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s haves nevalidan nombran valoron, preterlasita\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
-"%s havas tro grandan aŭ mangrandan longentjeran valoron, preterlasita\n"
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
-"%s havas tro grandan aŭ malgrandan mallongentjeran valoron, preterlasita\n"
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "Malsukcesis malkodi konduton por %s\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "Malsukcesis krei provizoran dosieron por %s: %s\n"
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "Malsukcesis skribi konduton %s al dosiero %s\n"
+msgid "%s%s"
+msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr "Malsukcesis krei anson por semanage\n"
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "Malsukcesis konektiĝi al konduta traktilo\n"
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "Malsukcesis komenci kondutan interagon: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr "Malsukcesis forigi provizoran kondutan dosieron %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Ĉapo"
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "Malsukcesis instali kondutan modulon: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "Malsukcesis forigi konduto-modulon: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Ne eblas reŝargi pretendo-kapon.\n"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "Malsukcesis disforkigi procezon: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "preterlasita"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "Malsukcesis plenumigi: %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "malsukcesa"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "%s ĉesis malnormale\n"
+msgid "Duplicate username or UID for user %s\n"
+msgstr "Duobligita salutnomo aŭ identigilo por uzanto %s\n"
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "%s malsukcesis kun elira kodo %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr "Duobligita grupnomo aŭ identigilo por grupo %s\n"
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "Malsukcesis cizeli kondutajn ŝanĝojn\n"
+#: lib/verify.c:395
+msgid "no state"
+msgstr "neniu stato"
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "Malsukcesis etendi padon restorecon"
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "nekonato stato"
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr "Malsukcesis alinomi dosiersistemon. Dosieroj ele estas misnomataj\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "manka   %c %s"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
-"Malsukcesis reŝargi dosierajn kuntekstojn. Dosieroj eble estas misnomataj\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Malkontentaj dependaĵoj por %s:\n"
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "Malsukcesis eltiri konduton el %s\n"
+msgid "Unable to reset nice value: %s"
+msgstr "Ne eblas restarigi afablan valoron: %s"
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktiva %d vaka %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr "Ne eblas restarigo eneligan prioritaton: %s"
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
+
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(vaka)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(vaka)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Makroo %%%s havas nefinitan korpon\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Makroo %%%s havas nefinitajn elektojn\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Makroo %%%s havas nevalidan vomon (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Makroo %%%s havas nefinitan korpon\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Makroo %%%s havas nefinitajn elektojn\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Makroo %%%s havas vakan korpon\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "Makroo %%%s postulas blankspacon antaŭ korpo\n"
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Makroo %%%s malsukcesis etendiĝi\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Makroo %%%s havas nevalidan nomon (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Makroo %%%s (%s) ne estis uzita sub nivelo %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr "Makroo %%%s difinita sed ne uzata en amplekso\n"
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Nekonata elekto %c en %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
@@ -3370,165 +3689,282 @@ msgstr ""
 "Tro da niveloj de rekursioj en makroa etendado. Verŝajne kaŭzate de rekursia "
 "makro-deklaro.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Nefinita %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "%% estas sekvata de sensenca makroo\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "malsukcesis ŝargi makroan dosieron %s"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktiva %d vaka %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "eraro dum krei provizoran dosieron %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Dosiero %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Dosiero %s estas malpli ol %u bajtoj\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "malsukcesis krei dosierujon"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[neniu]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(neniu eraro)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "haltigenda eraro:"
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "eraro: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "averto: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
-msgstr "nevalida sintakso en lua-programeto: %s\n"
+msgstr "nevalida sintakso en lua-skripteto: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
-msgstr "nevalida sintakso en lua-programeto: %s\n"
+msgstr "nevalida sintakso en lua-skripto: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
-msgstr "lua-programeto malsukcesis: %s\n"
+msgstr "lua-skripto malsukcesis: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "nevalida sintakso en lua-dosiero: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "lua hoko malsukcesis: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[neniu]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(neniu eraro)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "ĉesigenda eraro:"
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "eraro: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "averto: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "memora generado (%u okbitoj) donis nulon.\n"
+msgstr "memora generado (%u bajtoj) donis nulon.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, ŝlosila identigilo %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(neniu)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr "eraro dum krei provizoran dosierujon %s: %m\n"
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr "eraro dum krei rektvican memoron %s: %m\n"
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr "eraro dum forigi rektvican memoron %s: %m\n"
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr "eraro dum forigi dosierujon %s: %m\n"
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite malsukcesis: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread malsukcesis: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush malsukcesis: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr "Nekomprenita PGP-pretendo\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr "Nekomprenita krampita algoritmo %u de PGP\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr "Nekomprenita algoritmo publika-ŝlosila %u de PGP\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Ne eblas plenumigi: %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr "Fopen malsukcesis\n"
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "Ne eblis skribi al dukto\n"
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Ne eblas krei tubon por pretendi: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr "Ne eblis legi el dosiero %s: %s\n"
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "gpg-plenumo malsukcesis (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg malsukcesis skribi pretendon\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "ne eblas legi la pretendon\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp malsukcesis\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr "%s jam enhavas identan pretendon, preterlasanta\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead malsukcesis: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignure malsucksis: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: headerRead malsukcesis: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "Ne povas pretendi pakaĵojn el RPM-v3\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s jam enhavas identan pretendon, preterlasanta\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature malsukcesis: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead malsukcesis: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "anstataŭigo de %s malsukcesis: %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: legi manifeston malsukcesis: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
-msgstr "ne konstatu pretendojn de kapo+ŝarĝo"
+msgstr "ne konstati pretendojn de kapo+ŝarĝo"
index 1a77aa978df5c29e1c9ec0f7d4a46c03369db92f..5bdc4a7a1455b23bb0c10c9e476ba493376d3f07 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -3,19 +3,22 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Adolfo Jayme Barrientos <fitoschido@gmail.com>, 2011.
-# Claudio Rodrigo Pereyra Diaz <elsupergomez@gmail.com>, 2012.
-# Daniel Cabrera <logan@fedoraproject.org>, 2011.
-# Domingo Becker <domingobecker@gmail.com>, 2012.
-# Héctor Daniel Cabrera <logan@fedoraproject.org>, 2011.
+# Adolfo Jayme Barrientos, 2011
+# Adolfo Jayme Barrientos, 2011
+# Adolfo Jayme Barrientos <fitoschido@ubuntu.com>, 2011,2014
+# beckerde <domingobecker@gmail.com>, 2012
+# Claudio Rodrigo Pereyra Diaz <elsupergomez@gmail.com>, 2012
+# Daniel Cabrera <logan@fedoraproject.org>, 2011
+# beckerde <domingobecker@gmail.com>, 2012
+# Daniel Cabrera <logan@fedoraproject.org>, 2011
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-11 14:20+0000\n"
-"Last-Translator: Domingo Becker <domingobecker@gmail.com>\n"
-"Language-Team: Spanish <trans-es@lists.fedoraproject.org>\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: Spanish (http://www.transifex.com/rpm-team/rpm/language/es/)\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -35,14 +38,14 @@ msgstr "versión de RPM %s\n"
 #: cliutils.c:32
 #, c-format
 msgid "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
-msgstr "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
+msgstr "Copyright © 1998-2002 - Red Hat, Inc.\n"
 
 #: cliutils.c:33
 #, c-format
 msgid ""
 "This program may be freely redistributed under the terms of the GNU GPL\n"
 msgstr ""
-"Este programa puede ser redistribuido libremente bajo los términos de la "
+"Este programa puede redistribuirse libremente bajo los términos de la "
 "licencia GNU GPL\n"
 
 #: cliutils.c:53
@@ -50,528 +53,590 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "falló la creación de la tubería para --pipe: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "falló exec\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "el argumento no es un paquete RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "error al leer encabezado del paquete\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "no se puede volver a abrir la carga útil: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Opciones de la selección de paquetes a consultar/verificar:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Opciones de consulta (con -q o --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Opciones de verificación (con -V o --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Opciones de Instalación/Actualización/Remoción:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Opciones comunes para todos los modos rpm y ejecutables:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "solo un tipo de consulta/verificación puede ser ejecutado a la vez"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "opciones de consulta inesperadas"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "formato de consulta inesperado"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "fuente de consulta inesperado"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "solo puede especificarse un modo principal"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "solo puede forzarse la instalación y la actualización"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr ""
-"los archivos solo pueden ser reubicados durante la instalación del paquete"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "no se puede utilizar --prefix con --relocate o --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate y --excludepath solo pueden ser utilizados cuando se instalan "
-"nuevos paquetes"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix solo puede ser utilizado al instalar nuevos paquetes"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "los argumentos de --prefix deber iniciar con una /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-"--hash (-h) sólo puede ser indicado durante la instalación o la eliminación "
-"de un paquete"
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-"--percent sólo puede ser indicado durante la instalación o la eliminación de "
-"un paquete"
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-"--replacepkgs solo puede ser especificado durante la instalación del paquete"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-"--excludedocs solo puede ser especificado durante la instalación del paquete"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-"--includedocs solo puede ser especificado durante la instalación del paquete"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "solo se puede especificar una opción: --excludedocs o --includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-"--ignorearch solo puede ser especificado durante la instalación del paquete"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-"--ignoreos solo puede ser especificado durante la instalación del paquete"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-"--ignoresize solo puede ser especificado durante la instalación del paquete"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-"--allmatches solo puede ser especificado durante la eliminación del paquete"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-"--allfiles solo puede ser especificado durante la instalación del paquete"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"--justdb solo puede ser especificado durante la instalación y eliminación "
-"del paquete"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"las opciones para desactivar scripts sólo pueden ser especificadas durante "
-"la instalación y eliminación del paquete"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"las opciones de desactivación de detonante sólo pueden ser especificadas "
-"durante la instalación y eliminación del paquete"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-"solo puede especificarse --nodeps durante la instalación, eliminación o "
-"verificación del paquete"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-"solo puede especificarse --test durante la instalación o la eliminación de "
-"un paquete"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "los argumentos de --root (-r) deben iniciar con una /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "no ha sido indicado ningún paquete para ser eliminado"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "no ha sido indicado ningún paquete para la instalación"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "no ha sido indicado ningún argumento para la consulta"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "no ha sido indicado ningún argumento para la verificación"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot ya especificado, ignorando %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "construir a través de %prep (desempaquetar fuentes y aplicar parches) desde "
 "<specfile>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specfile>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "construir a través de %build (%prep, luego compilar) desde <specfile>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "construir a través de %install (%prep, %build, luego instalar) desde "
 "<specfile>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "verificar la sección %files de <specfile>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "construir paquetes binarios y fuente desde <specfile>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "construir paquetes binarios únicamente desde <specfile>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "construir paquete fuente únicamente desde <specfile>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<paquete fuente>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"construir a través de %install (%prep, %build, luego instalar) desde "
+"<paquete fuente>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "construir a través de %prep (desempaquetar fuentes y aplicar parches) desde "
 "<tarball>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "construir a través de %build (%prep, luego compilar) desde <tarball>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "construir a través de %install (%prep, %build, luego instalar) desde "
 "<tarball>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "verificar sección %files desde <tarball>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "construir paquetes binarios y fuente desde <tarball>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "construir paquete binario únicamente desde <tarball>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "construir paquete fuente desde <tarball> "
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "construir paquete binario desde <source package>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<paquete fuente>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"construir a través de %install (%prep, %build, luego instalar) desde "
-"<paquete fuente>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "sobreescribir construcción de root"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "remover árbol de construcción al finalizar"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignorar directivas ExcludeArch desde el archivo spec"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "depurar archivo de la máquina de estado"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "no ejecutar ningún nivel de la construcción"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "no verificar dependencias de la construcción"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 "genera encabezado(s) de paquete(s) compatible(s) con el empaquetamiento rpm "
 "v3 (legado)"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr "no ejecutar la fase %clean de la construcción"
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr "no ejecutar la fase %check de la construcción"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "no aceptar msgstr i18N desde el archivo spec"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "eliminar fuentes al finalizar"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "eliminar el archivo spec al finalizar"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "Ir a etapa especificada (solo para c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "sobreescribir plataforma de destino"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 "Opciones de construcción con [ <archivo spec> | <tarball> | <paquete "
 "fuente> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Opciones comunes para todos los modos rpm y ejecutables:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Fallo al construir las dependencias:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "No se puede abrir el archivo spec %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Falló la apertura de la tuberia para tar: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Falló la lectura del archivo spec desde %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Falló al renombrar %s to %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "falló la llamada stat sobre %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "El archivo %s no es un archivo regular.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "El archivo %s no parece ser un archivo spec.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Construyendo las plataformas de destino: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Construyendo para el destino %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "los argumentos de --root (-r) deben iniciar con una /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "inicializar base de datos"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "reconstruir lista invertida de la base de datos desde los encabezados de "
 "paquetes instalados"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "verificar archivos de la base de datos"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Opciones de la base de datos:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "solo puede especificarse un modo principal"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "verificar firma(s) del paquete"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "importar una llave pública con armadura"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
-msgstr "no importa, pero indica si iba a funcionar o no"
+msgstr "no importar, pero indicar si funcionará o no"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "lista las llaves del administrador de llaves RPM"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Opciones del llavero:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "no ha sido indicado ningún argumento"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Opciones de la selección de paquetes a consultar/verificar:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Opciones de consulta (con -q o --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Opciones de verificación (con -V o --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Opciones de Instalación/Actualización/Remoción:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "solo un tipo de consulta/verificación puede ser ejecutado a la vez"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "opciones de consulta inesperadas"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "formato de consulta inesperado"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "fuente de consulta inesperado"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "solo puede forzarse la instalación y la actualización"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr ""
+"los archivos solo pueden ser reubicados durante la instalación del paquete"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "no se puede utilizar --prefix con --relocate o --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate y --excludepath solo pueden ser utilizados cuando se instalan "
+"nuevos paquetes"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix solo puede ser utilizado al instalar nuevos paquetes"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "los argumentos de --prefix deber iniciar con una /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+"--hash (-h) sólo puede ser indicado durante la instalación o la eliminación "
+"de un paquete"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+"--percent sólo puede ser indicado durante la instalación o la eliminación de "
+"un paquete"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr ""
+"--replacepkgs solo puede ser especificado durante la instalación del paquete"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr ""
+"--excludedocs solo puede ser especificado durante la instalación del paquete"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr ""
+"--includedocs solo puede ser especificado durante la instalación del paquete"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "solo se puede especificar una opción: --excludedocs o --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr ""
+"--ignorearch solo puede ser especificado durante la instalación del paquete"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
+"--ignoreos solo puede ser especificado durante la instalación del paquete"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr ""
+"--ignoresize solo puede ser especificado durante la instalación del paquete"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+"--allmatches solo puede ser especificado durante la eliminación del paquete"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
+"--allfiles solo puede ser especificado durante la instalación del paquete"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"--justdb solo puede ser especificado durante la instalación y eliminación "
+"del paquete"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"las opciones para desactivar scripts sólo pueden ser especificadas durante "
+"la instalación y eliminación del paquete"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"las opciones de desactivación de detonante sólo pueden ser especificadas "
+"durante la instalación y eliminación del paquete"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"solo puede especificarse --nodeps durante la instalación, eliminación o "
+"verificación del paquete"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+"solo puede especificarse --test durante la instalación o la eliminación de "
+"un paquete"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "no ha sido indicado ningún paquete para ser eliminado"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "no ha sido indicado ningún paquete para la instalación"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "no ha sido indicado ningún argumento para la consulta"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "no ha sido indicado ningún argumento para la verificación"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr "firma paquete(s)"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "firmar paquete(s) (idéntico a --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "eliminar las firmas del paquete"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Opciones de firma:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "No se pudo ejecutar %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Debe establecer \"%%_gpg_name\" en su archivo de macro\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Introduzca la frase de acceso:"
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "La frase de acceso es correcta\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr "Falló la verificación de la contraseña, o la llave gpg ha expirado\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr "analizar archivo(s) spec a stdout"
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
-msgstr "consulta elo los archivos spec"
+msgstr "consultar archivo(s) de spec"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr "opera sobre rpms binarios generados por spec (predeterminado)"
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr "opera sobre rpm fuente generado por spec"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "utilizar el siguiente formato de consulta"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "Opciones de spec:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr "no se han ofrecido argumentos para analizar"
 
@@ -580,32 +645,37 @@ msgstr "no se han ofrecido argumentos para analizar"
 msgid "Unable to open temp file: %s\n"
 msgstr "No es posible abrir el archivo temporal: %s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr "No es posible abrir flujo: %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Ejecutando(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Falló exec sobre %s  (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr "Error ejecutando scriptlet %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Estado de salida erróneo de %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -615,235 +685,315 @@ msgstr ""
 "\n"
 "Errores de construcción RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "error de sintaxis durante el análisis ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "error de sintaxis durante el análisis &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "error de sintaxis durante el análisis ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "error de análisis en la expresión\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "no coincidente (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- solo en números\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! solo en números\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "los tipos deben coincidir\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / no está soportado en cadenas\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- no está soportado en cadenas\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& y || no están soportados en cadenas\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "error de sintaxis en la expresión\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "'(' ausente en %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "')' ausente en %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Elemento %s no válido: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "%s ausente en %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Ningún espacio en blanco después de %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Sintaxis errónea: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "modo spec erróneo: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "dirmode spec erróneo: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr "Longitud de locale no usual: \"%s\" in %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr "Locale %s duplicado en %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Capacidad inválida %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Soporte para la capacidad del archivo no construido\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Los archivos deben iniciar con \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "Algoritmo de resumen de archivo %u desconocido, regresando a MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Archivo listado dos veces: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "falló la lectura %s de symlink: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "El enlace simbólico apunta a BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "No se ha encontrado el directorio: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Archivo no encontrado: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: no se puede cargar, etiqueta (%d) desconocida.\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: falló la lectura de la clave publica.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: no es una clave pública con armadura.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: falló la codificación\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "falló al crear el directorio"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "El archivo necesita comenzar con \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "%%dev glob no permitido: %s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "El directorio no ha sido hallado por glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Archivo no encontrado por glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "No se pudo abrir el archivo %%files %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "línea: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "Error leyendo %%files archivo %s: %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr "illegal _docdir_fmt %s: %s\n"
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Archivo no encontrado por glob: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr "No se puede mezclar el %s especial con otros formatos: %s\n"
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr "Más de un archivo en una línea: %s\n"
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Archivo erróneo: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "propietario/grupo erróneo: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Comprobando si hay archivos desempaquetados: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -852,555 +1002,612 @@ msgstr ""
 "Se encontraron archivos instalados (pero desempaquetados):\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Procesando archivos: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 "Los archivos binarios (%d) no coinciden con los archivos del paquete (%d).\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 "Binarios dependientes de la arquitectura en paquetes sin arquitectura\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr "falló al crear el archivo %s: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr "falló la creación del archivo: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "No es posible abrir el archivo %s: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: línea: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "No se pudo canonizar el nombre de host: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "No ha sido possible escribir la carga útil de %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "No ha sido posible leer la carga útil de %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "No se pudo canonizar el nombre de host: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Compresion de carga útil desconocida: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "No ha sido posible crear la región inmutable del encabezado.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "No es posible abrir archivo temporal.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Incapaz de escribir el encabezado temporal\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Falló al leer el archivo de política: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Datos CSA erróneos\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Incapaz de recargar el encabezado de la firma\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "No se pudo abrir %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "No ha sido possible escribir el paquete: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "No ha sido posible abrir sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "No ha sido posible leer el encabezado de %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "No ha sido possible escribir el encabezado de %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Escrito: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Ejecutando \"%s\":\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Falló la ejecución de \"%s\":\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Falló la verificación \"%s\" del paquete\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 "No se pudo generar el nombre de archivo de salida para el paquete %s: %s \n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "no es posible crear %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "línea %d: segundo %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr "fecha incorrecta en %%changelog: %s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "entradas %%changelog deben iniciar con *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "entrada %%changelog incompleta\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "fecha errónea en %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog no está en orden cronológico descendente\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "nombre ausente en %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "ninguna descripción en %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "línea %d: Error al analizar %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "línea %d: Opción errónea %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "línea %d: Demasiados nombres: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "línea %d: El paquete no existe: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "línea %d: Segunda descripción\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "línea %d: Error al analizar %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr "línea %d: Error al analizar %%policies: %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr "Error analizando campo de etiqueta: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "línea %d: Número erróneo: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "línea %d: Número no%s erróneo: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "línea %d: Número %s erróneo: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d definido múltiples veces\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "Descargando %s en %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "No es posible descargar %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "La arquitectura es excluida: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "La arquitectura no es incluida: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "SO es excluido: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "SO no es incluido: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "el campo %s debe estar presente en el paquete: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Duplicar entradas %s en el paquete: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "No ha sido posible abrir el icono %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "No ha sido posible leer el icono %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Tipo de icono desconocido: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "línea %d: La etiqueta solo recibe patrones individuales: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "línea %d: Carácter '%c' ilegal en: %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "línea %d: Carácter ilegal en: %s\n"
+msgid "%s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "línea %d: Secuencia \"..\" ilegal en: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "línea %d: Etiqueta mal formada: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "línea %d: Etiqueta vacía: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "línea %d: Los prefijos deben finalizar en \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "línea %d: Docdir debe iniciar con '/': %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "línea %d: El campo epoch debe ser un número sin signo: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "línea %d: %s erróneo: calificadores: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "línea %d: Formato BuildArchitecture erróneo: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "linea %d: Solo existe soporte para subpaquetes sin arquitectura: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Error interno: Etiqueta errónea %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "línea %d: %s se encuentra obsoleta: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Especificación de paquete errónea: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "El paquete ya existe: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "línea %d: Etiqueta desconocida: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} no puede ser vacío\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{BuildRoot} no puede ser \"/\"\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Fuente errónea: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Ningún número de parche %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch sin etiqueta \"Patch:\" correspondientes\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Ningún número fuente %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "No hay etiqueta \"Source:\" en el archivo spec\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Error al analizar %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "línea %d: Argumento erróneo para %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "línea %d: opción %%setup errónea %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Número de parche %s inválido: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "línea %d: segundo %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
-"Las fichas de dependencias deben comenzar con caracteres alfa numéricos, '_' "
-"o '/'"
+"Las fichas de dependencias deben comenzar con caracteres alfanuméricos, «_» "
+"o «/»"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr "No se permite el nombre de archivo versionado"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "Es necesaria una versión"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "dependencia no válida"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "se necesita una versión"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr "línea %d: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "línea %d: los detonantes deben tener --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "línea %d: Error al analizar %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "línea %d: el script interno debe finalizar con '>': %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "línea %d: los scripts ejecutables debe iniciar con '/': %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "línea %d: Segundo %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "línea %d: script interno no soportado: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 "línea %d: los argumentos de intérprete no son permitidos en disparadores: "
 "%s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "línea %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "No ha sido posible abrir %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr "%s:%d: Argumento esperado para %s\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr "línea %d: %%if no cerrado\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr "línea %d: macro no cerrado o continuación de línea errónea\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr "%s:%d: mal %%si condición\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: Tiene un %%else sin %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: Tiene un %%endif sin %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
-msgstr "%s:%d: sentencia %%include mal formada\n"
+msgstr "%s:%d: instrucción %%include con formato incorrecto\n"
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "No se encontraron arquitecturas compatibles para la construcción\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "El paquete no tiene %%description: %s\n"
@@ -1475,455 +1682,564 @@ msgstr "Demasiados argumentos en la línea: %s\n"
 msgid "Processing policies: %s\n"
 msgstr "Procesando políticas: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "Ignorando regex no válido %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "No se pudo crear una tuberia para %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "No se pudo ejecutar la llamada exec %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "No se pudo ejecutar la llamada al sistema fork para %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "Falló %s: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "falló la escritura de todos los datos a %s: %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Falló la conversión de %s a entero largo.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr "Clasificador de archivo vacío\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "No han sido configurados atributos de archivo\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "falló magic_open(0x%x): %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "falló magic_load: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Falló la identificación del archivo \"%s\": modo %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Buscando %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Falló la búsqueda de %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "la consulta del archivo spec %s falló, no se pudo analizar\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(error 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Magic erróneo"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Encabezado erróneo/imposible de leer"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "opciones db no reconocidas: \"%s\" ignorado.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "El tamaño del encabezado es demasiado extenso"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s tiene un valor numérico no válido, omitido\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr "Archivo muy grande para compactar"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr ""
+"%s tiene un valor largo demasiado grande o demasiado pequeño, omitido\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Tipo de archivo desconocido"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
+"%s tiene un valor entero demasiado grande o demasiado pequeño, omitido\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "No se encuentra el Enlace fijo"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "no se pudo obtener bloqueo %s en %s/%s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "El digest no coincide"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "compartido"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Error interno"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "exclusivo"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "El fichero del archivo no se encuentra en el encabezado"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "tipo de índice %x inválido en  %s/%s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " falló - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "error(%d) al obtener registros «%s» desde el índice %s: %s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "error(%d) almacenando registros \"%s\" en %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "error(%d) eliminando registro \"%s\" de %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "error(%d) estableciendo registro de encabezado #%d\n"
 
-#: lib/depends.c:68
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "error(%d) eliminando registro de encabezado #%d\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "error(%d) asignando nueva instancia de paquete\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s es un RPM Delta y no puede ser instalado directamente\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Carga útil (%s) no soportada en el paquete %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "el paquete %s ya fue añadido, omitiendo %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "el paquete %s ya fue añadido, reemplazando con %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(no es un blob)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(no es un número)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(no es una cadena)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(tipo no válido)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(no base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(tipo no válido)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(no es un blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(tipo xml no válido)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(no es una firma OpenPGP)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr "Fecha no válida %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normal        "
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "reemplazado"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "no instalado"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "compartido en red"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "color incorrecto"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "no se encuentra"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(desconocido) "
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(no es una cadena)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "usuario %s no existe - utilizando root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "grupo %s no existe - utilizando root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s guardado como %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s creado como %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr "%s %s: falló al eliminar: %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr "directorio"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr "archivo"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr "ignorando %s %s con firma no verificable\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr "ignorando %s con firma no verificable\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
-"tag[%d]: INVALIDADO, etiqueta %d, ipo %d desplazamiento %d contador %d\n"
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: INVALIDO, no es hexadecimal\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: UNVALIDO, no es binario\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: UNVALIDO, no es binario\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "tamaño de blob(%d): INVALIDO, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
-"tag de región: INCORRECTA, tag %d tipo %d desplazamiento %d cantidad %d\n"
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
-"region offset: INVALIDO, etiqueta %d tipo %d desplazamiento %d contador %d\n"
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
-"region trailer: INVALIDO, etiqueta %d tipo %d desplazamiento %d contador %d\n"
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "region size: INVALIDO, rill(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr size(%d): INVALIDO, la lectura retorno %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic: INVALIDO\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr tags: INVALIDO, numero de etiquetas(%d) fuera del rango\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "campo de anchura no válido"
+
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "datos de encabezado: INVALIDO, número de bytes(%d) fuera del rango\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr blob(%zd): INVALIDO, la lectura regreso %d\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "hdr load: INVALIDO\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "formato de etiqueta vacío"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature falló: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "nombre de etiqueta vacío"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: ninguna firma disponible\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead falló: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] esperado al final del arreglo"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "] inesperado"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "} inesperado"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "se esperaba ? en la expresión"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "se esperaba { después de ? en la expresión"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "se esperaba } en la expresión"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "se esperaba : después de la subexpresión ?"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "se esperaba { después de : en la expresión"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "se esperaba | al final de la expresión"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "iterador de arreglo usado con arreglos de diferente tamaño"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread falló: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "predefine MACRO con valor EXPR"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'MACRO EXPR'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "define MACRO con valor EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "imprimir expansión de macro de EXPR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'EXPR'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "leer <FILE:...> en vez del archivo(s) predeterminado"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FILE:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "no verificar resumen del paquete(s)"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 "no verificar la base de datos de lo(s) encabezado(s) cuando sean recuperadas"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "no verificar la firma(s) del paquete"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "enviar stdout a CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "utilizar ROOT como el directorio superior"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
-msgstr "utiliza la base de datos en DIRECTORY"
+msgstr "utilizar base de datos en DIRECTORIO"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
-msgstr "DIRECTORY"
+msgstr "DIRECTORIO"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "mostrar etiquetas de consulta conocidas"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "mostrar configuración rpmrc y macro final"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "proporcionar salida menos detallada"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "proporcionar salida más detallada"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "imprimir la versión de rpm que está siendo utilizada"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "depurar archivo de carga de la máquina de estado"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "depurar E/S rpmio"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: misconfiguración de la opción table (%d)\n"
@@ -1944,13 +2260,13 @@ msgstr "realocaciones deben contener un ="
 msgid "relocations must have a / following the ="
 msgstr "realocaciones deben tener una / después de ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "instalar todos los archivos, incluso los de configuración, que de otra "
 "manera serían salteados."
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1958,151 +2274,161 @@ msgstr ""
 "remueve todos los paquetes que coincidan con <paquetes> (normalmente un "
 "error es generado si <paquete> especifica multiples paquetes) "
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "reubicar archivos en un paquete no reubicable"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "mostrar bucles de dependencias como advertencias"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "borrar (desinstalar) paquete"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<package>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "no instalar los archivos de configuración"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "no instalar documentación"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "omitir archivos con el componente inicial <path>"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<path>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "abreviatura para --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "actualizar paquete(s) si ya están instalados"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<packagefile>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "imprimir marcas hash como durante la instalación del paquete (con -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "no verificar arquitectura del paquete"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "no verificar sistema operativo del paquete"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "no verificar espacio de disco antes de la instalación"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "instalar documentación"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "instalar paquete(s)"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "actualizar la base de datos, mas no modificar el sistema de archivos"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "no verificar las dependencias del paquete"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "no verificar el digest de los archivos"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "no verificar el digest de los archivos (obsoleto)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "no instalar contextos de seguridad del archivo"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "no reordenar la instalación de paquetes para satisfacer dependencias"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "no ejecutar scriptlet(s) del paquete"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "no ejecutar %%pre scriptlet (si hay)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "no ejecutar %%post scriptlet (si hay)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "no ejecutar %%preun scriptlet (si hay)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "no ejecutar %%postun scriptlet (si hay)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "no ejecutar ningún scriptlet detonado por este paquete"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "no ejecutar ningún %%triggerprein scriptlet(s)"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "no ejecutar ningún %%triggerin scriptlet(s)"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "no ejecutar ningún %%triggerun scriptlet(s)"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "no ejecutar ningún %%triggerpostun scriptlet(s)"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "no realizar ninguna acción de colección"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2110,370 +2436,407 @@ msgstr ""
 "actualiza a una versión antigua del paquete (--force en actualizaciones hace "
 "esto automaticamente)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "imprimir porcentaje mientras se instala el paquete"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "realojar el paquete a <dir> si éste es realojable"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "realojar archivos de la ruta <old> a <new>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<old>=<new>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "ignorar conflictos entre paquetes referentes a archivos "
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "reinstalar si el paquete ya está presente"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "no instalar, pero señalar si se puede o no"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "actualizar paquete(s)"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "consultar/verificar todos los paquetes"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "modo rpm checksig"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "consultar/verificar archivo propietario de paquete(s)"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "consultar/verificar paquete(s) en grupo"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "consultar/verificar un archivo de paquete"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "consultar/verificar paquete(s) con identificador de paquete"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "consultar/verificar paquete(s)con identificador de cabecera"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "modo de consulta rpm"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "consultar/verificar una instancia de la cabecera"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "consultar/verificar paquete(s) de la transacción de la instalación"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "consultar los paquetes lanzados por el paquete"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "modo de verificación de rpm"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "consultar/verificar los paquetes que requieren una dependencia"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "consultar/verificar paquetes que proporcionan una dependencia"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "ningún argumento para glob"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "no procese los archivos que no pertenecen al paquete como manifiestos"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "listar todos los archivos de configuración"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "listar todos los archivos de documentación"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "listar todos los archivos de documentación"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "listar todos los archivos de configuración"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "Volcar información de archivo básica"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "listar archivos del paquete"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "saltar archivos %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "saltar archivos %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "mostrar el estado de los archivos listados"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "no verificar el tamaño de los archivos"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "no verificar la ruta symlink de los archivos"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "no verificar el propietario de los archivos"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "no verificar el grupo de los archivos"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "no verificar el tiempo de modificación de los archivos"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "no verificar el modo de los archivos"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "no verificar las capacidades de los archivos"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "no verificar los contextos de seguridad del archivo"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "no verificar las capacidades de los archivos"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "no verificar los archivos en el paquete"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "no verificar las dependencias de paquetes"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "no ejecutar scripts de verificación"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "No se encuentran características rpmlib para %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "se esperaba el paquete fuente, paquete binario encontrado\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "el paquete fuente no contiene archivo .spec\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "falló el desempaquetado de archivos %s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " en archivo"
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "falló %s en archivo %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "falló %s: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "formato incorrecto: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(no contiene archivos)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "reemplazado"
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "no instalado"
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "compartido en red"
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "color incorrecto"
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(sin estado)"
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(desconocido %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "el paquete no tiene lista de propietario/grupo de archivo\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "el paquete no tiene ni lista de propietario de archivos ni id\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "grupo %s no contiene ningún paquete\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "sin detonante de paquetes %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "%s mal formado: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "ningún paquete coincide con %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "ningún paquete requiere %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "ningún paquete proporciona %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "archivo %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "el archivo %s no es propiedad de ningún paquete\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "número de paquete inválido: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "el registro %u no pudo ser leído\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "el paquete %s no está instalado\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "etiqueta desconocida:\"%s\"\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s: falló la importación de la llave %d\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s: la llave %d no es una llave pública protegida.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: falló la lectura para importar(%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr "%s: fallo lectura de encabezado: %s\n"
+msgid "Fread failed: %s"
+msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
-"%s: la cabecera de región no modificable no pudo ser leída. ¿Estará corrupto "
-"el paquete?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NO ESTA BIEN"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "BIEN"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (FALTAN LAS CLAVES:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (CLAVES NO CONFIABLES:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: falló la apertura: %s\n"
@@ -2498,222 +2861,454 @@ msgstr "No se puede cambiar el directorio raíz: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "No es posible restablecer el directorio raíz: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "Generando %d índice(s) faltante(s), espere…\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "no se ha establecido dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: omitiendo"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "error(%d) almacenando registro #%d en %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s:  regexec falló: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp falló: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: omitiendo"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: encabezado dañado #%u recuperada -- omitiendo.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: no se pudo leer encabezado en 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "no se ha establecido dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "no se pudo crear el directorio %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "encabezado #%u erróneo en la base de datos -- omitiendo.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "no se puede añadir el registro original en %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"falló la reconstrucción de la base de datos: la base de datos original "
+"permanece en su lugar\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr ""
+"¡falló el remplazo de la base de datos antigua con la nueva base de datos!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NO "
 
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr "SI"
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "SI"
+
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+msgstr "PreReq:, Provides:, y Obsoletes: dependencias soportan versiones."
+
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr ""
+"nombres de archivos almacenados como (dirName,baseName,dirIndex) \"tuple\", "
+"no como ruta."
+
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr "la carga del paquete puede ser comprimida utilizando bzip2."
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr "la carga del paquete puede ser comprimida utilizando xz."
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr "la carga del paquete puede ser comprimida tilizando bzip2. "
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "los archivos de carga del paquete tienen el prefijo  \"./\"."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr ""
+"nombre-versión-lanzamiento del paquete no se proporciona implícitamente."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr ""
+"las etiquetas del encabezado son siempre ordenadas después de ser cargadas."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "el intérprete de scriptlet puede utilizar argumentos del encabezado."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr ""
+"un conjunto de enlaces fijos de archivo puede ser instalado aunque no se "
+"haya completado."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+"scriplets de paquete pueden acceder a la base de datos rpm mientras se está "
+"imstalando."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "soporte interno para scripts lua."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr "el algoritmo de digest se puede configurar por paquete"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "soporte para capacidades de archivo POSIX1e."
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+"los scriptlets de los paquetes pueden ser expandidos en el momento de la "
+"instalación."
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr "la comparación de dependencias admite versiones con virgulilla."
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
 
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr "PreReq:, Provides:, y Obsoletes: dependencias soportan versiones."
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
-"nombres de archivos almacenados como (dirName,baseName,dirIndex) \"tuple\", "
-"no como ruta."
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
-msgstr "la carga del paquete puede ser comprimida utilizando bzip2."
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
-msgstr "la carga del paquete puede ser comprimida utilizando xz."
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr "la carga del paquete puede ser comprimida tilizando bzip2. "
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "los archivos de carga del paquete tienen el prefijo  \"./\"."
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
 msgstr ""
-"nombre-versión-lanzamiento del paquete no se proporciona implícitamente."
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
 msgstr ""
-"las etiquetas del encabezado son siempre ordenadas después de ser cargadas."
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "el intérprete de scriptlet puede utilizar argumentos del encabezado."
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
-"un conjunto de enlaces fijos de archivo puede ser instalado aunque no se "
-"haya completado."
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Magic erróneo"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Encabezado erróneo/imposible de leer"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "El tamaño del encabezado es demasiado extenso"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "Archivo muy grande para compactar"
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Tipo de archivo desconocido"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
-"scriplets de paquete pueden acceder a la base de datos rpm mientras se está "
-"imstalando."
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "soporte interno para scripts lua."
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "El digest no coincide"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr "el algoritmo de digest se puede configurar por paquete"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Error interno"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "soporte para capacidades de archivo POSIX1e."
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "El fichero del archivo no se encuentra en el encabezado"
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
-"los scriptlets de los paquetes pueden ser expandidos en el momento de la "
-"instalación."
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
-msgstr "la comparación de dependencias soporta versiones con tilde."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " falló - "
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr ""
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "la apertura de %s falló: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: no es un paquete rpm (o manifiesto de paquete)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr "Actualizando / instalando...\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr "Limpiando / eliminando...\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Preparando..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr "Preparando paquetes..."
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Error de dependencias:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: no es un paquete rpm (o manifiesto de paquete): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s no puede ser instalado\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Recuperando %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "omitiendo %s - transferencia fallida\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "paquete %s no es reubicable\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "error al leer del archivo %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "\"%s\" especifica varios paquetes:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "no se puede abrir %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Instalando %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "no es un paquete rpm"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "tipo de firma ilegal"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "versión del paquete RPM no soportada"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "falló la lectura: %s  (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "no es un paquete rpm\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "no es posible crear el bloqueo %s sobre %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "esperando el bloqueo %s sobre %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr "Falló al abrir dl %s %s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "Falló al resolver el símbolo %s: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "Falló al expandir macro de %%__collection_%s\n"
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "El complemento %s no ha sido cargado\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr "Falló al resolver el símbolo %s de complemento %s: %s\n"
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "diferente"
@@ -2794,646 +3389,353 @@ msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 "se encontró el error desconocido %d mientras se manipulaba el paquete %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "segundo ':' omitido en %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "nombre de arquitectura omitida en %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Línea de datos incompleta en %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Demasiados argumentos en la línea de datos en %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Número de arq/os erróneo: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Línea determinada incompleta en %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Demasiados argumentos en la línea predeterminada en %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "':' faltante (se encontró 0x%02x) en %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "falta argumento para %s en %s:%d\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr "no se puede abrir %s en %s:%d: %m\n"
 
-#: lib/rpmrc.c:536
+#: lib/rpmrc.c:564
 #, c-format
 msgid "missing architecture for %s at %s:%d\n"
 msgstr "falta la arquitectura para %s en %s:%d\n"
 
-#: lib/rpmrc.c:603
+#: lib/rpmrc.c:632
 #, c-format
 msgid "bad option '%s' at %s:%d\n"
 msgstr "opción errónea '%s' en %s:%d\n"
 
-#: lib/rpmrc.c:927
+#: lib/rpmrc.c:972
 msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr "Falló al leer el vector auxiliar, ¿estará montado /proc?\n"
 
-#: lib/rpmrc.c:1349
+#: lib/rpmrc.c:1469
 #, c-format
 msgid "Unknown system: %s\n"
 msgstr "Sistema desconocido: %s\n"
 
-#: lib/rpmrc.c:1350
+#: lib/rpmrc.c:1471
 #, c-format
 msgid "Please contact %s\n"
 msgstr "Por favor contacte %s\n"
 
-#: lib/rpmrc.c:1591
+#: lib/rpmrc.c:1604
 #, c-format
 msgid "Unable to open %s for reading: %m.\n"
 msgstr "No se puede abrir %s para lectura: %m.\n"
 
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr "No es posible restaurar el directorio actual: %m"
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-"soporte interno para macro de inclución de guiones <lua>, no fue construido\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "No se pudo crear un archivo temporal para %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "No se pudo duplicar el descritor de archivo %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "%s: macro de ejecución de guión fallido, waitpid(%d) rd %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s: macro de ejecución de guión fallido, señal %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "%s: macro de ejecución de guión fallido, estado de terminación %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "formato desconocido"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "instalar "
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "borrar"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "no se puede abrir la base de datos Packages en %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "'(' extra en la etiqueta del paquete: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "'(' ausente en la etiqueta del paquete: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "')' ausente en la etiqueta del paquete: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: lectura de la clave publica fallida.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "transacción"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh size(%d): INVALIDO, la lectura devolvió %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic: INVALIDO\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh tags: INVALIDO, número de etiquetas(%d) fuera del rango\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh data: INVALIDO, número de bytes(%d) fuera del rango\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d): INVALIDO, la lectura devolvió %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-"sigh tag[%d]: INVALIDO, etiqueta %d tipo %d desplazamiento %d contador %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh load: INVALIDO\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh pad(%zd): INVALIDO, lectura de %zd bytes\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd): INVALIDO, fstat(2) falló\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
-"No se pudo leer la región inmutable del encabezado. ¿El paquete esta "
-"corrupto?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr "No es posible firmar paquetes RPM v3\n"
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "Resumen MD5: "
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "Resumen SHA1 del encabezado:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Encabezado"
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr "Comprobar firma: PARAMETROS ERRONEOS  (%d %p %d %p %p)\n"
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "ignorado"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "falló"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "falta %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Dependencias no satisfechas para %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr "campo de anchura no válido"
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "falta { después de %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "falta } después %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "formato de etiqueta vacío"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "nombre de etiqueta vacío"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "etiqueta desconocida"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] esperado al final del arreglo"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "] inesperado"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "} inesperado"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "se esperaba ? en la expresión"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "se esperaba { después de ? en la expresión"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "se esperaba } en la expresión"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "se esperaba : después de la subexpresión ?"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "se esperaba { después de : en la expresión"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "se esperaba | al final de la expresión"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "iterador de arreglo usado con arreglos de diferente tamaño"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "Generando %d índice(s) faltante(s), por favor aguarde...\n"
 
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "no se pudo abrir índice %s utilizando db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
-"error(%d) al intentar obtener \"%s\" registros desde el índice %s: %s\n"
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "no se ha establecido dbpath\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: omitiendo"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "error(%d) almacenando registro #%d en %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s:  regexec falló: %s\n"
 
-#: lib/rpmdb.c:1596
+#: lib/rpmscript.c:138
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp falló: %s\n"
+msgid "Unable to restore current directory: %m"
+msgstr "No es posible restaurar el directorio actual: %m"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: omitiendo"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr ""
+"soporte interno para macro de inclución de guiones <lua>, no fue construido\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmscript.c:278
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: encabezado dañado #%u recuperada -- omitiendo.\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "No se pudo crear un archivo temporal para %s: %s\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr "error(%d:%s) al intentar obtener siguiente llave desde el índice %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "No se pudo duplicar el descritor de archivo %s: %s\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmscript.c:353
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "error(%d) estableciendo registro de encabezado #%d\n"
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmscript.c:371
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "error(%d) eliminando registro de encabezado #%d\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s: macro de ejecución de guión fallido, waitpid(%d) rd %d: %s\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmscript.c:375
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: no se pudo leer encabezado en 0x%x\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s: macro de ejecución de guión fallido, señal %d\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmscript.c:378
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "error(%d) estableciendo registros \"%s\" desde índice %s\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s: macro de ejecución de guión fallido, estado de terminación %d\n"
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "error(%d) almacenando registros \"%s\" en %s\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "formato desconocido"
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "error(%d) eliminando registro \"%s\" de %s\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "instalar "
 
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "error(%d) asignando nueva instancia de paquete\n"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "borrar"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmts.c:100
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "error(%d) obteniendo registros \"%s\" del índice %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "no se puede abrir la base de datos Packages en %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmts.c:199
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "error(%d) almacenando registro %s en %s\n"
-
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "no se ha establecido dbpath"
+msgid "extra '(' in package label: %s\n"
+msgstr "'(' extra en la etiqueta del paquete: %s\n"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmts.c:217
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "no se pudo crear el directorio %s: %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "'(' ausente en la etiqueta del paquete: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmts.c:225
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "encabezado #%u erróneo en la base de datos -- omitiendo.\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "')' ausente en la etiqueta del paquete: %s\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "no se puede añadir el registro original en %u\n"
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: lectura de la clave publica fallida.\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr ""
-"falló la reconstrucción de la base de datos: la base de datos original "
-"permanece en su lugar\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "transacción"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
+#: lib/rpmvs.c:152
+#, c-format
+msgid "%s tag %u: invalid type %u"
 msgstr ""
-"¡falló el remplazo de la base de datos antigua con la nueva base de datos!\n"
 
-#: lib/rpmdb.c:2949
+#: lib/rpmvs.c:158
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "reemplazar archivos en %s con los archivos de %s a recuperar"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/rpmvs.c:178
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "falló la eliminación del directorio %s: %s\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmvs.c:188
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d error(%d) de %s: %s\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmvs.c:195
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d error(%d): %s\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmvs.c:206
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "no se pudo obtener bloqueo %s en %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "compartido"
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "exclusivo"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:261
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr "tipo de índice %x inválido en  %s/%s\n"
+msgid "%s%s %s"
+msgstr ""
 
-#: lib/backend/dbconfig.c:144
-#, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "opciones db no reconocidas: \"%s\" ignorado.\n"
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:268
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s tiene un valor numérico no válido, omitido\n"
+msgid "%s%s"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
-#, c-format
-msgid "%s has too large or too small long value, skipped\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
-"%s tiene un valor largo demasiado grande o demasiado pequeño, omitido\n"
 
-#: lib/backend/dbconfig.c:199
-#, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
-"%s tiene un valor entero demasiado grande o demasiado pequeño, omitido\n"
 
-#: plugins/sepolicy.c:218
-#, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "Falló al decodificar la política para %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
 
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "Falló al crear archivo temporal para %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Encabezado"
 
-#: plugins/sepolicy.c:231
-#, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "Falló al escribir la política %s en el archivo %s\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr "Falló al crear manipulador de semanage\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Incapaz de recargar el encabezado de la firma\n"
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "Falló al conectar con el manipulador de políticas\n"
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "ignorado"
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "Falló iniciar transacción de política: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "falló"
 
-#: plugins/sepolicy.c:337
+#: lib/verify.c:263
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr "Falló al eliminar el archivo de política temporal %s: %s\n"
+msgid "Duplicate username or UID for user %s\n"
+msgstr ""
 
-#: plugins/sepolicy.c:386
+#: lib/verify.c:284
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "Falló al instalar módulo de política: %s (%s)\n"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "Falló al eliminar el módulo de política: %s\n"
+#: lib/verify.c:395
+msgid "no state"
+msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "Falló al bifurcar el proceso: %s\n"
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: lib/verify.c:448
 #, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "Falló al ejecutar %s: %s\n"
+msgid "missing   %c %s"
+msgstr "falta %c %s"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:503
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "%s finalizó de manera anormal\n"
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Dependencias no satisfechas para %s:\n"
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: plugins/prioreset.c:29
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "%s falló con un código de salida %i\n"
-
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "Falló al enviar modificaciones de política\n"
-
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "Falló al expandir el camino restoreconf"
-
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
-"Falló al re etiquetar el sistema de archivos. Lor archivos podrían "
-"encontrarse mal etiquetados\n"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
-"Falló al recargar el contexto de archivo. Los archivos podrían estar mal "
-"etiquetados\n"
 
-#: plugins/sepolicy.c:594
-#, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "Falló al extraer la política desde %s\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:185
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== activo %d vacío %d\n"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
 
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(vacío)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(vacío)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "El macro %%%s tiene un cuerpo incompleto\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "El macro %%%s tiene opciones no terminadas\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "El macro %%%s tiene un nombre ilegal (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "El macro %%%s tiene un cuerpo incompleto\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "El macro %%%s tiene opciones no terminadas\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "El macro %%%s tiene un cuerpo vacío\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Falló la expansión del macro macro %%%s\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "El macro %%%s tiene un nombre ilegal (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "El macro %%%s (%s) no fue utilizado debajo del nivel %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Opción desconocida %c en %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
@@ -3441,165 +3743,282 @@ msgstr ""
 "Demasiados niveles de recursión en la expansión macro. Esto seguramente haya "
 "sido provocado por una declaración macro recursiva.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "No terminado %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Un %% está seguido por un macro no analizable\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== activo %d vacío %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "error al crear el archivo temporal %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Archivo %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "El archivo %s tiene menos de %u bytes\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "falló al crear el directorio"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[ninguno]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(ningún error)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "error fatal:"
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "error: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "advertencia:"
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "sintaxis no válida en el macro de ejecución de scriptlet lua: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "sintaxis no valida en el scriptlet lua: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "falló el scriptlet lua: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "sintaxis no valida en el archivo de scriptlet lua: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "falló el enlace de lua: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[ninguno]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(ningún error)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "error fatal:"
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "error: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "advertencia:"
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "la asignación de memoria (%u bytes) retornó NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, ID de clave %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(ninguno)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite falló: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread falló: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush fallido: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr "Firma PGP no soportada\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr "Algoritmo hash PGP no soportado %u\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr "Algoritmo de llave pública PGP no soportado %u\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "No se pudo ejecutar %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "No se pudo crear la tuberia para firmar: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "falló la llamada al sistema exec para gpg (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg falló al escribir la firma\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "incapaz de leer la firma\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "faló makeTempFile\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr "%s ya contiene una firma idéntica, ignorando\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead falló: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature falló: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: falló headerRead: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "No es posible firmar paquetes RPM v3\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s ya contiene una firma idéntica, ignorando\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature falló: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead falló: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "falló el reemplazo %s: %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: falló la lectura del manifiesto: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "no verificar firma de encabezado+carga"
index 71c87f7958f0e9d99e631d906b28bf4e689a0186..0f14185452ff40854f17bd1ff45355ea640afcf3 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -7,10 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Finnish (http://www.transifex.com/rpm-team/rpm/language/fi/)\n"
 "Language: fi\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,496 +43,558 @@ msgstr "Tätä ohjelmaa voi vapaasti levittää GNU GPL:n puittessa\n"
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "putken luominen --pipe:lle epäonnistui: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "suoritus epäonnistui\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "parametri ei ole RPM paketti\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "virhe luettaessa otsikkotietoa paketista\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "kuorman uudelleenavaus ei onnistu: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Kysely/tarkistus pakettivalitsimet"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Kyselyvalitsimet (-q tai --query yhteydessä)"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Tarkistusvalitsimet (-V tai --verify yhteydessä)"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Asennus-, päivitys- ja poistovalitsimet:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Yhteiset valitsimet kaikille rpm moodeille:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "vain yhden tyyppinen kysely/tarkistus voidaan suorittaa kerralla"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "odottamattomia kyselyvalintoja"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "odottamaton kyselyn muotoilu"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "odottamaton kyselyn lähde"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "vain yksi päätila voidaan määritellä"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "tiedostoja voidaan siirtää toiselle polulle vain asennettaessa"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "--prefix valintaa ei voi käyttää --relocate tai --excludepath kanssa"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate ja --excludepath: voidaan käyttää vain uusia paketteja "
-"asennettaessa"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix: voidaan käyttää vain uusia paketteja asennettaessa"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "--prefix parametrien pitää alkaa /-merkillä"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs: voidaan käyttää vain paketteja asennettaessa"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs: voidaan käyttää vain paketteja asennettaessa"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs: voidaan käyttää vain paketteja asennettaessa"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "vain toinen --excludedocs tai --includedocs voidaan antaa"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch: voidaan käyttää vain paketteja asennettaessa"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos: voidaan käyttää vain paketteja asennettaessa"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize: voidaan käyttää vain paketteja asennettaessa"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches: voidaan käyttää vain paketteja poistettaessa"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles: voidaan käyttää vain paketteja asennettaessa"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"--justdb: voidaan käyttää vain paketteja asennettaessa tai poistettaessa"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"skriptien estovalintoja voidaan käyttää vain paketteja asennettaessa tai "
-"poistettaessa"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"laukaisimien estovalintoja voidaan käyttää vain paketteja asennettaessa tai "
-"poistettaessa"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "parametrit --root (-r):lle alettava /-merkillä"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "poistolle ei määritelty paketteja"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "asennukselle ei määritelty paketteja"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "kyselylle ei annettu parametrejä"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "tarkistukselle ei annettu parametrejä"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot on jo määritelty, %s:ää ei huomioida\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr "käännä %prep-osioon asti spec-tiedostosta"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<spec-tiedosto>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "käännä %build-osioon asti (%prep ja %build) spec-tiedostosta"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "käännä %install-osioon asti (%prep, %build ja %install) spec-tiedostosta"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "tarkista %files-osio spec-tiedostosta"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "käännä lähde- ja binääripaketit spec-tiedostosta"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "käännä vain binääripaketti spec-tiedostosta"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "käännä vain lähdepaketti spec-tiedostosta"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<lähdepaketti>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr "käännä %install-osioon asti (%prep, %build ja %install) lähdepaketista"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr "käännä %prep-osioon asti tar-tiedostosta"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tar-tiedosto>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "käännä %build-osioon asti (%prep ja %build) tar-tiedostosta"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "käännä %install-osioon asti (%prep, %build ja %install) tar-tiedostosta"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "tarkista %files-osio tar-tiedostosta"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "käännä lähde- ja binääripaketit tar-tiedostosta"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "käännä vain binääripaketti tar-tiedostosta"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "käännä vain lähdepaketti tar-tiedostosta"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "käännä binääripaketti lähdepaketista"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<lähdepaketti>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr "käännä %install-osioon asti (%prep, %build ja %install) lähdepaketista"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "ohita käännösjuuri"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "poista käännöspuu, kun valmis"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "jätä ExcludeArch-directiivit huomioimatta"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr ""
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "älä suorita mitään käännöksen vaiheita"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "älä tarkista käännösriippuvuuksia"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "poista lähdekoodit kun valmis"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "poista määrittelytiedosto kun valmis"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "siirry suoraan määriteltyyn vaiheeseen (vain c ja i yhteydessä)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "ohita kohdealusta"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "Käännösvalitsimet:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Yhteiset valitsimet kaikille rpm moodeille:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Puuttuvia käännösriippuvuuksia:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "En voi avata spec-tiedostoa %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "tar-putken avaus epäonnistui: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Spec-tiedoston avaaminen %s:sta epäonnistui\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Uudelleen nimeäminen %s -> %s epäonnistui: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "%s:n stat epäonnistui: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Tiedosto %s ole tavallinen tiedosto.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Tiedosto %s ei vaikuta spec-tiedostolta.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Käännetään kohdealustoille: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Käännetään kohteelle %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "parametrit --root (-r):lle alettava /-merkillä"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "alusta tietokanta"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr "rakenna tietokanta uudestaan asennettujen pakettien tiedoista"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "tarkista tietokanta"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Tietokantavalitsimet:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "vain yksi päätila voidaan määritellä"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "tarkista paketin allekirjoitus"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "ei annettu parametrejä"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Kysely/tarkistus pakettivalitsimet"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Kyselyvalitsimet (-q tai --query yhteydessä)"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Tarkistusvalitsimet (-V tai --verify yhteydessä)"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Asennus-, päivitys- ja poistovalitsimet:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "vain yhden tyyppinen kysely/tarkistus voidaan suorittaa kerralla"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "odottamattomia kyselyvalintoja"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "odottamaton kyselyn muotoilu"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "odottamaton kyselyn lähde"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "tiedostoja voidaan siirtää toiselle polulle vain asennettaessa"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "--prefix valintaa ei voi käyttää --relocate tai --excludepath kanssa"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate ja --excludepath: voidaan käyttää vain uusia paketteja "
+"asennettaessa"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix: voidaan käyttää vain uusia paketteja asennettaessa"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "--prefix parametrien pitää alkaa /-merkillä"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs: voidaan käyttää vain paketteja asennettaessa"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs: voidaan käyttää vain paketteja asennettaessa"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs: voidaan käyttää vain paketteja asennettaessa"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "vain toinen --excludedocs tai --includedocs voidaan antaa"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch: voidaan käyttää vain paketteja asennettaessa"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos: voidaan käyttää vain paketteja asennettaessa"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize: voidaan käyttää vain paketteja asennettaessa"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches: voidaan käyttää vain paketteja poistettaessa"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles: voidaan käyttää vain paketteja asennettaessa"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"--justdb: voidaan käyttää vain paketteja asennettaessa tai poistettaessa"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"skriptien estovalintoja voidaan käyttää vain paketteja asennettaessa tai "
+"poistettaessa"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"laukaisimien estovalintoja voidaan käyttää vain paketteja asennettaessa tai "
+"poistettaessa"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "poistolle ei määritelty paketteja"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "asennukselle ei määritelty paketteja"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "kyselylle ei annettu parametrejä"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "tarkistukselle ei annettu parametrejä"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "allekirjoita paketti (hylkää nykyinen allekirjoitus)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "poista paketin allekirjoitus"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Allekirjoitusvalitsimet:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "%s:ää ei voitu suorittaa: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Sinun pitää asettaa \"gpg_name:\" makrotiedostossasi\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Syötä salasana: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Salasana täsmää.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "käytä seuraava kyselyformaattia"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -541,32 +603,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Suoritetaan(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "%s:n suoritus epäonnistui (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr ""
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -575,235 +642,315 @@ msgstr ""
 "\n"
 "RPM käännösvirheitä:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "syntaksivirhe jäsentäessä ==:aa\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "syntaksivirhe jäsentäessä &&:aa\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "syntaksivirhe jäsentäessä ||:aa\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "jäsennysvirhe lausekkeessa\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "pariton (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- vain numeroissa\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! vain numeroissa\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "tyyppien täytyy olla yhtenevät\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / ei tuettu merkkijonoille\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- ei tuettu merkkijoinoille\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& ja || ei tuettu merkkijoinoille\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "syntaksivirhe lausekkeessa\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Puuttuva '(' %s %s:ssä\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "puuttuva ')' %s:(%s:ssä\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Virheellinen %s merkki: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Puuttuva %s %s %s:ssä\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Virheellinen syntaksi: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Virheellinen oikeusmäärittely %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Virheellinen hakemisto-oikeusmäärittely %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Tiedostojen täytyy alkaa \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Tiedosto lueteltu kahdesti: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Symbolinen linkki osoittaa BuildRoot:iin: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Tiedostoa ei löytynyt: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: julkisen avaimen luku epäonnistui\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: ei ole panssaroitu julkinen avain.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "hakemiston luonti epäonnistui"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Tiedosto tarvitsee aloitusmerkin \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Tiedostoa ei löytynyt täydennyksellä: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "%%files tiedostoa %s ei voitu avata: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "rivi: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
+#, c-format
+msgid "illegal _docdir_fmt %s: %s\n"
+msgstr ""
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Tiedostoa ei löytynyt täydennyksellä: %s\n"
+
+#: build/files.c:2431
 #, c-format
-msgid "illegal _docdir_fmt %s: %s\n"
+msgid "Special file in generated file list: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Virheellinen tiedosto: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Virheellinen omistaja/ryhmä: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Tarkistetaan paketoimattomia tiedostoja: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -812,548 +959,605 @@ msgstr ""
 "Löytyi asennettuja (mutta paketoimattomia) tiedostoja:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Käsitellään tiedostoja: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: rivi: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Kuorman kirjoitus %s:ään ei onnistu: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Kuorman luku %s:stä ei onnistu: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Tuntematon kuorman pakkaus: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "En voi avata väliaikaistiedostoa.\n"
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Tilapäisotsikon kirjoitus ei onnistu\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Spec-tiedoston avaaminen %s:sta epäonnistui\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Allekirjoitusotsikon uudelleenlataus ei onnistu\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "%s:aa ei voitu avata: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Pakettia ei voitu kirjoittaa: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr ""
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Otsikkotiedon lukeminen %s:stä epäonnistui: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Otsikkotiedon kirjoittaminen %s:n epäonnistui: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Kirjoitettiin: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Suoritetaan \"%s\":\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "%s:n suoritus epäonnistui.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Paketin tarkistus \"%s\" epäonnistui.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Tiedostonimen muodostus paketille %s ei onnistu: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "%s:n luonti ei onnistu: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "rivi %d: toinen %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "%%changelog merkintöjen täytyy alkaa *:llä\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "epätäydellinen merkintä %%changelog:issa\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "virheellinen päivämäärä %%changelog:issa: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog ei ole kronologisessa järjestyksessä\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "puuttuva nimi %%changelog:issa\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "ei kuvausta %%changelog:issa\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "rivi %d: virhe jäsennettäessä %%description-osiota %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "rivi %d: virheellinen valinta %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "rivi %d: liikaa nimiä: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "line %d: pakettia ei ole olemassa: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "line %d: toinen %%description-osio\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "rivi %d: virhe jäsennettäessä %%files-osiota: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "rivi %d: virheellinen numero: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d määritelty useita kertoja\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Arkkitehtuuri on poissuljettu: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Arkkitehtuuri ei ole mukaanluettu: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "Käyttöjärjestelmä on poissuljettu: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "Käyttöjärjestelmä ei ole mukaanluettu: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "kenttä %s on vaadittu kenttä paketissa: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Useita %s-merkintöjä paketissa: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Ikonia %s ei voida avata: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Ikonia %s ei voida lukea: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Tuntematon ikonityyppi: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "rivi %d: laiton merkki '%c' %s:ssä\n"
+msgid "line %d: %s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "rivi %d: laiton merkki %s:ssä\n"
+msgid "%s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "rivi %d: laiton merkkijono \"..\" %s:ssä\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "rivi %d: Epoch-kentän täytyy olla etumerkitön numero: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "rivi %d: virheellinen käännösarkkitehtuurin muoto: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Virheellinen pakettimäärittely: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Paketti on jo olemassa: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "rivi %d: tuntematon nimiö: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} ei voi olla tyhjä\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} ei voi olla \"/\"\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Virheellinen lähde: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Ei patchia numero %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Ei lähdettä numero %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Virhe jäsennettäessä %%setup-osiota: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "rivi %d: virheellinen argumentti %%setup:ille: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "rivi %d: virheellinen %%setup valitsin %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Virheellinen patch-numero %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "rivi %d: toinen %%prep-osio\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "rivi %d: laukaisimissa pitää olla --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "rivi %d: virhe jäsennettäessä %s:ää: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "rivi %d: sisäisen skriptin täytyy päättyä '>':n: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "rivi %d: skriptitulkin täytyy alkaa '/':lla: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "rivi %d: toinen %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "rivi %d: %s:\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Ei voi avata %s:ää: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: %%else ilman %%if:iä\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: %%endif ilman %%if:iä\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Ei yhteensopivia arkkitehtureeja käännökselle\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Paketissa ei ole %%description-osiota: %s\n"
@@ -1424,450 +1628,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Ei voitu luoda putkea %s:lle: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Ei voitu suorittaa %s:ää: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Ei voitu suorittaa %s:ää: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) epäonnistui: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load epäonnistui: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Tiedoston \"%s\" tunnistaminen epäonnistui: moodi %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Etsitään %s:ää: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "%s:ää ei löytynyt\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "määrittelytiedoston %s kysely epäonnistui\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(virhe 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
 msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Virheellinen otsikkotieto"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Otsikkotieto liian suuri"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Tuntematon tiedostotyyppi"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "en saa %s lukitusta tietokantaan %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "jaettua"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "poissulkevaa"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Tarkistussumma ei täsmää"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Sisäinen virhe"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "virhe(%d) tallennettaessa tietuetta %s %s:ään\n"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "virhe(%d) poistettaessa tietuetta %s %s:stä\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "virhe(%d) lisättäessä otsikkon #%d tietuetta\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "virhe(%d) poistettaessa otsikon #%d tietuetta\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "virhe(%d) varattaessa uutta paketti-instanssia\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " epäonnistui - "
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s on Delta RPM eikä sitä voida suoraan asentaa\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Tuntematon kuorma (%s) paketissa %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "paketti %s on jo lisätty, ohitetaan %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "paketti %s oli jo lisätty, korvataan %s:lla\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(ei ole binääridataa)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(ei ole luku)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(ei ole merkkijono)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(virheellinen tyyppi)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr ""
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(ei ole base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(virheellinen tyyppi)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(ei ole binääridataa)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(virheellinen xml-tyyppi)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(ei ole OpenPGP-allekirjoitus)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normaali"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "korvattu"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "ei asennettu"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "verkkojaettu"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "väärä väri"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(tuntematon)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(ei ole merkkijono)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "käyttäjää %s ei ole olemassa, käytetään käyttäjää root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "ryhmää %s ei ole olemassa, käytetään ryhmää root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s talletettiin %s:nä\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s luotu %s:na\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1833
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1841
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1876
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1885
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1890
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1909
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:452
+#: lib/header.c:1949
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:362
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature epäonnistui: %s"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:384
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Ei allekirjoitusta saatavilla\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "tyhjä nimiön formaatti"
+
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "tyhjä nimiön nimi"
 
-#: lib/package.c:581
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: otsikon luku epäonnistui: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "']' puuttuu taulukkomäärittelyn lopusta"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "odottamaton ']'"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "odottamaton '}'"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "odotin '?'-merkkiä ilmauksessa"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "odotin '{' '?'-merkin jälkeen lausekkeessa"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "odotin '}'-merkkiä lausekkeessa"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "odotin ':' '?'-merkin jälkeen ali-lausekkeessa "
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "odotin '{' ':'-merkin jälkeen lausekkeessa "
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "odotin '}'-merkkiä ilmauksen lopussa"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Tiedoston luku epäonnistui: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "lue <TIEDOSTO:...> vakiotiedostojen sijaan"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<TIEDOSTO:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "älä tarkista pakettien tarkistussummia"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "älä tarkista otsikkotietoja haettaessa tietokanssata"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "älä tarkista paketin allekirjoitusta"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "lähetä vakiotuloste <komento>:lle"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "käytä <hakem> ylimpänä hakemistona"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "näytä tunnetut kyselymuodot"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "näytä lopullinen rpmrc ja makro-konfiguraatio"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "tulosta vähemmän yksityiskohtia"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "tulosta enemmän yksityiskohtia"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "tulosta käytetyn rpm:n versio"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1888,12 +2203,12 @@ msgstr "siirroissa pitää olla =-merkki"
 msgid "relocations must have a / following the ="
 msgstr "siirroissa pitää olla / =-merkin jälkeen"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "asenna kaikki tiedostot, myös konfiguraatiot, jotka muuten ehkä ohitettaisiin"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1901,151 +2216,161 @@ msgstr ""
 "poista kaikki paketit, joiden nimeä vastaa  <paketti> (tavallisesti, jos  "
 "<paketti> määrittää useita paketteja, tulee virhe)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "poista paketti"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr ""
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "älä asenna konfigurointiedostoja"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "älä asenna dokumentointia"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "ohita <polku>-alkuiset tiedostot"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<polku>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "lyhenne parametreille --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "päivitä vain jo asennetut paketit"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<pakettitiedosto>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "tulosta risuaitaa paketin asentuessa (-v:n kanssa hyvä)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "älä tarkista paketin arkkitehtuuria"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "älä tarkista paketin käyttöjärjestelmää"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "älä tarkista levytilaa ennen asennusta"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "asenna dokumentaatio"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "asenna paketteja"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "päivitä tietokanta, mutta älä muuta tiedostojärjestelmää"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "älä tarkista paketin riippuvuuksia"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "älä tarkista tiedostojen tarkistussummia"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "älä tarkista tiedostojen tarkistussummia"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "älä muuta asennusjärjestystä riippuvuuksien tyydyttämiseksi"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "älä suorita pakettikohtaisia skriptejä"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "älä suorita %%pre-scriptiä"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "älä suorita %%post-scriptiä"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "älä suorita %%preun-scriptiä"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "älä suorita %%postun scriptiä"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "älä suorita tämän paketin laukaisemia skriptejä"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "älä suorita %%triggerprein skriptejä"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "älä suorita %%triggerin skriptejä"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "älä suorita %%triggerun scriptejä"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "älä suorita %%triggerpostun scriptejä"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2053,368 +2378,407 @@ msgstr ""
 "päivitä vanhempaan versioon (--force päivitettäessä tekee tämän "
 "automaattisesti)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "tulosta asennuksen eteneminen prosentteina"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "siirrä paketti hakemistoon <hakem>, jos siirrettävissä"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<hakemisto>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "siirrä tiedostot hakemistosta <vanhapolku> hakemistoon <uusipolku>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<vanha>=<uusi>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "älä huomioi tiedostokonflikteja pakettien välillä"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "asenna uudelleen, jos paketti on jo asennettu"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "älä asenna, mutta kerro onnistuisiko se"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "päivitä paketteja"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "kysele/tarkista kaikki paketit"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "rpm allekirjoituksen tarkistustila"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "kysele/tarkista pakettia, jonka omistuksessa <tiedosto> on"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "kysele/tarkista paketteja ryhmässä"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "kysele/tarkista pakettitiedostoa"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "rpm kyselytila"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "rpm tarkistustila"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "kysele/tarkista paketteja, jotka vaativat ominaisuutta"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "kysele/tarkista paketteja, jotka tarjoavat ominaisuuden"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "luettele kaikki konfiguraatiotiedostot"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "luettele kaikki dokumentaatiotiedostot"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "luettele kaikki dokumentaatiotiedostot"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "luettele kaikki konfiguraatiotiedostot"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "luettele paketin tiedostot"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "ohita %%ghost tiedostot"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "ohita %%ghost tiedostot"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "näytä lueteltujen tiedostojen tilat"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "älä tarkista tiedostojen kokoa"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "älä tarkista tiedostojen symbolisen linkin polkua"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "älä tarkista tiedostojen omistajaa"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "älä tarkista tiedostojen ryhmää"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "älä tarkista tiedostojen muutosaikaa"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "älä tarkista tiedostojen oikeuksia"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "älä tarkista paketin tiedostoja"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "älä tarkista paketin riippuvuuksia"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "älä suorita tarkistusskriptejä"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "arkiston %s%s purkaminen epäonnistui: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " tiedostolle "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s epäonnistui tiedostolle %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s epäonnistui: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "virheelinen muoto: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(ei sisällä tiedostoja)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normaali      "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "korvattu      "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "ei asennettu  "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "verkkojaettu  "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "väärä väri    "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(ei tilaa)    "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(tuntematon %3d)"
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "ryhmässä %s ei ole paketteja\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "mikään paketti ei laukaise %s:a\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "epämuodostunut %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "mikään paketti ei tarvitse %s:a\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "mikään paketti ei tarjoa %s:a\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "tiedosto %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "tiedostoa %s ei omista mikään paketti\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "virheellinen paketin numero: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "tietuetta %u ei voitu lukea\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "paketti %s ei ole asennettu\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "tuntematon nimiö: \"%s\"\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
-msgstr "EI OK"
-
-#: lib/rpmchecksig.c:386
-msgid "OK"
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr "(PUUTTUVIA AVAIMIA:"
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ""
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (EPÄLUOTETTAVIA AVAIMIA:"
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
+msgstr "EI OK"
 
-#: lib/rpmchecksig.c:393
-msgid ")"
+#: lib/rpmchecksig.c:268
+msgid "OK"
 msgstr ""
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: avaus epäonnistui: %s\n"
@@ -2439,212 +2803,442 @@ msgstr "Juurihakemiston vaihto ei onnistu: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "Juurihakemiston palautus ei onnistu: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "dbpath ei ole asetettu\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: ohitetaan"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "virhe(%d) tallennettaessa tietuetta #%d %s:ään\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec epäonnistui: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp epäonnistui: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: ohitetaan"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: ohitetaan vioittunut otsikkotietue #%u.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: otsikkoa ei voida lukea (0x%x)\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "dbpath ei ole asetettu"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "hakemiston %s luonti epäonnistui: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "tietue numero %u tietokannassa viallinen -- ohitetaan.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "alkupäisen tietueen %u lisäys ei onnistu\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"tietokannan uudelleenrakennus epäonnistui: alkuperäinen kanta paikallaan\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "vanhan tietokannan korvaus uudella epäonnistui!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "EI "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "KYLLÄ "
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr ""
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr ""
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr ""
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr ""
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr ""
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr ""
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr ""
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr ""
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr ""
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Virheellinen otsikkotieto"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Otsikkotieto liian suuri"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Tuntematon tiedostotyyppi"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Tarkistussumma ei täsmää"
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Sisäinen virhe"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " epäonnistui - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "%s:n avaus ei onnistunut: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: ei ole rpm paketti (tai pakettilista)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Valmistellaan..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Puuttuvia riippuvuuksia:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: ei ole rpm paketti (tai pakettilista): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s:ää ei voida asentaa\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Haetaan %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "ohitetaan %s - siirto epäonnistui\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "paketti %s ei ole uudelleensijoitettava\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "virhe luettaessa tiedostosta %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "\"%s\" määrittää useita paketteja:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "virhe: en voi avata %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Asennetaan %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "ei ole RPM paketti"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "laiton allekirjoitustyyppi"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "RPM pakettiversio ei ole tuettu"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "luku epäonnistui: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "ei ole RPM paketti\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "%s-lukon luonti %s:een ei onnistu (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "odotetaan %s-lukkoa %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "eri"
@@ -2720,797 +3314,633 @@ msgstr ""
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "tuntematon virhe %d käsitellessä pakettia %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "toinen ':' puuttuu, %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "puuttuva arkkitehtuurin nimi, %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Epätäydellinen datarivi, %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Liian monta parametriä datarivillä %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Virheellinen arkkitehtuuri/käyttöjärjestelmä numero: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Epätäydellinen oletusrivi, %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Liian monta parametriä oletusrivillä %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "puuttuva ':' (löydettiin 0x%02x): %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "puuttuva argumentti %s:lle: %s:%d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr "en voi avata %s:aa %s:%d:ssä: %m\n"
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Tuntematon järjestelmä: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Ota yhteyttä %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "En voi avata %s luettavaksi: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Ei voitu luoda tilapäistiedostoa %s:lle: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "%s scripti epäonnistui, waitpid(%d) palautti %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s skripti epäonnistui, signaali %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "%s skripti epäonnistui, palautti %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Tuntematon formaatti"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "Pakettitietokantaa %s ei voida avata\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: julkisen avaimen luku epäonnistui.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Otsikko "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "epäonnistui"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "puuttuva  %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Tyydyttämättömiä riippuvuuksia %s:lle:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "puuttuva '{' '%':n jälkeen"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "puuttuva '{' '%{':n jälkeen"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "tyhjä nimiön formaatti"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "tyhjä nimiön nimi"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "tuntematon nimiö"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "']' puuttuu taulukkomäärittelyn lopusta"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "odottamaton ']'"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "odottamaton '}'"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "odotin '?'-merkkiä ilmauksessa"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "odotin '{' '?'-merkin jälkeen lausekkeessa"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "odotin '}'-merkkiä lausekkeessa"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "odotin ':' '?'-merkin jälkeen ali-lausekkeessa "
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "odotin '{' ':'-merkin jälkeen lausekkeessa "
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "odotin '}'-merkkiä ilmauksen lopussa"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "indeksin %s avaus db%d:llä ei onnistu - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "dbpath ei ole asetettu\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: ohitetaan"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "virhe(%d) tallennettaessa tietuetta #%d %s:ään\n"
-
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec epäonnistui: %s\n"
+msgid "missing argument for %s at %s:%d\n"
+msgstr "puuttuva argumentti %s:lle: %s:%d\n"
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:551
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp epäonnistui: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: ohitetaan"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "en voi avata %s:aa %s:%d:ssä: %m\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:564
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: ohitetaan vioittunut otsikkotietue #%u.\n"
+msgid "missing architecture for %s at %s:%d\n"
+msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "bad option '%s' at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "virhe(%d) lisättäessä otsikkon #%d tietuetta\n"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "virhe(%d) poistettaessa otsikon #%d tietuetta\n"
+msgid "Unknown system: %s\n"
+msgstr "Tuntematon järjestelmä: %s\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: otsikkoa ei voida lukea (0x%x)\n"
+msgid "Please contact %s\n"
+msgstr "Ota yhteyttä %s\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "virhe(%d) asetettaessa \"%s\" tietuetita indeksistä %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "En voi avata %s luettavaksi: %m.\n"
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "virhe(%d) tallennettaessa tietuetta %s %s:ään\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "virhe(%d) poistettaessa tietuetta %s %s:stä\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "virhe(%d) varattaessa uutta paketti-instanssia\n"
+msgid "Unable to restore current directory: %m"
+msgstr ""
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "virhe(%d) haettaessa \"%s\" tietueita indeksistä %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Ei voitu luoda tilapäistiedostoa %s:lle: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "virhe(%d) tallennettaessa tietuetta %s %s:ään\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "dbpath ei ole asetettu"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "hakemiston %s luonti epäonnistui: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s scripti epäonnistui, waitpid(%d) palautti %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "tietue numero %u tietokannassa viallinen -- ohitetaan.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s skripti epäonnistui, signaali %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "alkupäisen tietueen %u lisäys ei onnistu\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s skripti epäonnistui, palautti %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Tuntematon formaatti"
+
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
-"tietokannan uudelleenrakennus epäonnistui: alkuperäinen kanta paikallaan\n"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "vanhan tietokannan korvaus uudella epäonnistui!\n"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:100
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "korvaa tiedostot %s:ssä tiedostoilla %s:stä korjataksesi"
+msgid "cannot open Packages database in %s\n"
+msgstr "Pakettitietokantaa %s ei voida avata\n"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:199
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "hakemiston %s poisto epäonnistui: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:225
 #, c-format
-msgid "db%d error(%d): %s\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "en saa %s lukitusta tietokantaan %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "jaettua"
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: julkisen avaimen luku epäonnistui.\n"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "poissulkevaa"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
+
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Otsikko "
+
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Allekirjoitusotsikon uudelleenlataus ei onnistu\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "epäonnistui"
+
+#: lib/verify.c:263
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: lib/verify.c:284
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:448
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr ""
+msgid "missing   %c %s"
+msgstr "puuttuva  %c %s"
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr ""
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Tyydyttämättömiä riippuvuuksia %s:lle:\n"
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:185
-#, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktiivisia %d tyhjiä %d\n"
-
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(tyhjä)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(tyhjä)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Makrossa %%%s on päättämätön runko\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Makrossa %%%s on päättämättömiä valitsimia\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Makron %%%s nimi on laiton (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Makrossa %%%s on päättämätön runko\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Makrossa %%%s on päättämättömiä valitsimia\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Makron %%%s runko on tyhjä\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Makron %%%s laajennos ei onnistunut\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Makron %%%s nimi on laiton (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Makroa %%%s (%s) ei käytetty tason %d alla\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Tuntematon valitsin %c %s(%s):ssä\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Päättämätön %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "%% seuraa makro jota ei voida jäsentää\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktiivisia %d tyhjiä %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "virhe luotaessa tilapäistä tiedostoa %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Tiedosto %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "hakemiston luonti epäonnistui"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr ""
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(ei virhettä)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "vakava virhe: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "virhe: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "varoitus: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "virheellinen syntaksi lua-skriptissä: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "virheellinen syntaksi lua-skriptissä: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "lua-skripti epäonnistui: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "virheellinen syntaksi lua-tiedostossa: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "lua-koukku epäonnistui: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr ""
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(ei virhettä)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "vakava virhe: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "virhe: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "varoitus: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "muistin varaus (%u tavua) palautti NULL:in.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(ei mitään)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite epäonnistui: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Tiedoston luku epäonnistui: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush epäonnistui: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "%s:ää ei voitu suorittaa: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "gpg:n suoritus epäonnistui (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg ei voinut kirjoittaa allekirjoitusta\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "en voinut lukea allekirjoitusta\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp epäonnistui\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead epäonnistui: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature epäonnistui: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature epäonnistui: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead epäonnistui: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: pakettilistan luku epäonnistui: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "älä tarkista otsikon ja kuorman allekirjoitusta"
index f13dded2230ea574f514d12f001565cd51124186..7458b2aff7b0d96632abd7ac8412d8836b4b880a 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -3,16 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Mathieu LEFEBVRE Mathdabomb <mathdabomb@gmail.com>, 2011-2012.
+# Jérôme Fenal <jfenal@gmail.com>, 2013
+# Mathieu LEFEBVRE Mathdabomb <mathdabomb@gmail.com>, 2011-2012,2015
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:40+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: French (http://www.transifex.com/projects/p/rpm/language/"
-"fr/)\n"
+"Language-Team: French (http://www.transifex.com/rpm-team/rpm/language/fr/)\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,520 +47,586 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "la création d'un pipe pour --pipe est défaillant : %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "échec de l'exec\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "l'argument n'est pas un paquet RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "erreur dans la lecteur de l'entête du paquet\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "impossible de réouvrir la charge utile: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Options de sélection des requête/vérification des paquets :"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Options de requêtes (avec -q ou --query) :"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Options de vérifications (avec -V ou --verify) :"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Options d'installation/désinstallation/mise à jour :"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Options communes à tous les modes et exécutables rpm :"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "un seul type de requête/vérification à la fois"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "option de requête inattendue"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "format de requête inattendu"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "source de requête inattendue"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "un seul mode majeur peut être spécifié"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "seule l'installation et la mise à niveau peuvent être forcé"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "les fichiers ne peuvent être relogés qu'à l'installation"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "impossible d'utiliser --prefix avec --relocate ou --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate et --excludepath ne peuvent être utilisés qu'à l'installation de "
-"nouveaux paquets"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix ne peut être utilisé qu'à l'installation de nouveaux paquets"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "les arguments de --prefix doivent commencer par un /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs ne peut être utilisé qu'à l'installation de paquet"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs ne peut être utilisé qu'à l'installation de paquet"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs ne peut être utilisé qu'à l'installation de paquet"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "utiliser --excludedocs _OU_ --includedocs (pas les 2)"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch ne peut être utilisé qu'à l'installation de paquet"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos ne peut être utilisé qu'à l'installation de paquet"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize ne peut être utilisé qu'à l'installation de paquet"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches ne peut être utilisé qu'à la désinstallation de paquet"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles ne peut être utilisé qu'à l'installation de paquet"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"--justdb ne peut être utilisé qu'à l'installation/la désinstallation de "
-"paquet"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"les options désactivant les scripts ne peuvent être utilisées qu'à la (dés)"
-"installation"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"les options désactivant les triggers ne peuvent être utilisées qu'à la (dés)"
-"installation"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-"--nodeps ne peut être utilisé qu'à l'installation/la désinstallation/la "
-"vérification de paquet"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-"--test ne peut être utilisé qu'à l'installation/la désinstallation de paquet"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "les arguments ed --root (-r) doivent commencer par un /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "pas de paquet à désinstaller"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "pas de paquet à installer"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "aucun argument fournit à la requête"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "aucun argument fournit à la vérification"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot déjà spécifié, %s ignoré\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "construction jusqu'à la section %prep (déballage des sources et applications "
 "des patchs) du <fichier_spec>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<fichier_spec>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 "construction jusqu'à la section %build (%prep, et compilation) du "
 "<fichier_spec>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "construction jusqu'à la section %install (%prep, %build, et installation) du "
 "<fichier_spec>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "vérifier la section %files du <fichier_spec>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "construire les paquet sources et binaires à partir du <fichier_spec>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "construction du paquet binaire seulement à partir du <fichier_spec>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "construction du paquet source seulement à partir du <fichier_spec>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<paquet source>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"construire jusqu'à la section %install (%prep, %build, et installation) à "
+"partir du <paquet source>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "construire jusqu'à la section %prep (déballage des sources et application "
 "des patchs) à partir du <tarball>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 "construire jusqu'à la section %build (%prep, puis compilation) à partir du "
 "<tarball>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "construire jusqu'à la section %build (%prep, %build, puis installation) à "
 "partir du <tarball>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "vérifier la section %files à partir du <tarball>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "construire les paquet source et binaire à partir du <tarball>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "construire seulement le paquet binaire à partir du <tarball>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "construire seulement le paquet source à partir du <tarball>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "construire le paquet binaire à partir du <paquet source>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<paquet source>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"construire jusqu'à la section %install (%prep, %build, et installation) à "
-"partir du <paquet source>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "surcharger le buildroot"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "effacer l'arborescence de construction une fois terminé"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignorer les directives ExcludeArch: du fichier spec"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "déboguer la machine à états de fichiers (déballage)"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "n'exécuter aucune étape de la construction"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "ne pas vérifier les dépendances de construction"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 "générer un(des) entête(s) de paquet compatible(s) avec l'empaquetage rpm v3 "
 "(hérité)"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
+msgstr "ne pas exécuter l'étape %clean de la construction"
+
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
-msgstr ""
+msgstr "ne pas exécuter l'étape %check de la construction"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "ne pas accepter les msgstr de l'i18n du specfile"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "effacer les sources une fois terminé"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "effacer le fichier spec une fois terminé"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "aller directement à l'étape spécifiée (seulement pour c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "surcharger la plate-forme cible"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 "Options de construction avec [ <fichier_spec> | <tarball> | <paquet "
 "source> ] :"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Options communes à tous les modes et exécutables rpm :"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Dépendances de construction manquantes:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Impossible d'ouvrir le fichier spec %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Impossible d'ouvrir le pipe de tar: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Impossible de lire le fichier spec à %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Impossible de renommer %s en %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "échec de stat sur %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Fichier %s non régulier.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Le fichier %s ne semble pas être un fichier spec.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Construction pour plate-formes cibles: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Construction pour cible %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "les arguments ed --root (-r) doivent commencer par un /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "initialiser la base de données"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "refaire les listes inversées de la base de données à partir des entêtes des "
 "paquets installés"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "vérifier les fichiers de la base de données"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Options de la base de données :"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "un seul mode majeur peut être spécifié"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "vérifier la(les) signature(s) du paquet"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "importer une clé publique blindé"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
-msgstr ""
+msgstr "n'importe pas, mais dit si ça fonctionnerait ou pas"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "listes les clés du trousseau RPM"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Options du trousseau :"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "aucun argument fournit"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Options de sélection des requête/vérification des paquets :"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Options de requêtes (avec -q ou --query) :"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Options de vérifications (avec -V ou --verify) :"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Options d'installation/désinstallation/mise à jour :"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "un seul type de requête/vérification à la fois"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "option de requête inattendue"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "format de requête inattendu"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "source de requête inattendue"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "seule l'installation et la mise à niveau peuvent être forcé"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "les fichiers ne peuvent être relogés qu'à l'installation"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "impossible d'utiliser --prefix avec --relocate ou --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate et --excludepath ne peuvent être utilisés qu'à l'installation de "
+"nouveaux paquets"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix ne peut être utilisé qu'à l'installation de nouveaux paquets"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "les arguments de --prefix doivent commencer par un /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+"--hash (-h) ne peut être utilisé que lors d'une installation ou une "
+"suppression de paquet"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+"--percent ne peut être utilisé que lors d'une installation ou une "
+"suppression de paquet"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs ne peut être utilisé qu'à l'installation de paquet"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs ne peut être utilisé qu'à l'installation de paquet"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs ne peut être utilisé qu'à l'installation de paquet"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "utiliser --excludedocs _OU_ --includedocs (pas les 2)"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch ne peut être utilisé qu'à l'installation de paquet"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos ne peut être utilisé qu'à l'installation de paquet"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize ne peut être utilisé qu'à l'installation de paquet"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches ne peut être utilisé qu'à la désinstallation de paquet"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles ne peut être utilisé qu'à l'installation de paquet"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"--justdb ne peut être utilisé qu'à l'installation/la désinstallation de "
+"paquet"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"les options désactivant les scripts ne peuvent être utilisées qu'à la "
+"(dés)installation"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"les options désactivant les triggers ne peuvent être utilisées qu'à la "
+"(dés)installation"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps ne peut être utilisé qu'à l'installation/la désinstallation/la "
+"vérification de paquet"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+"--test ne peut être utilisé qu'à l'installation/la désinstallation de paquet"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "pas de paquet à désinstaller"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "pas de paquet à installer"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "aucun argument fournit à la requête"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "aucun argument fournit à la vérification"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr "signer le(s) paquet(s)"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "signer le(s) paquet(s) (identique à --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "supprimer les signatures de paquets"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Options de signatures :"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Impossible d'exécuter %s : %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr ""
 "Vous devez affecter une valeur à \"%%_gpg_name\" dans votre fichier de "
 "macros\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Entrez la phrase de passe : "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Phrase de passe bonne.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr "Échec du mot de passe ou clé GPG expirée\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr "analyse du fichier(s) de spec sur stdout"
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr "questionner le(s) fichier(s) de spec"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr "opérer sur le(s) rpm(s) binaire(s) généré(s) par spec (défaut)"
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr "opérer sur le rpm source généré par spec"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "utiliser le format de requête suivant"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "Options spec :"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr "pas d'arguments donnés pour analyser"
 
@@ -569,32 +635,37 @@ msgstr "pas d'arguments donnés pour analyser"
 msgid "Unable to open temp file: %s\n"
 msgstr "Impossible d'ouvrir le fichier temporaire : %s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr "Impossible d'ouvrir le flux : %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Exécution_de(%s) : %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "L'exec de %s a échoué (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr "Erreur d'exécution du scriptlet %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Mauvais statut de sortie pour %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -604,235 +675,315 @@ msgstr ""
 "\n"
 "Erreur de construction de RPM :\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "erreur de syntaxe en analysant ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "erreur de syntaxe en analysant &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "erreur de syntaxe en analysant ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "erreur de syntaxe dans l'expression\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "( non fermée\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- seulement sur des nombres\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! seulement sur des nombres\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "les types doivent correspondre\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / non supportés sur des chaînes de caractères\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- non prix en charge sur des chaînes de caractères\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& et || ne sont pas prix en charge sur des chaînes de caractères\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "erreur de syntaxe dans l'expression\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "'(' manquante dans %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "')' manquante dans %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Lexème %s invalide : %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "%s manquant(e) dans %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "espace non-blanc suivant %s() : %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Mauvaise syntaxe : %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Mauvais mode spec : %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Mauvais dirmode spec : %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr "Mauvaise longueur de la locale : « %s » dans %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr "Deux fois la même locale %s dans %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Capacité invalide : %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Support de capacité du fichier non intégré\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Le fichier doit commencer par « / » : %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "Algorithme %u du fichier de digest inconnu, recourt à MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Fichier listé deux fois : %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "la lecture du symlink %s a échouée : %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Lien symbolique pointant sur BuildRoot : %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "Répertoire introuvable : %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Fichier non trouvé : %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Pas de répertoire: %s\n"
+
+#: build/files.c:1592
+#, c-format
+msgid "%s: can't load unknown tag (%d).\n"
+msgstr "%s : ne peut pas charger le tag (%d) inconnu.\n"
+
+#: build/files.c:1598
+#, c-format
+msgid "%s: public key read failed.\n"
+msgstr "%s : échec de la lecture de la clé publique.\n"
+
+#: build/files.c:1602
+#, c-format
+msgid "%s: not an armored public key.\n"
+msgstr "%s : n'est pas une clé publique blindée.\n"
+
+#: build/files.c:1611
+#, c-format
+msgid "%s: failed to encode\n"
+msgstr "%s : échec de l'encodage.\n"
+
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
 #, c-format
-msgid "%s: can't load unknown tag (%d).\n"
-msgstr "%s : ne peut pas charger le tag (%d) inconnu.\n"
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1858
 #, c-format
-msgid "%s: public key read failed.\n"
-msgstr "%s : échec de la lecture de la clé publique.\n"
+msgid "Missing build-id in %s\n"
+msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1863
 #, c-format
-msgid "%s: not an armored public key.\n"
-msgstr "%s : n'est pas une clé publique blindée.\n"
+msgid "build-id found in %s too small\n"
+msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1864
 #, c-format
-msgid "%s: failed to encode\n"
-msgstr "%s : échec de l'encodage.\n"
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "échec de création du répertoire"
 
-#: build/files.c:1601
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Le fichier non précédé d'un \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "globale %%dev non autorisée : %s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "Répertoire introuvable par glob : %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Fichier non trouvé par la substitution : %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Impossible d'ouvrir le fichier %%files %s : %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "Ligne : %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "Erreur de lecture du fichiers %%files %s : %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
+msgstr "illegal _docdir_fmt %s: %s\n"
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Fichier non trouvé par la substitution : %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
-msgstr ""
+msgstr "Impossible de mélanger un %s spécial avec d'autres formes : %s\n"
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
+msgstr "Plus d'un fichier sur la ligne : %s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Mauvais fichier : %s : %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Mauvais possesseur/groupe : %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Vérification des fichiers non empaquetés : %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -841,551 +992,609 @@ msgstr ""
 "Fichier(s) installé(s) (mais non empaquetés) :\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Traitement des fichiers : %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
+"L'architecture de binaire (%d) ne correspond pas à celle du paquet (%d).\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "Binaires dépendants d'une arch dans un paquet noarch\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
-msgstr ""
+msgstr "échec de la création de l'archive dans le fichier %s : %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
-msgstr ""
+msgstr "échec de la création de l'archive : %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "Impossible d'ouvrir le fichier %s : %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s : ligne : %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Ne peut canoniser le nom d'hôte : %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Impossible d'écrire la charge utile dans %s : %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Impossible de lire la charge utile dans %s : %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Ne peut canoniser le nom d'hôte : %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Compression de charge inconnue : %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Impossible de créer la partie immuable de l'entête.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Incapable d'ouvrir un fichier temporaire.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Impossible d'écrire un entête temporaire\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Impossible de lire les fichier de stratégie : %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Mauvaises données CSA\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Impossible de recharger l'entête de la signature.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Impossible d'ouvrir %s : %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Impossible d'écrire le paquet : %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Impossible d'ouvrir sigtarget %s : %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Impossible de lire l'entête dans %s : %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Impossible d'écrire l'entête dans %s : %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Écrit : %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Exécution_de « %s » :\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "L'exécution de « %s » a échouée.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "La vérification du paquet « %s » a échouée.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Ne peut générer le nom de fichier pour le paquet %s : %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "Ne peut créer %s : %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "ligne %d : deuxième %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
-msgstr ""
+msgstr "date incorrecte dans %%changelog : %s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "les entrées dans le %%changelog doivent commencer par *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "entrée de %%changelog incomplète\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "mauvaise date dans %%changelog : %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "le %%changelog n'est pas dans l'ordre chronologique descendant\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "nom manquant dans le %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "absence de description dans le %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "ligne %d : erreur dans l'analyse syntaxique de la %%description : %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "ligne %d : mauvaise option %s : %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "ligne %d : trop de noms : %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "ligne %d : paquet inexistant : %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "ligne %d : deuxième description\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "ligne %d : erreur dans l'analyse syntaxique de %%files : %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr "ligne %d : erreur dans l'analyse syntaxique de %%policies : %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr "Erreur d'analyse dans le champ de balise : %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "ligne %d : mauvais numéro : %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "ligne %d : mauvais numéro n°%s : %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "ligne %d : mauvais numéro %s : %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d définie plusieurs fois\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "Téléchargement de %s à %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "Impossible de télécharger %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Architecture exclue : %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Architecture non incluse : %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS exclus : %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS non inclus : %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "Le champ %s doit être présent dans le paquet : %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Entrée dupliquée %s dans le paquet : %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Impossible d'ouvrir l'icône %s : %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Impossible de lire l'icône %s : %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Type d'icône inconnu : %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "ligne %d : le tag n'accepte qu'un seul lexème : %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "ligne %d : caractère '%c' illégal dans : %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "ligne %d : caractère illégal dans : %s\n"
+msgid "%s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "ligne %d : séquence illégale « .. » dans : %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "ligne %d : tag mal formé : %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "ligne %d : tag vide : %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "ligne %d : les préfixes ne doivent pas finir par un « / » : %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "ligne %d : le docdir doit commencer par un « / » : %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "ligne %d : le champ Epoch doit être un nombre : %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "ligne %d : mauvais %s : qualificatifs : %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "ligne %d : mauvais format pour BuildArchitecture : %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "ligne %d seuls les sous-paquets noarch sont pris en charge : %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Erreur interne : tag bidon %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "ligne %d : %s est obsolète : %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Mauvaise spécification de paquet : %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Paquet déjà existant : %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "ligne %d : tag inconnu : %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} ne peux pas être vide\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} ne peut pas être « / »\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Mauvaise source : %s : %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Pas de numéro de patch %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch sans correspondance avec le tag « Patch : »\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Pas de numéro de source %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "Pas de tag « Source: » dans le fichier spec\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Erreur d'analyse syntaxique du %%setup : %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "ligne %d : mauvais argument à %%setup : %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "ligne %d : mauvaise option à %%setup %s : %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s : %s : %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Numéro du patch invalide %s :%s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "ligne %d : deuxième %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 "Les jetons de dépendance doivent commencer par un caractère alpha-numérique, "
 "'_' ou '/'"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr "Nom de version de fichier non autorisé"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "Version requise"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "dépendance invalide"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "Version requise"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr "ligne %d : %s : %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "ligne %d : les triggers doivent avoir -- : %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "ligne %d : erreur d'analyse syntaxique %s : %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "ligne %d : le script interne doit se terminer par '>' : %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "ligne %d : le nom du script doit commencer par un '/' : %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "ligne %d : deuxième %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "ligne %d : script interne non pris en charge :%s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 "ligne %d : arguments interprète non autorisé dans les déclencheurs : %s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "ligne %d : %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Impossible d'ouvrir %s : %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr "%s :%d : argument attendu pour %s\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
-msgstr ""
+msgstr "ligne %d : %%if non terminé\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr "ligne %d : macro non fermée ou mauvaise continuation de ligne\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr "%s : %d : mauvaise condition %%if\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s : %d : j'ai là un %%else sans %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s : %d : j'ai là un %%endif sans %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
+msgstr "%s:%d: directive %%include mal-formée\n"
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Pas d'architecture compatible pour construction\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Le paquet n'a pas de %%description : %s\n"
@@ -1459,454 +1668,563 @@ msgstr "Trop nombreux arguments en ligne : %s\n"
 msgid "Processing policies: %s\n"
 msgstr "Traitement de la stratégie : %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "Ignorer l'expression régulière %s invalide\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Impossible de créer le pipe pour %s : %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Impossible d'exécuter %s : %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Impossible de forker %s : %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s a échoué : %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "échec de l'écriture de toutes les données de %s : %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "La conversion de %s vers un entier long a échoué.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr "Classificateur de fichier vide\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "Aucun fichier attributs configurés\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) a échoué : %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load a échoué : %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "La reconnaissance du fichier « %s » a échoué : mode %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Trouver %s : %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Impossible de trouver %s :\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 "échec de la requête sur le fichier spec %s, impossible de faire l'analyser "
 "syntaxique\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(erreur 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s erreur(%d) de %s: %s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Mauvaise magie, blah"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s erreur(%d): %s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Entête mauvais ou illisible"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "options de db inconnues : \"%s\" ignoré.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Entête trop gros"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s est une valeur numérique invalide, ignoré\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr ""
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s est une valeur 'long' trop petite ou trop grande, ignoré\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Type de fichier inconnu"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s est une valeur entière trop petite ou trop grande, ignoré\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "lien(s) dur(s) manquant(s)"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "impossible d'avoir le verrou %s sur %s/%s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Digest ne correspond pas"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "partagé"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Erreur interne"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "exclusif"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "L'entête ne contient pas le fichier archive"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "type d'index %x invalide sur %s/%s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " échec - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "erreur(%d) en attrapant les articles « %s » de l'index %s : %s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "erreur(%d) en stockant l'article « %s » dans %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "erreur(%d) en enlevant l'article « %s » de %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "Erreur(%d) ajout de l'enregistrement de l'en-tête #%d\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "Erreur (%d) suppression de l'enregistrement de l'en-tête #%d\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "erreur(%d) en allouant une nouvelle instance de paquet\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s est un Delta RPM et ne peut être installé directement\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Charge (%s) non pris en charge dans le paquet %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "le paquet %s a déjà été rajouté, %s ignoré\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "le paquet %s a déjà été rajouté, replacé par %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(pas un blob ça)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(n'est pas un nombre)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(pas une chaîne)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(type invalide)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(pas base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(type invalide)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(pas un blob ça)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(type xml invalide)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(pas une signature OpenPGP)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
-msgstr ""
+msgstr "Date invalide %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normal"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "remplacé"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "pas installé"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "sur le réseau"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "fausse couleur"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "manquant"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(inconnu)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(pas une chaîne)"
+#: lib/fsm.c:745
+#, c-format
+msgid "%s saved as %s\n"
+msgstr "%s sauvé en tant que %s\n"
+
+#: lib/fsm.c:798
+#, c-format
+msgid "%s created as %s\n"
+msgstr "%s créé en tant que %s\n"
+
+#: lib/fsm.c:1082
+#, c-format
+msgid "%s %s: remove failed: %s\n"
+msgstr "%s %s : échec de la suppression : %s\n"
+
+#: lib/fsm.c:1083
+msgid "directory"
+msgstr "répertoire"
+
+#: lib/fsm.c:1083
+msgid "file"
+msgstr "fichier"
+
+#: lib/header.c:285
+#, c-format
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
+
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
 
-#: lib/fsm.c:689
+#: lib/header.c:1797
 #, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "utilisateur %s inexistant - utilisation de root\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/fsm.c:696
+#: lib/header.c:1805
 #, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "groupe %s inexistant - utilisation de root\n"
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/fsm.c:1518
+#: lib/header.c:1824
 #, c-format
-msgid "%s saved as %s\n"
-msgstr "%s sauvé en tant que %s\n"
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/fsm.c:1543
+#: lib/header.c:1833
 #, c-format
-msgid "%s created as %s\n"
-msgstr "%s créé en tant que %s\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/fsm.c:1845
+#: lib/header.c:1841
 #, c-format
-msgid "%s %s: remove failed: %s\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/fsm.c:1846
-msgid "directory"
+#: lib/header.c:1876
+#, c-format
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/fsm.c:1846
-msgid "file"
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:1885
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr "%s ignoré %s avec signature invérifiable\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
 
-#: lib/package.c:149
+#: lib/header.c:1890
 #, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr "%s ignoré avec signature invérifiable\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1900
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
-"étiquette[%d] : ERRONÉE, étiquette %d type %d adresse relative %d décompte "
-"%d\n"
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1 : ERRONÉ, non hexa\n"
-
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA : ERRONÉ, non binaire\n"
+#: lib/header.c:1909
+#, c-format
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr SDA : ERRONÉ, non binaire\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1949
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "blob size(%d) : ERRONÉE, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "largeur du champ invalide"
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/headerfmt.c:362
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/headerfmt.c:384
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "region offset : ERRONÉ, tag %d type %d offset %d décompte %d\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "region trailer : ERRONÉ, tag %d type %d offset %d décompte %d\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "format de tag vide"
 
-#: lib/package.c:358 lib/signature.c:185
-#, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "region size: ERRONÉE, ril(%d) > il(%d)\n"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "nom de tag vide"
 
-#: lib/package.c:427
+#: lib/headerfmt.c:413
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr size(%d) : ERRONÉ, la lecture renvoie %d\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] attendu à la fin du tableau"
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic : ERRONÉ\n"
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "] inattendu"
 
-#: lib/package.c:436
-#, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr tags : ERRONÉ, no. de tags(%d) hors limite\n"
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "} inattendu"
 
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hdr data : ERRONÉ, no. de bytes(%d) hors limite\n"
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? attendu dans l'expression"
 
-#: lib/package.c:452
-#, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr blob(%zd) : ERRONÉ, la lecture a retourné %d\n"
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ attendu après ? dans l'expression"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} attendu dans l'expression"
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "hdr load : ERRONÉ\n"
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": attendu derrière la sous-expression de ?"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s : échec de rpmReadSignature : %s"
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ attendu après : dans l'expression"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
-msgstr "%s : aucune signature disponible\n"
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| attendu a la fin de l'expression"
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s : headerRead a échoué : %s"
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "itérateur de tableau utilisé avec des tableaux de tailles différentes"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s : Fread a échoué : %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "prédéfinir la MACRO avec l'EXPRression"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'MACRO EXPR'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "définit MACRO avec pour valeur EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
-msgstr ""
+msgstr "MACRO"
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "affiche la macro-expansion d'EXPR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'EXPR'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "Lire <FICHIER:...> au lieu du(des) fichier(s) par défaut"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FICHIER:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr "n'autoriser aucun plugin"
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "ne pas vérifier les sommes de hachage(s) du paquet"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "ne pas vérifier l'entête de la base de données à la récupération"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "ne pas vérifier la(les) signature(s) du paquet"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "envoyer la sortie standard à CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "utiliser RACINE comme répertoire racine"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "RACINE"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr "utiliser la base de données dans RÉPERTOIRE"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "RÉPERTOIRE"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "afficher les tags de requête connus"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "afficher la configuration finale des macros et rpmrc"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "afficher moins de détails"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "afficher plus de détails"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "afficher la version de rpm utilisé"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "déboguer la machine à états du fichier de la charge utile"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "déboguer les E/S de rpmio"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s : table d'option mal configurée (%d)\n"
@@ -1927,12 +2245,12 @@ msgstr "les relogement doivent contenir un ="
 msgid "relocations must have a / following the ="
 msgstr "dans les relogements un / doit suivre le ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "installer tous les fichiers, même si les configurations disent le contraire"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1940,156 +2258,166 @@ msgstr ""
 "retirer tous les paquets qui correspondent à <package> (normalement on "
 "retourne une erreur si le <package> correspond à plusieurs paquets"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "déplacer les fichiers dans le paquet non délocalisable"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "Afficher la dépendance des boucles comme alerte"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "désinstaller un paquet"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<package>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "ne pas installer les fichiers de configuration"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "ne pas installer la documentation"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "sauter les fichiers commence par le <chemin> indiqué"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<chemin>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "raccourci pour --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "met à jour le(s) paquet(s) déjà installé(s)"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<packagefile> +"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 "afficher des marqueurs au fur et à mesure que le paquet s'installe (avec -v "
 "c'est bien(tm))"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "ne pas vérifier l'architecture du paquet"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "ne pas vérifier le système d'exploitation du paquet"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "ne pas vérifier l'espace disque avant l'installation"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "installer la documentation"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "installer le(s) paquet(s)"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 "mettre à jour la base données, mais ne pas modifier le système de fichiers"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "ne pas vérifier les dépendances du paquet"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "ne pas vérifier les sommes de hachage des fichiers"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "ne pas vérifier les sommes de hachage des fichiers"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "ne pas installer les fichiers des contextes de sécurité"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 "ne pas réarranger l'ordre d'installation des paquets pour satisfaire les "
 "dépendances"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "ne pas exécuter le(s) scriptlet(s) du paquet"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "ne pas exécuter le scriptlet %%pre (s'il existe)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "ne pas exécuter le scriptlet %%post (s'il existe)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "ne pas exécuter le scriptlet %%preun (s'il existe)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "ne pas exécuter le scriptlet %%postun (s'il existe)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "n'exécuter aucun scriptlet trigger activé par ce paquet"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "n'exécuter aucun scriplet %%triggerprein"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "n'exécuter aucun scriplet %%triggerin"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "n'exécuter aucun scriptlet %%triggerun"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "n'exécuter aucun scriptlet %%triggerpostun"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "ne jamais effectuer de mesures de recouvrement"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2097,373 +2425,411 @@ msgstr ""
 "mettre à jour avec un paquet plus ancien (une m-à-j avec --force fait ça "
 "automatiquement"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "afficher le pourcentage d'installation du paquet"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "déplace le paquet vers <rep>, si déplacable"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<rep>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "reloge les fichiers du <vieux> chemin vers <nouveau>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<vieux>=<nouveau>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "Ignorer les conflits de fichier entre les paquets"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "réinstalle si le paquet est déjà installé"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "n'installe pas, mais dit si ça marcherait ou pas"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "mises à jour des paquets"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "réinstaller le(s) paquet(s)"
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "vérifier/demander à tous les paquets"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "mode rpm vérifsign"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "vérifier/demander un paquet possèdant un fichier"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "vérifier/questionner le(s) paquet(s) d'un même groupe"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "vérifier/questionner un fichier paquet"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "questionner/vérifier le(s) paquet(s) grâce à un identifieur de paquet"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 "questionner/vérifier le(s) paquet(s) grâce à un identificateur d'entête"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "mode de requête de rpm"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "questionner/vérifier une instance d'entête"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 "questionner/vérifier le(s) paquet(s) à partir de la transaction "
 "d'installation"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "questionner le(s) paquet(s) surveillé(s) par le paquet"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "mode de vérification de rpm"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "vérifier/demander le(s) paquet(s) qui requier(en)t une dépendance"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "vérifier/demander le(s) paquet(s) qui fourni(ssen)t une dépendance"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "Ne pas passer des arguments"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "ne traite pas les fichiers non-paquet comme manifestes"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "lister les fichiers de configuration"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "lister les fichiers documents"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "lister les fichiers documents"
+msgstr "lister les fichiers de license"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "lister les fichiers de license"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "débite les informations de base des fichiers"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "lister les fichiers du paquet"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "éviter les fichiers fantômes %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "éviter les fichiers fantômes %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "affiche la liste des fichiers et leur état"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "ne pas vérifier la taille des fichiers"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "ne pas vérifier le chemin du lien symbolique des fichiers"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "ne pas vérifier le possesseur des fichiers"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "ne pas vérifier le groupe possesseur des fichiers"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "ne pas vérifier les dates de modification des fichiers"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "ne pas vérifier les permissions des fichiers"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "ne pas vérifier les capacités des fichiers"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "ne pas vérifier la sécurité des fichiers"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "ne pas vérifier les capacités des fichiers"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "ne pas vérifier les fichiers du paquet"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "ne pas vérifier les dépendances du paquet"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "ne pas exécuter le(s) script(s) de vérification"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "Éléments rpmlib manquants pour %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "paquet source attendu, paquet binaire trouvé\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "le paquet source ne contient pas de fichier .spec\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "échec du déballage de l'archive %s%s : %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " dans fichier "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "échec de %s sur le fichier %s : %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "échec %s : %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "format incorrect : %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(Ne contient pas de fichiers)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "remplacé      "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "non installé  "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "sur le réseau "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "fausse couleur"
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(pas d'état)  "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(%3d iconnu)  "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "le paquet n'as pas de liste de possesseurs/groupes de fichiers\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 "le paquet n'a ni la liste des id ni celle des possesseurs de fichiers\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "le groupe %s ne contient aucun paquet\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "aucun paquet ne surveille %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "%s malformé : %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "aucun paquet ne correspond à %s : %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "aucun paquet ne requiert %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "aucun paquet ne fournit %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "fichier %s : %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "le fichier %s n'appartient à aucun paquet\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "numéro de paquet invalide : %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "l'enregistrement %u n'a pas pu être lu\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "le paquet %s n'est pas installé\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "tag inconnu: « %s »\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s : importation de la clé %d échouée.\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s : la clés %d n'est pas une clé publique blindée.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s : l'importation de lecture a échoué (%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
-"%s : la région d'en-tête immuable ne peut pas être lu. Paquet corrompu ?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "PAS OK"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (CLES MANQUANTES :"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (CLES NONCREDIBLE :"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s : échec de l'ouverture : %s\n"
@@ -2488,222 +2854,453 @@ msgstr "Impossible de changer le répertoire racine : %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "Impossible de restaurer le répertoire racine : %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "Génération d'index manquant(s) %d, merci d'attendre...\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr "impossible d'ouvrir l'index %s en utilisant %s - %s (%d)\n"
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "aucun dbpath n'a été fourni\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader : ignoré"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "erreur(%d) en stockant l'article nº%d dans %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s : regexec a échoué :%s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s : regcomp a échoué :%s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator : ignoré"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb : l'entête #%u endommagée a été récupérée -- ignoré.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s : impossible de lire l'entête à 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "aucun dbpath fournit"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "Impossible de créer le répertoire %s : %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "l'entête #%u dans la base de données n'est pas bon -- ignoré.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "impossible d'ajouter l'article qui était au départ à %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"Ne peut reconstruire la base de données : la base originale reste telle "
+"qu'elle est\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "Ne peut remplacer la vieille base de données par la nouvelle!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NON"
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "OUI"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 "Les dépendances de type PreReq:, Provides: et Obsoletes: supportent les "
 "versions."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 "Le(s) nom(s) de fichier sont stockés en tant que triplets (NomRep,NomFich,"
 "IndexRep), pas en tant que chemin."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "La charge du paquet est compressée avec bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr "La charge du paquet est compressée avec xz."
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr "La charge du paquet est compressée avec lzma."
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 "le(s) fichier(s) de la charge utile du paquet ont « ./ » comme préfixe."
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr "le nom-version-révision du paquet n'est pas implicitement fourni."
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
 msgstr "les tags d'entête sont toujours triés après avoir été chargés."
 
-#: lib/rpmds.c:961
+#: lib/rpmds.c:1249
 msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 "l'interprète du scriptlet peut utiliser des arguments à partir des entêtes."
 
-#: lib/rpmds.c:964
+#: lib/rpmds.c:1252
 msgid "a hardlink file set may be installed without being complete."
 msgstr "un lien en dur pourrait être installé sans être complet."
 
-#: lib/rpmds.c:967
+#: lib/rpmds.c:1255
 msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 "les scriptlets du paquet pourrait accéder à la base de données rpm pendant "
 "l'installation."
 
-#: lib/rpmds.c:971
+#: lib/rpmds.c:1259
 msgid "internal support for lua scripts."
 msgstr "prise en charge interne pour les scripts LUA."
 
-#: lib/rpmds.c:975
+#: lib/rpmds.c:1263
 msgid "file digest algorithm is per package configurable"
 msgstr "l'algorithme de hachage de fichier est configurable par paquet"
 
-#: lib/rpmds.c:979
+#: lib/rpmds.c:1267
 msgid "support for POSIX.1e file capabilities"
 msgstr "prise en charge des capacités du fichier POSIX.1e"
 
-#: lib/rpmds.c:983
+#: lib/rpmds.c:1271
 msgid "package scriptlets can be expanded at install time."
 msgstr "les scriptlets du paquet peut être étendu lors de l'installation."
 
-#: lib/rpmds.c:986
+#: lib/rpmds.c:1274
 msgid "dependency comparison supports versions with tilde."
+msgstr "la comparaison de dépendances prend en charge les versions avec tilde."
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "supporte les fichiers supérieurs à 4GB"
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Mauvaise magie, blah"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Entête mauvais ou illisible"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Entête trop gros"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "Fichier trop grand pour l'archive"
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Type de fichier inconnu"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "Fichier(s) manquant(s)"
+
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Digest ne correspond pas"
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Erreur interne"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "L'entête ne contient pas le fichier archive"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " échec - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: (erreur 0x%x)"
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "échec de l'ouverture de %s: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 "%s: n'est pas un paquet rpm (ni une liste de paquet)\n"
 "\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
-msgstr ""
+msgstr "Mise à jour / installation...\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
-msgstr ""
+msgstr "Nettoyage/suppression...\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Préparation...              "
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
-msgstr ""
+msgstr "Préparation des paquets..."
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Dépendances requises:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s : n'est pas un paquet rpm (ni une liste de paquet) : %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s ne peut être installé\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Récupération de %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "%s ignoré - échec du transfert\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "le paquet %s n'est pas localisable\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "erreur en lisant %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "« %s » spécifie plusieurs paquets\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "impossible d'ouvrir %s : %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Installation de %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "pas un paquet rpm"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "type de signature illégale"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "pas de prise en charge de la version du paquet RPM"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "échec de lecture : %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "pas un paquet rpm\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "Impossible de créer %s verrou sur %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "attente pour %s verrou sur %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr "Impossible de dlopen %s %s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "Impossible de résoudre le symbole %s : %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "Impossible d'agrandir la macro %%__collection_%s\n"
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "Plugin %%__%s_%s non configuré\n"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "Plugin %s non chargé\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr "Impossible de résoudre le symbole %s du plugin %s : %s\n"
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "différent"
@@ -2784,642 +3381,354 @@ msgstr "%s est rendu obsolète par %s%s"
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "erreur %d inconnue rencontrée en manipulant le paquet %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "il manque un second ':' à %s : %d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "architecture manquante à %s : %d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Ligne de données incomplète à %s : %d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Trop d'arguments dans la ligne de données à %s :%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Mauvais numéro d'arch/OS : %s (%s : %d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "valeur par défaut incomplète à la ligne %s : %d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Trop d'arguments pour la valeur par défaut de la ligne %s : %d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "':' manquant (trouvé 0x%02x) à %s : %d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "argument manquant pour %s à %s : %d\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr "Impossible d'ouvrir %s à %s : %d : %m\n"
 
-#: lib/rpmrc.c:536
+#: lib/rpmrc.c:564
 #, c-format
 msgid "missing architecture for %s at %s:%d\n"
 msgstr "architecture manquante pour %s à %s : %d\n"
 
-#: lib/rpmrc.c:603
+#: lib/rpmrc.c:632
 #, c-format
 msgid "bad option '%s' at %s:%d\n"
 msgstr "mauvaise option '%s' à %s : %d\n"
 
-#: lib/rpmrc.c:927
+#: lib/rpmrc.c:972
 msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
+msgstr "Échec de la lecture du vecteur auxiliaire, /proc est-il monté ?\n"
 
-#: lib/rpmrc.c:1349
+#: lib/rpmrc.c:1469
 #, c-format
 msgid "Unknown system: %s\n"
 msgstr "système inconnu : %s\n"
 
-#: lib/rpmrc.c:1350
+#: lib/rpmrc.c:1471
 #, c-format
 msgid "Please contact %s\n"
 msgstr "Contactez %s\n"
 
-#: lib/rpmrc.c:1591
+#: lib/rpmrc.c:1604
 #, c-format
 msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 "Impossible d'ouvrir %s en lecture : %m.\n"
 "\n"
 
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr "Impossible de restaurer le répertoire courant : %m"
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "le support du scriptlet <lua> n'est pas intégrer\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Impossible de créer de fichier temporaire pour %s : %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Impossible de dupliquer le descripteur de fichier : %s : %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "scriptlet %s échoué, waitpid(%d) rc %d : %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "scriptlet %s échoué, signal %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "%s scriptlet échoué, état de sortie %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Format inconnu"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "installer"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "effacer"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "impossible d'ouvrir la base de données paquet dans %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "'(' supplémentaire dans le label du paquet : %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "'(' manquante dans le label du paquet : %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "')' manquante dans le label du paquet : %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: la lecture de la clé publique a échoué.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "transaction"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh size(%d) : ERRONÉ, la lecture retourne %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic : ERRONÉ\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh tags : ERRONÉ, nb. d'étiquettes(%d) hors limite\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh data : ERRONÉ, nb. de  bytes(%d) hors limite\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d) : ERRONÉ, la lecture a retourné %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh tag[%d] : ERRONÉ, tag %d type %d offset %d décompte %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh load : ERRONÉE\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh pad(%zd) : ERRONÉ, lecture de %zd bytes\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd) : ERRONÉ, Fstat(2) échoué\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "La région d'entête immuable ne peut pas être lu. Paquet corrompu?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr "Ne peut signer les paquets RPM v3\n"
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5 :"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "Hachage de l'entête SHA1 :"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Entête "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr "Vérification de signature: MAUVAIS PARAMETRES (%d %p %d %p %p)\n"
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "sauté"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "échoué"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "manque   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Dépendances non satisfaites pour %s :\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr "largeur du champ invalide"
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "{ manquant après %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "} manquant après %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "format de tag vide"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "nom de tag vide"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "tag inconnu"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] attendu à la fin du tableau"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "] inattendu"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "} inattendu"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? attendu dans l'expression"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ attendu après ? dans l'expression"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} attendu dans l'expression"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": attendu derrière la sous-expression de ?"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ attendu après : dans l'expression"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| attendu a la fin de l'expression"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "itérateur de tableau utilisé avec des tableaux de tailles différentes"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "Génération d'index manquant(s) %d, merci d'attendre...\n"
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "ne peut ouvrir l'index %s en utilisant db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr "erreur(%d) en attrapant les articles « %s » de l'index %s : %s\n"
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "aucun dbpath n'a été fourni\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader : ignoré"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "erreur(%d) en stockant l'article nº%d dans %s\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
 
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s : regexec a échoué :%s\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmscript.c:138
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s : regcomp a échoué :%s\n"
+msgid "Unable to restore current directory: %m"
+msgstr "Impossible de restaurer le répertoire courant : %m"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator : ignoré"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "le support du scriptlet <lua> n'est pas intégrer\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmscript.c:278
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb : l'entête #%u endommagée a été récupérée -- ignoré.\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Impossible de créer de fichier temporaire pour %s : %s\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr "Erreur(%d : %s) obtention de la clé suivante à partir de l'index %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Impossible de dupliquer le descripteur de fichier : %s : %s\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmscript.c:353
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "Erreur(%d) ajout de l'enregistrement de l'en-tête #%d\n"
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmscript.c:371
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "Erreur (%d) suppression de l'enregistrement de l'en-tête #%d\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "scriptlet %s échoué, waitpid(%d) rc %d : %s\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmscript.c:375
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s : impossible de lire l'entête à 0x%x\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "scriptlet %s échoué, signal %d\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmscript.c:378
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "erreur(%d) en affectant les articles « %s » de l'index %s\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s scriptlet échoué, état de sortie %d\n"
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "erreur(%d) en stockant l'article « %s » dans %s\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Format inconnu"
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "erreur(%d) en enlevant l'article « %s » de %s\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "installer"
 
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "erreur(%d) en allouant une nouvelle instance de paquet\n"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "effacer"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmts.c:100
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "erreur(%d) en attrapant les articles « %s » de l'index %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "impossible d'ouvrir la base de données paquet dans %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmts.c:199
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "erreur(%d) en stockant l'article %s dans %s\n"
-
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "aucun dbpath fournit"
+msgid "extra '(' in package label: %s\n"
+msgstr "'(' supplémentaire dans le label du paquet : %s\n"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmts.c:217
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "Impossible de créer le répertoire %s : %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "'(' manquante dans le label du paquet : %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmts.c:225
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "l'entête #%u dans la base de données n'est pas bon -- ignoré.\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "')' manquante dans le label du paquet : %s\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "impossible d'ajouter l'article qui était au départ à %u\n"
-
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr ""
-"Ne peut reconstruire la base de données : la base originale reste telle "
-"qu'elle est\n"
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: la lecture de la clé publique a échoué.\n"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "Ne peut remplacer la vieille base de données par la nouvelle!\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "transaction"
 
-#: lib/rpmdb.c:2949
+#: lib/rpmvs.c:152
 #, c-format
-msgid "replace files in %s with files from %s to recover"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
-"remplacer les fichiers dans %s avec les fichiers de %s pour faire une "
-"récupération"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmvs.c:158
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "Ne peut détruire le répertoire %s : %s\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmvs.c:178
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "erreur db%d(%d) de %s : %s\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmvs.c:188
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "erreur db%d(%d) : %s\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmvs.c:195
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "impossible d'avoir le verrou %s sur %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "partagé"
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "exclusif"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:206
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr "type d'index %x invalide sur %s/%s\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:261
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "options de db inconnues : \"%s\" ignoré.\n"
+msgid "%s%s %s"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
-#, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s est une valeur numérique invalide, ignoré\n"
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:268
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s est une valeur 'long' trop petite ou trop grande, ignoré\n"
+msgid "%s%s"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
-#, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s est une valeur entière trop petite ou trop grande, ignoré\n"
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
-#, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "Échec de décodage de la stratégie pour %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
 
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "Impossible de créer le fichier temporaire %s : %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
 
-#: plugins/sepolicy.c:231
-#, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "Impossible d'écrire la stratégie %s dans le fichier %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Entête "
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr "Impossible de créer semanage handle\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "Impossible de se connecter au gestionnaire de la stratégie\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Impossible de recharger l'entête de la signature.\n"
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "Impossible de commencer la transaction de la stratégie : %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "sauté"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "échoué"
 
-#: plugins/sepolicy.c:337
+#: lib/verify.c:263
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
-"Échec de la suppression du fichier temporaire de la stratégie %s : %s\n"
 
-#: plugins/sepolicy.c:386
+#: lib/verify.c:284
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "Impossible d'installer le module de stratégie :%s (%s)\n"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "Impossible de supprimer le module de stratégie :%s\n"
+#: lib/verify.c:395
+msgid "no state"
+msgstr "pas d'état"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "Échec du fork du processus : %s\n"
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "état inconnu"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: lib/verify.c:448
 #, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "Impossible d'exécuter %s : %s\n"
+msgid "missing   %c %s"
+msgstr "manque   %c %s"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:503
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "%s terminé anormalement\n"
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Dépendances non satisfaites pour %s :\n"
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: plugins/prioreset.c:29
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "%s a échoué avec le code de sortie %i\n"
-
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "Impossible de valider les changements de stratégie\n"
-
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "Impossible d'étendre le chemin restorecon"
-
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
-"Impossible de renommer les fichiers. Les fichiers peuvent être mal étiqueté\n"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
-"Impossible de recharger les contextes de fichiers. Les fichiers peuvent être "
-"mal étiquetés\n"
 
-#: plugins/sepolicy.c:594
-#, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "Impossible d'extraire la stratégie depuis %s\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:185
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== %d actif(s) %d vide(s)\n"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
 
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(vide)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(vide)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "La macro %%%s a un corps sans fin\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "La macro %%%s a des options non-terminées\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "La macro %%%s a un nom illégal (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "La macro %%%s a un corps sans fin\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "La macro %%%s a des options non-terminées\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "La macro %%%s a un corps vide\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "La macro %%%s a besoin d'un espace avant le corps\n"
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "La macro %%%s ne peut être expansée\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "La macro %%%s a un nom illégal (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "La macro %%%s (%s) n'est plus utilisée en dessous du niveau %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr "Macro %%%s définie mais non utilisée sans portée\n"
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Option inconnue %c dans %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
@@ -3427,165 +3736,282 @@ msgstr ""
 "Trop de niveaux de récursivité dans l'expansion de la macro. Il est "
 "probablement causée par une déclaration de macro récursive.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "%c non terminé: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Un %% est suivi d'une macro in-analysable\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "Impossible de charger le fichier macro %s"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== %d actif(s) %d vide(s)\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "Erreur de création du fichier temporaire %s : %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Fichier %s : %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Le fichier %s est plus petit que %u octets\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "échec de création du répertoire"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[Aucun]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(pas d'erreur)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "erreur fatale : "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "erreur : "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "attention : "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "syntaxe invalide dans le scriptlet lua : %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "syntaxe invalide dans le script lua : %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "script lua échoué : %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "syntaxe invalide dans le fichier lua : %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "crochet lua échoué : %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[Aucun]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(pas d'erreur)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "erreur fatale : "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "erreur : "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "attention : "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "l'allocation de mémoire (%u octets) a retourné NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, clé ID %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(none)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s : échec de Fwrite : %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s : Fread a échoué : %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s : Fflush échoué : %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr "Signature PGP non supportée\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr "Algorithme %u de hashage PGP non supporté\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr "Algorithme %u clé publique PGP non supporté\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Impossible d'exécuter %s : %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "Impossible d'écrire dans le pipe\n"
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Impossible de créer le pipe pour la signature : %m"
+msgid "Could not read from file %s: %s\n"
+msgstr "Impossible de lire le fichier %s: %s\n"
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "gpg exec échoué (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "échec de gpg à écrire la signature\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "impossible de lire la signature\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp échoué\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr "%s contient déjà une signature identique, ignoré\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s : échec de writeLead : %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s : échec de rpmReadSignature : %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s : échec de headerRead %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "Ne peut signer les paquets RPM v3\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s contient déjà une signature identique, ignoré\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s : échec de rpmWriteSignature : %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s : échec de writeLead : %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "remplacer %s à échouer : %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s : échec de la lecture de la liste de paquetages : %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "ne pas vérifier la signature de l'entête+charge_utile"
diff --git a/po/gu.po b/po/gu.po
deleted file mode 100644 (file)
index 3fa6ae6..0000000
--- a/po/gu.po
+++ /dev/null
@@ -1,3484 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# This file is distributed under the same license as the PACKAGE package.
-# 
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: RPM\n"
-"Report-Msgid-Bugs-To: http://rpm.org/\n"
-"POT-Creation-Date: 2012-11-05 10:07+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
-"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Gujarati (http://www.transifex.com/projects/p/rpm/language/gu/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: gu\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: cliutils.c:21 lib/poptI.c:29
-#, c-format
-msgid "%s: %s\n"
-msgstr ""
-
-#: cliutils.c:27 lib/poptALL.c:55
-#, c-format
-msgid "RPM version %s\n"
-msgstr ""
-
-#: cliutils.c:32
-#, c-format
-msgid "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
-msgstr ""
-
-#: cliutils.c:33
-#, c-format
-msgid ""
-"This program may be freely redistributed under the terms of the GNU GPL\n"
-msgstr ""
-
-#: cliutils.c:53
-#, c-format
-msgid "creating a pipe for --pipe failed: %m\n"
-msgstr ""
-
-#: cliutils.c:63
-#, c-format
-msgid "exec failed\n"
-msgstr ""
-
-#: rpm2cpio.c:63
-#, c-format
-msgid "argument is not an RPM package\n"
-msgstr ""
-
-#: rpm2cpio.c:68
-#, c-format
-msgid "error reading header from package\n"
-msgstr ""
-
-#: rpm2cpio.c:83
-#, c-format
-msgid "cannot re-open payload: %s\n"
-msgstr ""
-
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr ""
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr ""
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr ""
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr ""
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr ""
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr ""
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr ""
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr ""
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr ""
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr ""
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid ""
-"--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr ""
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr ""
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr ""
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr ""
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr ""
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr ""
-
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr ""
-
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:129
-#, c-format
-msgid "verify %files section from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:142
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
-msgid "<tarball>"
-msgstr ""
-
-#: rpmbuild.c:145
-msgid "build through %build (%prep, then compile) from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:148
-msgid "build through %install (%prep, %build, then install) from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:151
-#, c-format
-msgid "verify %files section from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:154
-msgid "build source and binary packages from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:157
-msgid "build binary package only from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:160
-msgid "build source package only from <tarball>"
-msgstr ""
-
-#: rpmbuild.c:164
-msgid "build binary package from <source package>"
-msgstr ""
-
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr ""
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-
-#: rpmbuild.c:171
-msgid "override build root"
-msgstr ""
-
-#: rpmbuild.c:173
-msgid "remove build tree when done"
-msgstr ""
-
-#: rpmbuild.c:175
-msgid "ignore ExcludeArch: directives from spec file"
-msgstr ""
-
-#: rpmbuild.c:177
-msgid "debug file state machine"
-msgstr ""
-
-#: rpmbuild.c:179
-msgid "do not execute any stages of the build"
-msgstr ""
-
-#: rpmbuild.c:181
-msgid "do not verify build dependencies"
-msgstr ""
-
-#: rpmbuild.c:183
-msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
-msgstr ""
-
-#: rpmbuild.c:187
-#, c-format
-msgid "do not execute %clean stage of the build"
-msgstr ""
-
-#: rpmbuild.c:189
-#, c-format
-msgid "do not execute %check stage of the build"
-msgstr ""
-
-#: rpmbuild.c:192
-msgid "do not accept i18N msgstr's from specfile"
-msgstr ""
-
-#: rpmbuild.c:194
-msgid "remove sources when done"
-msgstr ""
-
-#: rpmbuild.c:196
-msgid "remove specfile when done"
-msgstr ""
-
-#: rpmbuild.c:198
-msgid "skip straight to specified stage (only for c,i)"
-msgstr ""
-
-#: rpmbuild.c:200 rpmspec.c:34
-msgid "override target platform"
-msgstr ""
-
-#: rpmbuild.c:217
-msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
-msgstr ""
-
-#: rpmbuild.c:237
-msgid "Failed build dependencies:\n"
-msgstr ""
-
-#: rpmbuild.c:255
-#, c-format
-msgid "Unable to open spec file %s: %s\n"
-msgstr ""
-
-#: rpmbuild.c:317
-#, c-format
-msgid "Failed to open tar pipe: %m\n"
-msgstr ""
-
-#: rpmbuild.c:336
-#, c-format
-msgid "Failed to read spec file from %s\n"
-msgstr ""
-
-#: rpmbuild.c:348
-#, c-format
-msgid "Failed to rename %s to %s: %m\n"
-msgstr ""
-
-#: rpmbuild.c:419
-#, c-format
-msgid "failed to stat %s: %m\n"
-msgstr ""
-
-#: rpmbuild.c:423
-#, c-format
-msgid "File %s is not a regular file.\n"
-msgstr ""
-
-#: rpmbuild.c:430
-#, c-format
-msgid "File %s does not appear to be a specfile.\n"
-msgstr ""
-
-#: rpmbuild.c:496
-#, c-format
-msgid "Building target platforms: %s\n"
-msgstr ""
-
-#: rpmbuild.c:504
-#, c-format
-msgid "Building for target %s\n"
-msgstr ""
-
-#: rpmdb.c:22
-msgid "initialize database"
-msgstr ""
-
-#: rpmdb.c:24
-msgid "rebuild database inverted lists from installed package headers"
-msgstr ""
-
-#: rpmdb.c:27
-msgid "verify database files"
-msgstr ""
-
-#: rpmdb.c:33
-msgid "Database options:"
-msgstr ""
-
-#: rpmkeys.c:24
-msgid "verify package signature(s)"
-msgstr ""
-
-#: rpmkeys.c:26
-msgid "import an armored public key"
-msgstr ""
-
-#: rpmkeys.c:28
-msgid "don't import, but tell if it would work or not"
-msgstr ""
-
-#: rpmkeys.c:31 rpmkeys.c:33
-msgid "list keys from RPM keyring"
-msgstr ""
-
-#: rpmkeys.c:40
-msgid "Keyring options:"
-msgstr ""
-
-#: rpmkeys.c:64 rpmsign.c:144
-msgid "no arguments given"
-msgstr ""
-
-#: rpmsign.c:25
-msgid "sign package(s)"
-msgstr ""
-
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
-msgstr ""
-
-#: rpmsign.c:29
-msgid "delete package signatures"
-msgstr ""
-
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr ""
-
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr ""
-
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
-msgstr ""
-
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr ""
-
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
-msgstr ""
-
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr ""
-
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
-msgstr ""
-
-#: rpmspec.c:28
-msgid "query spec file(s)"
-msgstr ""
-
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
-msgstr ""
-
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
-msgstr ""
-
-#: rpmspec.c:36 lib/poptQV.c:189
-msgid "use the following query format"
-msgstr ""
-
-#: rpmspec.c:45
-msgid "Spec options:"
-msgstr ""
-
-#: rpmspec.c:90
-msgid "no arguments given for parse"
-msgstr ""
-
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
-msgstr ""
-
-#: build/build.c:126
-#, c-format
-msgid "Unable to open stream: %s\n"
-msgstr ""
-
-#: build/build.c:161
-#, c-format
-msgid "Executing(%s): %s\n"
-msgstr ""
-
-#: build/build.c:168
-#, c-format
-msgid "Exec of %s failed (%s): %s\n"
-msgstr ""
-
-#: build/build.c:177
-#, c-format
-msgid "Error executing scriptlet %s (%s)\n"
-msgstr ""
-
-#: build/build.c:184
-#, c-format
-msgid "Bad exit status from %s (%s)\n"
-msgstr ""
-
-#: build/build.c:291
-msgid ""
-"\n"
-"\n"
-"RPM build errors:\n"
-msgstr ""
-
-#: build/expression.c:216
-msgid "syntax error while parsing ==\n"
-msgstr ""
-
-#: build/expression.c:246
-msgid "syntax error while parsing &&\n"
-msgstr ""
-
-#: build/expression.c:255
-msgid "syntax error while parsing ||\n"
-msgstr ""
-
-#: build/expression.c:305
-msgid "parse error in expression\n"
-msgstr ""
-
-#: build/expression.c:337
-msgid "unmatched (\n"
-msgstr ""
-
-#: build/expression.c:369
-msgid "- only on numbers\n"
-msgstr ""
-
-#: build/expression.c:385
-msgid "! only on numbers\n"
-msgstr ""
-
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
-msgid "types must match\n"
-msgstr ""
-
-#: build/expression.c:440
-msgid "* / not suported for strings\n"
-msgstr ""
-
-#: build/expression.c:491
-msgid "- not suported for strings\n"
-msgstr ""
-
-#: build/expression.c:638
-msgid "&& and || not suported for strings\n"
-msgstr ""
-
-#: build/expression.c:671
-msgid "syntax error in expression\n"
-msgstr ""
-
-#: build/files.c:327 build/files.c:496 build/files.c:710
-#, c-format
-msgid "Missing '(' in %s %s\n"
-msgstr ""
-
-#: build/files.c:337 build/files.c:632 build/files.c:720 build/files.c:779
-#, c-format
-msgid "Missing ')' in %s(%s\n"
-msgstr ""
-
-#: build/files.c:362 build/files.c:651
-#, c-format
-msgid "Invalid %s token: %s\n"
-msgstr ""
-
-#: build/files.c:465
-#, c-format
-msgid "Missing %s in %s %s\n"
-msgstr ""
-
-#: build/files.c:511
-#, c-format
-msgid "Non-white space follows %s(): %s\n"
-msgstr ""
-
-#: build/files.c:547
-#, c-format
-msgid "Bad syntax: %s(%s)\n"
-msgstr ""
-
-#: build/files.c:556
-#, c-format
-msgid "Bad mode spec: %s(%s)\n"
-msgstr ""
-
-#: build/files.c:568
-#, c-format
-msgid "Bad dirmode spec: %s(%s)\n"
-msgstr ""
-
-#: build/files.c:672
-#, c-format
-msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
-msgstr ""
-
-#: build/files.c:679
-#, c-format
-msgid "Duplicate locale %s in %%lang(%s)\n"
-msgstr ""
-
-#: build/files.c:794
-#, c-format
-msgid "Invalid capability: %s\n"
-msgstr ""
-
-#: build/files.c:804
-msgid "File capability support not built in\n"
-msgstr ""
-
-#: build/files.c:853
-#, c-format
-msgid "File must begin with \"/\": %s\n"
-msgstr ""
-
-#: build/files.c:974
-#, c-format
-msgid "Unknown file digest algorithm %u, falling back to MD5\n"
-msgstr ""
-
-#: build/files.c:1002
-#, c-format
-msgid "File listed twice: %s\n"
-msgstr ""
-
-#: build/files.c:1124
-#, c-format
-msgid "reading symlink %s failed: %s\n"
-msgstr ""
-
-#: build/files.c:1132
-#, c-format
-msgid "Symlink points to BuildRoot: %s -> %s\n"
-msgstr ""
-
-#: build/files.c:1346
-#, c-format
-msgid "Directory not found: %s\n"
-msgstr ""
-
-#: build/files.c:1347
-#, c-format
-msgid "File not found: %s\n"
-msgstr ""
-
-#: build/files.c:1538
-#, c-format
-msgid "%s: can't load unknown tag (%d).\n"
-msgstr ""
-
-#: build/files.c:1544
-#, c-format
-msgid "%s: public key read failed.\n"
-msgstr ""
-
-#: build/files.c:1548
-#, c-format
-msgid "%s: not an armored public key.\n"
-msgstr ""
-
-#: build/files.c:1557
-#, c-format
-msgid "%s: failed to encode\n"
-msgstr ""
-
-#: build/files.c:1602
-#, c-format
-msgid "File needs leading \"/\": %s\n"
-msgstr ""
-
-#: build/files.c:1626
-#, c-format
-msgid "%%dev glob not permitted: %s\n"
-msgstr ""
-
-#: build/files.c:1639
-#, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr ""
-
-#: build/files.c:1640 lib/rpminstall.c:426
-#, c-format
-msgid "File not found by glob: %s\n"
-msgstr ""
-
-#: build/files.c:1676
-#, c-format
-msgid "Could not open %%files file %s: %m\n"
-msgstr ""
-
-#: build/files.c:1683
-#, c-format
-msgid "line: %s\n"
-msgstr ""
-
-#: build/files.c:1690
-#, c-format
-msgid "Error reading %%files file %s: %m\n"
-msgstr ""
-
-#: build/files.c:1712
-#, c-format
-msgid "illegal _docdir_fmt %s: %s\n"
-msgstr ""
-
-#: build/files.c:1866
-#, c-format
-msgid "Can't mix special %s with other forms: %s\n"
-msgstr ""
-
-#: build/files.c:1883
-#, c-format
-msgid "More than one file on a line: %s\n"
-msgstr ""
-
-#: build/files.c:2011
-#, c-format
-msgid "Bad file: %s: %s\n"
-msgstr ""
-
-#: build/files.c:2036 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr ""
-
-#: build/files.c:2070
-#, c-format
-msgid "Checking for unpackaged file(s): %s\n"
-msgstr ""
-
-#: build/files.c:2083
-#, c-format
-msgid ""
-"Installed (but unpackaged) file(s) found:\n"
-"%s"
-msgstr ""
-
-#: build/files.c:2114
-#, c-format
-msgid "Processing files: %s\n"
-msgstr ""
-
-#: build/files.c:2127
-#, c-format
-msgid "Binaries arch (%d) not matching the package arch (%d).\n"
-msgstr ""
-
-#: build/files.c:2133
-msgid "Arch dependent binaries in noarch package\n"
-msgstr ""
-
-#: build/pack.c:50
-#, c-format
-msgid "create archive failed on file %s: %s\n"
-msgstr ""
-
-#: build/pack.c:53
-#, c-format
-msgid "create archive failed: %s\n"
-msgstr ""
-
-#: build/pack.c:80
-#, c-format
-msgid "Could not open %s file: %s\n"
-msgstr ""
-
-#: build/pack.c:96
-#, c-format
-msgid "%s: line: %s\n"
-msgstr ""
-
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr ""
-
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:206
-#, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr ""
-
-#: build/pack.c:310
-#, c-format
-msgid "Unknown payload compression: %s\n"
-msgstr ""
-
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr ""
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr ""
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr ""
-
-#: build/pack.c:440
-#, c-format
-msgid "Could not open %s: %s\n"
-msgstr ""
-
-#: build/pack.c:452
-#, c-format
-msgid "Unable to write package: %s\n"
-msgstr ""
-
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr ""
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr ""
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:523
-#, c-format
-msgid "Wrote: %s\n"
-msgstr ""
-
-#: build/pack.c:542
-#, c-format
-msgid "Executing \"%s\":\n"
-msgstr ""
-
-#: build/pack.c:545
-#, c-format
-msgid "Execution of \"%s\" failed.\n"
-msgstr ""
-
-#: build/pack.c:549
-#, c-format
-msgid "Package check \"%s\" failed.\n"
-msgstr ""
-
-#: build/pack.c:598
-#, c-format
-msgid "Could not generate output filename for package %s: %s\n"
-msgstr ""
-
-#: build/pack.c:615
-#, c-format
-msgid "cannot create %s: %s\n"
-msgstr ""
-
-#: build/parseBuildInstallClean.c:35
-#, c-format
-msgid "line %d: second %s\n"
-msgstr ""
-
-#: build/parseChangelog.c:114
-#, c-format
-msgid "bogus date in %%changelog: %s\n"
-msgstr ""
-
-#: build/parseChangelog.c:146
-#, c-format
-msgid "%%changelog entries must start with *\n"
-msgstr ""
-
-#: build/parseChangelog.c:154
-#, c-format
-msgid "incomplete %%changelog entry\n"
-msgstr ""
-
-#: build/parseChangelog.c:169
-#, c-format
-msgid "bad date in %%changelog: %s\n"
-msgstr ""
-
-#: build/parseChangelog.c:174
-#, c-format
-msgid "%%changelog not in descending chronological order\n"
-msgstr ""
-
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
-#, c-format
-msgid "missing name in %%changelog\n"
-msgstr ""
-
-#: build/parseChangelog.c:200
-#, c-format
-msgid "no description in %%changelog\n"
-msgstr ""
-
-#: build/parseDescription.c:32
-#, c-format
-msgid "line %d: Error parsing %%description: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
-#, c-format
-msgid "line %d: Bad option %s: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
-#, c-format
-msgid "line %d: Too many names: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr ""
-
-#: build/parseFiles.c:33
-#, c-format
-msgid "line %d: Error parsing %%files: %s\n"
-msgstr ""
-
-#: build/parsePolicies.c:32
-#, c-format
-msgid "line %d: Error parsing %%policies: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:69
-#, c-format
-msgid "Error parsing tag field: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:162
-#, c-format
-msgid "line %d: Bad number: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:168
-#, c-format
-msgid "line %d: Bad no%s number: %u\n"
-msgstr ""
-
-#: build/parsePreamble.c:231
-#, c-format
-msgid "line %d: Bad %s number: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:245
-#, c-format
-msgid "%s %d defined multiple times\n"
-msgstr ""
-
-#: build/parsePreamble.c:290
-#, c-format
-msgid "Downloading %s to %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:293
-#, c-format
-msgid "Couldn't download %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:432
-#, c-format
-msgid "Architecture is excluded: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:437
-#, c-format
-msgid "Architecture is not included: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:442
-#, c-format
-msgid "OS is excluded: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:447
-#, c-format
-msgid "OS is not included: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:473
-#, c-format
-msgid "%s field must be present in package: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:496
-#, c-format
-msgid "Duplicate %s entries in package: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:554
-#, c-format
-msgid "Unable to open icon %s: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:570
-#, c-format
-msgid "Unable to read icon %s: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:580
-#, c-format
-msgid "Unknown icon type: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:594
-#, c-format
-msgid "line %d: Tag takes single token only: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:614
-#, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:617
-#, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:623
-#, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:646
-#, c-format
-msgid "line %d: Malformed tag: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:654
-#, c-format
-msgid "line %d: Empty tag: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:715
-#, c-format
-msgid "line %d: Prefixes must not end with \"/\": %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:727
-#, c-format
-msgid "line %d: Docdir must begin with '/': %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:740
-#, c-format
-msgid "line %d: Epoch field must be an unsigned number: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:777
-#, c-format
-msgid "line %d: Bad %s: qualifiers: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:804
-#, c-format
-msgid "line %d: Bad BuildArchitecture format: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:814
-#, c-format
-msgid "line %d: Only noarch subpackages are supported: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:830
-#, c-format
-msgid "Internal error: Bogus tag %d\n"
-msgstr ""
-
-#: build/parsePreamble.c:915
-#, c-format
-msgid "line %d: %s is deprecated: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:978
-#, c-format
-msgid "Bad package specification: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:1015
-#, c-format
-msgid "line %d: Unknown tag: %s\n"
-msgstr ""
-
-#: build/parsePreamble.c:1047
-#, c-format
-msgid "%%{buildroot} couldn't be empty\n"
-msgstr ""
-
-#: build/parsePreamble.c:1051
-#, c-format
-msgid "%%{buildroot} can not be \"/\"\n"
-msgstr ""
-
-#: build/parsePrep.c:28
-#, c-format
-msgid "Bad source: %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:73
-#, c-format
-msgid "No patch number %u\n"
-msgstr ""
-
-#: build/parsePrep.c:75
-#, c-format
-msgid "%%patch without corresponding \"Patch:\" tag\n"
-msgstr ""
-
-#: build/parsePrep.c:152
-#, c-format
-msgid "No source number %u\n"
-msgstr ""
-
-#: build/parsePrep.c:154
-msgid "No \"Source:\" tag in the spec file\n"
-msgstr ""
-
-#: build/parsePrep.c:261
-#, c-format
-msgid "Error parsing %%setup: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:272
-#, c-format
-msgid "line %d: Bad arg to %%setup: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:287
-#, c-format
-msgid "line %d: Bad %%setup option %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:446
-#, c-format
-msgid "%s: %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:459
-#, c-format
-msgid "Invalid patch number %s: %s\n"
-msgstr ""
-
-#: build/parsePrep.c:486
-#, c-format
-msgid "line %d: second %%prep\n"
-msgstr ""
-
-#: build/parseReqs.c:112
-msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
-msgstr ""
-
-#: build/parseReqs.c:137
-msgid "Versioned file name not permitted"
-msgstr ""
-
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr ""
-
-#: build/parseReqs.c:165
-msgid "invalid dependency"
-msgstr ""
-
-#: build/parseReqs.c:181
-#, c-format
-msgid "line %d: %s: %s\n"
-msgstr ""
-
-#: build/parseScript.c:192
-#, c-format
-msgid "line %d: triggers must have --: %s\n"
-msgstr ""
-
-#: build/parseScript.c:202 build/parseScript.c:265
-#, c-format
-msgid "line %d: Error parsing %s: %s\n"
-msgstr ""
-
-#: build/parseScript.c:214
-#, c-format
-msgid "line %d: internal script must end with '>': %s\n"
-msgstr ""
-
-#: build/parseScript.c:220
-#, c-format
-msgid "line %d: script program must begin with '/': %s\n"
-msgstr ""
-
-#: build/parseScript.c:258
-#, c-format
-msgid "line %d: Second %s\n"
-msgstr ""
-
-#: build/parseScript.c:301
-#, c-format
-msgid "line %d: unsupported internal script: %s\n"
-msgstr ""
-
-#: build/parseScript.c:318
-#, c-format
-msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
-msgstr ""
-
-#: build/parseSpec.c:209
-#, c-format
-msgid "line %d: %s\n"
-msgstr ""
-
-#: build/parseSpec.c:252
-#, c-format
-msgid "Unable to open %s: %s\n"
-msgstr ""
-
-#: build/parseSpec.c:286
-#, c-format
-msgid "%s:%d: Argument expected for %s\n"
-msgstr ""
-
-#: build/parseSpec.c:308
-#, c-format
-msgid "line %d: Unclosed %%if\n"
-msgstr ""
-
-#: build/parseSpec.c:313
-#, c-format
-msgid "line %d: unclosed macro or bad line continuation\n"
-msgstr ""
-
-#: build/parseSpec.c:355
-#, c-format
-msgid "%s:%d: bad %%if condition\n"
-msgstr ""
-
-#: build/parseSpec.c:363
-#, c-format
-msgid "%s:%d: Got a %%else with no %%if\n"
-msgstr ""
-
-#: build/parseSpec.c:374
-#, c-format
-msgid "%s:%d: Got a %%endif with no %%if\n"
-msgstr ""
-
-#: build/parseSpec.c:392
-#, c-format
-msgid "%s:%d: malformed %%include statement\n"
-msgstr ""
-
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
-msgstr ""
-
-#: build/parseSpec.c:703
-#, c-format
-msgid "Package has no %%description: %s\n"
-msgstr ""
-
-#: build/policies.c:87
-#, c-format
-msgid "Policy module '%s' duplicated with overlapping types\n"
-msgstr ""
-
-#: build/policies.c:93
-#, c-format
-msgid "Base modules '%s' and '%s' have overlapping types\n"
-msgstr ""
-
-#: build/policies.c:101
-msgid "Failed to get policies from header\n"
-msgstr ""
-
-#: build/policies.c:154
-#, c-format
-msgid "%%semodule requires a file path\n"
-msgstr ""
-
-#: build/policies.c:163
-#, c-format
-msgid "Failed to read  policy file: %s\n"
-msgstr ""
-
-#: build/policies.c:170
-#, c-format
-msgid "Failed to encode policy file: %s\n"
-msgstr ""
-
-#: build/policies.c:187
-#, c-format
-msgid "Failed to determine a policy name: %s\n"
-msgstr ""
-
-#: build/policies.c:199
-#, c-format
-msgid ""
-"'%s' type given with other types in %%semodule %s. Compacting types to "
-"'%s'.\n"
-msgstr ""
-
-#: build/policies.c:246
-#, c-format
-msgid "Error parsing %s: %s\n"
-msgstr ""
-
-#: build/policies.c:252
-#, c-format
-msgid "Expecting %%semodule tag: %s\n"
-msgstr ""
-
-#: build/policies.c:262
-#, c-format
-msgid "Missing module path in line: %s\n"
-msgstr ""
-
-#: build/policies.c:268
-#, c-format
-msgid "Too many arguments in line: %s\n"
-msgstr ""
-
-#: build/policies.c:307
-#, c-format
-msgid "Processing policies: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:108
-#, c-format
-msgid "Ignoring invalid regex %s\n"
-msgstr ""
-
-#: build/rpmfc.c:204
-#, c-format
-msgid "Couldn't create pipe for %s: %m\n"
-msgstr ""
-
-#: build/rpmfc.c:229
-#, c-format
-msgid "Couldn't exec %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:234 lib/rpmscript.c:255
-#, c-format
-msgid "Couldn't fork %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:317
-#, c-format
-msgid "%s failed: %x\n"
-msgstr ""
-
-#: build/rpmfc.c:321
-#, c-format
-msgid "failed to write all data to %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
-msgid "Empty file classifier\n"
-msgstr ""
-
-#: build/rpmfc.c:918
-msgid "No file attributes configured\n"
-msgstr ""
-
-#: build/rpmfc.c:938
-#, c-format
-msgid "magic_open(0x%x) failed: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:944
-#, c-format
-msgid "magic_load failed: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:986
-#, c-format
-msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
-msgstr ""
-
-#: build/rpmfc.c:1166
-#, c-format
-msgid "Finding  %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
-#, c-format
-msgid "Failed to find %s:\n"
-msgstr ""
-
-#: build/spec.c:404
-#, c-format
-msgid "query of specfile %s failed, can't parse\n"
-msgstr ""
-
-#: lib/cpio.c:364
-#, c-format
-msgid "(error 0x%x)"
-msgstr ""
-
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr ""
-
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr ""
-
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr ""
-
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr ""
-
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr ""
-
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr ""
-
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr ""
-
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr ""
-
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr ""
-
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr ""
-
-#: lib/depends.c:68
-#, c-format
-msgid "%s is a Delta RPM and cannot be directly installed\n"
-msgstr ""
-
-#: lib/depends.c:72
-#, c-format
-msgid "Unsupported payload (%s) in package %s\n"
-msgstr ""
-
-#: lib/depends.c:348
-#, c-format
-msgid "package %s was already added, skipping %s\n"
-msgstr ""
-
-#: lib/depends.c:349
-#, c-format
-msgid "package %s was already added, replacing with %s\n"
-msgstr ""
-
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
-msgid "(not a number)"
-msgstr ""
-
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
-msgstr ""
-
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
-msgstr ""
-
-#: lib/formats.c:314
-msgid "(not base64)"
-msgstr ""
-
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr ""
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr ""
-
-#: lib/formats.c:384
-msgid "(invalid xml type)"
-msgstr ""
-
-#: lib/formats.c:434
-msgid "(not an OpenPGP signature)"
-msgstr ""
-
-#: lib/formats.c:446
-#, c-format
-msgid "Invalid date %u"
-msgstr ""
-
-#: lib/formats.c:512
-msgid "normal"
-msgstr ""
-
-#: lib/formats.c:515
-msgid "replaced"
-msgstr ""
-
-#: lib/formats.c:518
-msgid "not installed"
-msgstr ""
-
-#: lib/formats.c:521
-msgid "net shared"
-msgstr ""
-
-#: lib/formats.c:524
-msgid "wrong color"
-msgstr ""
-
-#: lib/formats.c:527
-msgid "missing"
-msgstr ""
-
-#: lib/formats.c:530
-msgid "(unknown)"
-msgstr ""
-
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
-#, c-format
-msgid "%s saved as %s\n"
-msgstr ""
-
-#: lib/fsm.c:1543
-#, c-format
-msgid "%s created as %s\n"
-msgstr ""
-
-#: lib/fsm.c:1845
-#, c-format
-msgid "%s %s: remove failed: %s\n"
-msgstr ""
-
-#: lib/fsm.c:1846
-msgid "directory"
-msgstr ""
-
-#: lib/fsm.c:1846
-msgid "file"
-msgstr ""
-
-#: lib/package.c:146
-#, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr ""
-
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr ""
-
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr ""
-
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr ""
-
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr ""
-
-#: lib/package.c:296
-#, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr ""
-
-#: lib/package.c:322 lib/signature.c:142
-#, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:331 lib/signature.c:151
-#, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/package.c:358 lib/signature.c:185
-#, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr ""
-
-#: lib/package.c:427
-#, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr ""
-
-#: lib/package.c:436
-#, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/package.c:452
-#, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr ""
-
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr ""
-
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
-msgstr ""
-
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr ""
-
-#: lib/package.c:629 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
-#, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr ""
-
-#: lib/poptALL.c:157
-msgid "predefine MACRO with value EXPR"
-msgstr ""
-
-#: lib/poptALL.c:158 lib/poptALL.c:161
-msgid "'MACRO EXPR'"
-msgstr ""
-
-#: lib/poptALL.c:160
-msgid "define MACRO with value EXPR"
-msgstr ""
-
-#: lib/poptALL.c:163
-msgid "print macro expansion of EXPR"
-msgstr ""
-
-#: lib/poptALL.c:164
-msgid "'EXPR'"
-msgstr ""
-
-#: lib/poptALL.c:166 lib/poptALL.c:180
-msgid "read <FILE:...> instead of default file(s)"
-msgstr ""
-
-#: lib/poptALL.c:167 lib/poptALL.c:181
-msgid "<FILE:...>"
-msgstr ""
-
-#: lib/poptALL.c:170
-msgid "don't verify package digest(s)"
-msgstr ""
-
-#: lib/poptALL.c:172
-msgid "don't verify database header(s) when retrieved"
-msgstr ""
-
-#: lib/poptALL.c:174
-msgid "don't verify package signature(s)"
-msgstr ""
-
-#: lib/poptALL.c:177
-msgid "send stdout to CMD"
-msgstr ""
-
-#: lib/poptALL.c:178
-msgid "CMD"
-msgstr ""
-
-#: lib/poptALL.c:183
-msgid "use ROOT as top level directory"
-msgstr ""
-
-#: lib/poptALL.c:184
-msgid "ROOT"
-msgstr ""
-
-#: lib/poptALL.c:186
-msgid "use database in DIRECTORY"
-msgstr ""
-
-#: lib/poptALL.c:187
-msgid "DIRECTORY"
-msgstr ""
-
-#: lib/poptALL.c:190
-msgid "display known query tags"
-msgstr ""
-
-#: lib/poptALL.c:192
-msgid "display final rpmrc and macro configuration"
-msgstr ""
-
-#: lib/poptALL.c:194
-msgid "provide less detailed output"
-msgstr ""
-
-#: lib/poptALL.c:196
-msgid "provide more detailed output"
-msgstr ""
-
-#: lib/poptALL.c:198
-msgid "print the version of rpm being used"
-msgstr ""
-
-#: lib/poptALL.c:204
-msgid "debug payload file state machine"
-msgstr ""
-
-#: lib/poptALL.c:210
-msgid "debug rpmio I/O"
-msgstr ""
-
-#: lib/poptALL.c:277
-#, c-format
-msgid "%s: option table misconfigured (%d)\n"
-msgstr ""
-
-#: lib/poptI.c:52
-msgid "exclude paths must begin with a /"
-msgstr ""
-
-#: lib/poptI.c:64
-msgid "relocations must begin with a /"
-msgstr ""
-
-#: lib/poptI.c:67
-msgid "relocations must contain a ="
-msgstr ""
-
-#: lib/poptI.c:70
-msgid "relocations must have a / following the ="
-msgstr ""
-
-#: lib/poptI.c:114
-msgid ""
-"install all files, even configurations which might otherwise be skipped"
-msgstr ""
-
-#: lib/poptI.c:118
-msgid ""
-"remove all packages which match <package> (normally an error is generated if"
-" <package> specified multiple packages)"
-msgstr ""
-
-#: lib/poptI.c:123
-msgid "relocate files in non-relocatable package"
-msgstr ""
-
-#: lib/poptI.c:127
-msgid "print dependency loops as warning"
-msgstr ""
-
-#: lib/poptI.c:131
-msgid "erase (uninstall) package"
-msgstr ""
-
-#: lib/poptI.c:131
-msgid "<package>+"
-msgstr ""
-
-#: lib/poptI.c:134 lib/poptI.c:171
-msgid "do not install configuration files"
-msgstr ""
-
-#: lib/poptI.c:137 lib/poptI.c:176
-msgid "do not install documentation"
-msgstr ""
-
-#: lib/poptI.c:139
-msgid "skip files with leading component <path> "
-msgstr ""
-
-#: lib/poptI.c:140
-msgid "<path>"
-msgstr ""
-
-#: lib/poptI.c:143
-msgid "short hand for --replacepkgs --replacefiles"
-msgstr ""
-
-#: lib/poptI.c:147
-msgid "upgrade package(s) if already installed"
-msgstr ""
-
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
-msgid "<packagefile>+"
-msgstr ""
-
-#: lib/poptI.c:150
-msgid "print hash marks as package installs (good with -v)"
-msgstr ""
-
-#: lib/poptI.c:153
-msgid "don't verify package architecture"
-msgstr ""
-
-#: lib/poptI.c:156
-msgid "don't verify package operating system"
-msgstr ""
-
-#: lib/poptI.c:159
-msgid "don't check disk space before installing"
-msgstr ""
-
-#: lib/poptI.c:161
-msgid "install documentation"
-msgstr ""
-
-#: lib/poptI.c:164
-msgid "install package(s)"
-msgstr ""
-
-#: lib/poptI.c:167
-msgid "update the database, but do not modify the filesystem"
-msgstr ""
-
-#: lib/poptI.c:173
-msgid "do not verify package dependencies"
-msgstr ""
-
-#: lib/poptI.c:179 lib/poptQV.c:204 lib/poptQV.c:206
-msgid "don't verify digest of files"
-msgstr ""
-
-#: lib/poptI.c:181
-msgid "don't verify digest of files (obsolete)"
-msgstr ""
-
-#: lib/poptI.c:183
-msgid "don't install file security contexts"
-msgstr ""
-
-#: lib/poptI.c:187
-msgid "do not reorder package installation to satisfy dependencies"
-msgstr ""
-
-#: lib/poptI.c:191
-msgid "do not execute package scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:195
-#, c-format
-msgid "do not execute %%pre scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:198
-#, c-format
-msgid "do not execute %%post scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:201
-#, c-format
-msgid "do not execute %%preun scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:204
-#, c-format
-msgid "do not execute %%postun scriptlet (if any)"
-msgstr ""
-
-#: lib/poptI.c:207
-msgid "do not execute any scriptlet(s) triggered by this package"
-msgstr ""
-
-#: lib/poptI.c:210
-#, c-format
-msgid "do not execute any %%triggerprein scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:213
-#, c-format
-msgid "do not execute any %%triggerin scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:216
-#, c-format
-msgid "do not execute any %%triggerun scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:219
-#, c-format
-msgid "do not execute any %%triggerpostun scriptlet(s)"
-msgstr ""
-
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
-msgid ""
-"upgrade to an old version of the package (--force on upgrades does this "
-"automatically)"
-msgstr ""
-
-#: lib/poptI.c:231
-msgid "print percentages as package installs"
-msgstr ""
-
-#: lib/poptI.c:233
-msgid "relocate the package to <dir>, if relocatable"
-msgstr ""
-
-#: lib/poptI.c:234
-msgid "<dir>"
-msgstr ""
-
-#: lib/poptI.c:236
-msgid "relocate files from path <old> to <new>"
-msgstr ""
-
-#: lib/poptI.c:237
-msgid "<old>=<new>"
-msgstr ""
-
-#: lib/poptI.c:240
-msgid "ignore file conflicts between packages"
-msgstr ""
-
-#: lib/poptI.c:243
-msgid "reinstall if the package is already present"
-msgstr ""
-
-#: lib/poptI.c:245
-msgid "don't install, but tell if it would work or not"
-msgstr ""
-
-#: lib/poptI.c:248
-msgid "upgrade package(s)"
-msgstr ""
-
-#: lib/poptQV.c:67
-msgid "query/verify all packages"
-msgstr ""
-
-#: lib/poptQV.c:69
-msgid "rpm checksig mode"
-msgstr ""
-
-#: lib/poptQV.c:71
-msgid "query/verify package(s) owning file"
-msgstr ""
-
-#: lib/poptQV.c:73
-msgid "query/verify package(s) in group"
-msgstr ""
-
-#: lib/poptQV.c:75
-msgid "query/verify a package file"
-msgstr ""
-
-#: lib/poptQV.c:78
-msgid "query/verify package(s) with package identifier"
-msgstr ""
-
-#: lib/poptQV.c:80
-msgid "query/verify package(s) with header identifier"
-msgstr ""
-
-#: lib/poptQV.c:83
-msgid "rpm query mode"
-msgstr ""
-
-#: lib/poptQV.c:85
-msgid "query/verify a header instance"
-msgstr ""
-
-#: lib/poptQV.c:87
-msgid "query/verify package(s) from install transaction"
-msgstr ""
-
-#: lib/poptQV.c:89
-msgid "query the package(s) triggered by the package"
-msgstr ""
-
-#: lib/poptQV.c:91
-msgid "rpm verify mode"
-msgstr ""
-
-#: lib/poptQV.c:93
-msgid "query/verify the package(s) which require a dependency"
-msgstr ""
-
-#: lib/poptQV.c:95
-msgid "query/verify the package(s) which provide a dependency"
-msgstr ""
-
-#: lib/poptQV.c:98
-msgid "do not glob arguments"
-msgstr ""
-
-#: lib/poptQV.c:100
-msgid "do not process non-package files as manifests"
-msgstr ""
-
-#: lib/poptQV.c:171
-msgid "list all configuration files"
-msgstr ""
-
-#: lib/poptQV.c:173
-msgid "list all documentation files"
-msgstr ""
-
-#: lib/poptQV.c:175
-msgid "dump basic file information"
-msgstr ""
-
-#: lib/poptQV.c:179
-msgid "list files in package"
-msgstr ""
-
-#: lib/poptQV.c:184
-#, c-format
-msgid "skip %%ghost files"
-msgstr ""
-
-#: lib/poptQV.c:191
-msgid "display the states of the listed files"
-msgstr ""
-
-#: lib/poptQV.c:209
-msgid "don't verify size of files"
-msgstr ""
-
-#: lib/poptQV.c:212
-msgid "don't verify symlink path of files"
-msgstr ""
-
-#: lib/poptQV.c:215
-msgid "don't verify owner of files"
-msgstr ""
-
-#: lib/poptQV.c:218
-msgid "don't verify group of files"
-msgstr ""
-
-#: lib/poptQV.c:221
-msgid "don't verify modification time of files"
-msgstr ""
-
-#: lib/poptQV.c:224 lib/poptQV.c:227
-msgid "don't verify mode of files"
-msgstr ""
-
-#: lib/poptQV.c:230
-msgid "don't verify capabilities of files"
-msgstr ""
-
-#: lib/poptQV.c:233
-msgid "don't verify file security contexts"
-msgstr ""
-
-#: lib/poptQV.c:235
-msgid "don't verify files in package"
-msgstr ""
-
-#: lib/poptQV.c:237 tools/rpmgraph.c:218
-msgid "don't verify package dependencies"
-msgstr ""
-
-#: lib/poptQV.c:240 lib/poptQV.c:243
-msgid "don't execute verify script(s)"
-msgstr ""
-
-#: lib/psm.c:212
-#, c-format
-msgid "Missing rpmlib features for %s:\n"
-msgstr ""
-
-#: lib/psm.c:254
-msgid "source package expected, binary found\n"
-msgstr ""
-
-#: lib/psm.c:307
-msgid "source package contains no .spec file\n"
-msgstr ""
-
-#: lib/psm.c:836
-#, c-format
-msgid "unpacking of archive failed%s%s: %s\n"
-msgstr ""
-
-#: lib/psm.c:837
-msgid " on file "
-msgstr ""
-
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
-#, c-format
-msgid "incorrect format: %s\n"
-msgstr ""
-
-#: lib/query.c:123
-msgid "(contains no files)\n"
-msgstr ""
-
-#: lib/query.c:156
-msgid "normal        "
-msgstr ""
-
-#: lib/query.c:159
-msgid "replaced      "
-msgstr ""
-
-#: lib/query.c:162
-msgid "not installed "
-msgstr ""
-
-#: lib/query.c:165
-msgid "net shared    "
-msgstr ""
-
-#: lib/query.c:168
-msgid "wrong color   "
-msgstr ""
-
-#: lib/query.c:171
-msgid "(no state)    "
-msgstr ""
-
-#: lib/query.c:174
-#, c-format
-msgid "(unknown %3d) "
-msgstr ""
-
-#: lib/query.c:194
-msgid "package has not file owner/group lists\n"
-msgstr ""
-
-#: lib/query.c:225
-msgid "package has neither file owner or id lists\n"
-msgstr ""
-
-#: lib/query.c:314
-#, c-format
-msgid "group %s does not contain any packages\n"
-msgstr ""
-
-#: lib/query.c:321
-#, c-format
-msgid "no package triggers %s\n"
-msgstr ""
-
-#: lib/query.c:332 lib/query.c:351 lib/query.c:367
-#, c-format
-msgid "malformed %s: %s\n"
-msgstr ""
-
-#: lib/query.c:342 lib/query.c:357 lib/query.c:372
-#, c-format
-msgid "no package matches %s: %s\n"
-msgstr ""
-
-#: lib/query.c:380
-#, c-format
-msgid "no package requires %s\n"
-msgstr ""
-
-#: lib/query.c:388
-#, c-format
-msgid "no package provides %s\n"
-msgstr ""
-
-#: lib/query.c:420
-#, c-format
-msgid "file %s: %s\n"
-msgstr ""
-
-#: lib/query.c:423
-#, c-format
-msgid "file %s is not owned by any package\n"
-msgstr ""
-
-#: lib/query.c:434
-#, c-format
-msgid "invalid package number: %s\n"
-msgstr ""
-
-#: lib/query.c:441
-#, c-format
-msgid "record %u could not be read\n"
-msgstr ""
-
-#: lib/query.c:454 lib/rpminstall.c:654
-#, c-format
-msgid "package %s is not installed\n"
-msgstr ""
-
-#: lib/query.c:488
-#, c-format
-msgid "unknown tag: \"%s\"\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:44
-#, c-format
-msgid "%s: key %d import failed.\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:48
-#, c-format
-msgid "%s: key %d not an armored public key.\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:93
-#, c-format
-msgid "%s: import read failed(%d).\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:119
-#, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
-msgstr ""
-
-#: lib/rpmchecksig.c:386
-msgid "OK"
-msgstr ""
-
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr ""
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ""
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr ""
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ""
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
-#, c-format
-msgid "%s: open failed: %s\n"
-msgstr ""
-
-#: lib/rpmchroot.c:43
-#, c-format
-msgid "Unable to open current directory: %m\n"
-msgstr ""
-
-#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
-#, c-format
-msgid "%s: chroot directory not set\n"
-msgstr ""
-
-#: lib/rpmchroot.c:70
-#, c-format
-msgid "Unable to change root directory: %m\n"
-msgstr ""
-
-#: lib/rpmchroot.c:95
-#, c-format
-msgid "Unable to restore root directory: %m\n"
-msgstr ""
-
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr ""
-
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr ""
-
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr ""
-
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
-msgstr ""
-
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
-msgstr ""
-
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
-msgstr ""
-
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr ""
-
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr ""
-
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr ""
-
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr ""
-
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr ""
-
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr ""
-
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr ""
-
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr ""
-
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr ""
-
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr ""
-
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr ""
-
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
-msgstr ""
-
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
-msgstr ""
-
-#: lib/rpmgi.c:136
-#, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
-msgstr ""
-
-#: lib/rpminstall.c:141
-#, c-format
-msgid "Updating / installing...\n"
-msgstr ""
-
-#: lib/rpminstall.c:143
-#, c-format
-msgid "Cleaning up / removing...\n"
-msgstr ""
-
-#: lib/rpminstall.c:192
-msgid "Preparing..."
-msgstr ""
-
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
-msgstr ""
-
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
-msgstr ""
-
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
-msgstr ""
-
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
-msgstr ""
-
-#: lib/rpminstall.c:542
-#, c-format
-msgid "package %s is not relocatable\n"
-msgstr ""
-
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
-msgstr ""
-
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr ""
-
-#: lib/rpminstall.c:706
-#, c-format
-msgid "Installing %s\n"
-msgstr ""
-
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
-msgstr ""
-
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
-msgstr ""
-
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
-msgstr ""
-
-#: lib/rpmlead.c:123
-#, c-format
-msgid "read failed: %s (%d)\n"
-msgstr ""
-
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
-msgstr ""
-
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
-msgstr ""
-
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
-msgstr ""
-
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
-msgstr ""
-
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
-msgstr ""
-
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr ""
-
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
-msgstr ""
-
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
-#: lib/rpmprob.c:109
-msgid "different"
-msgstr ""
-
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
-msgstr ""
-
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
-msgstr ""
-
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
-msgstr ""
-
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
-msgstr ""
-
-#: lib/rpmprob.c:130
-#, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
-msgstr ""
-
-#: lib/rpmprob.c:135
-#, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
-msgstr ""
-
-#: lib/rpmprob.c:140
-#, c-format
-msgid "package %s (which is newer than %s) is already installed"
-msgstr ""
-
-#: lib/rpmprob.c:145
-#, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
-msgstr ""
-
-#: lib/rpmprob.c:155
-#, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
-msgstr ""
-
-#: lib/rpmprob.c:159
-#, c-format
-msgid "%s is needed by %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
-msgstr ""
-
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
-msgstr ""
-
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
-msgstr ""
-
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr ""
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:494
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:511 lib/rpmrc.c:543
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:522
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr ""
-
-#: lib/rpmrc.c:535
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:602
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:926
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1348
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Please contact %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1590
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr ""
-
-#: lib/rpmts.c:192
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:210
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:218
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:278
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1085
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr ""
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1409
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1409
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr ""
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr ""
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr ""
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr ""
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr ""
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr ""
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr ""
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr ""
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr ""
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr ""
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr ""
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr ""
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ""
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr ""
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr ""
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr ""
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr ""
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr ""
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr ""
-
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr ""
-
-#: lib/rpmdb.c:2250
-#, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr ""
-
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr ""
-
-#: lib/rpmdb.c:2382
-#, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr ""
-
-#: lib/rpmdb.c:2448
-#, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr ""
-
-#: lib/rpmdb.c:2644
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr ""
-
-#: lib/rpmdb.c:2875
-#, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:2910
-#, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr ""
-
-#: lib/rpmdb.c:2924
-#, c-format
-msgid "cannot add record originally at %u\n"
-msgstr ""
-
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr ""
-
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr ""
-
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr ""
-
-#: lib/rpmdb.c:2960
-#, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr ""
-
-#: lib/backend/db3.c:33
-#, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr ""
-
-#: lib/backend/db3.c:36
-#, c-format
-msgid "db%d error(%d): %s\n"
-msgstr ""
-
-#: lib/backend/db3.c:500
-#, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr ""
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr ""
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr ""
-
-#: lib/backend/db3.c:582
-#, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:144
-#, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:181
-#, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:190
-#, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr ""
-
-#: lib/backend/dbconfig.c:199
-#, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr ""
-
-#: plugins/sepolicy.c:218
-#, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:231
-#, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr ""
-
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr ""
-
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr ""
-
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr ""
-
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
-msgstr ""
-
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
-#, c-format
-msgid "%s failed with exit code %i\n"
-msgstr ""
-
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr ""
-
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr ""
-
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
-
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
-
-#: plugins/sepolicy.c:594
-#, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr ""
-
-#: rpmio/macro.c:185
-#, c-format
-msgid "======================== active %d empty %d\n"
-msgstr ""
-
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
-msgstr ""
-
-#: rpmio/macro.c:364
-#, c-format
-msgid "%3d<%*s(empty)\n"
-msgstr ""
-
-#: rpmio/macro.c:537 rpmio/macro.c:575
-#, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr ""
-
-#: rpmio/macro.c:594
-#, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr ""
-
-#: rpmio/macro.c:600
-#, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr ""
-
-#: rpmio/macro.c:605
-#, c-format
-msgid "Macro %%%s has empty body\n"
-msgstr ""
-
-#: rpmio/macro.c:611
-#, c-format
-msgid "Macro %%%s failed to expand\n"
-msgstr ""
-
-#: rpmio/macro.c:649
-#, c-format
-msgid "Macro %%%s has illegal name (%%undefine)\n"
-msgstr ""
-
-#: rpmio/macro.c:743
-#, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr ""
-
-#: rpmio/macro.c:825
-#, c-format
-msgid "Unknown option %c in %s(%s)\n"
-msgstr ""
-
-#: rpmio/macro.c:1048
-msgid ""
-"Too many levels of recursion in macro expansion. It is likely caused by "
-"recursive macro declaration.\n"
-msgstr ""
-
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
-#, c-format
-msgid "Unterminated %c: %s\n"
-msgstr ""
-
-#: rpmio/macro.c:1175
-#, c-format
-msgid "A %% is followed by an unparseable macro\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:245
-#, c-format
-msgid "error creating temporary file %s: %m\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
-#, c-format
-msgid "File %s: %s\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:319
-#, c-format
-msgid "File %s is smaller than %u bytes\n"
-msgstr ""
-
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr ""
-
-#: rpmio/rpmlua.c:506
-#, c-format
-msgid "invalid syntax in lua scriptlet: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:522
-#, c-format
-msgid "invalid syntax in lua script: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
-#, c-format
-msgid "lua script failed: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:541
-#, c-format
-msgid "invalid syntax in lua file: %s\n"
-msgstr ""
-
-#: rpmio/rpmlua.c:709
-#, c-format
-msgid "lua hook failed: %s\n"
-msgstr ""
-
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr ""
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr ""
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr ""
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr ""
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr ""
-
-#: rpmio/rpmmalloc.c:25
-#, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr ""
-
-#: rpmio/rpmpgp.c:1008
-#, c-format
-msgid "V%d %s/%s %s, key ID %s"
-msgstr ""
-
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
-msgstr ""
-
-#: sign/rpmgensig.c:87
-#, c-format
-msgid "%s: Fwrite failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:97
-#, c-format
-msgid "%s: Fflush failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:125
-msgid "Unsupported PGP signature\n"
-msgstr ""
-
-#: sign/rpmgensig.c:131
-#, c-format
-msgid "Unsupported PGP hash algorithm %u\n"
-msgstr ""
-
-#: sign/rpmgensig.c:144
-#, c-format
-msgid "Unsupported PGP pubkey algorithm %u\n"
-msgstr ""
-
-#: sign/rpmgensig.c:174
-#, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr ""
-
-#: sign/rpmgensig.c:216
-#, c-format
-msgid "gpg exec failed (%d)\n"
-msgstr ""
-
-#: sign/rpmgensig.c:246
-msgid "gpg failed to write signature\n"
-msgstr ""
-
-#: sign/rpmgensig.c:263
-msgid "unable to read the signature\n"
-msgstr ""
-
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
-msgid "rpmMkTemp failed\n"
-msgstr ""
-
-#: sign/rpmgensig.c:501
-#, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr ""
-
-#: sign/rpmgensig.c:525
-#, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:531
-#, c-format
-msgid "%s: rpmWriteSignature failed: %s\n"
-msgstr ""
-
-#: sign/rpmgensig.c:545
-#, c-format
-msgid "replacing %s failed: %s\n"
-msgstr ""
-
-#: tools/rpmgraph.c:142
-#, c-format
-msgid "%s: read manifest failed: %s\n"
-msgstr ""
-
-#: tools/rpmgraph.c:220
-msgid "don't verify header+payload signature"
-msgstr ""
index 686824c0dcd975f14aa6fd1dee19f312a3eecab1..f56609cfd658d8ab8ce5f6bb9e2766741f8d504a 100644 (file)
--- a/po/id.po
+++ b/po/id.po
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR Free Software Foundation, Inc.
 # This file is distributed under the same license as the PACKAGE package.
-# 
+#
 # Translators:
+# Ibnu Daru Aji, 2015
+# Muhammad Panji <sumodirjo@gmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
-"Report-Msgid-Bugs-To: http://rpm.org/\n"
-"POT-Creation-Date: 2012-11-05 10:07+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Indonesian (http://www.transifex.com/projects/p/rpm/language/id/)\n"
+"Language-Team: Indonesian (http://www.transifex.com/rpm-team/rpm/language/"
+"id/)\n"
+"Language: id\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: id\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #: cliutils.c:21 lib/poptI.c:29
 #, c-format
 msgid "%s: %s\n"
-msgstr ""
+msgstr "%s: %s\n"
 
-#: cliutils.c:27 lib/poptALL.c:55
+#: cliutils.c:27 lib/poptALL.c:56
 #, c-format
 msgid "RPM version %s\n"
-msgstr ""
+msgstr "Versi RPM %s\n"
 
 #: cliutils.c:32
 #, c-format
 msgid "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
-msgstr ""
+msgstr "Hak Cipta (C) 1998-2002 - Red Hat, Inc\n"
 
 #: cliutils.c:33
 #, c-format
 msgid ""
 "This program may be freely redistributed under the terms of the GNU GPL\n"
 msgstr ""
+"Program ini bisa didistribusikan secara bebas menggunakan Lisensi GNU GPL\n"
 
 #: cliutils.c:53
 #, c-format
 msgid "creating a pipe for --pipe failed: %m\n"
-msgstr ""
+msgstr "pembuatan pipe untuk --pipe gagal: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
-msgstr ""
+msgstr "eksekusi gagal\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
-msgstr ""
+msgstr "argumen bukan merupakan paket RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
-msgstr ""
+msgstr "gagal membaca header paket\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
-msgstr ""
-
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr ""
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr ""
+msgstr "Tidak dapat membuka ulang payload: %s\n"
 
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr ""
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr ""
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr ""
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
+msgstr "buildroot sudah ditentukan, mengabaikan %s\n"
 
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
+"pembangunan pada %prep (membuka sumber dan penerapan tambalan) dari "
+"<specfile>"
 
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
+msgstr "<specfile>"
 
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr ""
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
+msgstr "pembangunan pada %build (%prep, lalu kompilasi) dari <specfile>"
 
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
+"pembangunan pada %install (%prep, %build, lalu pemasangan) dari <specfile>"
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
+msgstr "verifikasi %files dari <specfile>"
 
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr ""
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
+msgstr "membangun sumber dan paket binari dari <specfile>"
 
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr ""
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
+msgstr "membangun paket binari dari <specfile>"
 
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
+msgstr "membangun paket sumber dari <specfile>"
 
-#: rpmqv.c:174
+#: rpmbuild.c:161
+#, c-format
 msgid ""
-"--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<source package>"
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
 
-#: rpmqv.c:230
+#: rpmbuild.c:167 rpmbuild.c:208
 msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr ""
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr ""
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr ""
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr ""
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr ""
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr ""
-
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr ""
-
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
+"pembangunan pada %install (%prep, %build, lalu pemasangan) dari <source "
+"package>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:170
 #, c-format
-msgid "verify %files section from <specfile>"
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
+"pembangunan pada %prep (pembukaan berkas dan penerapan tambalan) dari "
+"<tarball>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
-msgstr ""
+msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
-msgstr ""
+msgstr "pembangunan pada %build (%prep, lalu kompilasi) dari <tarball>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
+"pembangunan pada %install (%prep, %build, lalu pemasangan) dari %tarball"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
-msgstr ""
+msgstr "verifikasi bagian %files dari <tarball>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
-msgstr ""
+msgstr "pembangunan paket sumber dan binari dari <tarball>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
-msgstr ""
+msgstr "pembangunan paket binari saja dari <tarball>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
-msgstr ""
+msgstr "pembangunan paket sumber saja dari <tarball>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
-msgstr ""
-
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr ""
+msgstr "pembangunan paket binari dari <source package>"
 
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
+msgstr "kesampingkan build root"
+
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
 
-#: rpmbuild.c:173
+#: rpmbuild.c:216
 msgid "remove build tree when done"
-msgstr ""
+msgstr "hapus build tree ketika selesai"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
-msgstr ""
+msgstr "abaikan ExcludeArch: arahan dari berkas spec"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr ""
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr ""
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr ""
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr ""
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr ""
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr ""
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Opsi umum untuk semua mode rpm dan eksekutabel:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr ""
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr ""
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr ""
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr ""
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr ""
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr ""
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr ""
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "argumen untuk --root (-r) harus diawali dengan /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr ""
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr ""
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr ""
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "hanya satu mode utama yang bisa ditentukan"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Opsi seleksi kueri/Verifikasi paket:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Opsi Kueri (dengan -q atau --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Opsi verifikasi (dengan -V atau --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Opsi Pemasangan/Pemutakhiran/Penghapusan:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "hanya satu tipe kueri/verifikasi yang bisa dilakukan dalam satu waktu"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "penanda kueri tak sesuai dengan yang diharapkan"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "format kueri tak sesuai dengan yang diharapkan"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "sumber kueri tak sesuai dengan yang diharapkan"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "hanya pemasangan dan pemutakhiran yang bisa dipaksakan"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "berkas mungkin sudah dipindahkan saat pemasangan paket"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "tidak dapat menggunakan --prefix dengan --relocate atau --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate dan --excludepath hanya bisa digunakan ketika pemasangan paket "
+"baru"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix hany abisa digunakan ketika pemasangan paket baru"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "argumen untuk --prefix harus dimulai dengan /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+"--hash (-h) hanya bisa ditentukan saat pemasangan atau penghapusan paket"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr "--percent hanya bisa ditentukan saat pemasangan paket atau penghapusan"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs hanya bisa ditentukan saat pemasangan paket"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs hanya bisa ditentukan saat pemasangan paket"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs hanya bisa ditentukan saat pemasangan paket"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "hanya satu dari --excludedocs dan --includedocs yang bisa digunakan"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch hanya bisa ditentukan saat pemasangan paket"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos hanya bisa ditentukan saat pemasangan paket"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize hanya bisa ditentukan saat pemasangan paket"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches hanya bisa ditentukan saat penghapusan paket"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles hanya bisa ditentukan saat pemasangan paket"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb hanya bisa ditentukan saat pemasangan dan penghapusan paket"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"opsi penonaktifan skrip hanya bisa ditentukan saat pemasangan dan "
+"penghapusan paket"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"opsi penonaktifan pemicu hanya bisa ditentukan saat pemasangan dan "
+"penghapusan paket"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps hanya bisa ditentukan saat pemasangan, penghapusan, dan verifikasi "
+"paket"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr "--test hanya bisa ditentukan saat pemasangan dan penghapusan paket"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "tak ada paket yang dihapus"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "tidak ada paket yang dipasang"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "tidak ada argumen untuk kueri"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "tidak ada argumen untuk verifikasi"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr ""
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
+#: rpmsign.c:37
+msgid "sign package(s) files"
 msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
+#: rpmsign.c:39
+msgid "use file signing key <key>"
 msgstr ""
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
+#: rpmsign.c:40
+msgid "<key>"
 msgstr ""
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
 msgstr ""
 
-#: rpmsign.c:117
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr ""
+
+#: rpmsign.c:101
 #, c-format
-msgid "Pass phrase is good.\n"
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr ""
 
-#: rpmsign.c:123
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:189
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr ""
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -533,473 +615,546 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr ""
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr ""
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr ""
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
 "RPM build errors:\n"
 msgstr ""
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr ""
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr ""
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr ""
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr ""
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr ""
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr ""
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr ""
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr ""
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr ""
 
-#: build/files.c:327 build/files.c:496 build/files.c:710
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr ""
 
-#: build/files.c:337 build/files.c:632 build/files.c:720 build/files.c:779
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr ""
 
-#: build/files.c:362 build/files.c:651
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr ""
 
-#: build/files.c:465
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:511
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:547
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:556
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:568
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:672
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:679
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:794
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:804
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:853
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:974
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1002
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr ""
 
-#: build/files.c:1124
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1132
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr ""
 
 #: build/files.c:1346
 #, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
+#, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1347
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr ""
 
-#: build/files.c:1538
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1544
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1548
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1557
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1602
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1626
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1639
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1640 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1676
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1683
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr ""
 
-#: build/files.c:1690
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1712
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1866
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1883
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2011
-#, c-format
-msgid "Bad file: %s: %s\n"
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2036 build/parsePrep.c:33
+#: build/files.c:2657
 #, c-format
-msgid "Bad owner/group: %s\n"
+msgid "Bad file: %s: %s\n"
 msgstr ""
 
-#: build/files.c:2070
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2083
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2114
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2127
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2133
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
 msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
 msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr ""
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr ""
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:434
 #, c-format
-msgid "Could not open %s: %s\n"
+msgid "Failed to read %jd bytes in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:452
-#, c-format
-msgid "Unable to write package: %s\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:468
+#: build/pack.c:453
 #, c-format
-msgid "Unable to open sigtarget %s: %s\n"
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:479
+#: build/pack.c:520
 #, c-format
-msgid "Unable to read header from %s: %s\n"
+msgid "Could not open %s: %s\n"
 msgstr ""
 
-#: build/pack.c:489
+#: build/pack.c:527
 #, c-format
-msgid "Unable to write header to %s: %s\n"
+msgid "Unable to write package: %s\n"
 msgstr ""
 
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr ""
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr ""
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr ""
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
+#: build/parseFiles.c:33
 #, c-format
-msgid "line %d: Second description\n"
+msgid "line %d: Error parsing %%files: %s\n"
 msgstr ""
 
-#: build/parseFiles.c:33
+#: build/parseFiles.c:73
 #, c-format
-msgid "line %d: Error parsing %%files: %s\n"
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
@@ -1007,341 +1162,410 @@ msgstr ""
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr ""
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr ""
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
+#, c-format
+msgid "%s:%d: malformed %%include statement\n"
+msgstr ""
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
 #, c-format
-msgid "%s:%d: malformed %%include statement\n"
+msgid "line %d doesn't belong to any section: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr ""
@@ -1412,442 +1636,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr ""
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
 msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
 msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
 msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:810
+msgid "shared"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
+#: lib/backend/db3.c:810
+msgid "exclusive"
 msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
 msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:348
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:349
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr ""
 
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
+#: lib/formats.c:44
+msgid "(not a string)"
 msgstr ""
 
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
 msgstr ""
 
-#: lib/formats.c:314
-msgid "(not base64)"
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
+#: lib/formats.c:253
+msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr ""
+
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
+msgid "unknown tag: \"%s\""
 msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr ""
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr ""
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr ""
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr ""
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
 msgstr ""
 
-#: lib/package.c:629 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr ""
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr ""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr ""
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
 msgstr ""
 
-#: lib/poptALL.c:157
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:158 lib/poptALL.c:161
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:160
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:163
+#: lib/poptALL.c:194
+msgid "undefine MACRO"
+msgstr ""
+
+#: lib/poptALL.c:195
+msgid "MACRO"
+msgstr ""
+
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:166 lib/poptALL.c:180
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:167 lib/poptALL.c:181
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:172
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:177
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:178
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:183
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:186
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:190
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr ""
 
-#: lib/poptALL.c:192
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr ""
 
-#: lib/poptALL.c:198
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr ""
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:210
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:277
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1868,524 +2211,576 @@ msgstr ""
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: lib/poptI.c:114
-msgid ""
-"install all files, even configurations which might otherwise be skipped"
+#: lib/poptI.c:118
+msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
-"remove all packages which match <package> (normally an error is generated if"
-" <package> specified multiple packages)"
+"remove all packages which match <package> (normally an error is generated if "
+"<package> specified multiple packages)"
 msgstr ""
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr ""
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr ""
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr ""
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr ""
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr ""
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr ""
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr ""
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: lib/poptI.c:179 lib/poptQV.c:204 lib/poptQV.c:206
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr ""
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr ""
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr ""
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr ""
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr ""
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr ""
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr ""
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr ""
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr ""
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:171
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr ""
 
-#: lib/poptQV.c:173
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/poptQV.c:175
+#: lib/poptQV.c:197
+msgid "list all license files"
+msgstr ""
+
+#: lib/poptQV.c:199
+msgid "list all artifact files"
+msgstr ""
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:179
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr ""
 
-#: lib/poptQV.c:184
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:191
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/poptQV.c:209
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr ""
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr ""
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr ""
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr ""
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:224 lib/poptQV.c:227
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr ""
 
-#: lib/poptQV.c:230
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:233
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:235
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr ""
 
-#: lib/poptQV.c:237 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr ""
 
-#: lib/poptQV.c:240 lib/poptQV.c:243
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr ""
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr ""
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:156
+#: lib/query.c:161
 msgid "normal        "
 msgstr ""
 
-#: lib/query.c:159
+#: lib/query.c:164
 msgid "replaced      "
 msgstr ""
 
-#: lib/query.c:162
+#: lib/query.c:167
 msgid "not installed "
 msgstr ""
 
-#: lib/query.c:165
+#: lib/query.c:170
 msgid "net shared    "
 msgstr ""
 
-#: lib/query.c:168
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:171
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr ""
 
-#: lib/query.c:174
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr ""
 
-#: lib/query.c:194
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:225
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 
-#: lib/query.c:314
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr ""
 
-#: lib/query.c:321
+#: lib/query.c:328
+#, c-format
+msgid "no package triggers %s\n"
+msgstr ""
+
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
+#, c-format
+msgid "malformed %s: %s\n"
+msgstr ""
+
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
+#, c-format
+msgid "no package matches %s: %s\n"
+msgstr ""
+
+#: lib/query.c:387
+#, c-format
+msgid "no package requires %s\n"
+msgstr ""
+
+#: lib/query.c:394
 #, c-format
-msgid "no package triggers %s\n"
+msgid "no package recommends %s\n"
 msgstr ""
 
-#: lib/query.c:332 lib/query.c:351 lib/query.c:367
+#: lib/query.c:401
 #, c-format
-msgid "malformed %s: %s\n"
+msgid "no package suggests %s\n"
 msgstr ""
 
-#: lib/query.c:342 lib/query.c:357 lib/query.c:372
+#: lib/query.c:408
 #, c-format
-msgid "no package matches %s: %s\n"
+msgid "no package supplements %s\n"
 msgstr ""
 
-#: lib/query.c:380
+#: lib/query.c:415
 #, c-format
-msgid "no package requires %s\n"
+msgid "no package enhances %s\n"
 msgstr ""
 
-#: lib/query.c:388
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr ""
 
-#: lib/query.c:420
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr ""
 
-#: lib/query.c:423
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr ""
 
-#: lib/query.c:434
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr ""
 
-#: lib/query.c:441
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:454 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr ""
 
-#: lib/query.c:488
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "OK"
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ""
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
 msgstr ""
 
-#: lib/rpmchecksig.c:393
-msgid ")"
+#: lib/rpmchecksig.c:268
+msgid "OK"
 msgstr ""
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr ""
@@ -2410,1075 +2805,1141 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr ""
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr ""
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr ""
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr ""
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr ""
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr ""
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr ""
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr ""
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
 msgstr ""
 
-#: lib/rpmds.c:961
+#: lib/rpmds.c:1249
 msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmds.c:964
+#: lib/rpmds.c:1252
 msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpmds.c:967
+#: lib/rpmds.c:1255
 msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpmds.c:971
+#: lib/rpmds.c:1259
 msgid "internal support for lua scripts."
 msgstr ""
 
-#: lib/rpmds.c:975
+#: lib/rpmds.c:1263
 msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmds.c:979
+#: lib/rpmds.c:1267
 msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmds.c:983
+#: lib/rpmds.c:1271
 msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmds.c:986
+#: lib/rpmds.c:1274
 msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmgi.c:136
-#, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpminstall.c:141
-#, c-format
-msgid "Updating / installing...\n"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpmds.c:1410
 #, c-format
-msgid "Cleaning up / removing...\n"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpmds.c:1544
 #, c-format
-msgid "package %s is not relocatable\n"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpminstall.c:706
+#: lib/rpmfi.c:810
 #, c-format
-msgid "Installing %s\n"
-msgstr ""
-
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmlead.c:123
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "read failed: %s (%d)\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
 msgstr ""
 
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
 msgstr ""
 
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
 msgstr ""
 
-#: lib/rpmprob.c:109
-msgid "different"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
+#: lib/rpmfi.c:2389
+msgid " failed - "
 msgstr ""
 
-#: lib/rpmprob.c:122
+#: lib/rpmfi.c:2392
 #, c-format
-msgid "package %s is already installed"
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmprob.c:125
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "path %s in package %s is not relocatable"
+msgid "open of %s failed: %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:130
+#: lib/rpmgi.c:144
 #, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:135
+#: lib/rpmgi.c:155
 #, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmprob.c:140
+#: lib/rpminstall.c:142
 #, c-format
-msgid "package %s (which is newer than %s) is already installed"
+msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpmprob.c:145
+#: lib/rpminstall.c:144
 #, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpmprob.c:155
-#, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+#: lib/rpminstall.c:193
+msgid "Preparing..."
 msgstr ""
 
-#: lib/rpmprob.c:159
-#, c-format
-msgid "%s is needed by %s%s"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpmprob.c:163
+#: lib/rpminstall.c:323
 #, c-format
-msgid "%s conflicts with %s%s"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:167
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "%s is obsoleted by %s%s"
+msgid "%s cannot be installed\n"
 msgstr ""
 
-#: lib/rpmprob.c:172
+#: lib/rpminstall.c:490
 #, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+msgid "Retrieving %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:194
+#: lib/rpminstall.c:502
 #, c-format
-msgid "missing second ':' at %s:%d\n"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpmrc.c:197
+#: lib/rpminstall.c:572
 #, c-format
-msgid "missing architecture name at %s:%d\n"
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpmrc.c:342
+#: lib/rpminstall.c:603
 #, c-format
-msgid "Incomplete data line at %s:%d\n"
+msgid "error reading from file %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:347
+#: lib/rpminstall.c:697
 #, c-format
-msgid "Too many args in data line at %s:%d\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpmrc.c:354
+#: lib/rpminstall.c:736
 #, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:385
+#: lib/rpminstall.c:742
 #, c-format
-msgid "Incomplete default line at %s:%d\n"
+msgid "Installing %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
 msgstr ""
 
-#: lib/rpmrc.c:494
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/rpmrc.c:511 lib/rpmrc.c:543
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/rpmrc.c:522
+#: lib/rpmlead.c:118
 #, c-format
-msgid "cannot open %s at %s:%d: %m\n"
+msgid "read failed: %s (%d)\n"
 msgstr ""
 
-#: lib/rpmrc.c:535
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/rpmrc.c:602
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
-msgid "bad option '%s' at %s:%d\n"
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmrc.c:926
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+#: lib/rpmlock.c:133
+#, c-format
+msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:1348
+#: lib/rpmplugins.c:65
 #, c-format
-msgid "Unknown system: %s\n"
+msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:1349
+#: lib/rpmplugins.c:73
 #, c-format
-msgid "Please contact %s\n"
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:1590
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Unable to open %s for reading: %m.\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmscript.c:75
+#: lib/rpmplugins.c:199
 #, c-format
-msgid "Unable to restore current directory: %m"
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
+#: lib/rpmprob.c:109
+msgid "different"
 msgstr ""
 
-#: lib/rpmscript.c:221
+#: lib/rpmprob.c:114
 #, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/rpmscript.c:248
+#: lib/rpmprob.c:118
 #, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/rpmscript.c:272
+#: lib/rpmprob.c:122
 #, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgid "package %s is already installed"
 msgstr ""
 
-#: lib/rpmscript.c:276
+#: lib/rpmprob.c:125
 #, c-format
-msgid "%s scriptlet failed, signal %d\n"
+msgid "path %s in package %s is not relocatable"
 msgstr ""
 
-#: lib/rpmscript.c:279
+#: lib/rpmprob.c:130
 #, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/rpmts.c:92
+#: lib/rpmprob.c:135
 #, c-format
-msgid "cannot open Packages database in %s\n"
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/rpmts.c:192
+#: lib/rpmprob.c:140
 #, c-format
-msgid "extra '(' in package label: %s\n"
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/rpmts.c:210
+#: lib/rpmprob.c:145
 #, c-format
-msgid "missing '(' in package label: %s\n"
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/rpmts.c:218
+#: lib/rpmprob.c:155
 #, c-format
-msgid "missing ')' in package label: %s\n"
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/rpmts.c:278
+#: lib/rpmprob.c:159
 #, c-format
-msgid "%s: reading of public key failed.\n"
+msgid "%s is needed by %s%s"
 msgstr ""
 
-#: lib/rpmts.c:1085
-msgid "transaction"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
 msgstr ""
 
-#: lib/signature.c:90
+#: lib/rpmprob.c:163
 #, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/signature.c:101
+#: lib/rpmprob.c:167
 #, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
+msgid "%s is obsoleted by %s%s"
 msgstr ""
 
-#: lib/signature.c:107
+#: lib/rpmprob.c:172
 #, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 
-#: lib/signature.c:123
+#: lib/rpmrc.c:222
 #, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
+msgid "missing second ':' at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:196
+#: lib/rpmrc.c:225
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "missing architecture name at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
+#: lib/rpmrc.c:370
+#, c-format
+msgid "Incomplete data line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:219
+#: lib/rpmrc.c:375
 #, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+msgid "Too many args in data line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpmrc.c:382
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr ""
 
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmrc.c:413
+#, c-format
+msgid "Incomplete default line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:489
-msgid "Header "
+#: lib/rpmrc.c:551
+#, c-format
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/signature.c:530
+#: lib/rpmrc.c:564
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
+msgid "missing architecture for %s at %s:%d\n"
 msgstr ""
 
-#: lib/transaction.c:1409
-msgid "skipped"
+#: lib/rpmrc.c:632
+#, c-format
+msgid "bad option '%s' at %s:%d\n"
 msgstr ""
 
-#: lib/transaction.c:1409
-msgid "failed"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/verify.c:372
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "missing   %c %s"
+msgid "Unknown system: %s\n"
 msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:342
-msgid "missing { after %"
+#: lib/rpmrc.c:1604
+#, c-format
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/headerfmt.c:375
-msgid "empty tag format"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/headerfmt.c:386
-msgid "empty tag name"
+#: lib/rpmscript.c:138
+#, c-format
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/headerfmt.c:393
-msgid "unknown tag"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
+#: lib/rpmscript.c:278
+#, c-format
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
+#: lib/rpmscript.c:313
+#, c-format
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:435
-msgid "unexpected }"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
 msgstr ""
 
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
+#: lib/rpmscript.c:371
+#, c-format
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
+#: lib/rpmscript.c:375
+#, c-format
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
+#: lib/rpmscript.c:378
+#, c-format
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
 msgstr ""
 
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
 
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
+#: lib/rpmte.c:730
+msgid "erase"
 msgstr ""
 
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
+#: lib/rpmts.c:100
+#, c-format
+msgid "cannot open Packages database in %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:97
+#: lib/rpmts.c:199
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:191
+#: lib/rpmts.c:217
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:516
+#: lib/rpmts.c:225
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmvs.c:152
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmvs.c:158
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmvs.c:188
+#, c-format
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmvs.c:195
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmvs.c:206
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmvs.c:261
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmvs.c:268
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
+msgid "%s%s"
 msgstr ""
 
-#: lib/rpmdb.c:2448
-#, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: lib/rpmdb.c:2644
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
 msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: lib/rpmdb.c:2875
-#, c-format
-msgid "failed to create directory %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/verify.c:263
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/verify.c:284
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/verify.c:448
 #, c-format
-msgid "replace files in %s with files from %s to recover"
+msgid "missing   %c %s"
 msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/verify.c:503
 #, c-format
-msgid "failed to remove directory %s: %s\n"
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: lib/backend/db3.c:33
+#: plugins/prioreset.c:29
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: lib/backend/db3.c:36
+#: plugins/prioreset.c:40
 #, c-format
-msgid "db%d error(%d): %s\n"
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
 
-#: lib/backend/db3.c:500
-#, c-format
-msgid "cannot get %s lock on %s/%s\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
+#: rpmio/digest_nss.c:79
+#, c-format
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
+#: rpmio/macro.c:286
+#, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr ""
 
-#: lib/backend/db3.c:582
+#: rpmio/macro.c:316
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%3d<%*s(empty)\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: rpmio/macro.c:483
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: rpmio/macro.c:551
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: rpmio/macro.c:557
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: rpmio/macro.c:562
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "Macro %%%s needs whitespace before body\n"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: rpmio/macro.c:566
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "Macro %%%s failed to expand\n"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: rpmio/macro.c:607
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: rpmio/macro.c:637
+#, c-format
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: rpmio/macro.c:761
+#, c-format
+msgid "Unknown option %c in %s(%s)\n"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: rpmio/macro.c:1055
+msgid ""
+"Too many levels of recursion in macro expansion. It is likely caused by "
+"recursive macro declaration.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:337
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:386
+#: rpmio/macro.c:1182
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: rpmio/macro.c:1197
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "failed to load macro file %s"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: rpmio/macro.c:1578
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "======================== active %d empty %d\n"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: rpmio/rpmfileutil.c:258
 #, c-format
-msgid "Failed to execute %s: %s\n"
+msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "File %s: %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: rpmio/rpmfileutil.c:332
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: rpmio/rpmlog.c:194
+msgid "error: "
 msgstr ""
 
-#: plugins/sepolicy.c:594
-#, c-format
-msgid "Failed to extract policy from %s\n"
+#: rpmio/rpmlog.c:195
+msgid "warning: "
 msgstr ""
 
-#: rpmio/macro.c:185
+#: rpmio/rpmlua.c:523
 #, c-format
-msgid "======================== active %d empty %d\n"
+msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/rpmlua.c:541
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:364
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
-msgid "%3d<%*s(empty)\n"
+msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/rpmlua.c:560
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/rpmlua.c:756
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/rpmmalloc.c:25
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
 #, c-format
-msgid "Macro %%%s has empty body\n"
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/rpmpgp.c:1127
 #, c-format
-msgid "Macro %%%s failed to expand\n"
+msgid "V%d %s/%s %s, key ID %s"
 msgstr ""
 
-#: rpmio/macro.c:649
-#, c-format
-msgid "Macro %%%s has illegal name (%%undefine)\n"
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/rpmsq.c:37
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "exiting on signal %d from pid %d\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: sign/rpmgensig.c:54
 #, c-format
-msgid "Unknown option %c in %s(%s)\n"
+msgid "error creating temp directory %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1048
-msgid ""
-"Too many levels of recursion in macro expansion. It is likely caused by "
-"recursive macro declaration.\n"
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "Unterminated %c: %s\n"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: sign/rpmgensig.c:91
 #, c-format
-msgid "A %% is followed by an unparseable macro\n"
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: sign/rpmgensig.c:167
 #, c-format
-msgid "error creating temporary file %s: %m\n"
+msgid "%s: Fwrite failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: sign/rpmgensig.c:173
 #, c-format
-msgid "File %s: %s\n"
+msgid "%s: Fread failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:319
+#: sign/rpmgensig.c:177
 #, c-format
-msgid "File %s is smaller than %u bytes\n"
+msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: sign/rpmgensig.c:202
+msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: sign/rpmgensig.c:208
 #, c-format
-msgid "invalid syntax in lua scriptlet: %s\n"
+msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: sign/rpmgensig.c:221
 #, c-format
-msgid "invalid syntax in lua script: %s\n"
+msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "lua script failed: %s\n"
+msgid "Could not exec %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
-#, c-format
-msgid "invalid syntax in lua file: %s\n"
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "lua hook failed: %s\n"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: sign/rpmgensig.c:312
+#, c-format
+msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
+#: sign/rpmgensig.c:354
+msgid "gpg failed to write signature\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
+#: sign/rpmgensig.c:371
+msgid "unable to read the signature\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
 msgstr ""
 
-#: rpmio/rpmmalloc.c:25
-#, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1008
-#, c-format
-msgid "V%d %s/%s %s, key ID %s"
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
+msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
-#, c-format
-msgid "%s: Fwrite failed: %s\n"
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s: Fflush failed: %s\n"
+msgid "%s already contains identical file signatures\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
-msgid "Unsupported PGP signature\n"
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "Unsupported PGP hash algorithm %u\n"
+msgid "%s: rpmReadSignature failed: %s"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:689
 #, c-format
-msgid "Unsupported PGP pubkey algorithm %u\n"
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:722
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "%s already contains identical signature, skipping\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
-msgid "gpg exec failed (%d)\n"
+msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
-msgid "gpg failed to write signature\n"
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:263
-msgid "unable to read the signature\n"
+#: sign/rpmgensig.c:812
+#, c-format
+msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
-msgid "rpmMkTemp failed\n"
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
-#, c-format
-msgid "%s already contains identical signature, skipping\n"
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
 msgstr ""
 
-#: sign/rpmgensig.c:525
-#, c-format
-msgid "%s: writeLead failed: %s\n"
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:531
-#, c-format
-msgid "%s: rpmWriteSignature failed: %s\n"
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:545
-#, c-format
-msgid "replacing %s failed: %s\n"
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 31fb92acd2b233bea1744413fe64596cae8022f9..e848f62ef24d7335a4cf8beb532097602739ec2a 100644 (file)
--- a/po/is.po
+++ b/po/is.po
@@ -7,15 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Icelandic (http://www.transifex.com/rpm-team/rpm/language/"
+"is/)\n"
 "Language: is\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"
+"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n"
 
 #: cliutils.c:21 lib/poptI.c:29
 #, c-format
@@ -43,487 +44,549 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr ""
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr ""
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr ""
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr ""
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr ""
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr ""
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr ""
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr ""
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
+msgstr "buildroot þegar skilgreind, hunsa %s\n"
 
-#: rpmqv.c:131
-msgid "unexpected query source"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
 msgstr ""
 
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
 msgstr ""
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
 msgstr ""
 
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:170
+#: rpmbuild.c:161
+#, c-format
 msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
 msgstr ""
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
 
-#: rpmqv.c:230
+#: rpmbuild.c:167 rpmbuild.c:208
 msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr ""
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr ""
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr ""
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr ""
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr ""
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr "buildroot þegar skilgreind, hunsa %s\n"
-
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr ""
-
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
 
-#: rpmbuild.c:129
+#: rpmbuild.c:170
 #, c-format
-msgid "verify %files section from <specfile>"
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr ""
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr ""
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr ""
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
+#: rpmbuild.c:212
+msgid "override build root"
 msgstr ""
 
-#: rpmbuild.c:171
-msgid "override build root"
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
 
-#: rpmbuild.c:173
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr ""
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr ""
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr ""
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr ""
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr ""
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr ""
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr ""
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr ""
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Get ekki opnað spec skrána %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Gat ekki opnað pípu í tar: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Gat ekki lesið spec skrá frá %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Gat ekki endurnefnt %s sem %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "gat ekki skoðað %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Skráin %s er ekki venjuleg skrá.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Skráin %s virðist ekki vera specskrá.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Þýði fyrir markkerfi: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Þýði fyrir markkerfi %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr ""
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr ""
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr ""
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr ""
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr ""
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr ""
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr ""
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr ""
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr ""
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr ""
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr ""
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr ""
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr ""
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr ""
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr ""
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr ""
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr ""
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr ""
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr ""
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr ""
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr ""
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr ""
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
+#: rpmsign.c:37
+msgid "sign package(s) files"
 msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
+#: rpmsign.c:39
+msgid "use file signing key <key>"
 msgstr ""
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
 msgstr ""
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
+#: rpmsign.c:49
+msgid "Signature options:"
 msgstr ""
 
-#: rpmsign.c:117
+#: rpmsign.c:101
 #, c-format
-msgid "Pass phrase is good.\n"
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr ""
 
-#: rpmsign.c:123
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr ""
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -532,473 +595,546 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr ""
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Gat ekki keyrt %s (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr ""
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
 "RPM build errors:\n"
 msgstr ""
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr ""
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr ""
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr ""
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr ""
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr ""
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr ""
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr ""
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr ""
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr ""
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "vantar '(' í  %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "vantar ')' í %s %s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Ógilt %s tákn: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Skráin er tvítekin: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr ""
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Skráin fannst ekki: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Skráin fannst ekki með 'glob': %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "lína: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Skráin fannst ekki með 'glob': %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Ógild skrá %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr ""
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Get ekki ritað innihald í %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Get ekki lesið innihald %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Get ekki opnað tempi skrá.\n"
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Gat ekki lesið spec skrá frá %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr ""
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Get ekki ritað í pakka: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Get ekki opnað sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Get ekki lesið haus úr %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Gat ekki ritað haus í %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Skrifaði: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr ""
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "lína %d: Óleyfilegur rofi %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr ""
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
+#: build/parseFiles.c:33
 #, c-format
-msgid "line %d: Second description\n"
+msgid "line %d: Error parsing %%files: %s\n"
 msgstr ""
 
-#: build/parseFiles.c:33
+#: build/parseFiles.c:73
 #, c-format
-msgid "line %d: Error parsing %%files: %s\n"
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
@@ -1006,341 +1142,410 @@ msgstr ""
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Get ekki opnað táknmynd %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Gat ekki lesið táknmynd %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Óþekkt tegund táknmyndar: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "lína %d: Tag tekur einungis eitt tákn: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "lína %d: Skemmt tag: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "lína %d: Tómt tag: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Slæmt ílag: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "lína %d: Ógilt viðfang við %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr ""
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "lína %d: Villa við þáttun %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr ""
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "lína %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Get ekki opnað %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr ""
@@ -1411,450 +1616,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Gat ekki keyrt %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Gat ekki búið til undirferli (fork) %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "gat ekki fundið %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
 msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
 msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr ""
+
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr ""
+
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr ""
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr ""
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "deildann"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "einka"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
 msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
 msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
 msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Harðar tengingar vantar"
-
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
 msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
 msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr ""
 
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
+#: lib/formats.c:44
+msgid "(not a string)"
 msgstr ""
 
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
 msgstr ""
 
-#: lib/formats.c:314
-msgid "(not base64)"
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
+#: lib/formats.c:253
+msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s vistað sem %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s búið til sem %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr ""
+
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
+msgid "unknown tag: \"%s\""
 msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr ""
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr ""
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr ""
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr ""
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr ""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr ""
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
 msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr ""
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "sýna endanlega rpmrc og stillingar fjölva"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr ""
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr ""
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "prenta útgáfunúmer rpm sem verið er að nota"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1875,527 +2191,576 @@ msgstr ""
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<pakkaskrá>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr ""
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr ""
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<pakkaskrá>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr ""
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr ""
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr ""
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr ""
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr ""
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<gömul>=<ný>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "uppfæra pakka"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr ""
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "fyrirspurn/yfirferð á pakkann sam á skrá"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr ""
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr ""
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "fyrirspurn/yfirferð á pakkana sem hafa pakkaþarfir"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "fyrirspurn/yfirferð á pakkana sem uppfylla þarfir annara pakka"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr ""
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/poptQV.c:176
+#: lib/poptQV.c:197
 msgid "list all license files"
 msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+msgid "list all artifact files"
+msgstr ""
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr ""
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "ekki yfirfara stærð skráa"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "ekki yfirfara symlink slóð skráa"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "ekki yfirfara eiganda skráa"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "ekki yfirfara hop skráa"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "ekki yfirfara heimildir skráa"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "ekki yfirfara skrárnar í pakkanum"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "ekki skoða pakkaskilyrðin"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "pakkinn inniheldur enga .spec skrá\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr ""
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr ""
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr ""
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr ""
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr ""
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr ""
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr ""
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr ""
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr ""
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr ""
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr ""
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr ""
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr ""
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr ""
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr ""
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr ""
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
-#, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:128
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "OK"
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ""
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
 msgstr ""
 
-#: lib/rpmchecksig.c:393
-msgid ")"
+#: lib/rpmchecksig.c:268
+msgid "OK"
 msgstr ""
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr ""
@@ -2415,1080 +2780,1146 @@ msgstr ""
 msgid "Unable to change root directory: %m\n"
 msgstr ""
 
-#: lib/rpmchroot.c:95
-#, c-format
-msgid "Unable to restore root directory: %m\n"
-msgstr ""
-
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr ""
-
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr ""
-
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr ""
-
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
-msgstr ""
-
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
-msgstr ""
-
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
-msgstr ""
-
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr ""
-
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr ""
-
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr ""
-
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr ""
-
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr ""
-
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr ""
-
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr ""
-
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmchroot.c:95
+#, c-format
+msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmdb.c:988
 #, c-format
-msgid "open of %s failed: %s\n"
+msgid "error(%d) storing record #%d into %s\n"
 msgstr ""
 
-#: lib/rpmgi.c:136
+#: lib/rpmdb.c:1100
 #, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+msgid "%s: regexec failed: %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpmdb.c:1281
 #, c-format
-msgid "Updating / installing...\n"
+msgid "%s: regcomp failed: %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
-#, c-format
-msgid "Cleaning up / removing...\n"
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
 msgstr ""
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
 msgstr ""
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpminstall.c:321
+#: lib/rpmdb.c:2415
 #, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
+msgid "could also not restore old database from %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
 #, c-format
-msgid "%s cannot be installed\n"
+msgid "replace files in %s with files from %s to recover\n"
 msgstr ""
 
-#: lib/rpminstall.c:464
+#: lib/rpmdb.c:2426
 #, c-format
-msgid "Retrieving %s\n"
+msgid "Could not get public keys from %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:476
+#: lib/rpmdb.c:2433
 #, c-format
-msgid "skipping %s - transfer failed\n"
+msgid "could not delete old database at %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:542
-#, c-format
-msgid "package %s is not relocatable\n"
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rpminstall.c:570
+#: lib/rpmdb.c:2520
 #, c-format
-msgid "error reading from file %s\n"
+msgid "failed to create directory %s: %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:661
+#: lib/rpmdb.c:2557
 #, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpminstall.c:700
+#: lib/rpmdb.c:2572
 #, c-format
-msgid "cannot open %s: %s\n"
+msgid "cannot add record originally at %u\n"
 msgstr ""
 
-#: lib/rpminstall.c:706
-#, c-format
-msgid "Installing %s\n"
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
 msgstr ""
 
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
 msgstr ""
 
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
+#: lib/rpmds.c:744
+msgid "NO "
 msgstr ""
 
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+#: lib/rpmds.c:744
+msgid "YES"
 msgstr ""
 
-#: lib/rpmlead.c:123
-#, c-format
-msgid "read failed: %s (%d)\n"
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
 msgstr ""
 
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmprob.c:109
-msgid "different"
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
 msgstr ""
 
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmprob.c:130
-#, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmprob.c:135
-#, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmprob.c:140
-#, c-format
-msgid "package %s (which is newer than %s) is already installed"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmprob.c:145
-#, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpmprob.c:155
-#, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpmprob.c:159
+#: lib/rpmds.c:1410
 #, c-format
-msgid "%s is needed by %s%s"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
-msgstr "vantar seinni ':' á %s:%d\n"
-
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpmrc.c:354
+#: lib/rpmds.c:1544
 #, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "viðfang vantar fyrir %s á %s:%d\n"
-
-#: lib/rpmrc.c:523
+#: lib/rpmfi.c:810
 #, c-format
-msgid "cannot open %s at %s:%d: %m\n"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:536
+#: lib/rpmfi.c:817
 #, c-format
-msgid "missing architecture for %s at %s:%d\n"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:603
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "ólöglegur rofi '%s' á %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmrc.c:1349
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "Unknown system: %s\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
 msgstr ""
 
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
 msgstr ""
 
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
 msgstr ""
 
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
 msgstr ""
 
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
 msgstr ""
 
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmtd.c:258
-msgid "Unknown format"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmte.c:868
-msgid "install"
+#: lib/rpmfi.c:2389
+msgid " failed - "
 msgstr ""
 
-#: lib/rpmte.c:869
-msgid "erase"
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmts.c:92
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "get ekki opnað pakka gagnagrunn í %s\n"
+msgid "open of %s failed: %s\n"
+msgstr ""
 
-#: lib/rpmts.c:191
+#: lib/rpmgi.c:144
 #, c-format
-msgid "extra '(' in package label: %s\n"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmts.c:209
+#: lib/rpmgi.c:155
 #, c-format
-msgid "missing '(' in package label: %s\n"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmts.c:217
+#: lib/rpminstall.c:142
 #, c-format
-msgid "missing ')' in package label: %s\n"
+msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpmts.c:273
+#: lib/rpminstall.c:144
 #, c-format
-msgid "%s: reading of public key failed.\n"
+msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpmts.c:1087
-msgid "transaction"
+#: lib/rpminstall.c:193
+msgid "Preparing..."
 msgstr ""
 
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
 msgstr ""
 
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/signature.c:101
+#: lib/rpminstall.c:323
 #, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/signature.c:107
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+msgid "%s cannot be installed\n"
 msgstr ""
 
-#: lib/signature.c:123
+#: lib/rpminstall.c:490
 #, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
+msgid "Retrieving %s\n"
 msgstr ""
 
-#: lib/signature.c:196
+#: lib/rpminstall.c:502
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
+#: lib/rpminstall.c:572
+#, c-format
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/signature.c:219
+#: lib/rpminstall.c:603
 #, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+msgid "error reading from file %s\n"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpminstall.c:697
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpminstall.c:736
+#, c-format
+msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+#: lib/rpminstall.c:742
+#, c-format
+msgid "Installing %s\n"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
 msgstr ""
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/signature.c:489
-msgid "Header "
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/signature.c:530
+#: lib/rpmlead.c:118
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
+msgid "read failed: %s (%d)\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "skipped"
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "failed"
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
+#, c-format
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/verify.c:372
+#: lib/rpmlock.c:133
 #, c-format
-msgid "missing   %c %s"
+msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmplugins.c:65
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
+msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:336
-msgid "invalid field width"
+#: lib/rpmplugins.c:73
+#, c-format
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:342
-msgid "missing { after %"
+#: lib/rpmplugins.c:154
+#, c-format
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
+#: lib/rpmplugins.c:199
+#, c-format
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/headerfmt.c:375
-msgid "empty tag format"
+#: lib/rpmprob.c:109
+msgid "different"
 msgstr ""
 
-#: lib/headerfmt.c:386
-msgid "empty tag name"
+#: lib/rpmprob.c:114
+#, c-format
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/headerfmt.c:393
-msgid "unknown tag"
+#: lib/rpmprob.c:118
+#, c-format
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
 msgstr ""
 
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
+#: lib/rpmprob.c:125
+#, c-format
+msgid "path %s in package %s is not relocatable"
+msgstr ""
+
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/headerfmt.c:435
-msgid "unexpected }"
+#: lib/rpmprob.c:135
+#, c-format
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
+#: lib/rpmprob.c:140
+#, c-format
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
+#: lib/rpmprob.c:145
+#, c-format
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
+#: lib/rpmprob.c:155
+#, c-format
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
 msgstr ""
 
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
 msgstr ""
 
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
+#: lib/rpmprob.c:163
+#, c-format
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
+#: lib/rpmprob.c:167
+#, c-format
+msgid "%s is obsoleted by %s%s"
 msgstr ""
 
-#: lib/rpmdb.c:97
+#: lib/rpmprob.c:172
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
+msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 
-#: lib/rpmdb.c:191
+#: lib/rpmrc.c:222
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "get ekki opnað %s index með db%d - %s (%d)\n"
+msgid "missing second ':' at %s:%d\n"
+msgstr "vantar seinni ':' á %s:%d\n"
 
-#: lib/rpmdb.c:516
+#: lib/rpmrc.c:225
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "missing architecture name at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
+#: lib/rpmrc.c:370
+#, c-format
+msgid "Incomplete data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmrc.c:375
+#, c-format
+msgid "Too many args in data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:382
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:413
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "Incomplete default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:418
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr ""
+msgid "missing argument for %s at %s:%d\n"
+msgstr "viðfang vantar fyrir %s á %s:%d\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "missing architecture for %s at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) removing header #%d record\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "ólöglegur rofi '%s' á %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
+msgid "Unknown system: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
+msgid "Unable to restore current directory: %m"
+msgstr ""
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
 msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
 msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
+#: lib/rpmte.c:730
+msgid "erase"
 msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr ""
+msgid "cannot open Packages database in %s\n"
+msgstr "get ekki opnað pakka gagnagrunn í %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "deildann"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "einka"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
+
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== virkt %d tómt %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(tómt)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(tómt)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr ""
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Óþekkt viðfang %c í %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== virkt %d tómt %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Skrá %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Skráin %s er minni en %u bæti\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(engin villa)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "banvæn villa: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "villa: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "aðvörun: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "minnisfrátekt (%u bæta) skilaði NULL.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(engin villa)"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "banvæn villa: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "villa: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "aðvörun: "
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "minnisfrátekt (%u bæta) skilaði NULL.\n"
+msgid "error creating fifo %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not exec %s: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
+#, c-format
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg get ekki lesið undirskriftina\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "get ekki lesið undirskriftina\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
 msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 9cc03362cfb119f22c897d55a189a4b842a85671..d52f1d98439deb546c019003ab0109074ef6354e 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -3,16 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Guido Grazioli <guido.grazioli@gmail.com>, 2011-2012.
+# Guido Grazioli <guido.grazioli@gmail.com>, 2011-2014
+# Luigi Toscano <luigi.toscano@tiscali.it>, 2016-2017
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Italian (http://www.transifex.com/projects/p/rpm/language/"
-"it/)\n"
+"Language-Team: Italian (http://www.transifex.com/rpm-team/rpm/language/it/)\n"
 "Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,527 +47,589 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "creazione di una pipe per --pipe fallita: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "exec fallito\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "l'argomento non è un pacchetto RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "errore durante la lettura dell'intestazione dal pacchetto\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "impossibile riaprire il payload: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Opzioni di selezione pacchetti per le operazioni Query/Verify:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Opzioni d'interrogazione (con -q o --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Opzioni di verifica (con -V o --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Opzioni Installa/Aggiorna/Rimuovi:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Opzioni comuni per tutte le modalità e gli eseguibili rpm:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "è possibile eseguire solo un tipo di interrogazione/verifica per volta"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "flag di interrogazione inaspettati"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "formato di interrogazione inaspettato"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "origine d'interrogazione inaspettata"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "è possibile specificare solo una modalità principale"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "è possibile forzare solo i processi di installazione e aggiornamento"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr ""
-"i file possono essere riposizionati solo durante l'installazione del "
-"pacchetto"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "impossibile usare --prefix con --relocate o --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate e --excludepath possono essere usati solo quando si installano "
-"nuovi pacchetti"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix può essere usato solo quando si installano nuovi pacchetti"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "gli argomenti per --prefix devono iniziare con /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-"--hash (-h) può essere usato solo per installazione o eliminazione di "
-"pacchetti"
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-"--percent può essere usato solo per installazione o eliminazione di pacchetti"
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-"--replacepkgs può essere specificato solo durante l'installazione del "
-"pacchetto"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-"--excludedocs può essere specificato solo durante l'installazione del "
-"pacchetto"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-"--includedocs può essere specificato solo durante l'installazione del "
-"pacchetto"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "è possibile specificare solo uno tra  --excludedocs e --includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-"--ignorearch può essere specificato solo durante l'installazione del "
-"pacchetto"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-"--ignoreos può essere specificato solo durante l'installazione del pacchetto"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-"--ignoresize può essere specificato solo durante l'installazione del "
-"pacchetto"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-"--allmatches può essere specificato solo durante la rimozione del pacchetto"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-"--allfiles può essere specificato solo durante l'installazione del pacchetto"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"--justdb può essere specificato solo durante l'installazione e la rimozione "
-"del pacchetto"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"le opzioni per la disabilitazione dello script possono essere specificate "
-"solo durante l'installazione e la rimozione del pacchetto"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"le opzioni di disabilitazione dell'attivazione possono essere specificate "
-"solo durante l'installazione e la rimozione del pacchetto"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-"--nodeps può essere specificato solamente per l'installazione, "
-"l'eliminazione e la verifica di pacchetti"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-"--test può essere specificato solamente per l'installazione e l'eliminazione "
-"di pacchetti"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "gli argomenti per --root (-r) devono iniziare con /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "non è stato specificato alcun pacchetto per la rimozione"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "non è stato specificato alcun pacchetto per l'installazione"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "non è stato specificato alcun argomento per l'interrogazione"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "non è stato specificato alcun argomento per la verifica"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot è già specificato, ignora %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "compila attraverso %prep (scompatta i sorgenti e applica le patch) da "
 "<specfile>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specfile>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "compila attraverso %build (%prep, e poi compila) da <specfile>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "compila attraverso %install (%prep, %build, e poi installa) da <specfile>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "verifica sezione %files da <specfile>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "compila i pacchetti binari e sorgente da <specfile>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "compila solo il pacchetto binario da <specfile>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "compila solo il pacchetto sorgente da <specfile>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<source package>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"compila attraverso %install (%prep, %build, poi installa) da <source package>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "compila attraverso %prep (scompatta i sorgenti ed applica le patch) da "
 "<tarball>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "compila attraverso %build (%prep, e poi compila) da <tarball>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "compila attraverso %install (%prep, %build, poi installa) da <tarball>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "verifica la sezione %files da <tarball>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "compila i pacchetti binari e sorgenti da <tarball>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "compila solo il pacchetto binario da <tarball>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "compila solo il pacchetto sorgente da <tarball>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "compila il pacchetto binario da <source package>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<source package>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"compila attraverso %install (%prep, %build, poi installa) da <source package>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "override della build root"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "rimuovere l'albero di compilazione quando terminato"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignora le direttive ExcludeArch: dal file spec"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "macchina a stati del file di debug"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "non eseguire alcuna fase del processo di compilazione"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "non verificare le dipendenze di compilazione"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr "genera pacchetti con intestazioni compatibili con rpm v3 (legacy)"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
-msgstr ""
+msgstr "non eseguire la fase %clean del processo di build"
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr "non eseguire la fase %prep del processo di build"
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
-msgstr ""
+msgstr "non eseguire la fase %check del processo di build"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "non accettare i msgtr di i18N da specfile"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "rimuovi i sorgenti quando terminato"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "rimuovi lo specfile quando terminato"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "salta direttamente alla fase specificata (solo per c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "override della piattaforma target"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "Opzioni di build con [ <specfile> | <tarball> | <source package> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Opzioni comuni per tutte le modalità e gli eseguibili rpm:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Dipendenze di build fallite:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Impossibile aprire il file spec %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Impossibile aprire tar pipe: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr "Trovato più di un file spec in %s\n"
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Impossibile leggere il file spec da %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Impossibile rinominare %s in %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "impossibile eseguire lo stat di %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Il file %s non è un file regolare.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Il file %s non sembra essere uno specfile.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Creazione piattaforme target in corso: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Creazione per il target %s in corso\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "gli argomenti per --root (-r) devono iniziare con /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "inizializza database"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "ricompila gli elenchi invertiti del database dalle intestazioni dei "
 "pacchetti installati"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "verifica dei file del database"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr "esporta database in una lista header su stdout"
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr "importa database da una lista di header su stdin"
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Opzioni del database:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "è possibile specificare solo una modalità principale"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "verifica firma(e) del pacchetto"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "importa una armored public key"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 "non importare realmente, riporta solo se l'operazione termina con successo "
 "oppure no"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "elenca le chiavi del keyring RPM"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Opzioni keyring:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "non è stato specificato alcun argomento"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Opzioni di selezione pacchetti per le operazioni Query/Verify:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Opzioni d'interrogazione (con -q o --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Opzioni di verifica (con -V o --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Opzioni Installa/Aggiorna/Rimuovi:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "è possibile eseguire solo un tipo di interrogazione/verifica per volta"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "flag di interrogazione inaspettati"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "formato di interrogazione inaspettato"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "origine d'interrogazione inaspettata"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "è possibile forzare solo i processi di installazione e aggiornamento"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr ""
+"i file possono essere riposizionati solo durante l'installazione del "
+"pacchetto"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "impossibile usare --prefix con --relocate o --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate e --excludepath possono essere usati solo quando si installano "
+"nuovi pacchetti"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix può essere usato solo quando si installano nuovi pacchetti"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "gli argomenti per --prefix devono iniziare con /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+"--hash (-h) può essere usato solo per installazione o eliminazione di "
+"pacchetti"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+"--percent può essere usato solo per installazione o eliminazione di pacchetti"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr ""
+"--replacepkgs può essere specificato solo durante l'installazione del "
+"pacchetto"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr ""
+"--excludedocs può essere specificato solo durante l'installazione del "
+"pacchetto"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr ""
+"--includedocs può essere specificato solo durante l'installazione del "
+"pacchetto"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "è possibile specificare solo uno tra  --excludedocs e --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr ""
+"--ignorearch può essere specificato solo durante l'installazione del "
+"pacchetto"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
+"--ignoreos può essere specificato solo durante l'installazione del pacchetto"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr ""
+"--ignoresize può essere specificato solo durante l'installazione del "
+"pacchetto"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+"--allmatches può essere specificato solo durante la rimozione del pacchetto"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
+"--allfiles può essere specificato solo durante l'installazione del pacchetto"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"--justdb può essere specificato solo durante l'installazione e la rimozione "
+"del pacchetto"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"le opzioni per la disabilitazione dello script possono essere specificate "
+"solo durante l'installazione e la rimozione del pacchetto"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"le opzioni di disabilitazione dell'attivazione possono essere specificate "
+"solo durante l'installazione e la rimozione del pacchetto"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps può essere specificato solamente per l'installazione, "
+"l'eliminazione e la verifica di pacchetti"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+"--test può essere specificato solamente per l'installazione e l'eliminazione "
+"di pacchetti"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "non è stato specificato alcun pacchetto per la rimozione"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "non è stato specificato alcun pacchetto per l'installazione"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "non è stato specificato alcun argomento per l'interrogazione"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "non è stato specificato alcun argomento per la verifica"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr "firma i pacchetti"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "firma pacchetto/i (identico a --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "cancella le firme del pacchetto"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Opzioni della firma:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Impossibile eseguire %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "È necessario impostare \"%%_gpg_name\" nel file macro\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Inserire la passphrase:"
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "La passphrase risulta valida.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr "Controllo della pass phrase fallito o chiave gpg scaduta\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr "parsa gli spec file sullo stdout"
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr "interroga file spec"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr "opera sugli rpm binari generati dal file spec (default)"
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr "opera sul file rpm sorgente generato dal file spec"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "usare il seguente formato di interrogazione"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "Opzioni specfile:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr "nessun argomento passato per il parsing"
 
@@ -576,32 +638,37 @@ msgstr "nessun argomento passato per il parsing"
 msgid "Unable to open temp file: %s\n"
 msgstr "Impossibile aprire il file temporaneo: %s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr "Impossibile aprire lo stream: %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Esecuzione(%s) in corso: %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Esecuzione di %s fallita (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr "Errore nell'esecuzione della scriptlet %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Stato d'uscita errato da %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -611,235 +678,317 @@ msgstr ""
 "\n"
 "Errori di compilazione RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "errore di sintassi durante il parsing di ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "errore di sintassi durante il parsing di &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "errore di sintassi durante il parsing di ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "errore durante il parsing dell'espressione\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "non corrispondente (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- solo sui numeri\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! solo sui numeri\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "i diversi tipi devono corrispondere\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / non supportato per le stringhe\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- non supportato per le stringhe\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& e || non supportati per le stringhe\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "errore di sintassi nell'espressione\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "'(' mancante in %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "')' mancante in %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Token %s non valido: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "%s mancante in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Caratteri non validi seguono %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Sintassi non corretta: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Spec della modalità errata: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Spec dirmode errata: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr "Lunghezza inconsueta del locale: \"%s\" in %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr "Locale duplicato: %s in %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Capability non valida: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
-msgstr "Supporto alle file capabilities non disponibile\n"
+msgstr "Supporto per capability dei file non disponibile\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Il file deve iniziare con \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "Algoritmo di digest %u sconosciuto, ritorno a MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "File elencato due volte: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "lettura del symlink %s fallita: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
-msgstr "Il Symlink punta alla BuildRoot: %s -> %s\n"
+msgstr "Il collegamento simbolico punta alla BuildRoot: %s -> %s\n"
+
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "Percorso esterno alla buildroot: %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "Directory non trovata: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "File non trovato: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Non è una directory: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: impossibile caricare tag sconosciuto (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: lettura chiave pubblica fallita.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: non è una chiave pubblica con formato 'armored'.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: errore durante l'encoding\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "impossibile creare la directory"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Il file deve essere preceduto da \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "glob %%dev non consentito: %s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "Directory non trovata per il glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "File non trovato dal glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Impossibile aprire %%files file %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "riga: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+"File %s vuoto nella sezione %%files\n"
+"\n"
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "Errore nella lettura del file %s in %%files: %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
+msgstr "_docdir_fmt %s non valido: %s\n"
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "File non trovato dal glob: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
-msgstr ""
+msgstr "Impossibile unire %s speciali con altre forme: %s\n"
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
+msgstr "Più di un file su una riga: %s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "File errato: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Proprietario/gruppo errato: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Controllo per file non pacchettizzati in corso: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -848,549 +997,610 @@ msgstr ""
 "Trovati file installati (ma non inclusi nel pacchetto):\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Elaborazione file: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
+"L'architettura dei binari (%d) non corrisponde a quella del pacchetto (%d).\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "Binari dipendenti dall'architettura presenti in un pacchetto noarch\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
-msgstr ""
+msgstr "creazione archivio fallita sul file %s: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
-msgstr ""
+msgstr "creazione archivio fallita: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "Impossibile aprire il file %s: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: linea: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Impossibile regolarizzare l'hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Impossibile salvare payload su %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Impossibile leggere payload da %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Impossibile regolarizzare l'hostname: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Compressione payload sconosciuta: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Impossibile creare una regione dell'intestazione immutabile.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Impossibile aprire il file temp.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr "Impossibile eseguire seek nel file %s: %s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Impossibile salvare intestazione di temp\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Impossibile leggere il file policy: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Dati CSA errati\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Impossibile ricaricare intestazione della firma.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Impossibile aprire %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Impossibile scrivere il pacchetto: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Impossibile aprire sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Impossibile leggere intestazione da %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Impossibile salvare intestazione su %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Scritto: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Esecuzione \"%s\":\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Esecuzione di \"%s\" fallita.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Controllo pacchetto \"%s\" fallito.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Impossibile generare nome del file di output per il pacchetto %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "impossibile creare %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "riga %d: secondo %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
-msgstr ""
+msgstr "data non valida in %%changelog: %s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "le voci %%changelog devono iniziare con *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "voce %%changelog incompleta\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "data errata in %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog non è in ordine cronologico decrescente\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "nome mancante in %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "nessuna descrizione in %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "linea %d: seconda sezione %%changelog\n"
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "riga %d: Errore durante il parsing di %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "riga  %d: Opzione %s errata: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "riga %d: Troppi nomi: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "riga %d: Pacchetto non esistente: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "riga %d: Seconda descrizione\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "riga %d: Errore nel parsing di %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr "riga %d: Errore nel parsing di %%policies: %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr "Impossibile eseguire il parsing del campo tag: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "riga %d: Numero errato: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "riga %d: Numero no%s errato: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "riga %d: Numero %s errato: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d specificato più volte\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "Scaricamento di %s su %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "Impossibile scaricare %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "L'architettura è esclusa: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "L'architettura non è inclusa: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS è escluso: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS non è incluso: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "il campo %s deve essere presente nel pacchetto: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Voci %s duplicate nel pacchetto: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Impossibile aprire l'icona %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Impossibile leggere l'icona %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Tipo di icona sconosciuto: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "riga %d: Il tag necessita di un solo token: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "riga %d: Carattere '%c' illegale in: %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr "linea %d: %s in: %s\n"
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "riga %d: Carattere illegale in: %s\n"
+msgid "%s in: %s\n"
+msgstr "%s in: %s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "riga %d: Sequenza \"..\" illegale in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr "Carattere non valido '%c' (0x%x)"
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr "Sequenza non valida \"..\""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "riga %d: Tag malformato: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "riga %d: Tag vuoto: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "riga %d: I prefissi non devono finire con \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "riga %d: Docdir deve iniziare con '/': %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "riga %d: Il tag Epoch deve essere un numero: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "riga %d: %s errati: qualificatori: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "riga %d: Formato BuildArchitecture errato: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "riga %d: Sono supportati solo sottopacchetti noarch: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
-msgstr "Errore interno: bogus tag %d\n"
+msgstr "Errore interno: tag incorretto %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "riga %d: %s è deprecato: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Specifiche errate del pacchetto: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Il pacchetto è già esistente: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "riga %d: Tag sconosciuto: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} non può essere vuota\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} non può essere \"/\"\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Sorgenti non validi: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Nessuna patch con numero %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch senza il corrispondente tag \"Patch:\"\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Nessun sorgente con numero %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "Nessun tag \"Source:\" nello spec file\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Errore nel parsing di %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "riga %d: Argomento errato su %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "riga %d: Opzione di %%setup errata %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Numero patch non valido %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "riga %d: secondo %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr "I token delle dipendenze devono iniziare per alfanumerico, '_' o '/'"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr "Nome file versionato non consentito"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "Versione richiesta"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "Dipendenza non valida"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "Versione richiesta"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr "Sono permessi solo percorsi assoluti nei trigger dei file"
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+"Un trigger attivato dallo stesso pacchetto è già definito nel file spec"
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr "linea %d: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "riga %d: i trigger devono presentare --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "riga %d: Errore nel parsing di %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "linea %d: uno script interno deve terminare con '>': %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "riga %d: il programma script deve iniziare con '/': %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "riga %d: Secondo %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "linea %d: script interno non supportato: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr "linea %d: argomenti dell'interprete non consentiti nei trigger: %s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "riga %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Impossibile aprire %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr "%s:%d: argomento necessario per %s\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
+"riga %d: %%if non bilanciato\n"
+"\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr "linea %d: macro non chiusa o errata continuazione linea\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr "%s:%d: condizione %%if errata\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: Trovato un %%else con nessun %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: Trovato un %%endif con nessun %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
+msgstr "%s: %d: istruzione %%include malformata\n"
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr "la codifica %s non è supportata dal sistema\n"
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr "Pacchetto %s: codifica %s non valida in %s: %s - %s\n"
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr ""
 "Non è stata trovata alcuna architettura compatibile per la compilazione\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Il pacchetto non possiede alcuna %%description: %s\n"
@@ -1463,451 +1673,562 @@ msgstr "Troppi argomenti alla linea: %s\n"
 msgid "Processing policies: %s\n"
 msgstr "Elaborazione policies: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "Viene ignorata la regex non valida %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Impossibile creare la pipe per %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Impossibile eseguire %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Impossibile biforcare %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s fallito: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "impossibile salvare tutti i dati su %s: %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Conversione di %s a long integer fallita.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr "File classifier vuoto\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "Non è configurato alcun attributo dei file\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) fallita: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load fallita: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Identificazione file \"%s\" fallita: modalità %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Ricerca di %s in corso: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Impossibile trovare %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 "interrogazione di specfile %s fallita, impossibile eseguire il parsing\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(errore 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s error(%d) da %s: %s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s error(%d): %s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Intestazione  errata/illeggibile"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "opzione db non riconosciuta: \"%s\" ignorata.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Dimensione intestazione troppo grande"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s presenta un valore numeric non valido, omesso\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr ""
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s presenta un valore long troppo grande o troppo piccolo, omesso\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Tipo di file sconosciuto"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s presenta un valore integer troppo grande o troppo piccolo, omesso\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Hardlink mancante(i)"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "impossibile ottenere il %s su %s/%s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Digest non corrispondente"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "condiviso"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Errore interno"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "esclusivo"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "File archive non è nell'intestazione"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "tipo indice %x non valido su %s/%s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " fallito - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "errore(%d) nella lettura dei record \"%s\" dall'indice %s: %s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "errore(%d) nella memorizzazione del record \"%s\" in %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "errore(%d) nella rimozione del record \"%s\" da %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "errore(%d) nell'impostazione del record #%d dell'intestazione\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "errore(%d) nell'eliminazione del record dell'intestazione #%d\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "errore(%d) nell'allocazione di una nuova istanza del pacchetto\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s è un Delta RPM e non può essere installato direttamente\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Payload non supportato (%s) nel pacchetto %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "il pacchetto %s è già stato aggiunto, salto %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "il pacchetto %s è stato già aggiunto, sostituzione con %s in corso\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(non è un blob)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(non è un numero)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(non è una stringa)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(tipo non valido)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(non base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(tipo non valido)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(non è un blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(tipo xml non valido)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(non è una firma OpenPGP)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr "Formato data %u non corretto"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normale"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "sostituito"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "non installato"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "condivisa su rete"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "colore errato"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "mancanti"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(sconosciuto)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(non è una stringa)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "l'utente %s non esiste - uso dell'utente root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "il gruppo %s non esiste - uso dell'utente root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s salvato come %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s creato come %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
-msgstr ""
+msgstr "%s %s: rimozione fallita: %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
-msgstr ""
+msgstr "directory"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
-msgstr ""
+msgstr "file"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr "salto il pacchetto %s %s perchè la firma non è verificabile\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr "salto il pacchetto %s perchè la firma non è verificabile\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "tag[%d]: BAD, tag %d tipo %d offset %d conteggio %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: BAD, non hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: BAD, non binario\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: BAD, non binario\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "dimensione blob(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "offset regione: BAD, tag %d tipo %d offset %d conteggio %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "trailer regione: BAD, tag %d tipo %d offset %d conteggio %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "dimensione regione: BAD, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr dimensione(%d): BAD, la lettura restituisce %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr tags: BAD, num. di tag(%d) fuori range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "lunghezza campo non valida"
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hdr data: BAD, num. di byte(%d) fuori range\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr blob(%zd): BAD, la lettura restituisce %d\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "hdr load: BAD\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "formato tag vuoto"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature fallita: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "nome tag vuoto"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Nessuna firma disponibile\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead fallita: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] previsto alla fine dell'array"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "] inaspettata"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "} inaspettata"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? previsto nell'espressione"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ previsto dopo ? nell'espressione"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} previsto nell'espressione"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": previsto dopo l'espressione secondaria ?"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ previsto dopo : nell'espressione"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| previsto alla fine dell'espressione"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "iteratore di array usato con array di dimensioni differenti"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread fallito: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "predefinisci MACRO con un valore EXPR"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'MACRO EXPR'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "definisci MACRO con un valore EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
-msgstr ""
+msgstr "undefine MACRO"
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
-msgstr ""
+msgstr "MACRO"
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "stapare espansione macro di EXPR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'EXPR'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "leggi <FILE:...> invece del file predefinito/i"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FILE:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "non verificare il digest del pacchetto/i"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "non verificare l'intestazione/i del database una volta ripristinata"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "non verificare la firma/e del pacchetto"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "invia stdout a CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "usa ROOT come cartella top level"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr "usa il database nella DIRECTORY"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "DIRECTORY"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "visualizza tag di interrogazione conosciute"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "visualizza la configurazione finale di rpmrc e macro"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "fornisci un output meno dettagliato"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "fornisci un output più dettagliato"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "visualizza la versione di rpm utilizzata"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "macchina di stato del file payload di debug"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "debug rpmio I/O"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: tabella opzioni configurata in modo errato (%d)\n"
@@ -1928,13 +2249,13 @@ msgstr "i riposizionamenti devono contenere un ="
 msgid "relocations must have a / following the ="
 msgstr "i riposizionamenti devono avere una / che segue ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "installare tutti i file, anche le configurazioni che possono altrimenti "
 "essere saltate"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1942,153 +2263,163 @@ msgstr ""
 "rimuovere tutti i pacchetti corrispondenti a <package> (normalmente viene "
 "generato un errore se con <package> vengono specificati pacchetti multipli)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "riposiziona i file in un pacchetto non-riposizionabile"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "mostra le dipendenze cicliche come avviso"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "rimuovi (disinstalla) il pacchetto"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<package>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "non installare i file di configurazione"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "non installare la documentazione"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "salta i file che presentano un componente <path> che li precede "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<path>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "abbreviazione di --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "aggiorna il pacchetto/i se già installati"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<packagefile>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 "mostra i caratteri hash durante l'installazione del pacchetto (utile con -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "non verificare l'architettura del pacchetto"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "non verificare il sistema operativo del pacchetto"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "non controllare lo spazio del disco prima dell'installazione"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "installa documentazione"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
-msgstr "installa pacchetto/i"
+msgstr "installa pacchetto/i"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "aggiorna il database, senza modificare il filesystem"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "non verificare le dipendenze dei pacchetti"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "non verificare il digest dei file"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "non verificare il digest dei file (obsoleto)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "non installare contesti di sicurezza dei file"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 "non riordinare l'installazione dei pacchetti per soddisfare le dipendenze"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "non eseguire le scriptlet dei pacchetti"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "non eseguire alcun scriptlet %%pre (se esistenti)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "non eseguire alcun scriptlet %%post (se esistenti)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "non eseguire alcun scriptlet %%preun (se esistenti)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "non eseguire alcun scriptlet %%postun (se esistenti)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "non eseguire scriptlet %%pretrans (quando presente)"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "non eseguire scriptlet %%posttrans (quando presente)"
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "non eseguire alcun scriptlet causato/i da questo pacchetto"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "non eseguire alcun scriptlet %%triggerprein"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "non eseguire alcun scriptlet %%triggerin"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "non eseguire alcun scriptlet %%triggerun"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "non eseguire alcun scriptlet %%triggerpostun"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "non eseguire azioni sulle collezioni"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2096,373 +2427,411 @@ msgstr ""
 "aggiorna ad una versione più vecchia del pacchetto (sugli aggiornamenti --"
 "force esegue questa operazione automaticamente)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "mostra le percentuali durante l'installazioni dei pacchetti"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "riposiziona il pacchetto su <dir>, se riposizionabile"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "riposiziona i file dal percorso <old> a <new>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<old>=<new>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "ignora i file in conflitto fra pacchetti"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "installa nuovamente se il pacchetto è già presente"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "non installare, ma indicare se funziona oppure no"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "aggiorna il pacchetto/i"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "reinstalla pacchetto(i)"
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "interrogare/verificare tutti i pacchetti"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "modalità rpm checksig"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "interrogare/verificare a quale pacchetto/i appartiene il file"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "interrogare/verificare il pacchetto/i in un gruppo"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "interrogare/verificare un file del pacchetto"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 "interrogare/verificare il pacchetto/i con un identificatore del pacchetto"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 "interrogare/verificare il pacchetto/i con un identificatore di intestazione"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "modalità interrogazione rpm"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "interrogare/verificare una istanza dell'intestazione"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 "interrogare/verificare il pacchetto/i dalla transazione di installazione"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "interroga il pacchetto/i azionato dal pacchetto"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "modalità verifica rpm"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "interrogare/verificare il pacchetto/i che necessita di una dipendenza"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "interrogare/verificare il pacchetto/i che fornisce una dipendenza"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr "interrogare/verificare il pacchetto/i che raccomanda una dipendenza"
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr "interrogare/verificare il pacchetto/i che suggerisce una dipendenza"
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "non eseguire il glob degli argomenti"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "non processare i file non-package come manifest"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "elenca tutti i file di configurazione"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "elenca tutti i file di documentazione"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "elenca tutti i file di documentazione"
+msgstr "elenca tutti i file licenza"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "elenca tutti i file licenza"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "emettere le informazioni di base dei file"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "elenca i file in un pacchetto"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "salta file %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "salta file %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "visualizza gli stati dei file elencati"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "non verificare la dimensione dei file"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "non verificare il percorso symlink dei file"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "non verificare il proprietario dei file"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "non verificare il gruppo dei file"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "non verificare l'ora di modifica dei file"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "non verificare la modalità dei file"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "non verificare le capabilities dei file"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "non verificare i contesti di sicurezza dei file"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "non verificare le capabilities dei file"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "non verificare i file nel pacchetto"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "non verificare le dipendenze del pacchetto"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "non eseguire gli script di verifica"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "Funzionalità rpmlib mancanti per %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "pacchetto sorgente atteso, trovato binario\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "il pacchetto sorgente non contiene alcun file .spec\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "estrazione archivio fallita%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " sul file "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s fallito sul file %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s fallito: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "formato non corretto: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(non contiene file)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normale        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "sostituito      "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "non installato "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "rete condivisa    "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "colore errato   "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(nessuno stato)    "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(sconosciuto %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "il pacchetto non possiede alcun elenco gruppo/proprietario dei file\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 "il pacchetto non possiede ne un proprietario del file ne un elenco id\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "il gruppo %s non contiene alcun pacchetto\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "nessun pacchetto attiva %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "%s malformato: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "nessun pacchetto corrisponde a %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "nessun pacchetto necessita di %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr "nessun pacchetto raccomanda %s\n"
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr "nessun pacchetto suggerisce %s\n"
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "nessun pacchetto fornisce %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "file %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "il file %s non è posseduto da alcun pacchetto\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "numero del pacchetto non valido: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "il record %u non può essere letto\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "il pacchetto %s non è stato installato\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "tag sconosciuto: \"%s\"\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s: importazione chiave %d fallita.\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s: chiave pubblica %d non con formato 'armored'.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: lettura importazione fallita(%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr "%s: headerRead fallita: %s\n"
+msgid "Fread failed: %s"
+msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
-"%s: La regione header immutabile non può essere letta. Pacchetto corrotto?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NON OK"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (CHIAVI MANCANTI:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (CHIAVI NON FIDATE:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: apertura fallita: %s\n"
@@ -2487,222 +2856,451 @@ msgstr "Impossibile cambiare directory root: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "Impossibile ripristinare directory root: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "Generazione di %d indici mancanti, prego attendere...\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr "impossibile aprire l'indice %s usando%s - %s (%d)\n"
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "non è stato impostato alcun dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: salto"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "errore(%d) nella memorizzazione del record #%d in %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec fallito: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp fallito: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: salto"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: intestazione #%u danneggiata -- viene omessa.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: impossibile leggere intestazione 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "non è stato impostato alcun dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "impossibile creare la cartella %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "l'intestazione #%u nel database non è valida -- viene omessa.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "impossibile aggiungere il record originariamente su %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "ricompilazione database fallita: il database originale rimane in uso\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "sostituzione del vecchio database con il nuovo database fallita!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NO "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "SI"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 "Supporto alla versione per le dipendenze PreReq:, Provides: e Obsoletes:."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 "file name conservati come tuple (dirName,baseName,dirIndex), non come "
 "percorsi."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "il payload del pacchetto può essere compresso utilizzando bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr "il payload del pacchetto può essere compresso utilizzando xz."
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr "il payload del pacchetto può essere compresso utilizzando lzma."
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
 msgstr "il/i file payload del pacchetto presentano un prefisso \"./\""
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr ""
 "il nome-versione-release del pacchetto non viene implicitamente fornito."
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
 msgstr ""
-"i tag delle intestazioni vengono sempre ordinate dopo il loro caricamento."
+"i tag delle intestazioni vengono sempre ordinate dopo il loro caricamento."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr ""
+"l'interprete di scriptlet può utilizzare gli argomenti presenti "
+"nell'intestazione."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "un set di file hardlink può essere installato senza che sia completo."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+"le scriptlet del pacchetto potrebbero accedere al database rpm durante "
+"l'installazione."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "supporto interno per gli script lua."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr "l'algoritmo digest di checksum dei file è configurabile per pacchetto"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "supporto per le file capabilities POSIX.1e"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+"le scriptlet del pacchetto possono essere espanse durante l'installazione."
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr "la comparazione delle dipendenze supporta le versioni con tilde."
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "supporto per file più grandi di 4GB"
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr "Nome richiesto"
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
-"l'interprete di scriptlet può utilizzare gli argomenti presenti "
-"nell'intestazione."
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "un set di file hardlink può essere installato senza che sia completo."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Bad magic"
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr ""
-"le scriptlet del pacchetto potrebbero accedere al database rpm durante "
-"l'installazione."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Intestazione  errata/illeggibile"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "supporto interno per gli script lua."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Dimensione intestazione troppo grande"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr "l'algoritmo digest di checksum dei file è configurabile per pacchetto"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "FIle troppo grande per l'archivio"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "supporto per le file capabilities POSIX.1e"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Tipo di file sconosciuto"
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr ""
-"le scriptlet del pacchetto possono essere espanse durante l'installazione."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "File mancante(i)"
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Digest non corrispondente"
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Errore interno"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "File archive non è nell'intestazione"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " fallito - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: (errore 0x%x)"
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "apertura di %s fallita: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: non è un pacchetto rpm (o un manifest del pacchetto)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr "Aggiornamento / installazinone...\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr "Pulizia / rimozione...\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Preparazione in corso..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr "Preparazione dei pacchetti..."
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Dipendenze fallite:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: non è un pacchetto rpm (o un manifest del pacchetto): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s non può essere installato\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Ripristino di %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "omissione di %s - trasferimento fallito\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "il pacchetto %s non è riposizionabile\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "errore di lettura dal file %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "\"%s\" specifica pacchetti multipli:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "impossibile aprire %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Installazione di %s in corso\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "non è un pacchetto rpm"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
-msgstr "tipo di firma illegale"
+msgstr "tipo di firma non valido"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "versione del pacchetto RPM non supportata"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "lettura fallita: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "non è un pacchetto rpm\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "impossibile creare il lock %s su %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "attesa del lock %s su %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr "Impossibile eseguire dlopen di %s %s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "Impossibile risolvere il simbolo %s: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "Impossibile espandere la macro  %%__collection_%s\n"
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "Plugin %%__%s_%s non configurato\n"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "Plugin %s non caricato\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr "Impossibile risolvere nel plugin %s il simbolo %s: %s\n"
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "diverso"
@@ -2785,637 +3383,352 @@ msgstr ""
 "si è verificato un errore sconosciuto %d durante la manipolazione del "
 "pacchetto %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "secondo ':' mancante su %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "nome architettura mancante su %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Riga dati incompleta su %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Troppi argomenti sulla riga dati di %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Numero arch/OS errato: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Riga di default incompleta su %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Troppi argomenti nella riga di default su %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "':' mancanti (trovato 0x%02x) su %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "argomento mancante per %s su %s:%d\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr "impossibile aprire %s su %s:%d: %m\n"
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "architettura mancante per %s su %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "opzione errata '%s' su %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Sistema sconosciuto: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Si prega di contattare %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Impossibile aprire %s per la lettura: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr "Impossibile tornare alla direcotry corrente: %m"
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "supporto agli scriptlet <lua> non disponibile\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Impossibile creare il file temporaneo per %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Impossibile duplicare il file descriptor: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "scriptlet %s fallita, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "scriptlet %s fallita, segnale %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "scriptlet %s fallita, uscita con stato %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Formato sconosciuto"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "installa"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "elimina"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "impossibile aprire il database dei pacchetti in %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "'(' extra nell'etichetta del pacchetto: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "'(' mancante nell'etichetta del pacchetto: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "')' mancante nell'etichetta del pacchetto: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: lettura chiave pubblica fallita.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "transazione"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "dimensione(%d) sigh: BAD, la lettura ha restituito %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic: BAD\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh tags: BAD, no. di tags(%d) fuori range\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh data: BAD, no. di  bytes(%d) fuori range\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d): BAD, la lettura ha restituito %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh tag[%d]: BAD, tag %d tipo %d offset %d conteggio %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "carico sigh: BAD\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh pad(%zd): BAD, lettura %zd byte\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd): BAD, fstat(2) fallito\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-"Impossibile leggere la regione immutabile dell'header. Pacchetto corrotto?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr "Impossibile firmare pacchetti RPM v3\n"
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5 digest:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "Digest SHA1 header:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Header "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr "Verifica firma: PARAMETRI NON CORRETTI (%d %p %d %p %p)\n"
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "saltato"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "fallito"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "%c %s  mancanti"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Dipendenze non soddisfatte per %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr "lunghezza campo non valida"
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "{ mancante dopo %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "} mancante dopo %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "formato tag vuoto"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "nome tag vuoto"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "tag sconosciuto"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] previsto alla fine dell'array"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "] inaspettata"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "} inaspettata"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? previsto nell'espressione"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ previsto dopo ? nell'espressione"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} previsto nell'espressione"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": previsto dopo l'espressione secondaria ?"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ previsto dopo : nell'espressione"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| previsto alla fine dell'espressione"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "iteratore di array usato con array di dimensioni differenti"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "Generazione di %d indici mancanti, prego attendere...\n"
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "impossibile aprire l'indice %s utilizando db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr "errore(%d) nella lettura dei record \"%s\" dall'indice %s: %s\n"
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "non è stato impostato alcun dbpath\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: salto"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "errore(%d) nella memorizzazione del record #%d in %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec fallito: %s\n"
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp fallito: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: salto"
-
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: intestazione #%u danneggiata -- viene omessa.\n"
-
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr "errore(%d) durante l'acquisizione dei record \"%s\" dall'indice %s\n"
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "architettura mancante per %s su %s:%d\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "errore(%d) nell'impostazione del record #%d dell'intestazione\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "opzione errata '%s' su %s:%d\n"
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "errore(%d) nell'eliminazione del record dell'intestazione #%d\n"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr "Impossibile leggere il vettore ausiliario, /proc non montata?\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: impossibile leggere intestazione 0x%x\n"
+msgid "Unknown system: %s\n"
+msgstr "Sistema sconosciuto: %s\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "errore(%d) nell'impostazione dei record \"%s\" dall'indice %s\n"
+msgid "Please contact %s\n"
+msgstr "Si prega di contattare %s\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "errore(%d) nella memorizzazione del record \"%s\" in %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Impossibile aprire %s per la lettura: %m.\n"
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "errore(%d) nella rimozione del record \"%s\" da %s\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr "Funzione exec() non chiamata dopo fork() nello scriptlet lua\n"
+
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "errore(%d) nell'allocazione di una nuova istanza del pacchetto\n"
+msgid "Unable to restore current directory: %m"
+msgstr "Impossibile tornare alla direcotry corrente: %m"
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "supporto agli scriptlet <lua> non disponibile\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "errore(%d) durante l'acquisizione dei record \"%s\" dall'indice %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Impossibile creare il file temporaneo per %s: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "errore(%d) nella memorizzazione del record %s in %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Impossibile duplicare il file descriptor: %s: %s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "non è stato impostato alcun dbpath"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr "Fwrite fallito: %s"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "impossibile creare la cartella %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "scriptlet %s fallita, waitpid(%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "l'intestazione #%u nel database non è valida -- viene omessa.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "scriptlet %s fallita, segnale %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "impossibile aggiungere il record originariamente su %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "scriptlet %s fallita, uscita con stato %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr "ricompilazione database fallita: il database originale rimane in uso\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Formato sconosciuto"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "sostituzione del vecchio database con il nuovo database fallita!\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "installa"
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "per eseguire un ripristino sostituire i file in %s con i file di %s"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "elimina"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "rimozione della directory %s fallita: %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "impossibile aprire il database dei pacchetti in %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d errore(%d) da %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "'(' extra nell'etichetta del pacchetto: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d errore(%d): %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "'(' mancante nell'etichetta del pacchetto: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "impossibile ottenere il %s su %s/%s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "')' mancante nell'etichetta del pacchetto: %s\n"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "condiviso"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: lettura chiave pubblica fallita.\n"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "esclusivo"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "transazione"
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr "tipo indice %x non valido su %s/%s\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "opzione db non riconosciuta: \"%s\" ignorata.\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s presenta un valore numeric non valido, omesso\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s presenta un valore long troppo grande o troppo piccolo, omesso\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s presenta un valore integer troppo grande o troppo piccolo, omesso\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "Impossibile decodificare la policy per %s\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "Impossibile creare il file temporaneo per %s: %s\n"
+msgid "%s%s %s"
+msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
+
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "Impossibile scrivere la policy %s nel file %s\n"
+msgid "%s%s"
+msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr "Errore nella creazione dell'handle semanage\n"
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "Errore nella connessione all'handler di policy\n"
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "Errore nell'inizializzazione della policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr "Impossibile rimuovere il temporaneo %s della policy: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Header "
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "Impossibile installare il modulo di policy: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "Impossibile rimuovere il modulo di policy: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Impossibile ricaricare intestazione della firma.\n"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "Errore durante il fork del processo: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "saltato"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "Impossibile eseguire %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "fallito"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "%s è terminato in modo anomalo\n"
+msgid "Duplicate username or UID for user %s\n"
+msgstr "Nome utente o UID duplicato per l'utente %s\n"
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "%s fallito con codice di errore %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr "Nome gruppo o GID duplicato per il gruppo %s\n"
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "Errore durante il commit delle modifiche alla policy\n"
+#: lib/verify.c:395
+msgid "no state"
+msgstr "nessuno stato"
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "Impossibile espandere il percorso restorecon"
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "stato sconosciuto"
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
-"Errore durante il relabel del filesystem. I file potrebbero avere label non "
-"corrette\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "%c %s  mancanti"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
-"Errore nel caricamento dei file context. I file potrebbero avere label non "
-"corrette\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Dipendenze non soddisfatte per %s:\n"
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "Impossibile estrarre la policy da %s\n"
+msgid "Unable to reset nice value: %s"
+msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== %d attivo %d vuoto\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(vuoto)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(vuoto)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "La macro %%%s presenta un corpo incompleto\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "La macro %%%s presenta delle opzioni incomplete\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "La macro %%%s presenta un nome illegale (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "La macro %%%s presenta un corpo incompleto\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "La macro %%%s presenta delle opzioni incomplete\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "La macro %%%s presenta contenuto vuoto\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "La Macro %%%s richiede whitespace prima del corpo\n"
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Impossibile espandere la macro %%%s\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
-msgstr "La macro %%%s presenta un nome illegale (%%undefine)\n"
+msgstr "La macro %%%s presenta un nome non valido (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "La macro %%%s (%s) non è stata utilizzata sotto il livello %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr "Macro %%%s definita ma non usata nello scope\n"
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Opzione %c sconosciuta in %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
@@ -3423,165 +3736,282 @@ msgstr ""
 "Troppo livelli di ricorsione nell'espansione della macro. Si tratta "
 "probabilmente di una macro definita ricorsivamente.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "%c non terminato: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Un %% è seguito da una macro non parsabile\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "impossibile caricare il file di macro %s"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== %d attivo %d vuoto\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "errore nella creazione del file temporaneo %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "File %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
-msgstr "File %s è più piccolo di %u byte\n"
+msgstr "Il file %s è più piccolo di %u byte\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "impossibile creare la directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[nessuno]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(nessun errore)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "errore fatale: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "errore: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "sintassi non valida nella scriptlet lua: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "sintassi non valida nello script lua: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "script lua fallito: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "sintassi non valida nel file lua: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
-msgstr "lua hook fallito: %s\n"
-
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[nessuno]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(nessun errore)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "errore fatale: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "errore: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "avvertimento: "
+msgstr "hook lua fallito: %s\n"
 
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "allocazione memoria (%u byte) ha ritornato NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, ID chiave %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(nessuno)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr "errore nella creazione della directory temporanea %s: %m\n"
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr "errore nella creazione del fifo %s: %m\n"
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr "errore nell'eliminazione del fifo %s: %m\n"
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr "errore nell'eliminazione della directory %s: %m\n"
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite fallito: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread fallito: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush fallito: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr "Firma PGP non supportata\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr "Algoritmo hash PGP %u non supportato\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr "Algoritmo di chiave privata PGP non supportato %u\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Impossibile eseguire %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr "Fopen fallito\n"
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "Impossibile scrivere nella pipe\n"
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Impossibile creare la pipe per la firma: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr "Impossibile leggere dal file %s: %s\n"
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "esecuzione gpg fallita (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg non è riuscito a salvare la firma\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "impossibile leggere la firma\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp fallito\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr "%s contiene la stessa identica signature, lo salto\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead fallito: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature fallita: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: headerRead fallita: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "Impossibile firmare pacchetti RPM v3\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s contiene la stessa identica signature, lo salto\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature fallito: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead fallito: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "sostituzione di %s fallita: %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: lettura manifesto fallita: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "non verificare firma header+payload"
index 5a36ef3078daa3dc8022586f69fc511d0495be55..f405931c23a7bc38be03bcf40798a48cb78e1956 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -3,18 +3,19 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Hajime Taira <htaira@redhat.com>, 2011-2012.
-# Tadashi "ELF" Jokagi <elf@poyo.jp>, 2012.
-# Tadashi Jokagi <elf@elf.no-ip.org>, 2011.
-# Tomoyuki KATO <tomo@dream.daynight.jp>, 2012.
+# Hajime Taira <htaira@redhat.com>, 2011-2012
+# Tadashi Jokagi <elf@poyo.jp>, 2012
+# Tadashi Jokagi <elf@elf.no-ip.org>, 2011
+# Tadashi Jokagi <elf@poyo.jp>, 2012
+# Tomoyuki KATO <inactive+katomo@transifex.com>, 2012-2013
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-06 12:55+0000\n"
-"Last-Translator: Tomoyuki KATO <tomo@dream.daynight.jp>\n"
-"Language-Team: Japanese (http://www.transifex.com/projects/p/rpm/language/"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: Japanese (http://www.transifex.com/rpm-team/rpm/language/"
 "ja/)\n"
 "Language: ja\n"
 "MIME-Version: 1.0\n"
@@ -48,498 +49,559 @@ msgstr "このプログラムは GNU GPL の下で自由に配布できます。
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "--pipe でのパイプ作成に失敗: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "実行失敗\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "引数は RPM パッケージではありません。\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "パッケージのヘッダー読み込み中にエラー\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "ペイロードを再度開けません: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "パッケージセレクションを問い合わせ/検証するオプション:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "問い合わせオプション (-q または --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "検証オプション (-V または --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "インストール/アップグレード/アンインストールオプション:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "すべてのモード・コマンドで共通のオプション:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "問い合わせ/検証は一度に一つしか実行できません。"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "予期せぬ問い合わせのフラグ"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "予期せぬ問い合わせのフォーマット"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "予期せぬ問い合わせのソース"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "一つのメジャーモードのみを指定して下さい"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "インストールとアップグレードのみを余儀なくされる可能性があります。"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "ファイルはパッケージのインストール時にのみ再配置できます。"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "--prefix は --relocate や --excludepath とは同時には使用できません。"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate と --excludepath は新しいパッケージをインストールする時のみ使用で"
-"きます。"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix は新規パッケージのインストール時のみ使用できます。"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "--prefix の引数は / から始まらなければなりません。"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr "--hash (-h) はパッケージのインストール時または削除時のみ指定できます。"
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr "--percent はパッケージのインストール時または削除時のみ指定できます。"
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs はパッケージのインストール時のみ指定できます。"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs はパッケージのインストール時のみ指定できます。"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs はパッケージのインストール時のみ指定できます。"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "--excludedocs と --includedocs は同時には指定できません。"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch はパッケージのインストール時のみ指定できます。"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos はパッケージのインストール時のみ指定できます。"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize はパッケージのインストール時のみ指定できます。"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches はパッケージ削除時のみ指定できます。"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles はパッケージのインストール時のみ指定できます。"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb はパッケージ インストール・削除時のみ指定できます。"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"スクリプトを無効にするようなオプションは、パッケージのインストール、削除時の"
-"み指定できます。"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"トリガーを無効にするようなオプションはパッケージのインストール、削除時のみ指"
-"定できます。"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-"--nodeps はパッケージのインストール時、削除時および検証時のみ指定できます。"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr "--test はパッケージのインストール時および削除時のみ指定できます。"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "--root (-r) の引数は / から始まらなければなりません。"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "アンインストールするパッケージが指定されていません。"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "インストールするパッケージが指定されていません。"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "問い合わせのための引数が指定されていません。"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "検証のための引数が指定されていません。"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "BuildRoot は既に指定されています。%s を無視します\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr "<specfile> の %prep (ソース展開と patch の適用) まで実行"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specfile>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "<specfile> の %build (%prep とコンパイル) まで実行"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr "<specfile> の %install (%prep, %build, インストール) まで実行"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "<specfile> の %files セクションを検証"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "<specfile> を元に、バイナリ/ソースパッケージ作成"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "<specfile> を元に、バイナリパッケージのみ作成"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "<specfile> を元に、ソースパッケージのみ作成"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<source package>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr "<source package> から %install (%prep, %build, インストール) まで実行"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr "<tarball> から %prep (ソース展開とパッチ適用) まで実行"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "<tarball> から %build (%prep とコンパイル) まで実行"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "<tarball> から %install (%prep, %build, インストール) まで実行"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "<tarball> から %files セクションを検証"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "<tarball> を元に、バイナリ/ソースパッケージを作成"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "<tarball> を元に、バイナリパッケージのみを作成"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "<tarball> を元に、ソースパッケージのみを作成"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "<source package> を元にバイナリパッケージを作成"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<source package>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr "<source package> から %install (%prep, %build, インストール) まで実行"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "build root を強制指定"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "パッケージ作成後ツリーを削除"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "spec ファイルの ExcludeArch: を無視"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "ファイル状態マシーンのデバッグ"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "ビルドのどの段階も実行しない"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "ビルド依存性を検証しない"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 "レガシーなRPM v3のパッケージングと互換性のあるパッケージのヘッダーの生成"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
+msgstr "ビルドの %clean 段階を実行しない"
+
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
-msgstr ""
+msgstr "ビルドの %check 段階を実行しない"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "specfile から i18N msgstr を受け付けない"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "終了後ソースを削除します。"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "終了時に spec ファイルを削除"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "指定した過程までスキップします (c, i でのみ有効)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "ターゲットプラットフォームを強制指定"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "[ <specfile> | <tarball> | <source package> ] とのビルドオプション:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "すべてのモード・コマンドで共通のオプション:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "ビルド依存性の失敗:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "spec ファイル %s を開けません: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "tar パイプのオープンに失敗しました: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "%s から spec ファイルの読み込みに失敗しました。\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "%s を %s に名前を変更できませんでした: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "stat %s に失敗しました: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "%s は通常ファイルではありません。\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "ファイル %s は spec ファイルではないようです。\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "ビルド対象プラットフォーム: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "ターゲット %s 用にビルド中\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "--root (-r) の引数は / から始まらなければなりません。"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "データベースを初期化します。"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "インストールされたパッケージヘッダーから、データベースのインデックスを再構築"
 "します。"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "データベースの検証を行います。"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "データベース オプション:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "一つのメジャーモードのみを指定して下さい"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "署名の検証を行います。"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "ASCII 化された公開鍵を取り込みます。"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr "インポートしませんが、動作するかしないかを通知します"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "RPMキーリングからキーを一覧表示する。"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "キーリングのオプション:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "引数が指定されていません。"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "パッケージセレクションを問い合わせ/検証するオプション:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "問い合わせオプション (-q または --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "検証オプション (-V または --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "インストール/アップグレード/アンインストールオプション:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "問い合わせ/検証は一度に一つしか実行できません。"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "予期せぬ問い合わせのフラグ"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "予期せぬ問い合わせのフォーマット"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "予期せぬ問い合わせのソース"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "インストールとアップグレードのみを余儀なくされる可能性があります。"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "ファイルはパッケージのインストール時にのみ再配置できます。"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "--prefix は --relocate や --excludepath とは同時には使用できません。"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate と --excludepath は新しいパッケージをインストールする時のみ使用で"
+"きます。"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix は新規パッケージのインストール時のみ使用できます。"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "--prefix の引数は / から始まらなければなりません。"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr "--hash (-h) はパッケージのインストール時または削除時のみ指定できます。"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr "--percent はパッケージのインストール時または削除時のみ指定できます。"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs はパッケージのインストール時のみ指定できます。"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs はパッケージのインストール時のみ指定できます。"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs はパッケージのインストール時のみ指定できます。"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "--excludedocs と --includedocs は同時には指定できません。"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch はパッケージのインストール時のみ指定できます。"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos はパッケージのインストール時のみ指定できます。"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize はパッケージのインストール時のみ指定できます。"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches はパッケージ削除時のみ指定できます。"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles はパッケージのインストール時のみ指定できます。"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb はパッケージ インストール・削除時のみ指定できます。"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"スクリプトを無効にするようなオプションは、パッケージのインストール、削除時の"
+"み指定できます。"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"トリガーを無効にするようなオプションはパッケージのインストール、削除時のみ指"
+"定できます。"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps はパッケージのインストール時、削除時および検証時のみ指定できます。"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr "--test はパッケージのインストール時および削除時のみ指定できます。"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "アンインストールするパッケージが指定されていません。"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "インストールするパッケージが指定されていません。"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "問い合わせのための引数が指定されていません。"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "検証のための引数が指定されていません。"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr "署名パッケージ"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "パッケージに署名する (--addsign と同一です)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "パッケージの署名を削除する"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "署名オプション:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "%s を実行できませんでした: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "マクロファイル内で \"%%_gpg_name\" を設定しなければなりません。\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "パスフレーズの入力: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "パスフレーズは正常です。\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
-"パスフレーズのチェックに失敗しました、または GPG キーが失効しています\n"
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr "SPEC ファイルを標準出力に構文解析します"
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr "specファイルの問い合わせ"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr "specファイルによって生成されたバイナリRPMを操作する(デフォルト)。"
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr "specファイルによって生成されたソースRPMを操作する。"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "以下の問い合わせ書式を使用します。"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "specのオプション:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr "構文解析する引数がありません"
 
@@ -548,32 +610,37 @@ msgstr "構文解析する引数がありません"
 msgid "Unable to open temp file: %s\n"
 msgstr "一時ファイルを開けません: %s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr "ストリームを開けません: %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "実行中(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "%s の実行に失敗 (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr "スクリプトレット %s (%s) の実行エラー\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "%s の不正な終了ステータス (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -583,237 +650,317 @@ msgstr ""
 "\n"
 "RPM ビルドのエラー:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "構文解析中の文法エラー ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "構文解析中の文法エラー &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "構文解析中の文法エラー ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "式中で構文解析エラー\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "( が一致しません\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- は数のみ使用可能です\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! は数にのみ使用可能です\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "型は一致していなければなりません\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / は文字列には使えません\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- は文字列には使えません\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& と || は文字列には使えません\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "式中で文法エラー\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "%s に '(' がありません %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "%s(%s の後に ')' がありません\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "無効なトークン %s: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "%s が %s %s にありません\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "%s() に続く空白がありません: %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "文法エラー: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "不正なモード指定: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "不正なディレクトリモード指定: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr "異常なロケール長: \"%s\" (%%lang(%s))\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr "重複する位置 %s が %%lang(%s) にあります\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "不正なケーパビリティです: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "ファイル ケーパビリティのサポートが組み込まれていません\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "ファイルは \"/\" から始まらなければなりません: %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 "不明なファイルのダイジェスト アルゴリズム %u です。MD5 にフォールバックしま"
 "す。\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "ファイルが2回表記されています: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "シンボリックリンク %s の読み込みに失敗しました: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "シンボリックリンクが BuildRoot を指しています: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "ディレクトリーがありません: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "ファイルが見つかりません: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: 不明なタグ (%d) を読み込めませんでした。\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: 公開鍵の読み込みに失敗しました。\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: ASCII 形式の公開鍵ではありません。\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: エンコードに失敗\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "ディレクトリーの作成に失敗しました"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "ファイルは先頭に \"/\" が必要です: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "%%dev グロブは許可されません: %s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "ディレクトリーがグロブにより見つかりませんでした: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "ファイルが見つかりません (by glob): %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "%%files のファイル %s を開けません: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "%s行目: \n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "%%files ファイル %s の読み込み中にエラー: %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr "不正な _docdir_fmt %s: %s\n"
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
 #, c-format
-msgid "Can't mix special %s with other forms: %s\n"
+msgid "File not found by glob: %s\n"
+msgstr "ファイルが見つかりません (by glob): %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2455
+#, c-format
+msgid "Can't mix special %s with other forms: %s\n"
+msgstr "他の形式で特別な %s を混ぜることはできません: %s\n"
+
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
+msgstr "1 行に複数のファイル: %s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "不正なファイル: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "不正な所有者/グループ: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "パッケージに含まれないファイルの検査中: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -822,549 +969,608 @@ msgstr ""
 "インストール済み(ただしパッケージに含まれない)ファイルが見つかりました:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "ファイルの処理中: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
+"バイナリのアーキテクチャー (%d) がパッケージのアーキテクチャー (%d) と一致し"
+"ません。\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "noarch パッケージ内にアーキテクチャ依存のバイナリー\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr "ファイル %s にアーカイブの作成を失敗しました: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr "アーカイブの作成に失敗しました: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "%s ファイルを開けませんでした: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: 行: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "ホスト名を正式なものにできません: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "%s への Payload 書き込みに失敗: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "%s から Payload 読み込みに失敗: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "ホスト名を正式なものにできません: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "不明なペイロード圧縮: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "不変ヘッダー領域を作成できません。\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "一時ファイルを開けません。\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "一時ヘッダーの書き込みができません。\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "ポリシーファイルの読み込みに失敗しました。: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "不正な CSA データ\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "署名ヘッダーの再読み込みができません。\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "%s のオープンに失敗: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "パッケージの書き込みに失敗: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "sigtarget %s のオープンに失敗: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "%s からヘッダー読み込みに失敗: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "%s へのヘッダー書き込みに失敗: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "書き込み完了: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "「%s」を実行しています:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "「%s」の実行に失敗しました。\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "パッケージ \"%s\" のチェックに失敗しました。\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "パッケージ %s の出力ファイル名を生成できませんでした: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "%s を作成できません: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "%d 行目: 2番目の %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
-msgstr ""
+msgstr "%%changelog に偽の日付: %s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "%%changelog エントリは * で始まらなければなりません\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "不完全な %%changelog エントリ\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "%%changelog 中の不正な日付: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog は日付の新しい順に並んでいません\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "%%changelog 中に名前がありません\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "%%changelog 中に説明がありません\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "%d 行目: %%description の構文解析エラー: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "%d 行目: 不正なオプション %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "%d 行目: 名前が多すぎます: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "%d 行目: パッケージが存在しません: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "%d 行目: 2番目の説明\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "%d 行目: %%files の構文解析エラー: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr "%d 行目: %%policies の構文解析エラー: %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr "タグフィールドの構文解析エラー: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "%d 行目: 不正な番号: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "%d 行目: 不正な no%s 番号: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "%d 行目: 不正な %s 番号: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d は複数回数指定しています\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "%s を %s にダウンロード中\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "%s をダウンロードできませんでした\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "アーキテクチャは除外されています: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "アーキテクチャは含まれていません: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS は除外されています: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS は含まれていません: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "%s フィールドがパッケージ中に必要です: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "パッケージ中に %s エントリが重複しています: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "アイコン %s を開けません: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "アイコン %s を読むことができません: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "不明なアイコンタイプ: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "%d 行目: タグはトークンを 1つしかとりません: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "%d 行目: 不正な文字 '%c' : %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "%d 行目: 不正な文字 '-' : %s\n"
+msgid "%s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "%d 行目: 不正なシーケンス 「..」 : %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "%d 行目: 不完全な形のタグ: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "%d 行目: 空のタグ: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "%d 行目: Prefix は \"/\" で終わってはいけません: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "%d 行目: Docdir は '/' で始まらなければなりません: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "%d 行目: Epoch フィールドは数字でなければなりません: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "%d 行目: 不正な修飾子 %s : %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "%d 行目: 不正な BuildArchtecture フォーマット: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "%d 行目: noarch サブ パッケージでのみサポート: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "内部エラー: にせのタグ %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "%d 行目: %s は非推奨: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "不正なパッケージの指定: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "パッケージは既に存在しています: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "%d 行目: 不明なタグ: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} を空にすることができません\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} を \"\" にすることができません\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "不正なソース: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "パッチ番号 %u はありません\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "\"Patch:\" タグに該当しない %%patch\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "ソース番号 %u はありません\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "spec ファイルに「Source:」タグがありません\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "%%setup の構文解析エラー: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "%d 行目: %%setup への不正な引数: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "%d 行目: 不正な %%setup オプション %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "無効なパッケージ番号 %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "%d 行目: ふたつ目の %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 "依存関係トークンは、英数字、'_' または '/' で始まらなければいけません。"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr "バージョン付きファイル名は許可されません"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "バージョン要件"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "無効な依存性"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "バージョン要件"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr "%d 行目: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "%d 行目: トリガーには -- がなければなりません: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "%d 行目: %s の構文解析エラー: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "%d 行目: 内部スクリプトは '>' で終わらなければなりません: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "%d 行目: スクリプトプログラムは '/' で始まらなければなりません: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "%d 行目: 2番目の %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "%d 行目: 未サポートの内部スクリプト: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr "%d 行目: インタープリター引数はトリガーにおいて許可されません: %s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "%d 行目: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "%s を開けません: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr "%s:%d: %s に対して期待される引数\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
-msgstr ""
+msgstr "%d 行目: %%if が閉じていません\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr "%d 行目: 終了していないマクロまたは行の不正な継続\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr "%s:%d: 不正な %%if 条件\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: %%if がないのに %%else があります\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: %%if がないのに %%endif があります\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
+msgstr "%s:%d: 不正な形式の %%include 文\n"
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "作成(build)可能な互換アーキテクチャはありません\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "パッケージには %%description がありません: %s\n"
@@ -1439,450 +1645,561 @@ msgstr "オプションが多すぎます: %s\n"
 msgid "Processing policies: %s\n"
 msgstr "ポリシーの処理中: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "不正な正規表現 %s を無視します\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "%s のためのパイプ作成ができません: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "%s を実行できませんでした: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "%s のフォークに失敗しました: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s は失敗しました。 %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "%s へ全データの書き込みに失敗しました: %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "%s の整数(long int)への変換に失敗しました。\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr "空のファイル分類子\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "構成すべきファイル属性がありません。\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) に失敗しました: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load に失敗しました: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "ファイル \"%s\" の承認に失敗しました: モード %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "%s を検索しています: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "%s の検索に失敗しました:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "スペックファイル %s の問い合わせに失敗しました。解析できません。\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(エラー 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "不正なマジック"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "不正な/不可読なヘッダー"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "不明なデータベースオプション: \"%s\" は無視します。\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "ヘッダーサイズが大きすぎます。"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s には不正な数値があります。スキップします\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr ""
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s には大き/小さ過ぎるlong値があります。スキップします\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "不明なファイルタイプ"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s には大き/小さ過ぎる整数値があります。スキップします\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "%sロックを獲得できません (%s/%s)\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "ハードリンクが見つかりません。"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "共有"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "ダイジェストが適合しません"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "排他"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "内部エラー"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "不正なインデックス形式 %x が %s/%s にあります\n"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "アーカイブファイルがヘッダーにありません。"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "エラー(%d) \"%s\" レコードの %s インデックスから取得中: %s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr "失敗 - "
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "エラー(%d) - レコード \"%s\" を %s に格納時\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "エラー(%d) - レコード \"%s\" を %s から削除時\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "エラー(%d) - ヘッダー #%d レコードの追加時\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "エラー(%d) - ヘッダー #%d レコードの削除時\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "エラー(%d) - 新しいパッケージインスタンスの割り当て時\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s はデルタ RPM で、直接インストールできません。\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "パッケージ %s 内にサポートしていないペイロード (%s) です。\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "パッケージ %s は既に追加されています。%s を飛ばします。\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "パッケージ %s は既に追加されています。 %s と置換します。\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(blob ではありません)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(数字ではありません)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(文字列でない)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(不正なタイプ)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(base64 ではありません)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(不正なタイプ)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(blob ではありません)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(不正な XML タイプ)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(OpenPGP 署名ではありません)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr "無効な日付 %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "通常"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "置換"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "未インストール"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "ネット共有"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "間違った色"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "見つかりません"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(不明)  "
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(文字列でない)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "ユーザー %s は存在しません - root を使用します\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "グループ %s は存在しません - root を使用します\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s は %s として保存されました。\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s は %s として作成されました。\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
-msgstr ""
+msgstr "%s %s: 削除に失敗しました: %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr "ディレクトリー"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr "ファイル"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr "検証できない署名を持つ %s %s をスキップしています\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr "検証できない署名を持つ %s をスキップしています\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
+
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "タグ[%d]: 異常です。tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "SHA1 ヘッダー: 異常です。16 進数ではありません。\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "RSA ヘッダー: 異常です。バイナリではありません。\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "DSA ヘッダー: 異常です.バイナリではありません。\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "blob サイズ (%d): 異常です。8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "リージョン オフセット: 異常です。tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "リージョン ヘッダー以降: 異常です。tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "リージョン容量: 異常です。ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "ヘッダー容量(%d): 異常です。読み込み結果は %d です。\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "ヘッダー マジック: 異常です。\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "ヘッダー タグ: 異常です。タグ(%d)の番号が範囲外です。\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "無効なフィールド幅"
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "ヘッダー データ: 異常です。バイト数(%d)が範囲外です。\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "ヘッダー blob(%zd): 異常です。読み込み結果は %d です。\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "ヘッダー ロード: 異常です。\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "空のタグフォーマット"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature に失敗しました: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "空のタグ名"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: 署名がありません。\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead に失敗しました: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "配列の後に ] が期待されます。"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "予期せぬ ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "予期せぬ }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "式中で ? が期待されます。"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "式中で ? の後に { が期待されます。"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "式中に } が期待されます。"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "? サブ式の後に : が期待されます。"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "式中で : の後に { が期待されます。"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "式の終わりに | が期待されます。"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "配列の繰り返し指定が、サイズが異なる配列の間で使用されています"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread に失敗しました: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "値 EXPR を持つマクロを予め定義します。"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'MACRO EXPR'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "値 EXPR を持つ MACRO を定義します。"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "EXPR のマクロを展開した結果を表示します。"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'EXPR'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "デフォルトファイルの代わりに <FILE:...> を読み込みます。"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FILE:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "パッケージダイジェストの検証をしません。"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "取得したデータベースヘッダーを検証しません。"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "パッケージ署名の検証をしません。"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "標準出力を CMD に送信します。"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "ROOT をトップ ディレクトリーとして使用します。"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr "DIRECTORY 内のデータベースを使用します。"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "DIRECTORY"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "全問い合わせタグを表示します。"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "最終的な rpmrc とマクロの設定を表示します。"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "詳細でない出力を提供します。"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "より詳細な出力を提供します。"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "使用している rpm のバージョンを表示します。"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "ペイロードのファイル状態マシンのデバッグ"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "rpmio 入出力のデバッグ"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: オプション テーブルの設定が正しくありません (%d)\n"
@@ -1903,11 +2220,11 @@ msgstr "再配置は = を含んでいなければなりません。"
 msgid "relocations must have a / following the ="
 msgstr "再配置は = の次に / でなければなりません。"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr "設定がスキップを指示していても、全ファイルをインストールします。"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1915,152 +2232,162 @@ msgstr ""
 "<package> と一致するパッケージ全てを削除します(通常は <package> が複数のパッ"
 "ケージを指す場合はエラーになります)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "再配置不可能なパッケージのファイルを再配置します。"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "依存のループを警告として表示します。"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "パッケージを削除 (アンインストール) します。"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<package>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "設定ファイルをインストールしません。"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "ドキュメントをインストールしません。"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "パス <path> 中のファイルをスキップします。"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<path>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "--replacepkgs と --replacefiles を短縮したもの"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "既にインストール済みの場合のみアップグレード"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<packagefile>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 "パッケージをインストールにつれて '#' を表示します (-v と使用すると良い)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "パッケージの対象アーキテクチャを検証しません。"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "パッケージ対象 OS の検証を行いません。"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "インストール前のディスク容量チェックを行いません。"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "ドキュメントをインストールします。"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "パッケージをインストールします。"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "データベースを更新しますが、ファイルシステムの変更は行いません。"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "パッケージの依存関係の検証を行いません。"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "ファイルのダイジェストを検証しません。"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "ファイルのダイジェストを検証しません (旧式)。"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "ファイルのセキュリティ コンテキストをインストールしません。"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "依存性を満たす為のパッケージのインストール順序を変更しません。"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "パッケージ指定のスクリプトを実行しません。"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "%%pre スクリプトを実行しません。"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "%%post スクリプトを実行しません。"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "%%preun スクリプトを実行しません。"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "%%postun スクリプトを実行しません。"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "このパッケージによってトリガーされるスクリプトを実行しません。"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "%%triggerprein スクリプトを実行しません。"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "%%triggerin スクリプトを実行しません。"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "%%triggerun スクリプトを実行しません。"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "%%triggerpostun スクリプトを実行しません。"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "いかなる収集活動も行わないでください。"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2068,371 +2395,408 @@ msgstr ""
 "古いバージョンのパッケージにアップグレードします(アップグレード時の --force "
 "はこれを自動的に行います)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "インストールする際にパーセント表示を行います。"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "パッケージが再配置可能ならば、 <dir> に再配置します。"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "パス <old> からパス <new> にファイルを再配置させます。"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<old>=<new>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "パッケージ間のファイルの競合を無視します。"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "既に存在するパッケージでも再インストールします。"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "インストールせずに、テストのみを行います。"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "パッケージをアップグレードします。"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "すべてのパッケージについて問い合わせ/検証します。"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "rpm の署名検査モード"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "<file> を所有しているパッケージを問い合わせ/検証します。"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "グループに所属するパッケージを問い合わせ/検証します。"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "パッケージファイルの問い合わせ/検証をします。"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "パッケージ ID で問い合わせ/検証します。"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "ヘッダー ID でパッケージを問い合わせ/検証します。"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "rpm 問い合わせモード"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "ヘッダー インスタンスの問い合わせ/検証をします。"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 "インストール トランザクションからのパッケージの問い合わせ/検証をします。"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "パッケージによってトリガーされるパッケージを問い合わせます。"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "RPM 検証モード"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "依存性を要求するパッケージの問い合わせ/検証をします。"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "依存性を提供するパッケージの問い合わせ/検証をします。"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "引数を glob パターンとしてみなしません。"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "リスト内の非パッケージファイルを処理しません。"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "全ての設定ファイルを列挙します。"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "全てのドキュメントファイルを列挙します。"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "全てのドキュメントファイルを列挙します。"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "全ての設定ファイルを列挙します。"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "基本的なファイル情報をダンプします。"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "パッケージ中のファイルを列挙します。"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "%%ghost ファイルをスキップします。"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "%%ghost ファイルをスキップします。"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "列挙したファイルの状態を表示します。"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "ファイル容量を検証しません。"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "ファイルのシンボリックリンクを検証しません。"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "ファイルの所有者を検証しません。"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "ファイルの所有グループを検証しません。"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "ファイルの最終更新日を検証しません。"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "ファイルのモードを検証しません。"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "ファイルのケーパビリティ (capability) を検証しません。"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "ファイルのセキュリティ コンテキストを検証しません。"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "ファイルのケーパビリティ (capability) を検証しません。"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "パッケージ中のファイルを検証しません。"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "パッケージの依存関係を検証しません。"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "検証スクリプトを実行しません。"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "%s の rpmlib 機能が見つかりません:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "ソースパッケージが期待されますが、これはバイナリパッケージです\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "ソースパッケージに .spec ファイルがありません\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "アーカイブの伸長に失敗%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr ": ファイル "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s: ファイル %s で失敗: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s: 失敗: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "不正な書式: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(ファイルが含まれていません)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "通常          "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "置換          "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "未インストール"
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "ネット共有    "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "間違った色    "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(状態なし)    "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(未知の %3d)  "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "パッケージはファイル所有者/グループ一覧を持っていません。\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "パッケージはファイル所有者も id リストも持っていません\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "グループ %s に属するパッケージは存在しません。\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "%s をトリガーするパッケージが存在しません。\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "不正な %s の指定: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "%s に一致するパッケージは存在しません: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "%s を必要とするパッケージは存在しません。\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "%s を提供するパッケージは存在しません。\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "ファイル %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "ファイル %s はどのパッケージにも属していません。\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "無効なパッケージ番号: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "レコード %u は読み込めませんでした\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "パッケージ %s はインストールされていません。\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "不明なタグ: \"%s\"\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s: キー %d のインポートに失敗しました。\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s: キー %d は ASCII 形式の公開鍵ではありません。\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: インポート読み込みに失敗しました(%d)。\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr "%s: headerRead に失敗しました: %s\n"
+msgid "Fread failed: %s"
+msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
-"%s: 不変のヘッダー領域が読み込めませんでした。パッケージが壊れていません"
-"か?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "OK ではありません。"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr "(見つからない鍵:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr "(信頼できない鍵:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: オープンに失敗しました: %s\n"
@@ -2457,215 +2821,445 @@ msgstr "ルート ディレクトリーの変更に失敗しました: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "ルート ディレクトリーの復元に失敗しました: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "失われたインデックス %d を生成しています、お待ちください...\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "dbpath が設定されていません\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: スキップします。"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "エラー(%d) - レコード #%d を %s に格納時\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: 正規表現に失敗しました: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp に失敗しました: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: スキップします。"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr ""
+"rpmdb: 破損したヘッダーインスタンス #%u を取得しました。スキップします。\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: ヘッダーを読むことができません (0x%x)\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "dbpath が設定されていません。"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "ディレクトリー %s の作成に失敗しました: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "データベース中のヘッダー #%u は不正です -- スキップします。\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "元々 %u にあったレコードを追加できません。\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "データベースの再構築に失敗: オリジナルのデータベースは残っています。\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "古いデータベースを新しいデータベースで置き換えるのに失敗!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NO "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "YES"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 "「PreReq:」「Provides:」「Obsoletes:」の依存関係をサポートしたバージョン。"
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 "ファイル名が、パスではなく (dirName, baseName, dirIndex) の組で格納されます。"
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "パッケージ ペイロードが bzip2 を用いて圧縮できます。"
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr "パッケージ ペイロードが xz を用いて圧縮できます。"
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr "パッケージ ペイロードが lzma を用いて圧縮できます。"
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr "パッケージ ペイロードが lzma を用いて圧縮できます。"
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "パッケージ ペイロード ファイルが「./」接頭語を持っています。"
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "「パッケージ名-バージョン-リリース」が暗黙で提供されません。"
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "ヘッダー タグが読み込まれた後、常にソートされます。"
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "スクリプト インタプリターがヘッダーから引数を使用できます。"
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "ハードリンク ファイル群が完全でなくてもインストールできます。"
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+"インストール中に、パッケージスクリプトが rpm データベースにアクセスできます。"
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "lua スクリプトの内部サポート。"
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr "ファイルのダイジェストアルゴリズムはパッケージ毎の設定です"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "POSIX..1e ファイル ケーパビリティ (capability) のためのサポート"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr "パッケージのスクリプトはインストール時間を長くすることができます。"
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr "依存性の比較はチルダを持つバージョンをサポートします"
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "パッケージ ペイロード ファイルが「./」接頭語を持っています。"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "不正なマジック"
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "「パッケージ名-バージョン-リリース」が暗黙で提供されません。"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "不正な/不可読なヘッダー"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "ヘッダー タグが読み込まれた後、常にソートされます。"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "ヘッダーサイズが大きすぎます。"
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "ã\82¹ã\82¯ã\83ªã\83\97ã\83\88 ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\83¼ã\81\8cã\83\98ã\83\83ã\83\80ã\83¼ã\81\8bã\82\89å¼\95æ\95°ã\82\92使ç\94¨ã\81§ã\81\8dã\81¾ã\81\99ã\80\82"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\82¢ã\83¼ã\82«ã\82¤ã\83\96ã\81®ã\81\9fã\82\81ã\81«å¤§ã\81\8dã\81\99ã\81\8eã\81¾ã\81\99"
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "ハードリンク ファイル群が完全でなくてもインストールできます。"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "不明なファイルタイプ"
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
-"インストール中に、パッケージスクリプトが rpm データベースにアクセスできます。"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "lua スクリプトの内部サポート。"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "ダイジェストが適合しません"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr "ファイルのダイジェストアルゴリズムはパッケージ毎の設定です"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "内部エラー"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "POSIX..1e ファイル ケーパビリティ (capability) のためのサポート"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "アーカイブファイルがヘッダーにありません。"
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr "パッケージのスクリプトはインストール時間を長くすることができます。"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr "失敗 - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "%s のオープンに失敗: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: RPM パッケージ(またはパッケージのリスト)ではありません。\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr "更新中 / インストール中...\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr "整理中 / 削除中...\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "準備しています..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr "パッケージの準備中..."
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "依存性の欠如:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: RPM パッケージ(またはパッケージのリスト)ではありません: %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s をインストールできません。\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "%s を取得中\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "%s をスキップします - 転送に失敗しました\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "パッケージ %s は再配置できません。\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "ファイル %s の読み込みエラー\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "\"%s\" は複数のパッケージを指定しています:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "%s を開けません: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "%s をインストール中です。\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "rpm パッケージではありません。"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "署名の種類が正しくありません。"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "サポートしていない RPM パッケージのバージョンです。"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "読み込みの失敗: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "rpm パッケージではありません。\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "%s ロックを(%s 上に)作成できません。(%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "%s ロックを待っています。(%s 上)\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr "%s のdlopenに失敗しました。%s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "シンボル %s の解決に失敗: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "%%__collection_%s マクロの拡張に失敗しました。\n"
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "%s プラグインは読み込まれていません。\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr "%s プラグインのシンボル %s の解決に失敗: %s\n"
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "異なる"
@@ -2745,639 +3339,353 @@ msgstr "%s は %s%s によって不要とされています"
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "不明なエラー %d がパッケージ %s 操作中に発生しました"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "2番目の ':' がありません (%s:%d で)\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "%s:%d にアーキテクチャ名がありません\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "%s:%d でデータ行が不完全です\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "%s:%d でデータ行に引数が多すぎます\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "不正な arch/os 番号: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "%s:%d で不完全なデフォルト行\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "%s:%d でデフォルト行に引数が多すぎます\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "':' がありません (0x%02x が見つかった) (%s:%d)\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "%s の引数がありません (%s:%d)\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr "%s が開けません (%s:%d): %m\n"
 
-#: lib/rpmrc.c:536
+#: lib/rpmrc.c:564
 #, c-format
 msgid "missing architecture for %s at %s:%d\n"
 msgstr "%s 用のアーキテクチャが見つかりません (%s:%d)\n"
 
-#: lib/rpmrc.c:603
+#: lib/rpmrc.c:632
 #, c-format
 msgid "bad option '%s' at %s:%d\n"
 msgstr "不正なオプションです: '%s' (%s:%d)\n"
 
-#: lib/rpmrc.c:927
+#: lib/rpmrc.c:972
 msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
+"補助ベクトルの読み込みに失敗しました、/proc がマウントされていないですか?\n"
 
-#: lib/rpmrc.c:1349
+#: lib/rpmrc.c:1469
 #, c-format
 msgid "Unknown system: %s\n"
 msgstr "不明なシステム: %s\n"
 
-#: lib/rpmrc.c:1350
+#: lib/rpmrc.c:1471
 #, c-format
 msgid "Please contact %s\n"
-msgstr "%s に連絡してください。\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "%s を読み込み用に開けません: %m。\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr "カレントディレクトリを戻せません: %m"
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "<lua> スクリプトは組み込みでサポートしていません\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "%s の一時ファイルを作成できませんでした: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "ファイル ディスクリプターの複製ができません: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "%s スクリプトの実行に失敗しました。waitpid (%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s スクリプトの実行に失敗しました。シグナル %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "%s スクリプトの実行に失敗しました。終了ステータス %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "不明な書式"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "インストール"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "削除"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "%s にある Package データベースを開けません。\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "パッケージラベル中に余分な「(」があります: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "パッケージラベル中に「(」がありません: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "パッケージラベル中に「)」がありません: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: 公開鍵の読み込みに失敗しました。\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "トランザクション"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "署名の容量 (%d): 異常、read が %d を返しました\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "署名の目印: 不正\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "署名タグ: 異常、タグの数 (%d) が範囲外です。\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "署名データ: 異常、バイト数 (%d) が範囲外です。\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "署名 blob(%d): 異常、read が %d を返しました。\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "署名タグ[%d]: 不正、タグ %d タイプ %d オフセット %d カウント %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "署名の読み込み: 不正。\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "署名の pad 容量(%zd): 異常、%zd バイト読み込みました。\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "署名の容量(%zd): 異常、fstat(2) に失敗しました。\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-"不変なヘッダー領域を読むことができませんでした。パッケージが壊れていません"
-"か?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr "RPM v3 パッケージを署名できません\n"
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5 ダイジェスト:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "ヘッダー SHA1 ダイジェスト:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "ヘッダー "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr "署名の検証: 不正なパラメーター (%d %p %d %p %p)\n"
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "スキップした"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "失敗"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "%c %s が見つかりません。"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "%s のための依存性を満たしていません。\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr "無効なフィールド幅"
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "% の後に { がありません。"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "%{ の後に } がありません。"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "空のタグフォーマット"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "空のタグ名"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "不明なタグ"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "配列の後に ] が期待されます。"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "予期せぬ ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "予期せぬ }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "式中で ? が期待されます。"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "式中で ? の後に { が期待されます。"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "式中に } が期待されます。"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "? サブ式の後に : が期待されます。"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "式中で : の後に { が期待されます。"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "式の終わりに | が期待されます。"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "配列の繰り返し指定が、サイズが異なる配列の間で使用されています"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "失われたインデックス %d を生成しています、お待ちください...\n"
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "%s インデックスを db%d で開けません - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr "エラー(%d) \"%s\" レコードの %s インデックスから取得中: %s\n"
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "dbpath が設定されていません\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: スキップします。"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "エラー(%d) - レコード #%d を %s に格納時\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: 正規表現に失敗しました: %s\n"
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp に失敗しました: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: スキップします。"
-
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr ""
-"rpmdb: 破損したヘッダーインスタンス #%u を取得しました。スキップします。\n"
-
-#: lib/rpmdb.c:2250
-#, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr "エラー(%d:%s) - %s インデックスから次のキー取得時\n"
-
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "エラー(%d) - ヘッダー #%d レコードの追加時\n"
-
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "エラー(%d) - ヘッダー #%d レコードの削除時\n"
-
-#: lib/rpmdb.c:2382
-#, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: ヘッダーを読むことができません (0x%x)\n"
+msgstr "%s に連絡してください。\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "エラー(%d) - \"%s\" のレコード設定時 (%s インデックスから)\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "%s を読み込み用に開けません: %m。\n"
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "エラー(%d) - レコード \"%s\" を %s に格納時\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "エラー(%d) - レコード \"%s\" を %s から削除時\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "エラー(%d) - 新しいパッケージインスタンスの割り当て時\n"
+msgid "Unable to restore current directory: %m"
+msgstr "カレントディレクトリを戻せません: %m"
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "<lua> スクリプトは組み込みでサポートしていません\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "エラー(%d) - レコード \"%s\" 取得時 (%s インデックスから)\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "%s の一時ファイルを作成できませんでした: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "ã\82¨ã\83©ã\83¼(%d) - ã\83¬ã\82³ã\83¼ã\83\89 %s ã\82\92 %s ã\81«ã\82¹ã\83\88ã\82¢æ\99\82\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "ã\83\95ã\82¡ã\82¤ã\83« ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®è¤\87製ã\81\8cã\81§ã\81\8dã\81¾ã\81\9bã\82\93: %s: %s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "dbpath が設定されていません。"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "ディレクトリー %s の作成に失敗しました: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s スクリプトの実行に失敗しました。waitpid (%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "データベース中のヘッダー #%u は不正です -- スキップします。\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s スクリプトの実行に失敗しました。シグナル %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "元々 %u にあったレコードを追加できません。\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s スクリプトの実行に失敗しました。終了ステータス %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr "データベースの再構築に失敗: オリジナルのデータベースは残っています。\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "不明な書式"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "古いデータベースを新しいデータベースで置き換えるのに失敗!\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "インストール"
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "復元するには %s 内のファイルを %s 内のファイルで置き換えて下さい"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "削除"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "ディレクトリー %s の削除に失敗しました: %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "%s にある Package データベースを開けません。\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d エラー (%d) (%s において): %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "パッケージラベル中に余分な「(」があります: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d エラー (%d): %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "パッケージラベル中に「(」がありません: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "%sロックを獲得できません (%s/%s)\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "パッケージラベル中に「)」がありません: %s\n"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "共有"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: 公開鍵の読み込みに失敗しました。\n"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "排他"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "トランザクション"
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr "不正なインデックス形式 %x が %s/%s にあります\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "不明なデータベースオプション: \"%s\" は無視します。\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s には不正な数値があります。スキップします\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s には大き/小さ過ぎるlong値があります。スキップします\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s には大き/小さ過ぎる整数値があります。スキップします\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "%s に対するポリシーのデコードに失敗しました\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "%s の一時ファイルの作成に失敗しました: %s\n"
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "%s ポリシーをファイル %s に書き込みに失敗しました\n"
+msgid "%s%s"
+msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr "semanage ハンドルの作成に失敗しました。\n"
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "ポリシーのハンドラーへの接続に失敗しました\n"
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "ポリシーのトランザクションの開始に失敗しました: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr "一時ポリシーファイル %s の削除に失敗しました: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "ヘッダー "
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "ポリシーモジュールのインストールに失敗しました: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "ポリシーモジュールの削除に失敗しました: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "署名ヘッダーの再読み込みができません。\n"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "プロセスのフォークに失敗: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "スキップした"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "%s の実行に失敗しました。%s\n"
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "失敗"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "%s が異常終了しました。\n"
+msgid "Duplicate username or UID for user %s\n"
+msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "%s が終了コード %i で失敗しました\n"
-
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "ポリシーの変更を確定した際にエラーが発生しました。\n"
-
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "restorecon パスの展開に失敗しました"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
-"ファイルシステムのリラベルに失敗しました。ファイルはミスラベルされたかもしれ"
-"ません。\n"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
-"ファイルのコンテキストの再読み込みに失敗しました。ファイルは違うラベルがつけ"
-"られたかもしれません。\n"
 
-#: plugins/sepolicy.c:594
+#: lib/verify.c:448
 #, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "%s からのポリシーの展開に失敗しました。\n"
+msgid "missing   %c %s"
+msgstr "%c %s が見つかりません。"
 
-#: rpmio/macro.c:185
+#: lib/verify.c:503
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== 有効 %d 空 %d\n"
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "%s のための依存性を満たしていません。\n"
+
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
+msgstr ""
+
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
+
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(空)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(空)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "ã\83\9eã\82¯ã\83­ %%%s ã\81¯ã\83\9cã\83\87ã\82£ã\81\8cçµ\82端ã\81\97ていません。\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "ã\83\9eã\82¯ã\83­ %%%s ã\81¯ã\82ªã\83\97ã\82·ã\83§ã\83³ã\81\8cçµ\82端ã\81\95ã\82\8cていません。\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "マクロ %%%s は不正な名前です (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "マクロ %%%s はボディが終端していません。\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "マクロ %%%s はオプションが終端されていません。\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "マクロ %%%s のボディは空です。\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "マクロ %%%s の展開に失敗しました。\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "マクロ %%%s は不正な名前です (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "マクロ %%%s (%s) はレベル %d 未満で使用されませんでした。\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "不明なオプション %c (%s(%s)中に)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
@@ -3385,165 +3693,282 @@ msgstr ""
 "マクロ展開の再帰呼び出しが深すぎます。これは再帰的マクロ定義が原因で発生して"
 "いる可能性があります。\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "終端されていない %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "%% の後ろに構文解析できないマクロが続いています。\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== 有効 %d 空 %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "一時ファイル %s の作成に失敗しました: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "ファイル %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "ファイル %s は %u バイトより小さくなっています。\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "ディレクトリーの作成に失敗しました"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[なし]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(エラーなし)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "致命的なエラー: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "エラー: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "警告: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "lua スクリプトで不正な文法がありました: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "lua スクリプトで不正な文法がありました: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "lua スクリプトに失敗しました: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "lua ファイルに不正な文法がありました: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "lua のフックに失敗しました: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[なし]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(エラーなし)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "致命的なエラー: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "エラー: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "警告: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "メモリ割り当て (%u バイト) が NULL を返しました。\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s、鍵 ID %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(なし)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite に失敗しました: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread に失敗しました: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush に失敗しました: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr "サポートされない PGP 署名\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr "サポートされない PGP ハッシュアルゴリズム %u\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr "サポートされない PGP 公開鍵アルゴリズム %u\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "%s を実行できませんでした: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "署名のためのパイプ作成ができません: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "gpg の実行に失敗しました (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg が署名を書き込むのに失敗しました。\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "署名を読み込めませんでした。\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp に失敗しました。\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr "%s はすでに同一の署名を含みます、スキップしています\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead に失敗しました: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature に失敗しました: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: headerRead に失敗しました: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "RPM v3 パッケージを署名できません\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s はすでに同一の署名を含みます、スキップしています\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature に失敗しました: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead に失敗しました: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "%s の置換に失敗: %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: manifest の読み込みに失敗: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "ヘッダーとペイロード署名を検証しません。"
index 3bde072b55acc4ed7165cee2f6c09dbada526fec..3d4ea3567866ac2ba5114142591be14bf19ae8b6 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -7,10 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Korean (http://www.transifex.com/rpm-team/rpm/language/ko/)\n"
 "Language: ko\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,493 +43,555 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "실행에 실패했습니다\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "인수 값으로 RPM 패키지가 지정되어야 합니다\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "패키지의 헤더를 읽는 도중 오류가 발생했습니다\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "payload를 다시 열 수 없음: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "질의 옵션 (-q 또는 --query 옵션과 함께 사용):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "검증 옵션 (-V 또는 --verify 옵션과 함께 사용):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "설치/업그레이드/삭제 옵션:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "질의/검증 유형은 각각 다른 유형과 동시에 수행할 수 있습니다"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "부적절한 질의 플래그 입니다"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "부적절한 질의 형식 입니다"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "부적절한 질의 소스 입니다"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "하나의 주(major) 모드만 지정할 수 있습니다"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "패키지 설치시에만 파일을 재배치할 수 있습니다"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr ""
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate 와 --excludepath 옵션은 최신의 패키지를 설치할 때에만 사용할 수 있"
-"습니다"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix 옵션은 최신의 패키지를 설치할 때에만 사용할 수 있습니다"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "--prefix 옵션의 인수는 반드시 '/' 로 시작해야 합니다"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs 옵션은 패키지 설치시에만 지정할 수 있습니다"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs 옵션은 패키지 설치시에만 지정할 수 있습니다"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs 옵션은 패키지 설치시에만 지정할 수 있습니다"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "--excludedocs 와 --includedocs 옵션만 지정할 수 있습니다"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch 옵션은 패키지 설치시에만 지정할 수 있습니다"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos 옵션은 패키지 설치시에만 지정할 수 있습니다"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize 옵션은 패키지 설치시에만 지정할 수 있습니다"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches 옵션은 패키지 삭제시에만 지정할 수 있습니다"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles 옵션은 패키지 설치시에만 지정할 수 있습니다"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb 옵션은 패키지 설치와 삭제시에만 지정할 수 있습니다"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr "스크립트 해제 옵션은 패키지 설치와 삭제시에만 지정할 수 있습니다"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr "트리거 해제 옵션은 패키지 설치와 삭제시에만 지정할 수 있습니다"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "--root (-r) 옵션의 인수는 반드시 '/' 로 시작해야 합니다"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "삭제할 패키지가 지정되지 않았습니다"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "설치할 패키지가 지정되지 않았습니다"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "질의에 필요한 인수가 지정되지 않았습니다"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "검증에 필요한 인수가 지정되지 않았습니다"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot는 이미 지정되어 있습니다, %s(을)를 무시합니다\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr "<spec파일>의 %prep (소스를 풀고 패치를 적용하는 과정)으로 제작합니다"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<spec파일>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "<spec파일>의 %build (%prep과 컴파일하는 과정)으로 제작합니다"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr "<spec파일>의 %install (%prep, %build와 설치하는 과정)으로 제작합니다"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "<spec파일>의 %files 항목(section)을 검사합니다"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "<spec파일>로 소스와 바이너리 패키지를 제작합니다"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "<spec파일>로 바이너리 패키지 만을 제작합니다"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "<spec파일>로 소스 패키지 만을 제작합니다"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<소스 패키지>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"<소스 패키지>를 %install (%prep, %build와 설치하는 과정)으로 제작합니다"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr "<tar파일>을 %prep (소스를 풀고 패치를 적용하는 과정)으로 제작합니다"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tar파일>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "<tar파일>을 %build (%prep과 컴파일하는 과정)으로 제작합니다"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "<tar파일>을 %install (%prep, %build와 설치하는 과정)으로 제작합니다"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "<tar파일>의 %files 항목(section)을 검사합니다"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "<tar파일>로 소스와 바이너리 패키지를 제작합니다"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "<tar파일>로 바이너리 패키지 만을 제작합니다"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "<tar파일>로 소스 패키지 만을 제작합니다"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "<소스 패키지>로 바이너리 패키지를 제작합니다"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<소스 패키지>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"<소스 패키지>를 %install (%prep, %build와 설치하는 과정)으로 제작합니다"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "buildroot를 교체(override)합니다"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "패키지 제작 후에 소스 파일을 풀고 작업한 디렉토리를 삭제합니다"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ExcludeArch를 무시함: spec 파일에서 지정(directive)됩니다"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "컴퓨터의 상태(state) 파일을 디버그 합니다"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "패키지 제작의 어떠한 단계도 실행하지 않습니다"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "패키지 제작 의존성을 검사하지 않습니다"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "spec파일의 i18N msgstr을 사용(accept)하지 않습니다"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "패키지 제작 후에 소스 파일을 삭제합니다"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "패키지 제작 후에 spec파일을 삭제합니다"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "지정된 단계로 바로 진행합니다 (c,i 에서만 사용 가능)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "목표대상(target) 플랫폼을 교체(override)합니다"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 "다음과 함께 사용하는 제작 옵션 [ <spec파일> | <tar파일> | <소스 패키지> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "%s spec 파일을 열 수 없음: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "tar 파이프를 여는데 실패함: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "%s에서 spec 파일을 읽는데 실패했습니다\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "%s의 이름을 %s(으)로 변경하는데 실패함: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "%s의 상태(stat)를 표시하는데 실패함: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "%s 파일은 정규(regular) 파일이 아닙니다.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "%s 파일은 spec 파일이 아닌 것 같습니다.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "목표대상(target) 플랫폼으로 제작 중: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "%s(을)를 제작하고 있습니다\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "--root (-r) 옵션의 인수는 반드시 '/' 로 시작해야 합니다"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "데이터베이스를 초기화 합니다"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "설치된 패키지 헤더에서 상반된 목록(inverted lists)의 데이터베이스를 재구축 합"
 "니다"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "데이터베이스 파일을 검사합니다"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "데이터베이스 옵션:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "하나의 주(major) 모드만 지정할 수 있습니다"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "질의 옵션 (-q 또는 --query 옵션과 함께 사용):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "검증 옵션 (-V 또는 --verify 옵션과 함께 사용):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "설치/업그레이드/삭제 옵션:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "질의/검증 유형은 각각 다른 유형과 동시에 수행할 수 있습니다"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "부적절한 질의 플래그 입니다"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "부적절한 질의 형식 입니다"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "부적절한 질의 소스 입니다"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "패키지 설치시에만 파일을 재배치할 수 있습니다"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr ""
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate 와 --excludepath 옵션은 최신의 패키지를 설치할 때에만 사용할 수 있"
+"습니다"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix 옵션은 최신의 패키지를 설치할 때에만 사용할 수 있습니다"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "--prefix 옵션의 인수는 반드시 '/' 로 시작해야 합니다"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs 옵션은 패키지 설치시에만 지정할 수 있습니다"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs 옵션은 패키지 설치시에만 지정할 수 있습니다"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs 옵션은 패키지 설치시에만 지정할 수 있습니다"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "--excludedocs 와 --includedocs 옵션만 지정할 수 있습니다"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch 옵션은 패키지 설치시에만 지정할 수 있습니다"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos 옵션은 패키지 설치시에만 지정할 수 있습니다"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize 옵션은 패키지 설치시에만 지정할 수 있습니다"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches 옵션은 패키지 삭제시에만 지정할 수 있습니다"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles 옵션은 패키지 설치시에만 지정할 수 있습니다"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb 옵션은 패키지 설치와 삭제시에만 지정할 수 있습니다"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr "스크립트 해제 옵션은 패키지 설치와 삭제시에만 지정할 수 있습니다"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr "트리거 해제 옵션은 패키지 설치와 삭제시에만 지정할 수 있습니다"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "삭제할 패키지가 지정되지 않았습니다"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "설치할 패키지가 지정되지 않았습니다"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "질의에 필요한 인수가 지정되지 않았습니다"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "검증에 필요한 인수가 지정되지 않았습니다"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr ""
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr ""
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "서명 옵션:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "%s(을)를 실행할 수 없음: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "매크로 파일 안에 반드시 \"%%_gpg_name\"을 설정해야 합니다\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "패스 구문(pass phrase) 입력: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "패스 구문(pass phrase)이 일치합니다.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "다음의 질의 형식을 사용하십시요"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -538,32 +600,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "실행 중(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "%s의 실행에 실패함 (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "%s의 잘못된 종료 상황 (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -573,783 +640,920 @@ msgstr ""
 "\n"
 "RPM 제작 오류:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "'==' 을 처리(parsing)하는 도중 구문 오류가 발생했습니다\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "'&&' 을 처리(parsing)하는 도중 구문 오류가 발생했습니다\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "'||' 을 처리(parsing)하는 도중 구문 오류가 발생했습니다\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "표현식에서 오류가 발생했습니다\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "'(' 가 일치하지 않습니다\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "'-' 는 숫자에만 사용합니다\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "'!' 는 숫자에만 사용합니다\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "유형은 반드시 일치해야 합니다\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "'* /' 는 문자열에서 사용할 수 없습니다\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "'-' 는 문자열에서 사용할 수 없습니다\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "'&&' 와 '||' 는 문자열에서 사용할 수 없습니다\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "표현식에서 구문 오류가 발생했습니다\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "%s %s에 '(' 가 없습니다\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "%s(%s에 ')' 가 없습니다\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "부적합한 %s 토큰: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "%2$s %3$s에 %1$s 가 없습니다\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "%s() 다음에 공백이 없음: %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "잘못된 구문: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "잘못된 모드 spec: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "잘못된 dir모드 spec: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "파일은 반드시 \"/\" 로 시작해야함: %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "파일 목록이 중복됨: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "BuildRoot에 심볼릭링크함: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "파일을 찾을 수 없음: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "파일은 \"/\" 로 시작해야함: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "glob으로 파일을 찾을 수 없음: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "행: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "glob으로 파일을 찾을 수 없음: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "잘못된 파일: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "잘못된 소유자/그룹: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "호스트명을 정규화(canonicalize) 할 수 없음: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "%s에 payload를 작성할 수 없음: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "%s의 payload를 읽을 수 없음: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "호스트명을 정규화(canonicalize) 할 수 없음: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "고정 헤더 영역(immutable header region)을 생성할 수 없습니다.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "임시 파일을 열 수 없습니다.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "임시(temp) 헤더를 작성할 수 없습니다\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "%s에서 spec 파일을 읽는데 실패했습니다\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "잘못된 CSA 데이터\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "서명(signature) 헤더를 다시 읽어올 수 없습니다.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "%s(을)를 열 수 없음: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "패키지를 작성할 수 없음: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "서명할 대상 %s(을)를 열 수 없음: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "%s의 헤더를 읽을 수 없음: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "%s에 헤더를 작성할 수 없음: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "작성: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "%s 패키지의 출력 파일명을 생성할 수 없음: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "%s(을)를 생성할 수 없음: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "%d 번째 행: 두번째 %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "%%changelog 항목(entry)은 반드시 '*' 로 시작해야 합니다\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "%%changelog 항목(entry)이 완전하지 않습니다\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "%%changelog에 잘못된 날짜: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog가 날짜(chronological) 순으로 되어있지 않습니다\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "%%changelog에 이름이 빠져있습니다\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "%%changelog에 내용(description)이 없습니다\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "%d 번째 행: %%description에서 오류가 발생했습니다: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "%d 번째 행: %s(은)는 잘못된 옵션입니다: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "%d 번째 행: 이름이 너무 많습니다: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "%d 번째 행: 패키지가 존재하지 않습니다: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "%d 번째 행: 두번째 내용(description)\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "%d 번째 행: %%files에서 오류가 발생했습니다: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "%d 번째 행: 잘못된 숫자입니다: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "%d 번째 행: %s(은)는 잘못된 숫자입니다: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "아키텍쳐가 제외됨: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "아키텍쳐가 포함되어 있지 않음: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "운영체제가 제외됨: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "운영체제가 포함되어 있지 않음: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "패키지에 반드시 %s 항목(field)을 포함해야함: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "패키지에 %s 항목(entry)이 중복되어 있음: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "%s 아이콘을 열 수 없음: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "%s 아이콘을 읽을 수 없음: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "알 수 없는 아이콘 유형: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "%d 번째 행: 태그에 하나의 토큰만 있습니다: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "%d 번째 행: 올바르지 못한 태그입니다: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "%d 번째 행: 태그가 비어있습니다: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "%d 번째 행: Prefixes는 절대 \"/\" 로 끝나서는 안됩니다: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "%d 번째 행: Docdir은 반드시 '/' 로 시작해야 합니다: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "%d 번째 행: 잘못된 %s: 수식자(qualifier): %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "%d 번째 행: 잘못된 BuildArchitecture 형식입니다: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "내부 오류: 보거스(Bogus) 태그 %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "잘못된 패키지 지정: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "패키지가 이미 존재함: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "%d 번째 행: 알 수 없는 태그입니다: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "잘못된 소스: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "%%setup에서 오류 발생: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "%d 번째 행: %%setup에 잘못된 인수가 있습니다: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "%d 번째 행: %%setup에 잘못된 %s 옵션: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "%d 번째 행: 두번째 %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "%d 번째 행: 트리거는 반드시 '--' 를 포함해야 합니다: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "%d 번째 행: %s에서 오류가 발생했습니다: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "%d 번째 행: 스크립트 프로그램은 반드시 '/' 로 시작해야 합니다: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "%d 번째 행: 두번째 %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "%d 번째 행: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "%s(을)를 열 수 없음: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: %%else가 %%if 없이 사용되었습니다\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: %%endif가 %%if 없이 사용되었습니다\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "패키지 제작에 호환하는 아키텍쳐를 찾을 수 없습니다\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "패키지에 %%description이 없음: %s\n"
@@ -1420,451 +1624,562 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "%s(을)를 실행할 수 없음: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "%s(을)를 fork 할 수 없음: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "%s(을)를 찾는데 실패함:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 "%s spec 파일을 질의하는데 실패했습니다, 파일을 처리(parse)할 수 없습니다\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(오류 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "잘못된 magic 입니다"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "잘못된/읽을 수 없는 헤더입니다"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "인증되지 않은 db 옵션: \"%s\"(을)를 무시합니다.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "헤더의 크기가 너무 큽니다"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s(은)는 부적합한 수치 값입니다, 생략합니다\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s(은)는 너무 크거나 너무 적은 정수(long) 값입니다, 생략합니다\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s(은)는 너무 크거나 너무 적은 정수(int) 값입니다, 생략합니다\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "%2$s/%3$s의 잠금된(lock) %1$s(을)를 얻을 수 없습니다\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "공유됨"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "폐쇄적(exclusive)"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "알 수 없는 파일 유형입니다"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "하드 링크를 찾을 수 없습니다"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "내부 오류"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "헤더에 아카이브 파일이 없습니다"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " 실패함 - "
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "새로운 패키지를 배치하는 도중 오류(%d)가 발생했습니다\n"
 
-#: lib/depends.c:68
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(BLOB[Binary Large OBject]이 아닙니다)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(숫자가 아닙니다)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr ""
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(부적합한 타입)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr ""
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(base64가 아닙니다)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(부적합한 타입)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(BLOB[Binary Large OBject]이 아닙니다)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "%s 사용자가 존재하지 않습니다 - root를 이용합니다\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "%s 그룹이 존재하지 않습니다 - root를 이용합니다\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s(이)가 %s(으)로 저장되었습니다\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s(이)가 %s(으)로 생성되었습니다\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1833
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1841
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1876
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1885
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1890
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1909
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:452
+#: lib/header.c:1949
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:362
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:384
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: 유효한 서명이 없습니다\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "태그 형식이 비어있습니다"
 
-#: lib/package.c:581
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "태그 이름이 비어있습니다"
+
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: headerRead failed: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "배열의 끝부분에 ']' 가 와야합니다"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "불필요한 ']' 가 있습니다"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "불필요한 '}' 가 있습니다"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "표현식에 '?' 가 와야합니다"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "표현식의 '?' 뒤에 '{' 가 와야합니다"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "표현식에 '}' 가 와야합니다"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "'?' 하부표현식(subexpression) 뒤에 ':' 이 와야합니다"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "표현식의 ':' 뒤에 '{' 가 와야합니다"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "표현식의 끝부분에 '|' 가 와야합니다"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread이 실패했습니다: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
-msgid "MACRO"
+#: lib/poptALL.c:195
+msgid "MACRO"
+msgstr ""
+
+#: lib/poptALL.c:197
+msgid "print macro expansion of EXPR"
+msgstr ""
+
+#: lib/poptALL.c:198
+msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:173
-msgid "print macro expansion of EXPR"
+#: lib/poptALL.c:200
+msgid "Specify target platform"
 msgstr ""
 
-#: lib/poptALL.c:174
-msgid "'EXPR'"
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "질의 태그를 보여줍니다"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "현재 설정되어 있는 rpmrc의 내용과 매크로를 보여줍니다"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "자세한 출력을 제공합니다"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "아주 상세한 출력을 제공합니다"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "현재 사용되고 있는 rpm 버전을 표시합니다"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "rpmio 입/출력을 디버그 합니다"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1885,13 +2200,13 @@ msgstr "재배치시에는 반드시 '=' 을 포함해야 합니다"
 msgid "relocations must have a / following the ="
 msgstr "재배치시에는 반드시 '=' 뒤에 '/' 가 와야 합니다"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "특정 파일을 생략하기 위한 설정이 적용된 경우에도, 패키지 안의 모든 파일을 설"
 "치합니다"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1899,155 +2214,165 @@ msgstr ""
 "<패키지> 이름과 일치하는 패키지는 모두 제거합니다 (<패키지>에 여러개의 패키지"
 "를 동시에 지정할 경우에는 오류가 발생합니다)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "패키지를 (제거) 삭제합니다"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<패키지>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "패키지에 포함된 문서 파일을 설치하지 않습니다"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "<경로>로 시작되는 파일은 설치하지 않습니다 "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<경로>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "--replacepkgs 와 --replacefiles 옵션을 동시에 사용합니다"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "기존에 설치된 패키지를 업그레이드 합니다"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<패키지파일>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 "패키지 설치를 해시마크(#)로 표시합니다 (-v 옵션과 함께 사용하는 것이 좋습니"
 "다)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "패키지의 아키텍쳐를 검사하지 않습니다"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "패키지의 운영체제를 검사하지 않습니다"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "패키지를 설치하기 전에 디스크 공간을 검사하지 않습니다"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "패키지에 포함된 문서 파일을 설치합니다"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "파일시스템을 변경하지 않고, 데이터베이스를 갱신합니다"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "패키지의 의존성을 검사하지 않습니다"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "의존성이 있는 패키지를 설치하도록 재요구하지 않습니다"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "패키지 스크립틀릿(scriptlet)을 실행하지 않습니다"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "%%pre 스크립틀릿(scriptlet)을 실행하지 않습니다 (있을 경우)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "%%post 스크립틀릿(scriptlet)을 실행하지 않습니다 (있을 경우)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "%%preun 스크립틀릿(scriptlet)을 실행하지 않습니다 (있을 경우)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "%%postun 스크립틀릿(scriptlet)을 실행하지 않습니다 (있을 경우)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 "이 패키지에 의해 생성되는(triggered) 어떠한 스크립틀릿(scriptlet)도 실행하지 "
 "않습니다"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "어떠한 %%triggerprein 스크립틀릿(scriptlet)도 실행하지 않습니다"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "어떠한 %%triggerin 스크립틀릿(scriptlet)도 실행하지 않습니다"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "어떠한 %%triggerun 스크립틀릿(scriptlet)도 실행하지 않습니다"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "어떠한 %%triggerpostun 스크립틀릿(scriptlet)도 실행하지 않습니다"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2055,369 +2380,408 @@ msgstr ""
 "이전 버전의 패키지로 다운그레이드 합니다 (--force 옵션을 사용시에는 이 옵션"
 "이 자동으로 적용됩니다)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "패키지 설치를 퍼센트(%)로 표시합니다"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 "재배치 기능이 있는 패키지의 경우, 지정한 <디렉토리>로 재배치하여 설치합니다"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<디렉토리>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "<이전경로>에서 <새로운경로>로 파일을 재배치 합니다"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<이전경로>=<새로운경로>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "패키지가 이미 설치되어 있는 경우에도 설치합니다"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "패키지를 설치하지 않고, 제대로 설치되는지만 확인합니다"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "패키지를 업그레이드 합니다"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "모든 패키지에 대해 질의/검증합니다"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "파일이 들어있는 패키지에 대해 질의/검증 합니다"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "그룹 안의 패키지를 질의/검증 합니다"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "패키지 식별자(identifier)를 사용하여 패키지를 질의/검증 합니다"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "헤더 식별자(identifier)를 사용하여 패키지를 질의/검증 합니다"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "rpm 질의 모드"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "설치 내용을 통해 패키지를 질의/검증 합니다"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "패키지로 인해 생성되는(triggered) 패키지에 대해 질의합니다"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "rpm 검증 모드"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "의존성을 필요로 하는 패키지에 대해 질의/검증 합니다"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "의존성을 제공하는 패키지에 대해 질의/검증 합니다"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "모든 설정 파일을 나열합니다"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "모든 문서 파일을 나열합니다"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "모든 문서 파일을 나열합니다"
+msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "모든 설정 파일을 나열합니다"
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "기본 파일 정보를 보여줍니다"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "패키지 안의 파일을 나열합니다"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "%%ghost 파일을 생략합니다"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "%%ghost 파일을 생략합니다"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "나열된 파일의 상태(state)를 보여줍니다"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "파일의 용량을 검사하지 않습니다"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "파일의 심볼릭 링크 경로를 검사하지 않습니다"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "파일의 소유자를 검사하지 않습니다"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "파일의 그룹을 검사하지 않습니다"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "파일의 최종 변경 시간을 검사하지 않습니다"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "파일의 모드를 검사하지 않습니다"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "패키지 안의 파일을 검사하지 않습니다"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "패키지의 의존성을 검사하지 않습니다"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "소스 패키지가 필요하며, 바이너리가 검색되었습니다\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "소스 패키지에 .spec 파일이 포함되어 있지 않습니다\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "아카이브를 푸는데 실패함%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " 다음 파일의 "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%2$s 파일의 %1$s(이)가 실패함: %3$s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s(이)가 실패함: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "올바르지 못한 형식: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "정상(normal)        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "교체됨(replaced)    "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "설치되어 있지 않음  "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "net 공유됨          "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(상태를 알 수 없음) "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(알 수 없는 %3d)    "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "패키지에 파일 소유자 또는 id 목록이 없습니다\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "%s 그룹은 어떤 패키지에도 포함되어 있지 않습니다\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "%s(을)를 생성하는(trigger) 패키지가 없습니다\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "%s(이)가 잘못됨: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "%s(와)과 일치하는 패키지가 없음: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "%s(을)를 필요로 하는 패키지가 없습니다\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "%s(을)를 제공하는 패키지가 없습니다\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "%s 파일: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "%s 파일은 어떤 패키지에도 들어있지 않습니다\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "부적합한 패키지 번호: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "%s 패키지가 설치되어 있지 않습니다\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "올바르지 않음"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "확인"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (키를 찾을 수 없음:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (키를 신뢰할 수 없음:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: 여는데 실패했습니다: %s\n"
@@ -2442,212 +2806,442 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "db경로가 설정되어 있지 않습니다\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: 0x%x의 헤더를 읽을 수 없습니다\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "db경로가 설정되어 있지 않습니다"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "%u에 처음부터 레코드를 추가할 수 없습니다\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"데이터베이스를 재구축하는데 실패함: 원본 데이터베이스는 그대로 유지됩니다\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "이전 데이터베이스를 새로운 데이터베이스로 교체하는데 실패했습니다!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "아니오"
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "예"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr ""
+
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr ""
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr ""
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr ""
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr ""
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr ""
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr ""
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr ""
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr ""
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr ""
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr ""
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "잘못된 magic 입니다"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "잘못된/읽을 수 없는 헤더입니다"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "헤더의 크기가 너무 큽니다"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "알 수 없는 파일 유형입니다"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "내부 오류"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "헤더에 아카이브 파일이 없습니다"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " 실패함 - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "%s(을)를 여는데 실패함: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "준비 중..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s(은)는 설치할 수 없습니다\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "%s(을)를 복구합니다\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "%s 파일을 읽는 도중 오류가 발생했습니다\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "%s(을)를 열 수 없음: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "%s(을)를 설치합니다\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr ""
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr ""
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "읽는데 실패함: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr ""
@@ -2722,798 +3316,633 @@ msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 "%2$s 패키지를 처리하는 과정에서 알 수 없는 오류 %1$d(이)가 발생했습니다"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "%s에 두번째 ':' 이 없음:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "%s에 아키텍쳐명이 없음:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "%s의 데이터 항목(line)이 불충분함:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "%s의 데이터 항목(line)에 인수가 너무 많음:%d\n"
 
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr "잘못된 아키텍쳐/운영체제 번호: %s (%s:%d)\n"
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr "%s의 기본 항목(line)이 불충분함:%d\n"
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr "%s의 기본 항목(line)에 인수가 너무 많음:%d\n"
-
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "%2$s에 ':' (0x%1$02x 찾음) 이 없음:%3$d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "%2$s에 %1$s(을)를 위한 인수가 없음:%3$d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr ""
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "%2$s에 %1$s(을)를 위한 아키텍쳐가 없음:%3$d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "%2$s에 잘못된 '%1$s' 옵션:%3$d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "알 수 없는 시스템: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "%s 안의 패키지 데이터베이스를 열 수 없습니다\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr ""
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr ""
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "'%' 뒤에 '{' 가 없습니다"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "'%{' 뒤에 '}' 가 없습니다"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "태그 형식이 비어있습니다"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "태그 이름이 비어있습니다"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "알 수 없는 태그 입니다"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "배열의 끝부분에 ']' 가 와야합니다"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "불필요한 ']' 가 있습니다"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "불필요한 '}' 가 있습니다"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "표현식에 '?' 가 와야합니다"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "표현식의 '?' 뒤에 '{' 가 와야합니다"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "표현식에 '}' 가 와야합니다"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "'?' 하부표현식(subexpression) 뒤에 ':' 이 와야합니다"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "표현식의 ':' 뒤에 '{' 가 와야합니다"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "표현식의 끝부분에 '|' 가 와야합니다"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
+#: lib/rpmrc.c:382
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr "잘못된 아키텍쳐/운영체제 번호: %s (%s:%d)\n"
 
-#: lib/rpmdb.c:191
+#: lib/rpmrc.c:413
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "db%2$d(을)를 이용하여 %1$s 인덱스를 열 수 없습니다 - %3$s (%4$d)\n"
+msgid "Incomplete default line at %s:%d\n"
+msgstr "%s의 기본 항목(line)이 불충분함:%d\n"
 
-#: lib/rpmdb.c:516
+#: lib/rpmrc.c:418
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
+msgid "Too many args in default line at %s:%d\n"
+msgstr "%s의 기본 항목(line)에 인수가 너무 많음:%d\n"
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "db경로가 설정되어 있지 않습니다\n"
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "%2$s에 ':' (0x%1$02x 찾음) 이 없음:%3$d\n"
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr ""
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
+msgstr "%2$s에 %1$s(을)를 위한 인수가 없음:%3$d\n"
 
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:564
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr ""
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "%2$s에 %1$s(을)를 위한 아키텍쳐가 없음:%3$d\n"
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:632
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr ""
+msgid "bad option '%s' at %s:%d\n"
+msgstr "%2$s에 잘못된 '%1$s' 옵션:%3$d\n"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr ""
+msgid "Unknown system: %s\n"
+msgstr "알 수 없는 시스템: %s\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/rpmdb.c:2382
-#, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: 0x%x의 헤더를 읽을 수 없습니다\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "새로운 패키지를 배치하는 도중 오류(%d)가 발생했습니다\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:353
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+msgid "Fwrite failed: %s"
 msgstr ""
-"%3$s 인덱스에서 \"%2$s\" 레코드를 얻는 도중 오류(%1$d)가 발생했습니다\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:371
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "%3$s(으)로 %2$s 레코드를 저장하는 도중 오류(%1$d)가 발생했습니다\n"
-
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "db경로가 설정되어 있지 않습니다"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:375
 #, c-format
-msgid "failed to create directory %s: %s\n"
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:378
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
-#, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "%u에 처음부터 레코드를 추가할 수 없습니다\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
-"데이터베이스를 재구축하는데 실패함: 원본 데이터베이스는 그대로 유지됩니다\n"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "이전 데이터베이스를 새로운 데이터베이스로 교체하는데 실패했습니다!\n"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:100
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "복구하기 위해 %2$s의 파일을 %1$s의 파일로 교체합니다"
+msgid "cannot open Packages database in %s\n"
+msgstr "%s 안의 패키지 데이터베이스를 열 수 없습니다\n"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:199
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "%s 디렉토리를 삭제하는데 실패함: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "%3$s의 db%1$d 오류(%2$d): %4$s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:225
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d 오류(%d): %s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "%2$s/%3$s의 잠금된(lock) %1$s(을)를 얻을 수 없습니다\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "공유됨"
+msgid "%s: reading of public key failed.\n"
+msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "폐쇄적(exclusive)"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "인증되지 않은 db 옵션: \"%s\"(을)를 무시합니다.\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s(은)는 부적합한 수치 값입니다, 생략합니다\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s(은)는 너무 크거나 너무 적은 정수(long) 값입니다, 생략합니다\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s(은)는 너무 크거나 너무 적은 정수(int) 값입니다, 생략합니다\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:231
-#, c-format
-msgid "Failed to write %s policy to file %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:268
+#, c-format
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "서명(signature) 헤더를 다시 읽어올 수 없습니다.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== %d 활성 %d 비어있음\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(비어있음)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(비어있음)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "매크로 %%%s에 종료되지 않은 내용(body)이 있습니다\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "매크로 %%%s에 종료되지 않은 옵션이 있습니다\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "매크로 %%%s에 부적합한 이름이 있습니다 (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "매크로 %%%s에 종료되지 않은 내용(body)이 있습니다\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "매크로 %%%s에 종료되지 않은 옵션이 있습니다\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "매크로 %%%s에 비어있는 내용(body)이 있습니다\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "매크로 %%%s(을)를 확장(expand)하는데 실패했습니다\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "매크로 %%%s에 부적합한 이름이 있습니다 (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "매크로 %%%s (%s)는 레벨 %d 이하에서는 사용할 수 없습니다\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "%2$s(%3$s)에 알 수 없는 옵션 %1$c(이)가 있습니다\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "%c(이)가 종료되지 않음: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "'%%' 다음에 처리할 수 없는(unparseable) 매크로가 있습니다\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== %d 활성 %d 비어있음\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "%s 파일: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "%s 파일이 %u 바이트 보다 적습니다\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(오류 없음)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "치명적 오류: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "오류: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "경고: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "메모리 할당 값 (%u 바이트)이 NULL을 반환하였습니다.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(오류 없음)"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "치명적 오류: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "오류: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "경고: "
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "메모리 할당 값 (%u 바이트)이 NULL을 반환하였습니다.\n"
+msgid "error creating fifo %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite이 실패했습니다: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread이 실패했습니다: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "%s(을)를 실행할 수 없음: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg 서명을 작성하는데 실패했습니다\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "서명을 읽을 수 없습니다\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead이 실패했습니다: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature이 실패했습니다: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead이 실패했습니다: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: 읽는데 실패했습니다: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 37968479de5906d61b674c7989c828b1d61bdff8..7863cc81333808d8020b4bfe6cc8039a5c7b6083 100644 (file)
--- a/po/ms.po
+++ b/po/ms.po
@@ -7,10 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Malay (http://www.transifex.com/rpm-team/rpm/language/ms/)\n"
 "Language: ms\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,962 +43,1097 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr ""
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr ""
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr ""
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr ""
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr ""
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr ""
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr ""
-
-#: rpmqv.c:128
-msgid "unexpected query format"
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
 msgstr ""
 
-#: rpmqv.c:131
-msgid "unexpected query source"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
 msgstr ""
 
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
 msgstr ""
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
 msgstr ""
 
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:170
+#: rpmbuild.c:161
+#, c-format
 msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
 msgstr ""
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
 
-#: rpmqv.c:230
+#: rpmbuild.c:167 rpmbuild.c:208
 msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr ""
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr ""
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr ""
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr ""
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr ""
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr ""
-
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr ""
-
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
 
-#: rpmbuild.c:129
+#: rpmbuild.c:170
 #, c-format
-msgid "verify %files section from <specfile>"
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr ""
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr ""
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr ""
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
+#: rpmbuild.c:212
+msgid "override build root"
 msgstr ""
 
-#: rpmbuild.c:171
-msgid "override build root"
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
 
-#: rpmbuild.c:173
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr ""
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr ""
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr ""
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr ""
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr ""
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr ""
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr ""
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr ""
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr ""
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr ""
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr ""
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr ""
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr ""
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr ""
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr ""
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr ""
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "memulakan pengkalan data"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "sahkan fail pengkalan data"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr ""
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr ""
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
-msgid "sign package(s)"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
 msgstr ""
 
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
 msgstr ""
 
-#: rpmsign.c:29
-msgid "delete package signatures"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
 msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Tidak dapat melaksana %s: %s\n"
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr ""
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
+#: rpmqv.c:126
+msgid "unexpected query flags"
 msgstr ""
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
+#: rpmqv.c:129
+msgid "unexpected query format"
 msgstr ""
 
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
+#: rpmqv.c:132
+msgid "unexpected query source"
 msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
 msgstr ""
 
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
 msgstr ""
 
-#: rpmspec.c:28
-msgid "query spec file(s)"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
 msgstr ""
 
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
 
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
-msgid "use the following query format"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
 msgstr ""
 
-#: rpmspec.c:45
-msgid "Spec options:"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmspec.c:90
-msgid "no arguments given for parse"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
 msgstr ""
 
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:126
-#, c-format
-msgid "Unable to open stream: %s\n"
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:161
-#, c-format
-msgid "Executing(%s): %s\n"
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:168
-#, c-format
-msgid "Exec of %s failed (%s): %s\n"
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
 msgstr ""
 
-#: build/build.c:177
-#, c-format
-msgid "Error executing scriptlet %s (%s)\n"
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:184
-#, c-format
-msgid "Bad exit status from %s (%s)\n"
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:291
-msgid ""
-"\n"
-"\n"
-"RPM build errors:\n"
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
 msgstr ""
 
-#: build/expression.c:216
-msgid "syntax error while parsing ==\n"
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
 msgstr ""
 
-#: build/expression.c:246
-msgid "syntax error while parsing &&\n"
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
 msgstr ""
 
-#: build/expression.c:255
-msgid "syntax error while parsing ||\n"
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
 msgstr ""
 
-#: build/expression.c:305
-msgid "parse error in expression\n"
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
 msgstr ""
 
-#: build/expression.c:337
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr ""
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr ""
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr ""
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr ""
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr ""
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr ""
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr ""
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr ""
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr ""
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr ""
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr ""
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr ""
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr ""
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr ""
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr ""
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr ""
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr ""
+
+#: build/build.c:125
+#, c-format
+msgid "Unable to open stream: %s\n"
+msgstr ""
+
+#: build/build.c:158
+#, c-format
+msgid "Executing(%s): %s\n"
+msgstr ""
+
+#: build/build.c:163
+#, c-format
+msgid "Exec of %s failed (%s): %s\n"
+msgstr ""
+
+#: build/build.c:172
+#, c-format
+msgid "Error executing scriptlet %s (%s)\n"
+msgstr ""
+
+#: build/build.c:178
+#, c-format
+msgid "Bad exit status from %s (%s)\n"
+msgstr ""
+
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
+msgid ""
+"\n"
+"\n"
+"RPM build errors:\n"
+msgstr ""
+
+#: build/expression.c:215
+msgid "syntax error while parsing ==\n"
+msgstr ""
+
+#: build/expression.c:245
+msgid "syntax error while parsing &&\n"
+msgstr ""
+
+#: build/expression.c:254
+msgid "syntax error while parsing ||\n"
+msgstr ""
+
+#: build/expression.c:304
+msgid "parse error in expression\n"
+msgstr ""
+
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr ""
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr ""
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr ""
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr ""
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr ""
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr ""
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr ""
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr ""
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr ""
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr ""
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr ""
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr ""
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
-#, c-format
-msgid "Bad file: %s: %s\n"
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2039 build/parsePrep.c:33
+#: build/files.c:2657
 #, c-format
-msgid "Bad owner/group: %s\n"
+msgid "Bad file: %s: %s\n"
 msgstr ""
 
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
 msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
 msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "gagal untuk mencipta direktori %s: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr ""
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr ""
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr ""
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr ""
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr ""
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr ""
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr ""
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
+#: build/parseFiles.c:33
 #, c-format
-msgid "line %d: Second description\n"
+msgid "line %d: Error parsing %%files: %s\n"
 msgstr ""
 
-#: build/parseFiles.c:33
+#: build/parseFiles.c:73
 #, c-format
-msgid "line %d: Error parsing %%files: %s\n"
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
@@ -1006,356 +1141,425 @@ msgstr ""
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr ""
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr ""
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:674
 #, c-format
-msgid "Package has no %%description: %s\n"
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
 msgstr ""
 
-#: build/policies.c:87
+#: build/parseSpec.c:710
 #, c-format
-msgid "Policy module '%s' duplicated with overlapping types\n"
+msgid "line %d: %%end doesn't take any arguments: %s\n"
 msgstr ""
 
-#: build/policies.c:93
+#: build/parseSpec.c:717
 #, c-format
-msgid "Base modules '%s' and '%s' have overlapping types\n"
+msgid "line %d: %%end not expected here, no section to close: %s\n"
 msgstr ""
 
-#: build/policies.c:101
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr ""
+
+#: build/parseSpec.c:912
+#, c-format
+msgid "Package has no %%description: %s\n"
+msgstr ""
+
+#: build/policies.c:87
+#, c-format
+msgid "Policy module '%s' duplicated with overlapping types\n"
+msgstr ""
+
+#: build/policies.c:93
+#, c-format
+msgid "Base modules '%s' and '%s' have overlapping types\n"
+msgstr ""
+
+#: build/policies.c:101
 msgid "Failed to get policies from header\n"
 msgstr ""
 
@@ -1411,450 +1615,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr ""
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
 msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
 msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
 msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "terkongsi"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
 msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
 msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr ""
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr ""
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr ""
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr ""
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr ""
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
+
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:149
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
+
+#: lib/header.c:1797
 #, c-format
-msgid "skipping %s with unverifiable signature\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1805
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1841
+#, c-format
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1876
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1885
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1890
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1900
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1909
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
+
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1949
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:436
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "format tag kosong"
+
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "nama tag kosong"
+
+#: lib/headerfmt.c:413
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "unknown tag: \"%s\""
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] dijangka dipenghujung tatasusunan"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
+#: lib/headerfmt.c:455
+msgid "unexpected }"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? dijangka dalam ungkapan"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
 msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "| dijangka dalam ungkapan"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "| dijangka selepas ungkapan ?"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr ""
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| dijangka pada penghujung ungkapan"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
 msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr ""
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr ""
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr ""
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr ""
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr ""
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1875,527 +2190,576 @@ msgstr ""
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr ""
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr ""
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr ""
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr ""
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr ""
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr ""
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr ""
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr ""
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr ""
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr ""
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr ""
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr ""
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr ""
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr ""
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr ""
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr ""
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr ""
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/poptQV.c:176
+#: lib/poptQV.c:197
 msgid "list all license files"
 msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+msgid "list all artifact files"
+msgstr ""
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr ""
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr ""
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr ""
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr ""
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr ""
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr ""
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr ""
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr ""
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr ""
 
-#: lib/psm.c:941
+#: lib/query.c:108
 #, c-format
-msgid "%s failed on file %s: %s\n"
+msgid "incorrect format: %s\n"
 msgstr ""
 
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
-#, c-format
-msgid "incorrect format: %s\n"
-msgstr ""
-
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr ""
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr ""
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr ""
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr ""
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr ""
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr ""
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr ""
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr ""
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr ""
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr ""
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr ""
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr ""
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr ""
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "OK"
-msgstr "OK"
-
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ""
-msgstr ""
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
 msgstr ""
 
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
+#: lib/rpmchecksig.c:268
+msgid "OK"
+msgstr "OK"
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr ""
@@ -2420,1075 +2784,1141 @@ msgstr "Tidak dapat untuk menukar direktori root: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "NO "
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "YES"
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
 msgstr ""
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
 msgstr ""
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
-msgstr ""
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec gagal: %s\n"
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp gagal: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
 msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
 msgstr ""
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "gagal untuk mencipta direktori %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
 msgstr ""
 
-#: lib/rpmgi.c:136
-#, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+#: lib/rpmds.c:744
+msgid "NO "
 msgstr ""
 
-#: lib/rpminstall.c:141
-#, c-format
-msgid "Updating / installing...\n"
+#: lib/rpmds.c:744
+msgid "YES"
 msgstr ""
 
-#: lib/rpminstall.c:143
-#, c-format
-msgid "Cleaning up / removing...\n"
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
 msgstr ""
 
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
 msgstr ""
 
-#: lib/rpminstall.c:542
-#, c-format
-msgid "package %s is not relocatable\n"
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
 msgstr ""
 
-#: lib/rpminstall.c:706
-#, c-format
-msgid "Installing %s\n"
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmlead.c:123
-#, c-format
-msgid "read failed: %s (%d)\n"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmds.c:1410
 #, c-format
-msgid "waiting for %s lock on %s\n"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpmprob.c:109
-msgid "different"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpmprob.c:118
+#: lib/rpmds.c:1544
 #, c-format
-msgid "package %s is intended for a %s operating system"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmprob.c:130
-#, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmprob.c:135
+#: lib/rpmfi.c:810
 #, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:140
+#: lib/rpmfi.c:817
 #, c-format
-msgid "package %s (which is newer than %s) is already installed"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:145
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmprob.c:155
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmprob.c:159
-#, c-format
-msgid "%s is needed by %s%s"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
 msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
 msgstr ""
 
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
 msgstr ""
 
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
 msgstr ""
 
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
 msgstr ""
 
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
+#: lib/rpmfi.c:2389
+msgid " failed - "
 msgstr ""
 
-#: lib/rpmrc.c:390
+#: lib/rpmfi.c:2392
 #, c-format
-msgid "Too many args in default line at %s:%d\n"
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmrc.c:495
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgid "open of %s failed: %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmgi.c:144
 #, c-format
-msgid "missing argument for %s at %s:%d\n"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:523
+#: lib/rpmgi.c:155
 #, c-format
-msgid "cannot open %s at %s:%d: %m\n"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmrc.c:536
+#: lib/rpminstall.c:142
 #, c-format
-msgid "missing architecture for %s at %s:%d\n"
+msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpmrc.c:603
+#: lib/rpminstall.c:144
 #, c-format
-msgid "bad option '%s' at %s:%d\n"
+msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+#: lib/rpminstall.c:193
+msgid "Preparing..."
 msgstr ""
 
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Sistem tidak diketahui: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Sila hubungi %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Tidak dapat membuka %s untuk dibaca: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpmscript.c:221
+#: lib/rpminstall.c:323
 #, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:248
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgid "%s cannot be installed\n"
 msgstr ""
 
-#: lib/rpmscript.c:272
+#: lib/rpminstall.c:490
 #, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgid "Retrieving %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:276
+#: lib/rpminstall.c:502
 #, c-format
-msgid "%s scriptlet failed, signal %d\n"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpmscript.c:279
+#: lib/rpminstall.c:572
 #, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpmts.c:92
+#: lib/rpminstall.c:603
 #, c-format
-msgid "cannot open Packages database in %s\n"
+msgid "error reading from file %s\n"
 msgstr ""
 
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "'(' tambahan dalam label pakej: %s\n"
-
-#: lib/rpmts.c:209
+#: lib/rpminstall.c:697
 #, c-format
-msgid "missing '(' in package label: %s\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpmts.c:217
+#: lib/rpminstall.c:736
 #, c-format
-msgid "missing ')' in package label: %s\n"
+msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: lib/rpmts.c:273
+#: lib/rpminstall.c:742
 #, c-format
-msgid "%s: reading of public key failed.\n"
+msgid "Installing %s\n"
 msgstr ""
 
-#: lib/rpmts.c:1087
-msgid "transaction"
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
 msgstr ""
 
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "magik sigh: BURUK\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/signature.c:107
+#: lib/rpmlead.c:118
 #, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+msgid "read failed: %s (%d)\n"
 msgstr ""
 
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/signature.c:196
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "muatan sigh: BURUK\n"
-
-#: lib/signature.c:219
+#: lib/rpmlock.c:133
 #, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpmplugins.c:65
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
+#: lib/rpmplugins.c:73
+#, c-format
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "Digest SHA1 pengepala:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Pengepala"
-
-#: lib/signature.c:530
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "skipped"
+#: lib/rpmplugins.c:199
+#, c-format
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "failed"
+#: lib/rpmprob.c:109
+msgid "different"
 msgstr ""
 
-#: lib/verify.c:372
+#: lib/rpmprob.c:114
 #, c-format
-msgid "missing   %c %s"
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmprob.c:118
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Kebergantungan tidak dipenuhi untuk %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "hilang { selepas %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "hilang } selepas %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "format tag kosong"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "nama tag kosong"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "tag tidak diketahui"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] dijangka dipenghujung tatasusunan"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/headerfmt.c:435
-msgid "unexpected }"
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
 msgstr ""
 
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? dijangka dalam ungkapan"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
+#: lib/rpmprob.c:125
+#, c-format
+msgid "path %s in package %s is not relocatable"
 msgstr ""
 
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "| dijangka dalam ungkapan"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "| dijangka selepas ungkapan ?"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| dijangka pada penghujung ungkapan"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
+#: lib/rpmprob.c:135
+#, c-format
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/rpmdb.c:97
+#: lib/rpmprob.c:140
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/rpmdb.c:191
+#: lib/rpmprob.c:145
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/rpmdb.c:516
+#: lib/rpmprob.c:155
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
 msgstr ""
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmprob.c:163
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmprob.c:167
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec gagal: %s\n"
+msgid "%s is obsoleted by %s%s"
+msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmprob.c:172
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp gagal: %s\n"
+msgid "unknown error %d encountered while manipulating package %s"
+msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmrc.c:222
+#, c-format
+msgid "missing second ':' at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:225
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "missing architecture name at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:370
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "Incomplete data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:375
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "Too many args in data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:382
 #, c-format
-msgid "error(%d) removing header #%d record\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:413
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
+msgid "Incomplete default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:418
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:523
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+msgid "missing argument for %s at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d) allocating new package instance\n"
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+msgid "missing architecture for %s at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2660
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
+msgid "bad option '%s' at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "gagal untuk mencipta direktori %s: %s\n"
+msgid "Unknown system: %s\n"
+msgstr "Sistem tidak diketahui: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "Please contact %s\n"
+msgstr "Sila hubungi %s\n"
+
+#: lib/rpmrc.c:1604
+#, c-format
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Tidak dapat membuka %s untuk dibaca: %m.\n"
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:138
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
+#: lib/rpmscript.c:278
+#, c-format
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmscript.c:313
 #, c-format
-msgid "replace files in %s with files from %s to recover"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/rpmscript.c:353
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "gagal untuk membuang direktori %s: %s\n"
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmscript.c:371
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "ralat db%d (%d) dari %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmscript.c:375
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "ralat db%d (%d): %s\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "terkongsi"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
 
-#: lib/backend/db3.c:582
-#, c-format
-msgid "invalid index type %x on %s/%s\n"
+#: lib/rpmte.c:730
+msgid "erase"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmts.c:100
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "cannot open Packages database in %s\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmts.c:199
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr ""
+msgid "extra '(' in package label: %s\n"
+msgstr "'(' tambahan dalam label pakej: %s\n"
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmts.c:217
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmts.c:225
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmts.c:284
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s: reading of public key failed.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:152
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:158
+#, c-format
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:178
+#, c-format
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: plugins/sepolicy.c:306
+#: lib/rpmvs.c:188
 #, c-format
-msgid "Failed to begin policy transaction: %s\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: plugins/sepolicy.c:337
+#: lib/rpmvs.c:195
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: plugins/sepolicy.c:386
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to execute %s: %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
+
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Pengepala"
+
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
+
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr ""
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr ""
+
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:263
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:284
+#, c-format
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: lib/verify.c:503
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Kebergantungan tidak dipenuhi untuk %s:\n"
+
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktif %d kosong %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(kosong)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(kosong)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Makro %%%s gagal untuk mengembang\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Pilihan tidak diketahui %c dalam %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktif %d kosong %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr ""
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(tiada ralat)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "ralat maut:"
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "ralat"
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "skrip lua gagal: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "pautan lua gagal: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(tiada ralat)"
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "ralat maut:"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "ralat"
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
 msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:54
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
+msgid "error creating temp directory %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error creating fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not exec %s: %s\n"
+msgstr "Tidak dapat melaksana %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
+#, c-format
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "Pelaksanaan gpg gagal (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
 msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: gagal membaca manifest: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index e900472871eb500fa42411416d357492c0fbc1e1..182fd2cbfa31c9c4250d490d8663db414e38ba29 100644 (file)
--- a/po/nb.po
+++ b/po/nb.po
@@ -7,10 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Norwegian Bokmål (http://www.transifex.com/rpm-team/rpm/"
+"language/nb/)\n"
 "Language: nb\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,528 +44,595 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "kjøring feilet\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "argumentet er ikke en RPM-pakke\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "feil under lesing av header fra pakke\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "kan ikke gjenåpne \"payload\": %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
+msgstr "Feil under lesing av spec fil fra %s\n"
 
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
+"bygg gjennom %prep (pakk ut kildekoden og legg til patcher) fra <specfil>"
 
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
+msgstr "<specfil>"
 
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "én type spørring/verifisering kan utføres om gangen"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "uventede flagg for spørring"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "ventet spørringsformat"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "uventet spørringskilde"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "kun ett større modi kan spesifiseres"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
 msgstr ""
 
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "filer kan kun omplasseres under pakkeinstallasjon"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
+msgstr "bygg kilde- og binærpakker fra <specfil>"
 
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr ""
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
+msgstr "spør pakke som eier <fil>"
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
 msgstr ""
-"--relocate og --excludepath kan kun brukes ved installasjon av nye pakker"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix kan kun brukes ved installasjon av nye pakker"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "argumenter til --prefix må begynne med en /"
 
-#: rpmqv.c:170
+#: rpmbuild.c:161
+#, c-format
 msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"skript som slår av alternativer kan kun spesifiseres under pakkeinstallasjon "
-"og sletting"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<kildepakke>"
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
-"alternativer som slår av utløsing  kan kun spesifiseres under "
-"pakkeinstallasjon, og sletting"
 
-#: rpmqv.c:230
+#: rpmbuild.c:167 rpmbuild.c:208
 msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr ""
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
 
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "ingen pakker oppgitt for installering"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "ingen argumenter oppgitt for spørring"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "ingen argumenter oppgitt for verifisering"
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr "Feil under lesing av spec fil fra %s\n"
-
-#: rpmbuild.c:120
+#: rpmbuild.c:170
 #, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-"bygg gjennom %prep (pakk ut kildekoden og legg til patcher) fra <specfil>"
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr "<specfil>"
-
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmbuild.c:129
-#, c-format
-msgid "verify %files section from <specfile>"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
-msgstr "bygg kilde- og binærpakker fra <specfil>"
-
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
-msgstr "spør pakke som eier <fil>"
-
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "bygg gjennom %prep (pakk ut kildekoden og legg til patcher) fra <tarball>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "verifiser %files seksjon fra <tarball>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "bygg kilde- og binærpakker fra <tarball>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "bygg binær-pakke fra <kildepakke>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<kildepakke>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
+#: rpmbuild.c:212
+msgid "override build root"
 msgstr ""
 
-#: rpmbuild.c:171
-msgid "override build root"
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
 
-#: rpmbuild.c:173
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "fjern byggtreet når ferdig"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr ""
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr ""
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr ""
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "fjern kildekoden når ferdig"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr ""
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "hopp rett til spesifisert steg (kun for c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr ""
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Kunne ikke åpne spec fil %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Kunne ikke åpne tar-rør: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Feil under lesing av spec-fil fra %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Feil under endring av navn fra %s til %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "kunne ikke kjøre stat på %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Fil %s er ikke en vanlig fil.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Fil %s ser ikke ut til å være en spec-fil.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Bygger målplattformene: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Bygger for mål %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr ""
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "initier database"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr "gjenoppbygg database inverterte lister fra installerte pakkers headere"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr ""
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr ""
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "kun ett større modi kan spesifiseres"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
-msgid "sign package(s)"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
 msgstr ""
 
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
 msgstr ""
 
-#: rpmsign.c:29
-msgid "delete package signatures"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
 msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr ""
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "én type spørring/verifisering kan utføres om gangen"
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
-msgstr ""
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "uventede flagg for spørring"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Skriv inn passord: "
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "ventet spørringsformat"
 
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Passord er ok.\n"
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "uventet spørringskilde"
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
 msgstr ""
 
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
-msgstr ""
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "filer kan kun omplasseres under pakkeinstallasjon"
 
-#: rpmspec.c:28
-msgid "query spec file(s)"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
 msgstr ""
 
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
+"--relocate og --excludepath kan kun brukes ved installasjon av nye pakker"
 
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix kan kun brukes ved installasjon av nye pakker"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "argumenter til --prefix må begynne med en /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
-msgid "use the following query format"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmspec.c:45
-msgid "Spec options:"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
 
-#: rpmspec.c:90
-msgid "no arguments given for parse"
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:126
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr ""
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"skript som slår av alternativer kan kun spesifiseres under pakkeinstallasjon "
+"og sletting"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"alternativer som slår av utløsing  kan kun spesifiseres under "
+"pakkeinstallasjon, og sletting"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr ""
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "ingen pakker oppgitt for installering"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "ingen argumenter oppgitt for spørring"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "ingen argumenter oppgitt for verifisering"
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr ""
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr ""
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr ""
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr ""
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr ""
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr ""
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr ""
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr ""
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr ""
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr ""
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr ""
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr ""
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr ""
+
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Kjører(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Kjøring av %s feilet (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Ugyldig sluttstatus fra %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -574,799 +642,936 @@ msgstr ""
 "\n"
 "RPM-feil under bygging:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "syntaksfeil under lesing av ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "syntaksfeil under lesing av &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "syntaksfeil under lesing av ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "feil under lesing av uttrykk\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "ubalansert (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- kun på tall\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! kun på tall\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "typene må være like\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / ikke støttet for strenger\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- ikke støttet for strenger\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& og || ikke støttet for strenger\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "syntaksfeil i uttrykk\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Mangler '(' i %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Mangler ')' i %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Ugyldig %s-tegn: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Filen må begynne med \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Fil listet to ganger: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Symbolsk lenke peker til BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Fil ikke funnet: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "Installerer %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Ugyldig fil %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Ugyldig eier/gruppe: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Kunne ikke skrive \"payload\" til %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Kunne ikke lese \"payload\" fra %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Kunne ikke åpne spec fil %s: %s\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Feil under lesing av spec-fil fra %s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Ugyldige CSA-data\n"
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Kunne ikke åpne %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Kunne ikke skrive pakke: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Kunne ikke åpne sigmål %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Kunne ikke åpne spec fil %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Kunne ikke skrive header til %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Skrev: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr ""
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "linje %d: Ugyldig flagg %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr ""
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr ""
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "linje %d: Feil under lesing av %%filer: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "linje %d: Ugyldig nummer: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "linje %d: Ugyldig %s-nummer: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "%s-felt må være tilstede i pakken: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Kunne ikke åpne ikon %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Kan ikke lese ikon %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Ukjent ikontype: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "linje %d: Tagg tar kun et enkelt tegn: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "linje %d: Feilutformet tagg: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "linje %d: Tom tagg: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "linje %d: Prefiks må ikke slutte på \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "linje %d: Docdir må begynne med '/': %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "linje %d: Ugyldig %s: kvalifikatorer: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "linje %d: Ugyldig BuildArchitecture format: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Intern feil: Ugyldig tag %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Ugyldig pakkespesifikasjon: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Pakke eksisterer allerede: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "linje %d: Ukjent tagg: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "kunne ikke opprette %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Feil under lesing av %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "linje %d: Ugyldig argument til %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "linje %d: Ugyldig %%setup flagg %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "linje %d: %%prep for andre gang\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "linje %d: triggere må ha --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "linje %d: Feil under lesing av %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "linje %d: skriptprogram må begynne med '/': %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "linje %d: Andre %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "linje %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Kan ikke åpne %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: %%else uten %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: %%endif uten %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
-msgstr "Ingen kompatible arkitekturer funnet for bygging\n"
-
-#: build/parseSpec.c:703
+#: build/parseSpec.c:645
 #, c-format
-msgid "Package has no %%description: %s\n"
-msgstr "Pakken har ingen %%description: %s\n"
+msgid "encoding %s not supported by system\n"
+msgstr ""
 
-#: build/policies.c:87
+#: build/parseSpec.c:674
 #, c-format
-msgid "Policy module '%s' duplicated with overlapping types\n"
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
 msgstr ""
 
-#: build/policies.c:93
+#: build/parseSpec.c:710
 #, c-format
-msgid "Base modules '%s' and '%s' have overlapping types\n"
+msgid "line %d: %%end doesn't take any arguments: %s\n"
 msgstr ""
 
-#: build/policies.c:101
-msgid "Failed to get policies from header\n"
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr "Ingen kompatible arkitekturer funnet for bygging\n"
+
+#: build/parseSpec.c:912
+#, c-format
+msgid "Package has no %%description: %s\n"
+msgstr "Pakken har ingen %%description: %s\n"
+
+#: build/policies.c:87
+#, c-format
+msgid "Policy module '%s' duplicated with overlapping types\n"
+msgstr ""
+
+#: build/policies.c:93
+#, c-format
+msgid "Base modules '%s' and '%s' have overlapping types\n"
+msgstr ""
+
+#: build/policies.c:101
+msgid "Failed to get policies from header\n"
 msgstr ""
 
 #: build/policies.c:154
@@ -1421,450 +1626,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Kunne ikke kjøre %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "klarte ikke å åpne %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Klarte ikke å finne %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(feil 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Ugyldig magi"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Ugyldig/ulesbar header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "For stor header"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Ukjent filtype"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Mangler hard(e) lenke(er)"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:810
+msgid "shared"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Intern feil"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " feilet - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr ""
 
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
+#: lib/formats.c:44
+msgid "(not a string)"
 msgstr ""
 
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
 msgstr ""
 
-#: lib/formats.c:314
-msgid "(not base64)"
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
+#: lib/formats.c:253
+msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s lagret som %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s opprettet som %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
+
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Ingen signatur tilgjengelig\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr ""
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr ""
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr ""
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr ""
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr ""
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr ""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread feilet: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "vis kjente tagger for spørring"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "vis endelig rpmrc og makrokonfigurasjon"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "gi mindre detaljert info"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "gi mer detaljert info"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "skriv ut hvilken versjon av rpm som brukes"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "feilsøk rpmio I/U"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1885,11 +2201,11 @@ msgstr "relokasjoner må inneholde et ="
 msgid "relocations must have a / following the ="
 msgstr "relokasjoner må ha et / etter ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr "installer alle filer, selv konfigurasjoner som ellers kan hoppes over"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1897,151 +2213,161 @@ msgstr ""
 "fjern alle pakker som er lik <pakke> (normalt vil en feil genereres hvis "
 "<pakke> spesifiserer flere pakker)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "slett (avinstaller) pakke"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<pakke>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "ikke installer dokumentasjon"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "hopp over filer med innledende komponent <sti> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<sti>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "forkortning for --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "oppgrader pakke(r) hvis allerede installert"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<pakkefil>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "skriv ut skigarder etter som pakken installeres (nyttig med -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "ikke verifiser pakkearkitektur"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "ikke verifiser operativsystem for pakken"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "ikke sjekk diskplass før installasjon"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "installer dokumentasjon"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "oppdater databasen, men ikke modifiser filsystemet"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "ikke verifiser pakkeavhengigheter"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "ikke ordne pakkeinstallasjon for å tilfredsstille avhengigheter"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "ikke kjør pakkespesifikke skriptlet"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "ikke kjør noen %%pre skriptlet (hvis noen)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "ikke kjør %%post skriptlet (hvis noen)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "ikke kjør %%preun skriptlet (hvis noen)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "ikke kjør %%postun skriptlet (hvis noen)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "Ikke kjør noen skriptlets som utløses av denne pakken"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "ikke kjør %%triggerprein skriptlets"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "ikke kjør %%triggerin skriptlets"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "ikke kjør %%triggerun skriplets"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "ikke kjør %%triggerpostun skriptlets"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2049,367 +2375,406 @@ msgstr ""
 "oppgrader til en gammel versjon av pakken (--force ved oppgraderinger gjør "
 "dette automatisk)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "skriv ut prosentvis fremgang etter som pakken installeres"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "omplasser pakken til <kat>, hvis den er omplasserbar"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<kat>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "omplasser filer fra sti <gml> til <ny>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<gml>=<ny>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "reinstaller selv om pakken allerede er installert"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "ikke installer, men si ifra om det ville virke eller ikke"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "oppgrader pakke(r)"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "spør/verifiser alle pakker"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "spør/verifiser pakke(r) som eier fil"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "spør/verifiser pakke(r) i gruppe"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "rpm spørremodus"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "spør pakker utløst av <pakke>"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "spør etter etter pakker som trenger <funk> funksjonalitet"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "spør etter pakker som tilbyr <funk> funksjonalitet"
 
-#: lib/poptQV.c:98
-msgid "do not glob arguments"
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
 msgstr ""
 
-#: lib/poptQV.c:100
-msgid "do not process non-package files as manifests"
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
+msgid "do not glob arguments"
+msgstr ""
+
+#: lib/poptQV.c:116
+msgid "do not process non-package files as manifests"
+msgstr ""
+
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr ""
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/poptQV.c:176
+#: lib/poptQV.c:197
 msgid "list all license files"
 msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+msgid "list all artifact files"
+msgstr ""
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr ""
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "ikke verifiser størrelse på filer"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "ikke verifiser sti til symbolske lenker for filer"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "ikke verifiser eier av filer"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "ikke verifiser gruppe for filer"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "ikke verifisert endringsdato for filer"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "ikke verifiser modus for filer"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "ikke verifiser filer i pakke"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "ikke verifiser pakkeavhengigheter"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "kildepakke forventet, binær funnet\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "kildepakke inneholder ikke en .spec-fil\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr ""
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "ukorrekt format: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "erstattet     "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "ikke installert"
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "delt via nett "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(ingen tilstand)"
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(ukjent %3d)  "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "pakken har verken fileier eller id-lister\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "gruppe %s inneholder ingen pakker\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "ingen pakke utløser %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "ingen pakke krever %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "ingen pakke gir %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "fil %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "filen %s eies ikke av noen pakke\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "ugyldig pakkenummer: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "pakke %s er ikke installert\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
-msgstr "IKKE OK"
-
-#: lib/rpmchecksig.c:386
-msgid "OK"
-msgstr "OK"
-
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ""
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ""
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
+msgstr "IKKE OK"
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:268
+msgid "OK"
+msgstr "OK"
+
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: åpne feilet: %s\n"
@@ -2434,1075 +2799,1141 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr "NEI"
-
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr "JA"
-
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
 msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
 msgstr ""
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
 msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
-msgstr "feil under åpning av %s: %s\n"
-
-#: lib/rpmgi.c:136
+#: lib/rpmdb.c:2520
 #, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+msgid "failed to create directory %s: %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpmdb.c:2557
 #, c-format
-msgid "Updating / installing...\n"
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpmdb.c:2572
 #, c-format
-msgid "Cleaning up / removing...\n"
+msgid "cannot add record originally at %u\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
-msgstr "Forbereder..."
-
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
 msgstr ""
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
-msgstr ""
+#: lib/rpmds.c:744
+msgid "NO "
+msgstr "NEI"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "JA"
+
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
-msgstr "Henter %s\n"
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr ""
 
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpminstall.c:542
-#, c-format
-msgid "package %s is not relocatable\n"
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
-msgstr "feil under lesing fra fil %s\n"
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr ""
 
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "kan ikke åpne %s: %s\n"
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr ""
 
-#: lib/rpminstall.c:706
-#, c-format
-msgid "Installing %s\n"
-msgstr "Installerer %s\n"
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr ""
 
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpmlead.c:123
-#, c-format
-msgid "read failed: %s (%d)\n"
-msgstr "lesing feilet: %s (%d)\n"
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr ""
 
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpmplugins.c:149
+#: lib/rpmds.c:1410
 #, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpmprob.c:109
-msgid "different"
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
-msgstr "pakke %s er allerede installert"
-
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpmprob.c:130
-#, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpmprob.c:135
-#, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpmprob.c:140
-#, c-format
-msgid "package %s (which is newer than %s) is already installed"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpmprob.c:145
+#: lib/rpmds.c:1544
 #, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmprob.c:155
-#, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmprob.c:159
-#, c-format
-msgid "%s is needed by %s%s"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmprob.c:163
+#: lib/rpmfi.c:810
 #, c-format
-msgid "%s conflicts with %s%s"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:167
+#: lib/rpmfi.c:817
 #, c-format
-msgid "%s is obsoleted by %s%s"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:172
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmrc.c:194
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "missing second ':' at %s:%d\n"
-msgstr "mangler andre ':' ved %s:%d\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
 
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
-msgstr "manglende navn på arkitektur ved %s:%d\n"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Ugyldig magi"
 
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
-msgstr "Ukomplett datalinje ved %s:%d\n"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Ugyldig/ulesbar header"
 
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
-msgstr "For mange argumenter i datalinje ved %s:%d\n"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "For stor header"
 
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr "Ukomplett standardlinje ved %s:%d\n"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Ukjent filtype"
 
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "mangler ':' (fant 0x%02X) ved %s:%d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "manglende argumentfor %s ved %s:%d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "manglende arkitektur for %s ved %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "ugyldig flagg '%s' ved %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Intern feil"
 
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " feilet - "
 
-#: lib/rpmscript.c:75
+#: lib/rpmfi.c:2392
 #, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmscript.c:221
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
+msgid "open of %s failed: %s\n"
+msgstr "feil under åpning av %s: %s\n"
 
-#: lib/rpmscript.c:248
+#: lib/rpmgi.c:144
 #, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:272
+#: lib/rpmgi.c:155
 #, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmscript.c:276
+#: lib/rpminstall.c:142
 #, c-format
-msgid "%s scriptlet failed, signal %d\n"
+msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpmscript.c:279
+#: lib/rpminstall.c:144
 #, c-format
-msgid "%s scriptlet failed, exit status %d\n"
+msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
+#: lib/rpminstall.c:193
+msgid "Preparing..."
+msgstr "Forbereder..."
 
-#: lib/rpmte.c:868
-msgid "install"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpmte.c:869
-msgid "erase"
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpmts.c:92
+#: lib/rpminstall.c:323
 #, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "kan ikke åpne pakkedatabase i %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpmts.c:209
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "missing '(' in package label: %s\n"
+msgid "%s cannot be installed\n"
 msgstr ""
 
-#: lib/rpmts.c:217
+#: lib/rpminstall.c:490
 #, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
+msgid "Retrieving %s\n"
+msgstr "Henter %s\n"
 
-#: lib/rpmts.c:273
+#: lib/rpminstall.c:502
 #, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/signature.c:90
+#: lib/rpminstall.c:572
 #, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/signature.c:101
+#: lib/rpminstall.c:603
 #, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
+msgid "error reading from file %s\n"
+msgstr "feil under lesing fra fil %s\n"
 
-#: lib/signature.c:107
+#: lib/rpminstall.c:697
 #, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/signature.c:123
+#: lib/rpminstall.c:736
 #, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
+msgid "cannot open %s: %s\n"
+msgstr "kan ikke åpne %s: %s\n"
 
-#: lib/signature.c:196
+#: lib/rpminstall.c:742
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "Installing %s\n"
+msgstr "Installerer %s\n"
+
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
 msgstr ""
 
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpmlead.c:118
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
+msgid "read failed: %s (%d)\n"
+msgstr "lesing feilet: %s (%d)\n"
 
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
+#, c-format
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
+#: lib/rpmlock.c:133
+#, c-format
+msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
+#: lib/rpmplugins.c:65
+#, c-format
+msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/signature.c:489
-msgid "Header "
+#: lib/rpmplugins.c:73
+#, c-format
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/signature.c:530
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "skipped"
+#: lib/rpmplugins.c:199
+#, c-format
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "failed"
+#: lib/rpmprob.c:109
+msgid "different"
 msgstr ""
 
-#: lib/verify.c:372
+#: lib/rpmprob.c:114
 #, c-format
-msgid "missing   %c %s"
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmprob.c:118
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "mangler { etter %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "mangler } etter %{"
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
+msgstr "pakke %s er allerede installert"
 
-#: lib/headerfmt.c:375
-msgid "empty tag format"
+#: lib/rpmprob.c:125
+#, c-format
+msgid "path %s in package %s is not relocatable"
 msgstr ""
 
-#: lib/headerfmt.c:386
-msgid "empty tag name"
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/headerfmt.c:393
-msgid "unknown tag"
+#: lib/rpmprob.c:135
+#, c-format
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
+#: lib/rpmprob.c:140
+#, c-format
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
+#: lib/rpmprob.c:145
+#, c-format
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/headerfmt.c:435
-msgid "unexpected }"
+#: lib/rpmprob.c:155
+#, c-format
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
 msgstr ""
 
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
 msgstr ""
 
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
+#: lib/rpmprob.c:163
+#, c-format
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
+#: lib/rpmprob.c:167
+#, c-format
+msgid "%s is obsoleted by %s%s"
 msgstr ""
 
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
+#: lib/rpmprob.c:172
+#, c-format
+msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr ""
+#: lib/rpmrc.c:222
+#, c-format
+msgid "missing second ':' at %s:%d\n"
+msgstr "mangler andre ':' ved %s:%d\n"
 
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
+#: lib/rpmrc.c:225
+#, c-format
+msgid "missing architecture name at %s:%d\n"
+msgstr "manglende navn på arkitektur ved %s:%d\n"
 
-#: lib/rpmdb.c:97
+#: lib/rpmrc.c:370
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
+msgid "Incomplete data line at %s:%d\n"
+msgstr "Ukomplett datalinje ved %s:%d\n"
 
-#: lib/rpmdb.c:191
+#: lib/rpmrc.c:375
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "kan ikke åpne %s-indeks ved bruk av db%d - %s (%d)\n"
+msgid "Too many args in data line at %s:%d\n"
+msgstr "For mange argumenter i datalinje ved %s:%d\n"
 
-#: lib/rpmdb.c:516
+#: lib/rpmrc.c:382
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr ""
+#: lib/rpmrc.c:413
+#, c-format
+msgid "Incomplete default line at %s:%d\n"
+msgstr "Ukomplett standardlinje ved %s:%d\n"
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:523
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr ""
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "mangler ':' (fant 0x%02X) ved %s:%d\n"
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr ""
+msgid "missing argument for %s at %s:%d\n"
+msgstr "manglende argumentfor %s ved %s:%d\n"
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:551
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr ""
+#: lib/rpmrc.c:564
+#, c-format
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "manglende arkitektur for %s ved %s:%d\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:632
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "ugyldig flagg '%s' ved %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "Unknown system: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) removing header #%d record\n"
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
-#, c-format
-msgid "%s: cannot read header at 0x%x\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/rpmdb.c:2448
-#, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/rpmdb.c:2467
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) allocating new package instance\n"
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:353
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "feil(%d) under lagring av post %s til %s\n"
-
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
+msgid "Fwrite failed: %s"
 msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
 msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
+#: lib/rpmte.c:730
+msgid "erase"
 msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr ""
+msgid "cannot open Packages database in %s\n"
+msgstr "kan ikke åpne pakkedatabase i %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
+
+#: rpmio/digest_nss.c:79
+#, c-format
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/macro.c:286
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "%3d>%*s(empty)\n"
 msgstr ""
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr ""
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr ""
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr ""
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Fil %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Fil %s er mindre enn %u bytes\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr ""
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "fatal feil: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "feil: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "advarsel: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "fatal feil: "
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "feil: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "advarsel: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:54
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
+msgid "error creating temp directory %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error creating fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite feilet: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread feilet: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead feilet: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature feilet: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead feilet: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: lesing av manifest feilet: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 338646aa238a414593b7c4b746a29d60dd63bc34..cce2bf99f1f1d0a9a5b9ee8ec8d547fbbd4b8c37 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -7,10 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Dutch (http://www.transifex.com/rpm-team/rpm/language/nl/)\n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,962 +43,1097 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr ""
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr ""
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr ""
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr ""
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr ""
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr ""
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr ""
-
-#: rpmqv.c:128
-msgid "unexpected query format"
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
 msgstr ""
 
-#: rpmqv.c:131
-msgid "unexpected query source"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
 msgstr ""
 
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
 msgstr ""
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
 msgstr ""
 
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:170
+#: rpmbuild.c:161
+#, c-format
 msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
 msgstr ""
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
 
-#: rpmqv.c:230
+#: rpmbuild.c:167 rpmbuild.c:208
 msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr ""
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr ""
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr ""
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr ""
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr ""
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
-msgstr ""
-
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
-msgstr ""
-
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr ""
-
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
 
-#: rpmbuild.c:129
+#: rpmbuild.c:170
 #, c-format
-msgid "verify %files section from <specfile>"
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr ""
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr ""
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
+#: rpmbuild.c:212
+msgid "override build root"
 msgstr ""
 
-#: rpmbuild.c:171
-msgid "override build root"
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
 
-#: rpmbuild.c:173
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr ""
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr ""
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr ""
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr ""
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr ""
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr ""
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr ""
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr ""
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr ""
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr ""
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr ""
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr ""
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr ""
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr ""
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr ""
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr ""
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr ""
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr ""
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Database opties:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr ""
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
-msgid "sign package(s)"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
 msgstr ""
 
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
 msgstr ""
 
-#: rpmsign.c:29
-msgid "delete package signatures"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
 msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
 msgstr ""
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
+#: rpmqv.c:126
+msgid "unexpected query flags"
 msgstr ""
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
+#: rpmqv.c:129
+msgid "unexpected query format"
 msgstr ""
 
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
+#: rpmqv.c:132
+msgid "unexpected query source"
 msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
 msgstr ""
 
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
 msgstr ""
 
-#: rpmspec.c:28
-msgid "query spec file(s)"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
 msgstr ""
 
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
 
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
-msgid "use the following query format"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
 msgstr ""
 
-#: rpmspec.c:45
-msgid "Spec options:"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmspec.c:90
-msgid "no arguments given for parse"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
 msgstr ""
 
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:126
-#, c-format
-msgid "Unable to open stream: %s\n"
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:161
-#, c-format
-msgid "Executing(%s): %s\n"
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:168
-#, c-format
-msgid "Exec of %s failed (%s): %s\n"
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
 msgstr ""
 
-#: build/build.c:177
-#, c-format
-msgid "Error executing scriptlet %s (%s)\n"
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:184
-#, c-format
-msgid "Bad exit status from %s (%s)\n"
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
 msgstr ""
 
-#: build/build.c:291
-msgid ""
-"\n"
-"\n"
-"RPM build errors:\n"
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
 msgstr ""
 
-#: build/expression.c:216
-msgid "syntax error while parsing ==\n"
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
 msgstr ""
 
-#: build/expression.c:246
-msgid "syntax error while parsing &&\n"
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
 msgstr ""
 
-#: build/expression.c:255
-msgid "syntax error while parsing ||\n"
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
 msgstr ""
 
-#: build/expression.c:305
-msgid "parse error in expression\n"
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
 msgstr ""
 
-#: build/expression.c:337
-msgid "unmatched (\n"
-msgstr ""
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr ""
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr ""
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr ""
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr ""
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr ""
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr ""
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr ""
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr ""
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr ""
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr ""
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr ""
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr ""
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr ""
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr ""
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr ""
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr ""
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr ""
+
+#: build/build.c:125
+#, c-format
+msgid "Unable to open stream: %s\n"
+msgstr ""
+
+#: build/build.c:158
+#, c-format
+msgid "Executing(%s): %s\n"
+msgstr ""
+
+#: build/build.c:163
+#, c-format
+msgid "Exec of %s failed (%s): %s\n"
+msgstr ""
+
+#: build/build.c:172
+#, c-format
+msgid "Error executing scriptlet %s (%s)\n"
+msgstr ""
+
+#: build/build.c:178
+#, c-format
+msgid "Bad exit status from %s (%s)\n"
+msgstr ""
+
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
+msgid ""
+"\n"
+"\n"
+"RPM build errors:\n"
+msgstr ""
+
+#: build/expression.c:215
+msgid "syntax error while parsing ==\n"
+msgstr ""
+
+#: build/expression.c:245
+msgid "syntax error while parsing &&\n"
+msgstr ""
+
+#: build/expression.c:254
+msgid "syntax error while parsing ||\n"
+msgstr ""
 
-#: build/expression.c:369
+#: build/expression.c:304
+msgid "parse error in expression\n"
+msgstr ""
+
+#: build/expression.c:336
+msgid "unmatched (\n"
+msgstr ""
+
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr ""
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr ""
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr ""
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr ""
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Ontbrekende '(' in %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Ontbrekende ')' in %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr ""
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Ontbrekende %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr ""
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr ""
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr ""
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "regel: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
-#, c-format
-msgid "Bad file: %s: %s\n"
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2039 build/parsePrep.c:33
+#: build/files.c:2657
 #, c-format
-msgid "Bad owner/group: %s\n"
+msgid "Bad file: %s: %s\n"
 msgstr ""
 
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: regel: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
 msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
 msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr ""
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr ""
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:434
 #, c-format
-msgid "Could not open %s: %s\n"
+msgid "Failed to read %jd bytes in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:452
-#, c-format
-msgid "Unable to write package: %s\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:468
+#: build/pack.c:453
 #, c-format
-msgid "Unable to open sigtarget %s: %s\n"
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:479
+#: build/pack.c:520
 #, c-format
-msgid "Unable to read header from %s: %s\n"
+msgid "Could not open %s: %s\n"
 msgstr ""
 
-#: build/pack.c:489
+#: build/pack.c:527
 #, c-format
-msgid "Unable to write header to %s: %s\n"
+msgid "Unable to write package: %s\n"
 msgstr ""
 
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr ""
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr ""
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr ""
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
+#: build/parseFiles.c:33
 #, c-format
-msgid "line %d: Second description\n"
+msgid "line %d: Error parsing %%files: %s\n"
 msgstr ""
 
-#: build/parseFiles.c:33
+#: build/parseFiles.c:73
 #, c-format
-msgid "line %d: Error parsing %%files: %s\n"
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
@@ -1006,351 +1141,420 @@ msgstr ""
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr ""
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr ""
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "regel %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:674
 #, c-format
-msgid "Package has no %%description: %s\n"
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
 msgstr ""
 
-#: build/policies.c:87
+#: build/parseSpec.c:710
 #, c-format
-msgid "Policy module '%s' duplicated with overlapping types\n"
+msgid "line %d: %%end doesn't take any arguments: %s\n"
 msgstr ""
 
-#: build/policies.c:93
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr ""
+
+#: build/parseSpec.c:912
+#, c-format
+msgid "Package has no %%description: %s\n"
+msgstr ""
+
+#: build/policies.c:87
+#, c-format
+msgid "Policy module '%s' duplicated with overlapping types\n"
+msgstr ""
+
+#: build/policies.c:93
 #, c-format
 msgid "Base modules '%s' and '%s' have overlapping types\n"
 msgstr ""
@@ -1411,450 +1615,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr ""
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(fout 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
 msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
 msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Onbekend bestandstype"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Ontbrekende hard link(s)"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:810
+msgid "shared"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Interne fout"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " mislukt - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(geen getal)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr ""
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr ""
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr ""
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr ""
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(geen OpenPGP handtekening)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr ""
+
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
+msgid "unknown tag: \"%s\""
 msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr ""
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "onverwachte ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "onverwachte }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? verwacht in expressie"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ verwacht na ? in expressie"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} verwacht in expressie"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ verwacht na : in expressie"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr ""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
 msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'MACRO EXPR'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'EXPR'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<BESTAND:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr ""
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr ""
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr ""
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr ""
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr ""
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1875,527 +2190,576 @@ msgstr ""
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<pakket>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr ""
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<pad>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<pakketbestand>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr ""
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr ""
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr ""
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr ""
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr ""
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr ""
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr ""
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr ""
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr ""
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr ""
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr ""
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr ""
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/poptQV.c:176
+#: lib/poptQV.c:197
 msgid "list all license files"
 msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+msgid "list all artifact files"
+msgstr ""
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr ""
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr ""
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr ""
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr ""
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr ""
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr ""
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr ""
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr ""
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr ""
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr ""
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(bevat geen bestanden)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normaal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr ""
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "niet geïnstalleerd "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr ""
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr ""
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(onbekende %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr ""
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr ""
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr ""
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr ""
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "bestand %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr ""
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr ""
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr ""
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NIET OK"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (ONTBREKENDE SLEUTELS:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr ""
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr ""
@@ -2420,1075 +2784,1141 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr "NEE "
-
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr "JA"
-
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
 msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
 msgstr ""
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
 msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmdb.c:2520
 #, c-format
-msgid "open of %s failed: %s\n"
+msgid "failed to create directory %s: %s\n"
 msgstr ""
 
-#: lib/rpmgi.c:136
+#: lib/rpmdb.c:2557
 #, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpmdb.c:2572
 #, c-format
-msgid "Updating / installing...\n"
+msgid "cannot add record originally at %u\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
-#, c-format
-msgid "Cleaning up / removing...\n"
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
 msgstr ""
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
-msgstr ""
+#: lib/rpmds.c:744
+msgid "NO "
+msgstr "NEE "
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
-msgstr ""
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "JA"
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpminstall.c:542
-#, c-format
-msgid "package %s is not relocatable\n"
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
 msgstr ""
 
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
 msgstr ""
 
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
 msgstr ""
 
-#: lib/rpminstall.c:706
-#, c-format
-msgid "Installing %s\n"
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
-msgstr "geen rpm pakket"
-
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpmlead.c:123
-#, c-format
-msgid "read failed: %s (%d)\n"
-msgstr "lezen mislukt: %s (%d)\n"
-
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpmprob.c:109
-msgid "different"
-msgstr "verschillend"
-
-#: lib/rpmprob.c:114
+#: lib/rpmds.c:1410
 #, c-format
-msgid "package %s is intended for a %s architecture"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
-msgstr "pakket %s is reeds geïnstalleerd"
-
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpmprob.c:130
-#, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpmprob.c:135
-#, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpmprob.c:140
-#, c-format
-msgid "package %s (which is newer than %s) is already installed"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpmprob.c:145
-#, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpmprob.c:155
-#, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpmprob.c:159
+#: lib/rpmds.c:1544
 #, c-format
-msgid "%s is needed by %s%s"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
-msgstr "(geïnstalleerd) "
-
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmrc.c:194
+#: lib/rpmfi.c:810
 #, c-format
-msgid "missing second ':' at %s:%d\n"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
-msgstr "ontbrekende architectuurnaam op %s:%d\n"
-
-#: lib/rpmrc.c:342
+#: lib/rpmfi.c:817
 #, c-format
-msgid "Incomplete data line at %s:%d\n"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:347
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "Too many args in data line at %s:%d\n"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmrc.c:354
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
 msgstr ""
 
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
 msgstr ""
 
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "ontbrekende ':' (gevonden 0x%02x) op %s:%d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "ontbrekend argument voor %s op %s:%d\n"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr ""
 
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "ontbrekende architectuur voor %s op %s:%d\n"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Onbekend bestandstype"
 
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Onbekend systeem: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr ""
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Interne fout"
 
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " mislukt - "
 
-#: lib/rpmscript.c:221
+#: lib/rpmfi.c:2392
 #, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmscript.c:248
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgid "open of %s failed: %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:272
+#: lib/rpmgi.c:144
 #, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:276
+#: lib/rpmgi.c:155
 #, c-format
-msgid "%s scriptlet failed, signal %d\n"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmscript.c:279
+#: lib/rpminstall.c:142
 #, c-format
-msgid "%s scriptlet failed, exit status %d\n"
+msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpmtd.c:258
-msgid "Unknown format"
+#: lib/rpminstall.c:144
+#, c-format
+msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpmte.c:868
-msgid "install"
+#: lib/rpminstall.c:193
+msgid "Preparing..."
 msgstr ""
 
-#: lib/rpmte.c:869
-msgid "erase"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpmts.c:191
+#: lib/rpminstall.c:323
 #, c-format
-msgid "extra '(' in package label: %s\n"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpmts.c:209
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "ontbrekende '(' in pakketlabel: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "ontbrekende ')' in pakketlabel: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
+msgid "%s cannot be installed\n"
 msgstr ""
 
-#: lib/signature.c:90
+#: lib/rpminstall.c:490
 #, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
+msgid "Retrieving %s\n"
 msgstr ""
 
-#: lib/signature.c:101
+#: lib/rpminstall.c:502
 #, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/signature.c:107
+#: lib/rpminstall.c:572
 #, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/signature.c:123
+#: lib/rpminstall.c:603
 #, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
+msgid "error reading from file %s\n"
 msgstr ""
 
-#: lib/signature.c:196
+#: lib/rpminstall.c:697
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/signature.c:219
+#: lib/rpminstall.c:736
 #, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpminstall.c:742
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
+msgid "Installing %s\n"
 msgstr ""
 
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
+msgstr "geen rpm pakket"
 
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
+#: lib/rpmlead.c:118
+#, c-format
+msgid "read failed: %s (%d)\n"
+msgstr "lezen mislukt: %s (%d)\n"
 
-#: lib/signature.c:489
-msgid "Header "
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/signature.c:530
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "failed"
+#: lib/rpmlock.c:133
+#, c-format
+msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/verify.c:372
+#: lib/rpmplugins.c:65
 #, c-format
-msgid "missing   %c %s"
-msgstr "ontbrekende   %c %s"
+msgid "Failed to dlopen %s %s\n"
+msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmplugins.c:73
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:336
-msgid "invalid field width"
+#: lib/rpmplugins.c:154
+#, c-format
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "ontbrekende { na %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "ontbrekende } na %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
+#: lib/rpmplugins.c:199
+#, c-format
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr ""
+#: lib/rpmprob.c:109
+msgid "different"
+msgstr "verschillend"
 
-#: lib/headerfmt.c:393
-msgid "unknown tag"
+#: lib/rpmprob.c:114
+#, c-format
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
+#: lib/rpmprob.c:118
+#, c-format
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "onverwachte ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "onverwachte }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? verwacht in expressie"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ verwacht na ? in expressie"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} verwacht in expressie"
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
+msgstr "pakket %s is reeds geïnstalleerd"
 
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
+#: lib/rpmprob.c:125
+#, c-format
+msgid "path %s in package %s is not relocatable"
 msgstr ""
 
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ verwacht na : in expressie"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
+#: lib/rpmprob.c:135
+#, c-format
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/rpmdb.c:97
+#: lib/rpmprob.c:140
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/rpmdb.c:191
+#: lib/rpmprob.c:145
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/rpmdb.c:516
+#: lib/rpmprob.c:155
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
 msgstr ""
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
+msgstr "(geïnstalleerd) "
+
+#: lib/rpmprob.c:163
+#, c-format
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmprob.c:167
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "%s is obsoleted by %s%s"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmprob.c:172
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:222
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "missing second ':' at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmrc.c:225
+#, c-format
+msgid "missing architecture name at %s:%d\n"
+msgstr "ontbrekende architectuurnaam op %s:%d\n"
+
+#: lib/rpmrc.c:370
+#, c-format
+msgid "Incomplete data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:375
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "Too many args in data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:382
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:413
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "Incomplete default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:418
 #, c-format
-msgid "error(%d) removing header #%d record\n"
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:523
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "ontbrekende ':' (gevonden 0x%02x) op %s:%d\n"
+
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
+msgstr "ontbrekend argument voor %s op %s:%d\n"
+
+#: lib/rpmrc.c:551
+#, c-format
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:564
+#, c-format
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "ontbrekende architectuur voor %s op %s:%d\n"
+
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr ""
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+msgid "Unknown system: %s\n"
+msgstr "Onbekend systeem: %s\n"
+
+#: lib/rpmrc.c:1471
+#, c-format
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr ""
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
+msgid "Unable to restore current directory: %m"
+msgstr ""
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
 msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
 msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr ""
+
+#: lib/rpmts.c:100
 #, c-format
-msgid "replace files in %s with files from %s to recover"
+msgid "cannot open Packages database in %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:199
 #, c-format
-msgid "failed to remove directory %s: %s\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d fout(%d) van %s: %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "ontbrekende '(' in pakketlabel: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:225
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d fout(%d): %s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "ontbrekende ')' in pakketlabel: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
+msgid "%s: reading of public key failed.\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
+#: lib/rpmvs.c:152
+#, c-format
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:158
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:178
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:206
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "ontbrekende   %c %s"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== actief %d leeg %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(leeg)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(leeg)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr ""
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Onbekende optie %c in %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== actief %d leeg %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(geen fout)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "fatale fout: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "fout: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "waarschuwing: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(geen fout)"
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "fatale fout: "
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "fout: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "waarschuwing: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:54
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
+msgid "error creating temp directory %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error creating fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not exec %s: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
+#, c-format
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "gpg uitvoeren mislukt (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
 msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index d41816b2a55ecfa272e7f50c5fec745aa61a9d13..c1067e4fa59a9bcf9a70aad266e48de7b838bd50 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -3,20 +3,19 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Arkadiusz Miskiewicz <arekm@pld-linux.org>, 2003.
-# Jakub Bogusz <qboosh@pld-linux.org>, 2002.
-# Paweł Dziekoński <pdziekonski@mml.ch.pwr.wroc.pl>, 1999.
-# Piotr Drąg <piotrdrag@gmail.com>, 2007,2011-2012.
-# Wojciech Drapiński <wojciech.drapinski@zie.pg.gda.pl>, 1999.
+# Arkadiusz Miskiewicz <arekm@pld-linux.org>, 2003
+# Jakub Bogusz <qboosh@pld-linux.org>, 2002
+# Paweł Dziekoński <pdziekonski@mml.ch.pwr.wroc.pl>, 1999
+# Piotr Drąg <piotrdrag@gmail.com>, 2007,2011-2012,2014-2017
+# Wojciech Drapiński <wojciech.drapinski@zie.pg.gda.pl>, 1999
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 19:51+0000\n"
-"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
-"Language-Team: Polish (http://www.transifex.com/projects/p/rpm/language/"
-"pl/)\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: Polish (http://www.transifex.com/rpm-team/rpm/language/pl/)\n"
 "Language: pl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -32,12 +31,12 @@ msgstr "%s: %s\n"
 #: cliutils.c:27 lib/poptALL.c:56
 #, c-format
 msgid "RPM version %s\n"
-msgstr "RPM wersja %s\n"
+msgstr "RPM %s\n"
 
 #: cliutils.c:32
 #, c-format
 msgid "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
-msgstr "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
+msgstr "Copyright © 1998-2002 Red Hat, Inc.\n"
 
 #: cliutils.c:33
 #, c-format
@@ -52,539 +51,608 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "utworzenie potoku dla --pipe się nie powiodło: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "wykonanie się nie powiodło\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "parametr nie jest pakietem RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
-msgstr "błąd podczas odczytywania nagłówka z pakietu\n"
+msgstr "błąd podczas odczytywania nagłówka z pakietu\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "nie można ponownie otworzyć danych: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Odpytanie/sprawdzenie opcji wyboru pakietów:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Opcje zapytania (z -q lub --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Opcje sprawdzania (z -V lub --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Opcje instalacji/aktualizacji/usuwania:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Wspólne opcje dla wszystkich trybów i plików binarnych RPM:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "tylko jeden typ odpytywania/sprawdzania można wykonać na raz"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "nieoczekiwane flagi zapytania"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "nieoczekiwany format zapytania"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "nieoczekiwane źródło zapytania"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "może być podany tylko jeden główny tryb pracy"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "tylko instalację i aktualizowanie można wymusić"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "pliki mogą być przenoszone tylko podczas instalacji pakietu"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "nie można użyć --prefix z --relocate lub --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate i --excludepath można użyć tylko podczas instalowania nowych "
-"pakietów"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix można użyć tylko podczas instalowania nowych pakietów"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "parametry dla --prefix muszą zaczynać się od /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr "--hash (-h) można podać tylko podczas instalacji i usuwaniu pakietów"
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr "--percent można podać tylko podczas instalacji i usuwaniu pakietów"
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs można podać tylko podczas instalacji pakietów"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs można podać tylko podczas instalacji pakietów"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs można podać tylko podczas instalacji pakietów"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "nie można jednocześnie podać --excludedocs i --includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch można podać tylko podczas instalacji pakietów"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos można podać tylko podczas instalacji pakietów"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize można podać tylko podczas instalacji pakietów"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches można podać tylko podczas usuwania pakietów"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles można podać tylko podczas instalacji pakietów"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb można podać tylko podczas instalacji i usuwania pakietów"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"opcje wyłączające skrypty można podać tylko podczas instalacji i usuwania "
-"pakietów"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"opcje wyłączające wyzwalacze można podać tylko podczas instalacji i usuwania "
-"pakietów"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-"--nodeps można podać tylko podczas instalacji, usuwania i sprawdzania "
-"pakietów"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr "--test można podać tylko podczas instalacji i usuwania pakietów"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "parametry dla --root (-r) muszą zaczynać się od /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "nie podano pakietów do usunięcia"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "nie podano pakietów do zainstalowania"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "nie podano parametrów dla zapytania"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "nie podano parametrów dla sprawdzenia"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot został już podany, ignorowanie %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
-"zbudowanie przez %prep (rozpakowanie źródeł i nałożenie łat) z <pliku_spec>"
+"zbudowanie przez %prep (rozpakowanie źródeł i nałożenie łat) z <pliku-spec>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
-msgstr "<plik_spec>"
+msgstr "<plik-spec>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
-msgstr "zbudowanie przez %build (%prep i skompilowanie) z <pliku_spec>"
+msgstr "zbudowanie przez %build (%prep i skompilowanie) z <pliku-spec>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
-"zbudowanie przez %install (%prep, %build i zainstalowanie) z <pliku_spec>"
+"zbudowanie przez %install (%prep, %build i zainstalowanie) z <pliku-spec>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
-msgstr "sprawdzenie sekcji %files z <pliku_spec>"
+msgstr "sprawdzenie sekcji %files z <pliku-spec>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
-msgstr "zbudowanie pakietu źródłowego i binarnego z <pliku_spec>"
+msgstr "zbudowanie pakietu źródłowego i binarnego z <pliku-spec>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
-msgstr "zbudowanie tylko pakietu binarnego z <pliku_spec>"
+msgstr "zbudowanie tylko pakietu binarnego z <pliku-spec>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
-msgstr "zbudowanie tylko pakietu źródłowego z <pliku_spec>"
+msgstr "zbudowanie tylko pakietu źródłowego z <pliku-spec>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+"zbudowanie przez %prep (rozpakowanie źródeł i nałożenie łat) z <pakietu-"
+"źródłowego>"
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<pakiet-źródłowy>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr "zbudowanie przez %build (%prep i skompilowanie) z <pakietu-źródłowego>"
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"zbudowanie przez %install (%prep, %build i zainstalowanie) z <pakietu-"
+"źródłowego>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr "sprawdzenie sekcji %files z <pakietu-źródłowego>"
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr "zbudowanie pakietu źródłowego i binarnego z <pakietu-źródłowego>"
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr "zbudowanie tylko pakietu binarnego z <pakietu-źródłowego>"
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr "zbudowanie tylko pakietu źródłowego z <pakietu-źródłowego>"
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
-"zbudowanie przez %prep (rozpakowanie źródeł i nałożenie łat) z <pliku_tar>"
+"zbudowanie przez %prep (rozpakowanie źródeł i nałożenie łat) z <pliku-tar>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
-msgstr "<plik_tar>"
+msgstr "<plik-tar>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
-msgstr "zbudowanie przez %build (%prep oraz skompilowanie) z <pliku_tar>"
+msgstr "zbudowanie przez %build (%prep oraz skompilowanie) z <pliku-tar>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
-"zbudowanie przez %install (%prep, %build i zainstalowanie) z <pliku_tar>"
+"zbudowanie przez %install (%prep, %build i zainstalowanie) z <pliku-tar>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
-msgstr "sprawdzenie sekcji %files z <pliku_tar>"
+msgstr "sprawdzenie sekcji %files z <pliku-tar>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
-msgstr "zbudowanie pakietu źródłowego i binarnego z <pliku_tar>"
+msgstr "zbudowanie pakietu źródłowego i binarnego z <pliku-tar>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
-msgstr "zbudowanie tylko pakietu binarnego z <pliku_tar>"
+msgstr "zbudowanie tylko pakietu binarnego z <pliku-tar>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
-msgstr "zbudowanie tylko pakietu źródłowego z <pliku_tar>"
+msgstr "zbudowanie tylko pakietu źródłowego z <pliku-tar>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
-msgstr "zbudowanie pakietu binarnego z <pakietu_źródłowego>"
-
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<pakiet_źródłowy>"
+msgstr "zbudowanie pakietu binarnego z <pakietu-źródłowego>"
 
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"zbudowanie przez %install (%prep, %build i zainstalowanie) z "
-"<pakietu_źródłowego>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "zastąpienie build root"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr "zbudowanie w bieżącym katalogu"
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "usunięcie drzewa budowania po ukończeniu"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
-msgstr "zignorowanie dyrektywy ExcludeArch: z pliku spec"
+msgstr "zignorowanie dyrektywy ExcludeArch: z pliku spec"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "debugowanie maszyny stanów plików"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "bez wykonania żadnych etapów budowania"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "bez sprawdzania zależności budowania"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
-"utworzenie nagłówków pakietu zgodnych z (przestarzałymi) pakietami RPM v3"
+"utworzenie nagłówków pakietu zgodnych z (przestarzałymi) pakietami RPM v3"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr "bez wykonywania etapu budowania %clean"
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr "bez wykonywania etapu budowania %prep"
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr "bez wykonywania etapu budowania %check"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
-msgstr "bez akceptowania wpisów msgstr i18n z pliku spec"
+msgstr "bez akceptowania wpisów msgstr i18n z pliku spec"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "usunięcie źródeł po ukończeniu"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "usunięcie pliku spec po ukończeniu"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "przejście od razu do podanego etapu (tylko dla c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "zastąpienie platformy docelowej"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
-msgstr "Opcje budowania z [ <plik_spec> | <plik_tar> | <pakiet_źródłowy> ]:"
+msgstr "Opcje budowania z [ <plik-spec> | <plik-tar> | <pakiet-źródłowy> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Wspólne opcje dla wszystkich trybów i plików binarnych RPM:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Niespełnione zależności budowania:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Nie można otworzyć pliku spec %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Otwarcie potoku tar się nie powiodło: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr "Odnaleziono więcej niż jeden plik spec w %s\n"
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
-msgstr "Odczytanie pliku spec z %s się nie powiodło\n"
+msgstr "Odczytanie pliku spec z %s się nie powiodło\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Zmiana nazwy %s na %s się nie powiodła: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "wykonanie stat na %s się nie powiodło: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Plik %s nie jest zwykłym plikiem.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Plik %s nie wygląda na plik spec.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Budowanie dla platform docelowych: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Budowanie dla %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "parametry dla --root (-r) muszą zaczynać się od /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "zainicjowanie bazy danych"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
-"przebudowanie odwrotne listy w bazie danych z nagłówków zainstalowanych "
+"przebudowanie odwrotne listy w bazie danych z nagłówków zainstalowanych "
 "pakietów"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "sprawdzenie plików bazy danych"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr "wyeksportowanie bazy danych do listy nagłówków standardowego wyjścia"
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr "zaimportowanie bazy danych z listy nagłówków standardowego wejścia"
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Opcje bazy danych:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "może być podany tylko jeden główny tryb pracy"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "sprawdzenie podpisów pakietów"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "zaimportowanie opakowanego klucza publicznego"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr "bez importowania, ale wyświetla, czy by się powiodło"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
-msgstr "wyświetlenie listy kluczy z bazy kluczy RPM"
+msgstr "wyświetlenie listy kluczy z bazy kluczy RPM"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Opcje bazy kluczy:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "nie podano parametrów"
 
-#: rpmsign.c:25
-msgid "sign package(s)"
-msgstr "podpisanie pakietów"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Odpytanie/sprawdzenie opcji wyboru pakietów:"
 
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
-msgstr "podpisanie pakietów (identyczne z --addsign)"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Opcje zapytania (z -q lub --query):"
 
-#: rpmsign.c:29
-msgid "delete package signatures"
-msgstr "usunięcie podpisów pakietów"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Opcje sprawdzania (z -V lub --verify):"
 
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr "Opcje podpisu:"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Opcje instalacji/aktualizacji/usuwania:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Nie można wykonać %s: %s\n"
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "tylko jeden typ odpytywania/sprawdzania można wykonać na raz"
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
-msgstr "Należy ustawić \"%%_gpg_name\" w pliku makr\n"
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "nieoczekiwane flagi zapytania"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Proszę podać hasło: "
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "nieoczekiwany format zapytania"
 
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Hasło jest dobre.\n"
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "nieoczekiwane źródło zapytania"
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr "Sprawdzenie hasła się nie powiodło lub klucz GPG wygasł\n"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "tylko instalację i aktualizowanie można wymusić"
 
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
-msgstr "przetwarza pliki spec do standardowego wyjścia"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "pliki mogą być przenoszone tylko podczas instalacji pakietu"
 
-#: rpmspec.c:28
-msgid "query spec file(s)"
-msgstr "odpytuje pliki spec"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "nie można użyć --prefix z --relocate lub --excludepath"
 
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
-"działa na binarnych pakietach RPM utworzonych przez plik spec (domyślnie)"
+"--relocate i --excludepath można użyć tylko podczas instalowania nowych "
+"pakietów"
 
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
-msgstr "działa na źródłowych pakietach RPM utworzonych przez plik spec"
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix można użyć tylko podczas instalowania nowych pakietów"
 
-#: rpmspec.c:36 lib/poptQV.c:192
-msgid "use the following query format"
-msgstr "użycie następującego formatu zapytania"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "parametry dla --prefix muszą zaczynać się od /"
 
-#: rpmspec.c:45
-msgid "Spec options:"
-msgstr "Opcje pliku spec:"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr "--hash (-h) można podać tylko podczas instalacji i usuwaniu pakietów"
 
-#: rpmspec.c:90
-msgid "no arguments given for parse"
-msgstr "nie podano parametrów do przetworzenia"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr "--percent można podać tylko podczas instalacji i usuwaniu pakietów"
 
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
-msgstr "Nie można otworzyć pliku tymczasowego: %s\n"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs można podać tylko podczas instalacji pakietów"
 
-#: build/build.c:126
-#, c-format
-msgid "Unable to open stream: %s\n"
-msgstr "Nie można otworzyć strumienia: %s\n"
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs można podać tylko podczas instalacji pakietów"
 
-#: build/build.c:161
-#, c-format
-msgid "Executing(%s): %s\n"
-msgstr "Wykonywanie(%s): %s\n"
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs można podać tylko podczas instalacji pakietów"
 
-#: build/build.c:168
-#, c-format
-msgid "Exec of %s failed (%s): %s\n"
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "nie można jednocześnie podać --excludedocs i --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch można podać tylko podczas instalacji pakietów"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos można podać tylko podczas instalacji pakietów"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize można podać tylko podczas instalacji pakietów"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches można podać tylko podczas usuwania pakietów"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles można podać tylko podczas instalacji pakietów"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb można podać tylko podczas instalacji i usuwania pakietów"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"opcje wyłączające skrypty można podać tylko podczas instalacji i usuwania "
+"pakietów"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"opcje wyłączające wyzwalacze można podać tylko podczas instalacji i usuwania "
+"pakietów"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps można podać tylko podczas instalacji, usuwania i sprawdzania "
+"pakietów"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr "--test można podać tylko podczas instalacji i usuwania pakietów"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "nie podano pakietów do usunięcia"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "nie podano pakietów do zainstalowania"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "nie podano parametrów dla zapytania"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "nie podano parametrów dla sprawdzenia"
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr "podpisanie pakietów"
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr "podpisanie pakietów (identyczne z --addsign)"
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr "usunięcie podpisów pakietów"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "Opcje podpisu:"
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr "Należy ustawić „%%_gpg_name” w pliku makr\n"
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr "przetwarza pliki spec do standardowego wyjścia"
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr "odpytuje pliki spec"
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr ""
+"działa na binarnych pakietach RPM utworzonych przez plik spec (domyślnie)"
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr "działa na źródłowych pakietach RPM utworzonych przez plik spec"
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr "użycie następującego formatu zapytania"
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr "Opcje pliku spec:"
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr "nie podano parametrów do przetworzenia"
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr "Nie można otworzyć pliku tymczasowego: %s\n"
+
+#: build/build.c:125
+#, c-format
+msgid "Unable to open stream: %s\n"
+msgstr "Nie można otworzyć strumienia: %s\n"
+
+#: build/build.c:158
+#, c-format
+msgid "Executing(%s): %s\n"
+msgstr "Wykonywanie(%s): %s\n"
+
+#: build/build.c:163
+#, c-format
+msgid "Exec of %s failed (%s): %s\n"
 msgstr "Wykonanie %s się nie powiodło (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr "Błąd podczas wykonywania skryptu %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
-msgstr "Błędny stan wyjścia z %s (%s)\n"
+msgstr "Błędny stan wyjścia z %s (%s)\n"
+
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
 
-#: build/build.c:291
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -594,235 +662,315 @@ msgstr ""
 "\n"
 "Błędy budowania pakietu RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "błąd składni podczas przetwarzania ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "błąd składni podczas przetwarzania &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "błąd składni podczas przetwarzania ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
-msgstr "błąd przetwarzania w wyrażeniu\n"
+msgstr "błąd przetwarzania w wyrażeniu\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "niesparowane (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- tylko na liczbach\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! tylko na liczbach\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "typy muszą się zgadzać\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / nie są obsługiwane dla ciągów\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- nie jest obsługiwane dla ciągów\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
-msgstr "&& i || nie są obsługiwane dla ciągów\n"
+msgstr "&& i || nie są obsługiwane dla ciągów\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
-msgstr "błąd składni w wyrażeniu\n"
+msgstr "błąd składni w wyrażeniu\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
-msgstr "Brak \"(\" w %s %s\n"
+msgstr "Brak „(” w %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
-msgstr "Brak \")\" w %s(%s\n"
+msgstr "Brak „)” w %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Nieprawidłowy token %s: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Brak %s w %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Brak białego znaku po %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Błędna składnia: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Błędny tryb spec: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Błędny tryb katalogu spec: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
-msgstr "Niezwykła długość lokalizacji: \"%s\" w %%lang(%s)\n"
+msgstr "Niezwykła długość lokalizacji: „%s” w %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
-msgstr "Podwójna lokalizacja %s w %%lang(%s)\n"
+msgstr "Podwójna lokalizacja %s w %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Nieprawidłowa możliwość: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Obsługa możliwości plików nie jest wbudowana\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
-msgstr "Plik musi zaczynać się od \"/\": %s\n"
+msgstr "Plik musi zaczynać się od „/”: %s\n"
+
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
-msgstr "Nieznany algorytm skrótu pliku %u, używanie w zamian MD5\n"
+msgstr "Nieznany algorytm skrótu pliku %u, używanie w zamian MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Plik podany dwukrotnie: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "odczytanie dowiązania symbolicznego %s się nie powiodło: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
-msgstr "Dowiązanie symboliczne wskazuje na BuildRoot: %s -> %s\n"
+msgstr "Dowiązanie symboliczne wskazuje na BuildRoot: %s → %s\n"
+
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "Ścieżka jest poza buildroot: %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "Nie odnaleziono katalogu: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Nie odnaleziono pliku: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Nie jest katalogiem: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: nie można wczytać nieznanego znacznika (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: odczytanie klucza publicznego się nie powiodło.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: nie jest opakowanym kluczem publicznym.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: odkodowanie się nie powiodło\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "utworzenie katalogu się nie powiodło"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
-msgstr "Plik musi zaczynać się od \"/\": %s\n"
+msgstr "Plik musi zaczynać się od „/”: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "Wyrażenie regularne %%dev nie jest dozwolone: %s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "Katalog nie został odnaleziony przez wyrażenie regularne: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Nie odnaleziono pliku przez wyrażenie regularne: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
-msgstr "Nie można otworzyć pliku %s dla %%files: %m\n"
+msgstr "Nie można otworzyć pliku %s %%files: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "wiersz: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr "Pusty plik %s w %%files\n"
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
-msgstr "Błąd podczas odczytywania %%files pliku %s: %m\n"
+msgstr "Błąd podczas odczytywania pliku %s w %%files: %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr "illegal _docdir_fmt %s: %s\n"
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Nie odnaleziono pliku przez wyrażenie regularne: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
-msgstr "Nie można mieszać specjalnego %s z innymi formami: %s\n"
+msgstr "Nie można mieszać specjalnego %s z innymi formami: %s\n"
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr "Więcej niż jeden plik na wiersz: %s\n"
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Błędny plik: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Błędny właściciel/grupa: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Sprawdzanie niespakietowanych plików: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -831,570 +979,627 @@ msgstr ""
 "Odnaleziono zainstalowane (ale niespakietowane) pliki:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Przetwarzanie plików: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
-"Architektura plików binarnych (%d) nie zgadza się z architekturą pakietu "
+"Architektura plików binarnych (%d) nie zgadza się z architekturą pakietu "
 "(%d).\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
-msgstr "Pliki binarne zależne od architektury w pakiecie noarch\n"
+msgstr "Pliki binarne zależne od architektury w pakiecie noarch\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr "utworzenie archiwum się nie powiodło na pliku %s: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr "utworzenie archiwum się nie powiodło: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "Nie można otworzyć pliku %s: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: wiersz: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Nie można ustalić kanonicznej nazwy komputera: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Nie można zapisać danych do %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Nie można odczytać danych z %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Nie można ustalić kanonicznej nazwy komputera: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Nieznana kompresja danych: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Nie można utworzyć niezmiennej części nagłówka.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Nie można otworzyć pliku tymczasowego.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr "Nie można wyszukać w pliku %s: %s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Nie można zapisać tymczasowego nagłówka\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Odczytanie pliku polityki się nie powiodło: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Błędne dane CSA\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Nie można ponownie wczytać nagłówka podpisu.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Nie można otworzyć %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Nie można zapisać pakietu: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Nie można otworzyć sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Nie można odczytać nagłówka z %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Nie można zapisać nagłówka do %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Zapisano: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
-msgstr "Wykonywanie \"%s\":\n"
+msgstr "Wykonywanie „%s”:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
-msgstr "Wykonanie \"%s\" się nie powiodło.\n"
+msgstr "Wykonanie „%s” się nie powiodło.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
-msgstr "Sprawdzenie pakietu \"%s\" się nie powiodło.\n"
+msgstr "Sprawdzenie pakietu „%s” się nie powiodło.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Nie można utworzyć wyjściowej nazwy pliku dla pakietu %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "nie można utworzyć %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
-msgstr "wiersz %d: drugi %s\n"
+msgstr "%d. wiersz: drugie %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
-msgstr "błędna data w %%changelog: %s\n"
+msgstr "błędna data w %%changelog: %s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "Wpisy %%changelog muszą zaczynać się od *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "niepełny wpis %%changelog\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
-msgstr "błędna data w %%changelog: %s\n"
+msgstr "błędna data w %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
-msgstr "Wpisy w %%changelog nie są w porządku chronologicznym\n"
+msgstr "Wpisy w %%changelog nie są w porządku chronologicznym\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
-msgstr "brak nazwy w %%changelog\n"
+msgstr "brak nazwy w %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
-msgstr "brak opisu w %%changelog\n"
+msgstr "brak opisu w %%changelog\n"
+
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "%d. wiersz: drugi %%changelog\n"
 
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
-msgstr "wiersz %d: błąd podczas przetwarzania %%description: %s\n"
+msgstr "%d. wiersz: błąd podczas przetwarzania %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
-msgstr "wiersz %d: błędna opcja %s: %s\n"
+msgstr "%d. wiersz: błędna opcja %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
-msgstr "wiersz %d: za dużo nazw: %s\n"
-
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "wiersz %d: pakiet nie istnieje: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "wiersz %d: drugi opis\n"
+msgstr "%d. wiersz: za dużo nazw: %s\n"
 
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
-msgstr "wiersz %d: błąd podczas przetwarzania %%files: %s\n"
+msgstr "%d. wiersz: błąd podczas przetwarzania %%files: %s\n"
+
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
 
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
-msgstr "wiersz %d: błąd podczas przetwarzania %%policies: %s\n"
+msgstr "%d. wiersz: błąd podczas przetwarzania %%policies: %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr "Błąd podczas przetwarzania pola znacznika: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
-msgstr "wiersz %d: błędny numer: %s\n"
+msgstr "%d. wiersz: błędny numer: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
-msgstr "wiersz %d: błędny numer no%s: %u\n"
+msgstr "%d. wiersz: błędny numer no%s: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
-msgstr "wiersz %d: błędny numer %s: %s\n"
+msgstr "%d. wiersz: błędny numer %s: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d zostało określone wiele razy\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "Pobieranie %s do %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "Nie można pobrać %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Architektura jest wykluczona: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Architektura nie jest dołączona: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "System operacyjny jest wykluczony: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "System operacyjny nie jest dołączony: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
-msgstr "Pole %s musi być obecne w pakiecie: %s\n"
+msgstr "Pole %s musi być obecne w pakiecie: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
-msgstr "Powtórzone wpisy %s w pakiecie: %s\n"
+msgstr "Powtórzone wpisy %s w pakiecie: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Nie można otworzyć ikony %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Nie można odczytać ikony %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Nieznany typ ikony: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
-msgstr "wiersz %d: znacznik przyjmuje tylko jeden token: %s\n"
+msgstr "%d. wiersz: znacznik przyjmuje tylko jeden token: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "wiersz %d: niedozwolony znak \"%c\" w: %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr "%d. wiersz: %s w: %s\n"
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "wiersz %d: niedozwolony znak w: %s\n"
+msgid "%s in: %s\n"
+msgstr "%s w: %s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "wiersz %d: niedozwolona sekwencja \"..\" w: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr "Niedozwolony znak „%c” (0x%x)"
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr "Niedozwolona sekwencja „..”"
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
-msgstr "wiersz %d: błędnie sformowany znacznik: %s\n"
+msgstr "%d. wiersz: błędnie sformowany znacznik: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
-msgstr "wiersz %d: pusty znacznik: %s\n"
+msgstr "%d. wiersz: pusty znacznik: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
-msgstr "wiersz %d: przedrostki nie mogą kończyć się na \"/\": %s\n"
+msgstr "%d. wiersz: przedrostki nie mogą kończyć się na „/”: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
-msgstr "wiersz %d: Docdir musi zaczynać się od \"/\": %s\n"
+msgstr "%d. wiersz: Docdir musi zaczynać się od „/”: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
-msgstr "wiersz %d: pole Epoch musi być niepodpisaną liczbą: %s\n"
+msgstr "%d. wiersz: pole Epoch musi być niepodpisaną liczbą: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
-msgstr "wiersz %d: błędne określenia %s: %s\n"
+msgstr "%d. wiersz: błędne określenia %s: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
-msgstr "wiersz %d: błędny format BuildArchitecture: %s\n"
+msgstr "%d. wiersz: błędny format BuildArchitecture: %s\n"
+
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
-msgstr "wiersz %d: obsługiwane są tylko podpakiety noarch: %s\n"
+msgstr "%d. wiersz: obsługiwane są tylko podpakiety noarch: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Wewnętrzny błąd: fałszywy znacznik %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
-msgstr "wiersz %d: %s jest przestarzałe: %s\n"
+msgstr "%d. wiersz: %s jest przestarzałe: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Błędna specyfikacja pakietu: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Pakiet już istnieje: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
-msgstr "wiersz %d: nieznany znacznik: %s\n"
+msgstr "%d. wiersz: nieznany znacznik: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} nie może być puste\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
-msgstr "%%{buildroot} nie może być \"/\"\n"
+msgstr "%%{buildroot} nie może być „/”\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Błędne źródło: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Brak łaty numer %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
-msgstr "%%patch bez odpowiadającego mu znacznika \"Patch:\"\n"
+msgstr "%%patch bez odpowiadającego mu znacznika „Patch:”\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Brak źródła numer %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
-msgstr "Brak znacznika \"Source:\" w pliku spec\n"
+msgstr "Brak znacznika „Source:” w pliku spec\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Błąd podczas przetwarzania %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
-msgstr "wiersz %d: błędny parametr dla %%setup: %s\n"
+msgstr "%d. wiersz: błędny parametr dla %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
-msgstr "wiersz %d: błędna opcja %%setup %s: %s\n"
+msgstr "%d. wiersz: błędna opcja %%setup %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Nieprawidłowy numer łaty %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
-msgstr "wiersz %d: drugie %%prep\n"
+msgstr "%d. wiersz: drugie %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
-"Tokeny zależności muszą zaczynać się od znaków alfanumerycznych, \"_\" lub "
-"\"/\""
+"Tokeny zależności muszą zaczynać się od znaków alfanumerycznych, „_” lub „/”"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
-msgstr "Wersja w nazwie pliku jest niedozwolona"
+msgstr "Wersja w nazwie pliku jest niedozwolona"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "Wersja jest wymagana"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr "Złożone zależności nie są dozwolone dla tego typu"
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "nieprawidłowa zależność"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "Wersja jest wymagana"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr "Tylko ścieżki bezwzględne są dozwolone w wyzwalaczach plików"
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+"Wyzwalacz wywołany przez ten sam pakiet jest już określony w pliku spec"
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
-msgstr "wiersz %d: %s: %s\n"
+msgstr "%d. wiersz: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
-msgstr "wiersz %d: wyzwalacze muszą posiadać --: %s\n"
+msgstr "%d. wiersz: wyzwalacze muszą mieć --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
-msgstr "wiersz %d: błąd podczas przetwarzania %s: %s\n"
+msgstr "%d. wiersz: błąd podczas przetwarzania %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
-msgstr "wiersz %d: wewnętrzny skrypt musi kończyć się \">\": %s\n"
+msgstr "%d. wiersz: wewnętrzny skrypt musi kończyć się „>”: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
-msgstr "wiersz %d: program skryptu musi zaczynać się od \"/\": %s\n"
+msgstr "%d. wiersz: program skryptu musi zaczynać się od „/”: %s\n"
+
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr "%d. wiersz: priorytety są dozwolone tylko w wyzwalaczach plików: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
-msgstr "wiersz %d: drugi %s\n"
+msgstr "%d. wiersz: drugie %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
-msgstr "wiersz %d: wewnętrzny skrypt jest nieobsługiwany: %s\n"
+msgstr "%d. wiersz: wewnętrzny skrypt jest nieobsługiwany: %s\n"
+
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
-"wiersz %d: parametry interpretatora nie są dozwolone w wyzwalaczach: %s\n"
+"%d. wiersz: parametry interpretatora nie są dozwolone w wyzwalaczach: %s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
-msgstr "wiersz %d: %s\n"
+msgstr "%d. wiersz: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr "Makro rozszerzone w komentarzu w %d. wierszu: %s\n"
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Nie można otworzyć %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr "%s:%d: oczekiwano parametru dla %s\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
-msgstr "wiersz %d: niezamknięte %%if\n"
+msgstr "%d. wiersz: niezamknięte %%if\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
-msgstr "wiersz %d: niezamknięte makro lub błędna kontynuacja wiersza\n"
+msgstr "%d. wiersz: niezamknięte makro lub błędna kontynuacja wiersza\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr "%s:%d: błędny warunek %%if\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: napotkano %%else bez %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: napotkano %%endif bez %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr "%s:%d: błędnie sformatowany zwrot %%include\n"
 
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
-msgstr "Nie odnaleziono zgodnych architektur do zbudowania\n"
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr "kodowanie %s nie jest obsługiwane przez system\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:674
 #, c-format
-msgid "Package has no %%description: %s\n"
-msgstr "Pakiet nie posiada %%description: %s\n"
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr "Pakiet %s: nieprawidłowe kodowanie %s w %s: %s — %s\n"
 
-#: build/policies.c:87
+#: build/parseSpec.c:710
 #, c-format
-msgid "Policy module '%s' duplicated with overlapping types\n"
-msgstr "Moduł polityki \"%s\" posiada kopię z pokrywającymi się typami\n"
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
 
-#: build/policies.c:93
+#: build/parseSpec.c:717
 #, c-format
-msgid "Base modules '%s' and '%s' have overlapping types\n"
-msgstr "Podstawowe moduły \"%s\" i \"%s\" posiadają pokrywające się typy\n"
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr "Nie odnaleziono zgodnych architektur do zbudowania\n"
+
+#: build/parseSpec.c:912
+#, c-format
+msgid "Package has no %%description: %s\n"
+msgstr "Pakiet nie ma %%description: %s\n"
+
+#: build/policies.c:87
+#, c-format
+msgid "Policy module '%s' duplicated with overlapping types\n"
+msgstr "Moduł polityki „%s” ma kopię z pokrywającymi się typami\n"
+
+#: build/policies.c:93
+#, c-format
+msgid "Base modules '%s' and '%s' have overlapping types\n"
+msgstr "Podstawowe moduły „%s” i „%s” mają pokrywające się typy\n"
 
 #: build/policies.c:101
 msgid "Failed to get policies from header\n"
-msgstr "Uzyskanie polityk z nagłówka się nie powiodło\n"
+msgstr "Uzyskanie polityk z nagłówka się nie powiodło\n"
 
 #: build/policies.c:154
 #, c-format
@@ -1422,8 +1627,8 @@ msgid ""
 "'%s' type given with other types in %%semodule %s. Compacting types to "
 "'%s'.\n"
 msgstr ""
-"Typ \"%s\" został podany razem z innymi typami w %%semodule %s. "
-"Kompaktowanie typów do \"%s\".\n"
+"Typ „%s” został podany razem z innymi typami w %%semodule %s. Kompaktowanie "
+"typów do „%s”.\n"
 
 #: build/policies.c:246
 #, c-format
@@ -1438,463 +1643,576 @@ msgstr "Oczekiwano znacznika %%semodule: %s\n"
 #: build/policies.c:262
 #, c-format
 msgid "Missing module path in line: %s\n"
-msgstr "Brak ścieżki do modułu w wierszu: %s\n"
+msgstr "Brak ścieżki do modułu w wierszu: %s\n"
 
 #: build/policies.c:268
 #, c-format
 msgid "Too many arguments in line: %s\n"
-msgstr "Za dużo parametrów w wierszu: %s\n"
+msgstr "Za dużo parametrów w wierszu: %s\n"
 
 #: build/policies.c:307
 #, c-format
 msgid "Processing policies: %s\n"
 msgstr "Przetwarzanie polityk: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "Ignorowanie nieprawidłowego wyrażenia regularnego %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Nie można utworzyć potoku dla %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Nie można wykonać %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Nie można rozdzielić %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s się nie powiodło: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "zapisanie wszystkich danych do %s się nie powiodło: %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Konwersja %s na długą liczbę całkowitą się nie powiodła.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr "Pusty klasyfikator pliku\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "Brak skonfigurowanych atrybutów plików\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) się nie powiodło: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load się nie powiodło: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
-msgstr "Rozpoznanie pliku \"%s\" się nie powiodło: tryb %06o %s\n"
+msgstr "Rozpoznanie pliku „%s” się nie powiodło: tryb %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Wyszukiwanie %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Odnalezienie %s się nie powiodło:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "odpytanie pliku spec %s się nie powiodło, nie można przetworzyć\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(błąd 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s błąd(%d) z %s: %s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Błędne magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s błąd(%d): %s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Błędny/nieczytelny nagłówek"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "nierozpoznana opcja bazy danych: zignorowano „%s”.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Rozmiar nagłówka jest za duży"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s ma nieprawidłową wartość liczbową, pominięto\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr "Plik jest za duży dla archiwum"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s ma za dużą lub za małą wartość long, pominięto\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Nieznany typ pliku"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s ma za dużą lub za małą wartość całkowitą, pominięto\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Brak twardych dowiązań"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "nie można otrzymać blokady %s na %s/%s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Skrót nie zgadza się"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "współdzielonej"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Wewnętrzny błąd"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "wyłącznej"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Plik archiwum nie znajduje się w nagłówku"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "nieprawidłowy typ indeksu %x w %s/%s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " się nie powiodło - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "błąd(%d) podczas uzyskiwania wpisów „%s” z indeksu %s: %s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "błąd(%d) podczas zapisywania wpisu „%s” do %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "błąd(%d) usuwania wpisu „%s” z %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "błąd(%d) podczas dodawania wpisu nagłówka #%d\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "błąd(%d) podczas usuwania wpisu nagłówka #%d\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "błąd(%d) podczas przydzielania nowej instancji pakietu\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
-"%s jest pakietem RPM Delta i nie może zostać bezpośrednio zainstalowany\n"
+"%s jest pakietem RPM Delta i nie może zostać bezpośrednio zainstalowany\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
-msgstr "Nieobsługiwane dane (%s) w pakiecie %s\n"
+msgstr "Nieobsługiwane dane (%s) w pakiecie %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "pakiet %s został już dodany, pomijanie %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "pakiet %s został już dodany, zastępowanie %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(nie jest „blob”)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(nie jest liczbą)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(nie jest ciągiem)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(nieprawidłowy typ)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
-msgstr "%a %b %d %Y"
+msgstr "%a %d %b %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(nie jest base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(nieprawidłowy typ)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(nie jest \"blob\")"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(nieprawidłowy typ XML)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(nie jest podpisem OpenPGP)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr "Nieprawidłowa data %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "zwykły"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "zastąpiony"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "niezainstalowany"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
-msgstr "udostępniony w sieci"
+msgstr "udostępniony w sieci"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "błędny kolor"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "brak"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(nieznany)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(nie jest ciągiem)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "użytkownik %s nie istnieje - używanie roota\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "grupa %s nie istnieje - używanie roota\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s zapisano jako %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s utworzono jako %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr "%s %s: usunięcie się nie powiodło: %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr "katalog"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr "plik"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr "pomijanie %s %s z podpisem, którego nie można sprawdzić\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr "pomijanie %s z podpisem, którego nie można sprawdzić\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr "load hdr: BŁĘDNE"
+
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "znacznik[%d]: BŁĘDNY, znacznik %d typ %d offset %d licznik %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr "znacznik regionu: BŁĘDNY, znacznik %d typ %d offset %d licznik %d"
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: BŁĘDNY, nie szesnastkowy\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr "offset regionu: BŁĘDNY, znacznik %d typ %d offset %d licznik %d"
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: BŁĘDNY, nie binarny\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr "zakończenie regionu: BŁĘDNE, znacznik %d typ %d offset %d licznik %d"
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: BŁĘDNY, nie binarny\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "rozmiar blob(%d): BŁĘDNY, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
-msgstr "znacznik obszaru: BAD, znacznik %d typ %d offset %d licznik %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr "rozmiar hdr(%d): BŁĘDNY, odczytanie zwróciło %d"
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr "magic hdr: BŁĘDNE"
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "offset obszaru: BŁĘDNY, znacznik %d typ %d offset %d licznik %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr "znaczniki hdr: BŁĘDNE, liczba znaczników(%d) jest poza zakresem"
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "końcówka obszaru: BŁĘDNA, znacznik %d typ %d offset %d licznik %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr "dane hdr: BŁĘDNE, liczba bajtów(%d) jest poza zakresem"
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "rozmiar obszaru: BŁĘDNY, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr "blob hdr(%zd): BŁĘDNE, odczytanie zwróciło %d"
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr rozmiar(%d): BŁĘDNY, read zwróciło %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr "pad sigh(%zd): BŁĘDNE, odczyt %zd bajtów"
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic: BŁĘDNE\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr znacznik: BŁĘDNE, liczba znaczników(%d) poza zakresem\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr "rozmiar blob(%d): BŁĘDNY, 8 + 16 * il(%d) + dl(%d)"
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "nieprawidłowa szerokość pola"
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hdr dane: BŁĘDNE, liczba bajtów(%d) poza zakresem\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr blob(%zd): BŁĘDNY, read zwróciło %d\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "hdr load: BŁĘDNY\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "pusty format znacznika"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature się nie powiodło: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "pusta nazwa znacznika"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: podpis jest niedostępny\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead się nie powiodło: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "oczekiwano ] na końcu tablicy"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "nieoczekiwane ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "nieoczekiwane }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "oczekiwano ? w wyrażeniu"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "oczekiwano { po ? w wyrażeniu"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "oczekiwano } w wyrażeniu"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "oczekiwano : po podwyrażeniu ?"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "oczekiwano { po : w wyrażeniu"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "oczekiwano | na końcu wyrażenia"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "iterator tablicy użyty na tablicach o różnych rozmiarach"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread się nie powiodło: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
+"%s: błąd: podano więcej niż jedną opcję --pipe (niezgodne aliasy biblioteki "
+"popt?)\n"
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
-msgstr "wcześniejsze określenie MAKRA z wartością WYRAŻENIE"
+msgstr "wcześniejsze określenie MAKRA z wartością WYRAŻENIE"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "\"MAKRO WYRAŻENIE\""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
-msgstr "określenie MAKRA z wartością WYRAŻENIE"
+msgstr "określenie MAKRA z wartością WYRAŻENIE"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
-msgstr ""
+msgstr "usunięcie określenia MAKRA"
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
-msgstr ""
+msgstr "MAKRO"
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
-msgstr "wyświetlenie rozwinięcia makr z WYRAŻENIA"
+msgstr "wyświetlenie rozwinięcia makr z WYRAŻENIA"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "\"WYRAŻENIE\""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
-msgstr "odczytanie <PLIK:...> zamiast domyślnych plików"
+msgstr "odczytanie <PLIK:> zamiast domyślnych plików"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
-msgstr "<PLIK:...>"
+msgstr "<PLIK:…>"
+
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr "bez włączania wtyczek"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "bez sprawdzania skrótów pakietów"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "bez sprawdzania nagłówków bazy danych po pobraniu"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "bez sprawdzania podpisów pakietów"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "przekazanie standardowego wyjścia do POLECENIA"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "POLECENIE"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "użycie ROOTA jako katalogu najwyższego poziomu"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
-msgstr "użycie bazy danych w KATALOGU"
+msgstr "użycie bazy danych w KATALOGU"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "KATALOG"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "wyświetlenie znanych znaczników zapytań"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
-msgstr "wyświetlenie ostatecznej konfiguracji rpmrc i makr"
+msgstr "wyświetlenie ostatecznej konfiguracji rpmrc i makr"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "użycie mniej szczegółowego wyjścia"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "użycie bardziej szczegółowego wyjścia"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "wyświetlenie wersji używanego oprogramowania RPM"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "debugowanie maszyny stanu danych pliku"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "debugowanie wejścia/wyjścia rpmio"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: tabela opcji jest błędnie skonfigurowana (%d)\n"
@@ -1915,165 +2233,175 @@ msgstr "przesunięcia muszą zawierać ="
 msgid "relocations must have a / following the ="
 msgstr "przesunięcia muszą zawierać / po ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
-"zainstalowanie wszystkich plików, nawet konfiguracyjnych, które w innym "
+"zainstalowanie wszystkich plików, nawet konfiguracyjnych, które w innym "
 "przypadku by pominięto"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
-"usunięcie wszystkich pakietów, które zgadzają się z <pakietem> (zwykle "
-"tworzony jest błąd, jeśli <pakiet> podaje wiele pakietów)"
+"usunięcie wszystkich pakietów, które zgadzają się z <pakietem> (zwykle "
+"tworzony jest błąd, jeśli <pakiet> określa wiele pakietów)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
-msgstr "przesunięcie plików w nieprzesuwalnym pakiecie"
+msgstr "przesunięcie plików w nieprzesuwalnym pakiecie"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "wyświetlenie pętli zależności jako ostrzeżenie"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "usunięcie (odinstalowanie) pakietu"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<pakiet>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "bez instalacji plików konfiguracyjnych"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "bez instalacji dokumentacji"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "pominięcie plików zaczynających się od składnika <ścieżki> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<ścieżka>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "skrócona wersja --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "zaktualizowanie pakietów, jeśli są już zainstalowane"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
-msgstr "<plik_pakietu>+"
+msgstr "<plik-pakietu>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
-msgstr "wyświetlenie krzyżyków podczas instalacji pakietów (dobre z -v)"
+msgstr "wyświetlenie krzyżyków podczas instalacji pakietów (dobre z -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "bez sprawdzania architektury pakietu"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "bez sprawdzania systemu operacyjnego pakietu"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "bez sprawdzania pojemności dysku przed zainstalowaniem"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "zainstalowanie dokumentacji"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "zainstalowanie pakietów"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "zaktualizowanie bazy danych, ale bez modyfikacji systemu plików"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "bez sprawdzania zależności pakietu"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "bez sprawdzania skrótów plików"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "bez sprawdzania skrótów plików (przestarzałe)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "bez instalacji kontekstów bezpieczeństwa plików"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "bez zmieniania kolejności instalacji pakietów, aby zapewnić zależności"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "bez wykonania skryptów pakietów"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "bez wykonania skryptu %%pre (jeśli jest)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "bez wykonania skryptu %%post (jeśli jest)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "bez wykonania skryptu %%preun (jeśli jest)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "bez wykonania skryptu %%postun (jeśli jest)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "bez wykonania skryptu %%pretrans (jeśli jest)"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "bez wykonania skryptu %%posttrans (jeśli jest)"
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "bez wykonania żadnych skryptów wyzwalanych przez ten pakiet"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "bez wykonania żadnych skryptów %%triggerprein"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "bez wykonania żadnych skryptów %%triggerin"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "bez wykonania żadnych skryptów %%triggerun"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "bez wykonania żadnych skryptów %%triggerpostun"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "bez wykonywania żadnych działań kolekcji"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2081,369 +2409,407 @@ msgstr ""
 "zaktualizowanie do poprzedniej wersji pakietu (--force podczas "
 "aktualizowania robi to automatycznie)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
-msgstr "wyświetlenie stanu instalacji pakietu w procentach"
+msgstr "wyświetlenie stanu instalacji pakietu w procentach"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "przesunięcie pakietu do <katalogu>, jeśli jest przesuwalny"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<katalog>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
-msgstr "przesunięcie plików z <poprzedniej> ścieżki do <nowej>"
+msgstr "przesunięcie plików z <poprzedniej> ścieżki do <nowej>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<poprzednia>=<nowa>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "zignorowanie konfliktów plików między pakietami"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "zainstalowanie ponownie, jeśli pakiet jest już zainstalowany"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "bez instalacji, podanie tylko czy instalacja zadziała czy nie"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "zaktualizowanie pakietów"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "ponowne zainstalowanie pakietów"
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "odpytanie/sprawdzenie wszystkich pakietów"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "tryb sprawdzania podpisów pakietów RPM"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "odpytanie/sprawdzenie pakietów zawierających plik"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
-msgstr "odpytanie/sprawdzenie pakietów w grupie"
+msgstr "odpytanie/sprawdzenie pakietów w grupie"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "odpytanie/sprawdzenie pliku pakietu"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
-msgstr "odpytanie/sprawdzenie pakietów z identyfikatorem pakietu"
+msgstr "odpytanie/sprawdzenie pakietów z identyfikatorem pakietu"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
-msgstr "odpytanie/sprawdzenie pakietów z identyfikatorem nagłówka"
+msgstr "odpytanie/sprawdzenie pakietów z identyfikatorem nagłówka"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "tryb odpytywania pakietów RPM"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "odpytanie/sprawdzenie instancji nagłówka"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
-msgstr "odpytanie/sprawdzenie pakietów z transakcji instalacji"
+msgstr "odpytanie/sprawdzenie pakietów z transakcji instalacji"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "odpytanie pakietów wyzwalanych przez pakiet"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "tryb sprawdzania pakietów RPM"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "odpytanie/sprawdzenie pakietów wymagających zależności"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "odpytanie/sprawdzenie pakietów dostarczających zależność"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr "odpytanie/sprawdzenie pakietów zalecających zależność"
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr "odpytanie/sprawdzenie pakietów sugerujących zależność"
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr "odpytanie/sprawdzenie pakietów uzupełniających zależność"
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr "odpytanie/sprawdzenie pakietów ulepszających zależność"
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
-msgstr "bez używania wyrażeń regularnych w parametrach"
+msgstr "bez używania wyrażeń regularnych w parametrach"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "bez przetwarzania plików nie będących pakietami jako manifesty"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "wyświetlenie listy wszystkich plików konfiguracyjnych"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "wyświetlenie listy wszystkich plików dokumentacji"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "wyświetlenie listy wszystkich plików dokumentacji"
+msgstr "wyświetlenie listy wszystkich plików licencji"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "wyświetlenie listy wszystkich plików licencji"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
-msgstr "zrzucenie podstawowych informacji o pliku"
+msgstr "zrzucenie podstawowych informacji o pliku"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "wyświetlenie listy plików pakietu"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "pominięcie plików %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "pominięcie plików %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "wyświetlenie stanu wyświetlonych plików"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "bez sprawdzania rozmiaru plików"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "bez sprawdzania ścieżek dowiązań symbolicznych plików"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "bez sprawdzania właścicieli plików"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "bez sprawdzania grup plików"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "bez sprawdzania czasu modyfikacji plików"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "bez sprawdzania trybu plików"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "bez sprawdzania możliwości plików"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "bez sprawdzania kontekstów bezpieczeństwa plików"
 
-#: lib/poptQV.c:238
-msgid "don't verify files in package"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "bez sprawdzania możliwości plików"
+
+#: lib/poptQV.c:266
+msgid "don't verify files in package"
 msgstr "bez sprawdzania plików pakietu"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "bez sprawdzania zależności pakietu"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "bez wykonania żadnych skryptów sprawdzania"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "Brak funkcji rpmlib dla %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "oczekiwano pakietu źródłowego, odnaleziono binarny\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "pakiet źródłowy nie zawiera pliku .spec\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "rozpakowanie archiwum się nie powiodło%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " na pliku "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s nie powiódł się na pliku %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s się nie powiodło: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "niepoprawny format: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(nie zawiera plików)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "zwykły                "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "zastąpiony            "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "niezainstalowany      "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
-msgstr "udostępniony w sieci  "
+msgstr "udostępniony w sieci  "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "błędny kolor          "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(brak stanu)          "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(nieznany %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
-msgstr "pakiet nie posiada list właścicieli/grup plików\n"
+msgstr "pakiet nie ma list właścicieli/grup plików\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
-msgstr "pakiet nie posiada list właścicieli ani identyfikatorów plików\n"
+msgstr "pakiet nie ma list właścicieli ani identyfikatorów plików\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "grupa %s nie zawiera żadnych pakietów\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "brak pakietów wyzwalających %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "błędnie sformowane %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "brak pakietów pasujących do %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "brak pakietów wymagających %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr "brak pakietów zalecających %s\n"
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr "brak pakietów sugerujących %s\n"
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr "brak pakietów uzupełniających %s\n"
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr "brak pakietów ulepszających %s\n"
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "brak pakietów dostarczających %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "plik %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "plik %s nie należy do żadnego pakietu\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "nieprawidłowy numer pakietu: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "nie można odczytać wpisu %u\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "pakiet %s nie jest zainstalowany\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
-msgstr "nieznany znacznik: \"%s\"\n"
+msgstr "nieznany znacznik: „%s”\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s: zaimportowanie klucza %d się nie powiodło.\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s: klucz %d nie jest opakowanym kluczem publicznym.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: zaimportowanie read się nie powiodło(%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr "%s: headerRead się nie powiodło: %s\n"
+msgid "Fread failed: %s"
+msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
-"%s: nie można odczytać niezmiennego regionu nagłówka. Uszkodzony pakiet?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NIE DOBRZE"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (BRAK KLUCZY:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (NIEZAUFANE KLUCZE:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: otwarcie się nie powiodło: %s\n"
@@ -2468,215 +2834,447 @@ msgstr "Nie można zmienić katalogu roota: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "Nie można przywrócić katalogu roota: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "Tworzenie %d brakujących indeksów, proszę czekać…\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr "nie można otworzyć indeksu %s za pomocą %s — %s (%d)\n"
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "ścieżka bazy danych nie została ustawiona\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: pomijanie"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "błąd(%d) podczas zapisywania wpisu #%d do %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec się nie powiodło: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp się nie powiodło: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: pomijanie"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: pobrano uszkodzony nagłówek #%u — pomijanie.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: nie można odczytać nagłówka pod 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "ścieżka bazy danych nie została ustawiona"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "utworzenie katalogu %s się nie powiodło: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "nagłówek #%u w bazie danych jest błędny — pomijanie.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "nie można dodać wpisu będącego pierwotnie przy %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"przebudowanie bazy danych się nie powiodło: pierwotna baza danych pozostała "
+"na miejscu\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "zamiana poprzedniej bazy danych na nową się nie powiodła.\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NIE "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "TAK"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr "Zależności PreReq:, Provides: i Obsoletes: obsługują wersje."
+msgstr "Zależności PreReq:, Provides: i Obsoletes: obsługują wersje."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
-"nazwy plików przechowano jako krotka (dirName,baseName,dirIndex), a nie jako "
+"nazwy plików przechowano jako krotka (dirName,baseName,dirIndex), a nie jako "
 "ścieżki."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
-msgstr "dane pakietu mogą zostać skompresowane używając bzip2."
+msgstr "dane pakietu mogą zostać skompresowane za pomocą bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
-msgstr "dane pakietu mogą zostać skompresowane używając xz."
+msgstr "dane pakietu mogą zostać skompresowane za pomocą xz."
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
-msgstr "dane pakietu mogą zostać skompresowane używając lzma."
+msgstr "dane pakietu mogą zostać skompresowane za pomocą lzma."
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
-msgstr "pliki danych pakietu posiadają przedrostek \"./\"."
+msgstr "pliki danych pakietu mają przedrostek „./”."
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr "pakiet nazwa-wersja-wydanie nie jest domyślnie dostarczany."
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
 msgstr "znaczniki nagłówka są zawsze porządkowane po wczytaniu."
 
-#: lib/rpmds.c:961
+#: lib/rpmds.c:1249
 msgid "the scriptlet interpreter can use arguments from header."
-msgstr "interpreter skryptów może używać parametrów z nagłówka."
+msgstr "interpreter skryptów może używać parametrów z nagłówka."
 
-#: lib/rpmds.c:964
+#: lib/rpmds.c:1252
 msgid "a hardlink file set may be installed without being complete."
 msgstr "plik twardego dowiązania może zostać zainstalowany bez ukończenia."
 
-#: lib/rpmds.c:967
+#: lib/rpmds.c:1255
 msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 "skrypty pakietu mogą odwoływać się do bazy danych RPM podczas instalowania."
 
-#: lib/rpmds.c:971
+#: lib/rpmds.c:1259
 msgid "internal support for lua scripts."
 msgstr "wewnętrzna obsługa skryptów Lua."
 
-#: lib/rpmds.c:975
+#: lib/rpmds.c:1263
 msgid "file digest algorithm is per package configurable"
 msgstr "algorytm skrótu pliku jest konfigurowalny dla każdego pakietu osobno"
 
-#: lib/rpmds.c:979
+#: lib/rpmds.c:1267
 msgid "support for POSIX.1e file capabilities"
 msgstr "obsługa możliwości plików POSIX.1e"
 
-#: lib/rpmds.c:983
+#: lib/rpmds.c:1271
 msgid "package scriptlets can be expanded at install time."
-msgstr "skrypty pakietu mogą być rozszerzane w czasie instalacji."
+msgstr "skrypty pakietu mogą być rozszerzane w czasie instalacji."
 
-#: lib/rpmds.c:986
+#: lib/rpmds.c:1274
 msgid "dependency comparison supports versions with tilde."
 msgstr "rozwiązywanie zależności obsługuje wersje zawierające tyldę."
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "obsługa plików większych niż 4 GB"
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr "obsługa złożonych zależności."
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr "Nieznany operator złożonej zależności „%.*s”"
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr "Nazwa jest wymagana"
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr "Złożona zależność nie zaczyna się od „(”"
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr "Brak parametru dla operatora złożonej zależności"
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr "Pusta złożona zależność"
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr "Niezakończona złożona zależność: %s"
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr "Nie można połączyć różnych operatorów"
+
+#: lib/rpmds.c:1564
+#, fuzzy
+msgid "Can only chain and/or/with ops"
+msgstr "Można połączyć tylko operatory AND i OR"
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr "Błędne dane po złożonej zależności"
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Błędne magic"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Błędny/nieczytelny nagłówek"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Rozmiar nagłówka jest za duży"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "Plik jest za duży dla archiwum"
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Nieznany typ pliku"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "Brak plików"
+
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Skrót nie zgadza się"
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Wewnętrzny błąd"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Plik archiwum nie znajduje się w nagłówku"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
+
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " się nie powiodło — "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: (błąd 0x%x)"
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "otwarcie %s się nie powiodło: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr "Przekroczono maksymalny poziom rekurencji manifestu: %s\n"
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: nie jest pakietem RPM (ani manifestem pakietu)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
-msgstr "Aktualizowanie/instalowanie...\n"
+msgstr "Aktualizowanie/instalowanie\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
-msgstr "Czyszczenie/usuwanie...\n"
+msgstr "Czyszczenie/usuwanie\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
-msgstr "Przygotowywanie..."
+msgstr "Przygotowywanie"
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
-msgstr "Przygotowywanie pakietów..."
+msgstr "Przygotowywanie pakietów"
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Niespełnione zależności:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: nie jest pakietem RPM (ani manifestem pakietu): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s nie może zostać zainstalowany\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Pobieranie %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
-msgstr "pomijanie %s - przesłanie się nie powiodło\n"
+msgstr "pomijanie %s  przesłanie się nie powiodło\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "pakiet %s nie jest przesuwalny\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
-msgstr "błąd podczas odczytywania z pliku %s\n"
+msgstr "błąd podczas odczytywania z pliku %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
-msgstr "\"%s\" podaje wiele pakietów:\n"
+msgstr "„%s” określa wiele pakietów:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "nie można otworzyć %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Instalowanie %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "nie jest pakietem RPM"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "niedozwolony typ podpisu"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "nieobsługiwana wersja pakietu RPM"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "odczytanie się nie powiodło: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "nie jest pakietem RPM\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "nie można utworzyć blokady %s na %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "oczekiwanie na blokadę %s na %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr "Wykonanie dlopen na %s %s się nie powiodło\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "Rozwiązanie symbolu %s się nie powiodło: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "Rozwinięcie makra %%__collection_%s się nie powiodło\n"
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "Wtyczka %%__%s_%s nie jest skonfigurowana\n"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "Wtyczka %s nie jest wczytana\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr "Rozwiązanie wtyczki %s symbolu %s się nie powiodło: %s\n"
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "różne"
@@ -2699,17 +3297,17 @@ msgstr "pakiet %s jest już zainstalowany"
 #: lib/rpmprob.c:125
 #, c-format
 msgid "path %s in package %s is not relocatable"
-msgstr "ścieżka %s w pakiecie %s nie jest przesuwalna"
+msgstr "ścieżka %s w pakiecie %s nie jest przesuwalna"
 
 #: lib/rpmprob.c:130
 #, c-format
 msgid "file %s conflicts between attempted installs of %s and %s"
-msgstr "plik %s jest w konflikcie między instalowanymi %s i %s"
+msgstr "plik %s jest w konflikcie między instalowanymi %s i %s"
 
 #: lib/rpmprob.c:135
 #, c-format
 msgid "file %s from install of %s conflicts with file from package %s"
-msgstr "plik %s z instalacji %s jest w konflikcie z plikiem z pakietu %s"
+msgstr "plik %s z instalacji %s jest w konflikcie z plikiem z pakietu %s"
 
 #: lib/rpmprob.c:140
 #, c-format
@@ -2719,12 +3317,12 @@ msgstr "pakiet %s (nowszy niż %s) jest już zainstalowany"
 #: lib/rpmprob.c:145
 #, c-format
 msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
-msgstr "instalowanie pakietu %s wymaga %<PRIu64>%cB w systemie plików %s"
+msgstr "instalowanie pakietu %s wymaga %<PRIu64>%c B w systemie plików %s"
 
 #: lib/rpmprob.c:155
 #, c-format
 msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
-msgstr "instalowanie pakietu %s wymaga %<PRIu64> i-węzłów w systemie plików %s"
+msgstr "instalowanie pakietu %s wymaga %<PRIu64> i-węzłów w systemie plików %s"
 
 #: lib/rpmprob.c:159
 #, c-format
@@ -2738,7 +3336,7 @@ msgstr "(zainstalowane) "
 #: lib/rpmprob.c:163
 #, c-format
 msgid "%s conflicts with %s%s"
-msgstr "%s jest w konflikcie z %s%s"
+msgstr "%s jest w konflikcie z %s%s"
 
 #: lib/rpmprob.c:167
 #, c-format
@@ -2750,805 +3348,636 @@ msgstr "%s jest zastępowane przez %s%s"
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "wystąpił nieznany błąd %d podczas manipulowania pakietem %s"
 
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
-msgstr "brak drugiego \":\" w %s:%d\n"
-
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
-msgstr "brak nazwy architektury w %s:%d\n"
-
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
-msgstr "Niepełny wiersz danych w %s:%d\n"
-
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
-msgstr "Za dużo parametrów w wierszu danych w %s:%d\n"
-
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr "Błędny numer architektury/systemu operacyjnego: %s (%s:%d)\n"
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr "Niepełny domyślny wiersz w %s:%d\n"
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr "Za dużo parametrów w domyślnym wierszu w %s:%d\n"
-
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "brak \":\" (odnaleziono 0x%02x) w %s:%d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "brak parametru dla %s w %s:%d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr "nie można otworzyć %s w %s:%d: %m\n"
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "brak architektury dla %s w %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "błędna opcja \"%s\" w %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-"Odczytanie pomocniczego wektora się nie powiodło, nie zamontowano /proc?\n"
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Nieznany system: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Proszę skontaktować się z %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Nie można otworzyć %s do odczytania: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr "Nie można przywrócić bieżącego katalogu: %m"
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "Obsługa skryptów <lua> nie jest wbudowana\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Nie można utworzyć pliku tymczasowego dla %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Nie można utworzyć kopii deskryptora pliku: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "Skrypt %s się nie powiódł, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "Skrypt %s się nie powiódł, sygnał %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "Skrypt %s się nie powiódł, stan wyjścia %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Nieznany format"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "instalacja"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "usunięcie"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "nie można otworzyć bazy danych pakietów w %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "dodatkowe \"(\" w etykiecie pakietu: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "brak \"(\" w etykiecie pakietu: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "brak \")\" w etykiecie pakietu: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: odczytanie klucza publicznego się nie powiodło.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "transakcji"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh rozmiar(%d): BŁĘDNY, read zwróciło %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic: BŁĘDNE\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh znaczników: BŁĘDNE, liczba znaczników(%d) poza zakresem\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh dane: BŁĘDNE, liczba bajtów(%d) poza zakresem\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d): BŁĘDNY, read zwróciło %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh znacznik[%d]: BŁĘDNY, znacznik %d typ %d offset %d licznik %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh wczytanie: BŁĘDNE\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh wyrównanie(%zd): BŁĘDNE, odczytano %zd bajtów\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh rozmiar podpisu(%zd): BŁĘDNY, fstat(2) się nie powiodło\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "Nie można odczytać niezmiennego regionu nagłówka. Uszkodzony pakiet?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr "Nie można podpisywać pakietów RPM v3\n"
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "Skrót MD5:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "Skrót SHA1 nagłówka:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Nagłówek "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr "Sprawdzanie podpisu: BŁĘDNE PARAMETRY (%d %p %d %p %p)\n"
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "pominięto"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "nie powiodło się"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "brak   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Niespełnione zależności dla %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr "nieprawidłowa szerokość pola"
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "brak { po %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "brak } po %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "pusty format znacznika"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "pusta nazwa znacznika"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "nieznany znacznik"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "oczekiwano ] na końcu tablicy"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "nieoczekiwane ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "nieoczekiwane }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "oczekiwano ? w wyrażeniu"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "oczekiwano { po ? w wyrażeniu"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "oczekiwano } w wyrażeniu"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "oczekiwano : po podwyrażeniu ?"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "oczekiwano { po : w wyrażeniu"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "oczekiwano | na końcu wyrażenia"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "iterator tablicy użyty na tablicach o różnych rozmiarach"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "Tworzenie %d brakujących indeksów, proszę czekać...\n"
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "nie można otworzyć indeksu %s używając bazy danych%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr "błąd(%d) podczas uzyskiwania wpisów \"%s\" z indeksu %s: %s\n"
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "ścieżka bazy danych nie została ustawiona\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: pomijanie"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "błąd(%d) podczas zapisywania wpisu #%d do %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec się nie powiodło: %s\n"
-
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:222
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp się nie powiodło: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: pomijanie"
+msgid "missing second ':' at %s:%d\n"
+msgstr "brak drugiego „:” w %s:%d\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:225
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: pobrano uszkodzony nagłówek #%u - pomijanie.\n"
+msgid "missing architecture name at %s:%d\n"
+msgstr "brak nazwy architektury w %s:%d\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:370
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr "błąd(%d:%s) podczas pobierania następnego klucza z indeksu %s\n"
+msgid "Incomplete data line at %s:%d\n"
+msgstr "Niepełny wiersz danych w %s:%d\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:375
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "błąd(%d) podczas dodawania wpisu nagłówka #%d\n"
+msgid "Too many args in data line at %s:%d\n"
+msgstr "Za dużo parametrów w wierszu danych w %s:%d\n"
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:382
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "błąd(%d) podczas usuwania wpisu nagłówka #%d\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr "Błędny numer architektury/systemu operacyjnego: %s (%s:%d)\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:413
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: nie można odczytać nagłówka pod 0x%x\n"
+msgid "Incomplete default line at %s:%d\n"
+msgstr "Niepełny domyślny wiersz w %s:%d\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:418
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "błąd(%d) podczas ustawiania wpisów \"%s\" z indeksu %s\n"
+msgid "Too many args in default line at %s:%d\n"
+msgstr "Za dużo parametrów w domyślnym wierszu w %s:%d\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:523
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "błąd(%d) podczas zapisywania wpisu \"%s\" do %s\n"
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "brak „:” (odnaleziono 0x%02x) w %s:%d\n"
 
-#: lib/rpmdb.c:2477
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "błąd(%d) usuwania wpisu \"%s\" z %s\n"
+msgid "missing argument for %s at %s:%d\n"
+msgstr "brak parametru dla %s w %s:%d\n"
 
-#: lib/rpmdb.c:2551
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "błąd(%d) podczas przydzielania nowej instancji pakietu\n"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "nie można otworzyć %s w %s:%d: %m\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "błąd(%d) podczas otrzymywania wpisów \"%s\" z indeksu %s\n"
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "brak architektury dla %s w %s:%d\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "bÅ\82Ä\85d(%d) podczas zapisywania wpisu %s do %s\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "bÅ\82Ä\99dna opcja â\80\9e%sâ\80\9d w %s:%d\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "ścieżka bazy danych nie została ustawiona"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr ""
+"Odczytanie pomocniczego wektora się nie powiodło, nie zamontowano /proc?\n"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "utworzenie katalogu %s się nie powiodło: %s\n"
+msgid "Unknown system: %s\n"
+msgstr "Nieznany system: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "nagłówek #%u w bazie danych jest błędny - pomijanie.\n"
+msgid "Please contact %s\n"
+msgstr "Proszę skontaktować się z %s\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "nie można dodać wpisu będącego pierwotnie przy %u\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Nie można otworzyć %s do odczytania: %m.\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
-"przebudowanie bazy danych się nie powiodło: pierwotna baza danych pozostała "
-"na miejscu\n"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "zamiana poprzedniej bazy danych na nową się nie powiodła.\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr "Nie wywołano exec() po fork() w skrypcie Lua\n"
 
-#: lib/rpmdb.c:2949
+#: lib/rpmscript.c:138
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "aby odzyskać, należy zastąpić pliki w %s plikami z %s"
+msgid "Unable to restore current directory: %m"
+msgstr "Nie można przywrócić bieżącego katalogu: %m"
 
-#: lib/rpmdb.c:2960
-#, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "usunięcie katalogu %s się nie powiodło: %s\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "Obsługa skryptów <lua> nie jest wbudowana\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmscript.c:278
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "błąd bazy danych%d(%d) z %s: %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Nie można utworzyć pliku tymczasowego dla %s: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmscript.c:313
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "błąd bazy danych%d(%d): %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Nie można utworzyć kopii deskryptora pliku: %s: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmscript.c:353
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "nie można otrzymać blokady %s na %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "współdzielonej"
+msgid "Fwrite failed: %s"
+msgstr "„Fwrite” się nie powiodło: %s"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "wyłącznej"
-
-#: lib/backend/db3.c:582
+#: lib/rpmscript.c:371
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr "nieprawidłowy typ indeksu %x w %s/%s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "Skrypt %s się nie powiódł, waitpid(%d) rc %d: %s\n"
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmscript.c:375
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "nierozpoznana opcja bazy danych: \"%s\" zignorowano.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "Skrypt %s się nie powiódł, sygnał %d\n"
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmscript.c:378
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s ma nieprawidłową wartość liczbową, pominięto\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "Skrypt %s się nie powiódł, stan wyjścia %d\n"
 
-#: lib/backend/dbconfig.c:190
-#, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s ma za dużą lub za małą wartość long, pominięto\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Nieznany format"
+
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "instalacja"
+
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "usunięcie"
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmts.c:100
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s ma za dużą lub za małą wartość całkowitą, pominięto\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "nie można otworzyć bazy danych pakietów w %s\n"
 
-#: plugins/sepolicy.c:218
+#: lib/rpmts.c:199
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "Odkodowanie polityki dla %s się nie powiodło\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "dodatkowe „(” w etykiecie pakietu: %s\n"
 
-#: plugins/sepolicy.c:225
+#: lib/rpmts.c:217
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "Utworzenie pliku tymczasowego dla %s się nie powiodło: %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "brak „(” w etykiecie pakietu: %s\n"
 
-#: plugins/sepolicy.c:231
+#: lib/rpmts.c:225
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "Zapisanie polityki %s do pliku %s się nie powiodło\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "brak „)” w etykiecie pakietu: %s\n"
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr "Utworzenie obsługi semanage się nie powiodło\n"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: odczytanie klucza publicznego się nie powiodło.\n"
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "Połączenie z obsługą polityki się nie powiodło\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "transakcji"
 
-#: plugins/sepolicy.c:306
+#: lib/rpmvs.c:152
 #, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "Rozpoczęcie transakcji polityki się nie powiodło: %s\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: plugins/sepolicy.c:337
+#: lib/rpmvs.c:158
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr "Usunięcie tymczasowego pliku polityki %s się nie powiodło: %s\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: plugins/sepolicy.c:386
+#: lib/rpmvs.c:178
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "Zainstalowanie modułu polityki się nie powiodło: %s (%s)\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: plugins/sepolicy.c:416
+#: lib/rpmvs.c:188
 #, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "Usunięcie modułu polityki się nie powiodło: %s\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: lib/rpmvs.c:195
 #, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "Rozdzielenie procesu się nie powiodło: %s\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "Wykonanie %s się nie powiodło: %s\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/rpmvs.c:261
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "%s zostało nienormalnie zakończone\n"
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/rpmvs.c:268
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "%s nie powiodło się z kodem wyjścia %i\n"
+msgid "%s%s"
+msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "Wprowadzenie zmian w polityce się nie powiodło\n"
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "Rozwinięcie makra restorecon się nie powiodło"
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
-"Ponowne nadanie etykiet systemowi plików się nie powiodło. Pliki mogą "
-"posiadać błędne etykiety\n"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Nagłówek "
+
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
-"Ponowne wczytanie kontekstów plików się nie powiodło. Pliki mogą posiadać "
-"błędne etykiety\n"
 
-#: plugins/sepolicy.c:594
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Nie można ponownie wczytać nagłówka podpisu.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "pominięto"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "się nie powiodło"
+
+#: lib/verify.c:263
 #, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "Wydobycie polityki z %s się nie powiodło\n"
+msgid "Duplicate username or UID for user %s\n"
+msgstr "Podwójna nazwa użytkownika lub UID dla użytkownika %s\n"
 
-#: rpmio/macro.c:185
+#: lib/verify.c:284
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktywne %d puste %d\n"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr "Podwójna nazwa grupy lub GID dla grupy %s\n"
+
+#: lib/verify.c:395
+msgid "no state"
+msgstr "brak stanu"
+
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "nieznany stan"
+
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "brak   %c %s"
+
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Niespełnione zależności dla %s:\n"
+
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
+msgstr "Nie można przywrócić wartości „nice”: %s"
+
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
+msgstr "Nie można przywrócić priorytetu wejścia/wyjścia: %s"
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(puste)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(puste)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Makro %%%s posiada niezakończone ciało\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Makro %%%s ma niezakończone opcje\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Makro %%%s posiada niedozwoloną nazwę (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Makro %%%s ma niezakończoną treść\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Makro %%%s posiada niezakończone opcje\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
-msgstr "Makro %%%s posiada puste ciało\n"
+msgstr "Makro %%%s ma pustą treść\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "Makro %%%s wymaga spacji przed treścią\n"
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Rozwinięcie makra %%%s się nie powiodło\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
-msgstr "Makro %%%s posiada niedozwoloną nazwę (%%undefine)\n"
+msgstr "Makro %%%s ma niedozwoloną nazwę (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Makro %%%s (%s) nie zostało użyte poniżej poziomu %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr "Określono makro %%%s, ale nie jest używane w ramach zakresu\n"
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
-msgstr "Nieznana opcja %c w %s(%s)\n"
+msgstr "Nieznana opcja %c w %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
-"Za dużo poziomów rekurencji w rozwinięciu makra. Prawdopodobnie jest to "
+"Za dużo poziomów rekurencji w rozwinięciu makra. Prawdopodobnie jest to "
 "spowodowane rekurencyjną deklaracją makra.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Niezakończone %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Makro niemożliwe do przetworzenia po %%\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "wczytanie pliku makra %s się nie powiodło"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktywne %d puste %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "błąd podczas tworzenia pliku tymczasowego %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Plik %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Plik %s jest mniejszy niż %u bajtów\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "utworzenie katalogu się nie powiodło"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[brak]"
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(brak błędu)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "krytyczny błąd: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "błąd: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "ostrzeżenie: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "nieprawidłowa składnia skryptu Lua: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "nieprawidłowa składnia skryptu Lua: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "skrypt Lua się nie powiódł: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "nieprawidłowa składnia pliku Lua: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "hak Lua się nie powiódł: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[brak]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(brak błędu)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "krytyczny błąd: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "błąd: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "ostrzeżenie: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "przydzielenie pamięci (%u bajtów) zwróciło NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, identyfikator klucza %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(brak)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr "błąd podczas tworzenia katalogu tymczasowego %s: %m\n"
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr "błąd podczas tworzenia FIFO %s: %m\n"
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr "błąd podczas usuwania FIFO %s: %m\n"
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr "błąd podczas usuwania katalogu %s: %m\n"
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
-msgstr "%s: Fwrite się nie powiodło: %s\n"
+msgstr "%s: „Fwrite” się nie powiodło: %s\n"
+
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: „Fread” się nie powiodło: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
-msgstr "%s: Fflush się nie powiodło: %s\n"
+msgstr "%s: „Fflush” się nie powiodło: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr "Nieobsługiwany podpis PGP\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr "Nieobsługiwany algorytm mieszania PGP %u\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr "Nieobsługiwany algorytm klucza publicznego PGP %u\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Nie można wykonać %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr "„Fopen” się nie powiodło\n"
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "Nie można zapisać do potoku\n"
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Nie można utworzyć potoku do podpisania: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr "Nie można odczytać z pliku %s: %s\n"
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "wykonanie gpg się nie powiodło (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "zapisanie podpisu przez gpg się nie powiodło\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "nie można odczytać podpisu\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp się nie powiodło\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr "%s zawiera już identyczny podpis, pomijanie\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead się nie powiodło: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature się nie powiodło: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: headerRead się nie powiodło: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "Nie można podpisywać pakietów RPM v3\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s zawiera już identyczny podpis, pomijanie\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature się nie powiodło: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead się nie powiodło: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "zastąpienie %s się nie powiodło: %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: odczytanie manifestu się nie powiodło: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "bez sprawdzania podpisu nagłówka+danych"
index d7e32e030c5ad34ba8dcd8a8aba5bbe9b1cce79b..aa8056fb7f6a194267f7d0bba7ecdbd2d128a227 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
@@ -7,10 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Portuguese (http://www.transifex.com/rpm-team/rpm/language/"
+"pt/)\n"
 "Language: pt\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,503 +44,565 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "o exec falhou\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "o argumento não é um pacote RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "erro ao ler o cabeçalho do pacote\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "não consigo aceder de novo ao conteúdo: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Opções de pesquisa (com o -q ou o --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Opções de verificação (com o -V ou o --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Opções de Instalação/Actualização/Remoção:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "só pode ser realizado um tipo de pesquisa/verificação de cada vez"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "opções de pesquisa inesperadas"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "formato de pesquisa inesperado"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "origem de pesquisa inesperada"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "só pode ser especificado um 'major mode'"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr ""
-"os ficheiros só podem ser mudados de sítio durante a instalação do pacote"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr ""
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"o --relocate e o --excludepath só podem ser usados ao instalar pacotes novos"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "o --prefix só pode ser usado ao instalar pacotes novos"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "os argumentos do --prefix têm de começar por /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "o --replacepkgs só pode ser indicado durante a instalação do pacote"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "o --excludedocs  só pode ser indicado durante a instalação do pacote"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "o --includedocs  só pode ser indicado durante a instalação do pacote"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "só uma das opções --excludedocs e --includedocs pode ser usada"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "o --ignorearch só pode ser indicado durante a instalação do pacote"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "o --ignoreos só pode ser indicado durante a instalação do pacote"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "o --ignoresize só pode ser indicado durante a instalação do pacote"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "o --allmatches só pode ser indicado ao apagar o pacote"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "o --allfiles só pode ser indicado durante a instalação do pacote"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"o --justdb só pode ser indicado durante a instalação ou a remoção do pacote"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"a desactivação de 'scripts' só pode ser indicado durante a instalação ou a "
-"remoção de pacotes"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"a desactivação dos 'triggers' só pode ser usado durante a instalação ou "
-"remoção de pacotes"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "os argumentos do --root (-r) têm de começar por /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "não foram indicados pacotes para apagar"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "não foram indicados pacotes para instalar"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "não foram indicados argumentos para a pesquisa"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "não foram indicados argumentos para a verificação"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "O buildroot já foi especificado, a ignorar o %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "criar através do %prep (desempacotar o código e aplicar patches) do "
 "<fichspec>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<fichspec>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "criar através do %build (%prep e depois compilar) do <fichspec>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "criar através do %install (%prep, %build e depois instalar) do <fichspec>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "verificar a secção %files do <fichspec>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "criar os pacotes binários e de código a partir do <fichspec>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "criar só o pacote binário a partir do <fichspec>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "criar só o pacote com código-fonte a partir do <fichspec>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<pacote de código>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"criar através do %install (%prep, %build e depois instalar) do <pacote de "
+"código>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "criar através do %prep (desempacotar o código e aplicar patches) do <fichtar>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<fichtar>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "criar através do %build (%prep e depois compilar) do <fichtar>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "criar através do %install (%prep, %build e depois instalar) do <fichtar>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "verificar a secção %files do <fichtar>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "criar os pacotes binários e de código a partir do <fichtar>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "criar só o pacote binário a partir do <fichtar>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "criar só o pacote com código-fonte a partir do <fichtar>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "criar o pacote binário a partir do <pacote de código>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<pacote de código>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"criar através do %install (%prep, %build e depois instalar) do <pacote de "
-"código>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "ignorar a raiz de criação"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "apagar as directorias de criação quando acabar"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignorar as directivas ExcludeArch: do ficheiro spec"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "depurar máquina de estados de ficheiros"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "não executar nenhuma etapa da criação"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "não verificar as dependências de compilação"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "não aceitar as mensagens de i18N do ficheiro spec"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "apagar o código-fonte quando acabar"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "apagar o ficheiro spec quando acabar"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "saltar directamente para a etapa indicada (só para c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "ignorar a plataforma-alvo"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "Opções de criação com [ <fich spec> | <fich tar> | <pacote fonte> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Não consegui abrir ficheiro spec %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Não consegui abrir o 'pipe' para o tar: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Não consegui ler o ficheiro spec do %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Não consegui mudar o nome de %s para %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "Não consegui analisar o %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "O ficheiro %s não é um ficheiro normal.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "O ficheiro %s não parece ser um ficheiro spec.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "A construir plataformas alvo: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "A construir para o alvo %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "os argumentos do --root (-r) têm de começar por /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "inicializar a base de dados"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "reconstruir as listas invertidas da base dados com os cabeçalhos dos pacotes "
 "instalados"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "verificar ficheiros da base de dados"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Opções da base de dados:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "só pode ser especificado um 'major mode'"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Opções de pesquisa (com o -q ou o --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Opções de verificação (com o -V ou o --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Opções de Instalação/Actualização/Remoção:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "só pode ser realizado um tipo de pesquisa/verificação de cada vez"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "opções de pesquisa inesperadas"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "formato de pesquisa inesperado"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "origem de pesquisa inesperada"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr ""
+"os ficheiros só podem ser mudados de sítio durante a instalação do pacote"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr ""
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"o --relocate e o --excludepath só podem ser usados ao instalar pacotes novos"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "o --prefix só pode ser usado ao instalar pacotes novos"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "os argumentos do --prefix têm de começar por /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "o --replacepkgs só pode ser indicado durante a instalação do pacote"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "o --excludedocs  só pode ser indicado durante a instalação do pacote"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "o --includedocs  só pode ser indicado durante a instalação do pacote"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "só uma das opções --excludedocs e --includedocs pode ser usada"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "o --ignorearch só pode ser indicado durante a instalação do pacote"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "o --ignoreos só pode ser indicado durante a instalação do pacote"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "o --ignoresize só pode ser indicado durante a instalação do pacote"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "o --allmatches só pode ser indicado ao apagar o pacote"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "o --allfiles só pode ser indicado durante a instalação do pacote"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"o --justdb só pode ser indicado durante a instalação ou a remoção do pacote"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"a desactivação de 'scripts' só pode ser indicado durante a instalação ou a "
+"remoção de pacotes"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"a desactivação dos 'triggers' só pode ser usado durante a instalação ou "
+"remoção de pacotes"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "não foram indicados pacotes para apagar"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "não foram indicados pacotes para instalar"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "não foram indicados argumentos para a pesquisa"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "não foram indicados argumentos para a verificação"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr ""
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr ""
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Opções de assinatura:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Não consegui executar %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Precisa definir o \"%%_gpg_name\" no seu ficheiro de macros\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Indique a palavra-chave: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "A palavra-chave está correcta.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "usar o formato de pesquisa seguinte"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -548,32 +611,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "A executar(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "A execução de %s falhou (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Código de saída inválido do %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -583,785 +651,920 @@ msgstr ""
 "\n"
 "Erros de criação do RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "erro de sintaxe ao analisar o ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "erro de sintaxe ao analisar o &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "erro de sintaxe ao analisar o ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "erro de análise na expressão\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "( não correspondido\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- só em números\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! só em números\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "os tipos têm de corresponder\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / não suportados em cadeias de caracteres\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- não suportado em cadeias de caracteres\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& e || não suportados em cadeias de caracteres\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "erro de sintaxe na expressão\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Falta um '(' em %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Falta um ')' em %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Elemento %s inválido: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Falta um %s em %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Carácter sem ser espaço a seguir a %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Sintaxe inválida: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Spec de modo inválido: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Spec de dirmode inválido: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "O ficheiro tem de começar por \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Ficheiro listado duas vezes: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "A 'symlink' aponta para a BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Ficheiro não encontrado: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "O ficheiro precisa de começar por \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Ficheiro não encontrado pelo glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "linha: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
+#, c-format
+msgid "illegal _docdir_fmt %s: %s\n"
+msgstr ""
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Ficheiro não encontrado pelo glob: %s\n"
+
+#: build/files.c:2431
 #, c-format
-msgid "illegal _docdir_fmt %s: %s\n"
+msgid "Special file in generated file list: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Ficheiro inválido: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Dono/grupo inválido: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Não consegui canonizar o nome da máquina: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Não consegui escrever o conteúdo de %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Não consegui ler o conteúdo de %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Não consegui canonizar o nome da máquina: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Não consegui criar região imutável do cabeçalho.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Não consegui abrir um ficheiro temporário.\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Não consegui ler o ficheiro spec do %s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
-"Não consegui gravar o cabeçalho temporário\n"
-"\n"
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Dados de CSA inválidos\n"
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Não consegui reler o cabeçalho do assinatura.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Não consigo aceder ao %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Não consegui gravar o pacote: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Não consegui abrir o sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Não consegui ler o cabeçalho de %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Não consegui gravar o cabeçalho de %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Gravei: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Não consigo gerar o ficheiro de saída para o pacote %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "não consigo criar o %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "linha %d: segundo %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "As entradas de %%changelog têm de começar por *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "entrada de %%changelog incompleta\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "data inválida no %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "O %%changelog não está na ordem cronológica descendente\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "falta o nome no %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "falta a descrição no %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "linha %d: Erro ao analisar a %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "linha %d: Opção inválida %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "linha %d: Demasiados nomes: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "linha %d: O pacote não existe: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "linha %d: Segunda descrição\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "linha %d: Erro ao analisar o %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "linha %d: Número inválido: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "linha %d: Número %s inválido: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "A arquitectura está excluída: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "A arquitectura não está incluída: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "O SO está excluído: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "O SO não está incluído: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "O campo %s tem de estar presente no pacote: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Entradas %s duplicadas no pacote: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Não consegui abrir o ícone %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Não consegui ler o ícone %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Tipo de ícone desconhecido: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "linha %d: Opção só recebe um parâmetro: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "Linha %d: Opção inválida: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "linha %d: Opção em branco: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "linha %d: Os prefixos não podem acabar em \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "linha %d: A docdir tem de começar por '/': %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "linha %d: Qualificadores %s: inválidos: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "linha %d: Formato da BuildArchitecture inválido: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Erro interno: Opção esquisita %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Descrição do pacote inválida: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "O pacote já existe: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "linha %d: Opção desconhecida: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Código-fonte inválido: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Erro ao analisar o %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "linha %d: Argumento inválido para %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "linha %d: Opção inválida do %%setup %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "linha %d: segundo %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "linha %d: os 'triggers' (que activam) têm de ter --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "linha %d: Erro ao analisar o %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "linha %d: o programa de 'script' tem de começar por '/': %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "linha %d: Segundo %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "linha %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Incapaz de aceder ao %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: Descobri um %%else sem um %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: Descobri um %%endif sem um %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Não foram encontradas arquitecturas compatíveis para as quais criar\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "O pacote não tem uma %%description: %s\n"
@@ -1432,450 +1635,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Não consegui executar o %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Não consegui executar à parte o %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Não consegui encontrar o %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "a pesquisa do ficheiro spec %s falhou, não consigo analisar\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(erro 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Código de integridade inválido"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Cabeçalho inválido/ilegível"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "opção do db desconhecida: \"%s\" ignorada.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Tamanho do cabeçalho demasiado grande"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "O %s tem um valor numérico inválido, foi ignorado\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "O %s tem um valor demasiado elevado ou pequeno, foi ignorado\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "O %s tem um valor inteiro demasiado elevado ou pequeno, foi ignorado\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "não consigo trancar o %s no %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "partilhado"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "exclusivo"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Tipo de ficheiro desconhecido"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Falta(m) o(s) 'hard link(s)'"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Erro interno"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Ficheiro de arquivo não está no cabeçalho"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " falhou - "
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "erro(%d) ao criar uma nova instância do pacote\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(não é um blob)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(não é um número)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr ""
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(tipo inválido)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr ""
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(não é um base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(tipo inválido)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(não é um blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "o utilizador %s não existe - a usar o root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "o grupo %s não existe - a usar o root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s gravado como %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s criado como %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1833
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1841
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1876
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1885
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1890
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1909
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:452
+#: lib/header.c:1949
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:362
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:384
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Nenhuma assinatura disponível\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "formato da opção em branco"
+
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "nome da opção em branco"
 
-#: lib/package.c:581
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: headerRead failed: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] esperado no fim do vector"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "] inesperado"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "} inesperado"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "esperado um ? na expressão"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "esperado um { a seguir ao ? na expressão"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "esperado um } na expressão"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "esperado um : a seguir à sub-expressão ?"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "esperado um { a seguir ao : na expressão"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "esperado um | no fim da expressão"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: O fread falhou: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "mostrar as opções de pesquisa conhecidas"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "mostra a configuração final do rpmrc e das macros"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "devolver um resultado menos detalhado"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "devolver um resultado mais detalhado"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "imprime a versão do RPM que está a usar"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "depurar a E/S da rpmio"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1896,13 +2210,13 @@ msgstr "os novos locais têm de conter um ="
 msgid "relocations must have a / following the ="
 msgstr "os novos locais têm de ter um / a seguir ao ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "instala todos os ficheiros, mesmo as configurações que de outro modo seriam "
 "ignoradas"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1910,152 +2224,162 @@ msgstr ""
 "remove todos os pacotes que correspondam a <pacote> (normalmente aparece um "
 "erro se o <pacote> especifica vários pacotes)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "apaga (desinstala) o pacote"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<pacote>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "não instala a documentação"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "ignorar os ficheiros com a componente inicial <dir> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<caminho>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "abreviatura para --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "actualizar o pacote(s) se já estiver instalado"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<pacote>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "mostra cardinais enquanto o pacote instala (conveniente com o -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "não verifica a arquitectura do pacote"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "não verifica o sistema operativo do pacote"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "não verifica o espaço em disco antes de instalar"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "instala a documentação"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "actualiza a base de dados, mas não altera o sistema de ficheiros"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "não verifica as dependências do pacote"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 "não reorganiza a instalação dos pacotes para satisfazer as dependências"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "não executar nenhuns scripts do pacote"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "não executar o script %%pre (se existir)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "não executar o script %%post (se existir)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "não executar o script %%preun (se existir)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "não executar o script %%postun (se existir)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "não executar nenhum dos scripts activados por este pacote"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "não executar nenhum dos scripts %%triggerprein"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "não executar nenhum dos scripts %%triggerin"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "não executar nenhum dos scripts %%triggerun"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "não executar nenhum dos scripts %%triggerpostun"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2063,369 +2387,408 @@ msgstr ""
 "actualiza para um versão antiga do pacote (o --force faz isto "
 "automaticamente)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "mostra percentagens enquanto o pacote instala"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "muda o pacote para <dir>, se for possível"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "muda os ficheiros de <velho> para <novo>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<velho>=<novo>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "reinstalar se o pacote já estiver presente"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "não instala, mas indica se iria funcionar ou não"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "actualizar pacote(s)"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "pesquisar/verificar todos os pacotes"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "pesquisar/verificar o(s) pacote(s) que contém(êm) o ficheiro"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "pesquisar/verificar o(s) pacote(s) no grupo"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "pesquisar/verificar o(s) pacote(s) com o identificador do pacote"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "pesquisar/verificar o(s) pacote(s) com o identificador do cabeçalho"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "modo de pesquisa do rpm"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "pesquisar/verificar o(s) pacote(s) de transacção de instalação"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "pesquisar o(s) pacote(s) activados pelo pacote"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "modo de verificação do rpm"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "pesquisar/verificar o(s) pacote(s) que precisa duma dependência"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "pesquisar/verificar o(s) pacote(s) que oferecem uma dependência"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "listar todos os ficheiros de configuração"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "listar todos os ficheiros de documentação"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "listar todos os ficheiros de documentação"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "listar todos os ficheiros de configuração"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "apresentar a informação básica do ficheiro"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "listar os ficheiros no pacote"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "ignorar ficheiros %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "ignorar ficheiros %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "mostrar os estados dos ficheiros listados"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "não verificar os tamanho dos ficheiros"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "não verificar as ligações simbólicas dos ficheiros"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "não verificar o dono dos ficheiros"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "não verificar o grupo dos ficheiros"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "não verificar hora de modificação dos ficheiros"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "não verificar o modo dos ficheiros"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "não verificar os ficheiros no pacote"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "não verificar as dependências do pacote"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 "esperava-se um pacote com código-fonte, foi encontrado um pacote binário\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "o pacote de código-fonte não contem um ficheiro .spec\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "a abertura do pacote falhou%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " no ficheiro "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s falhou no ficheiro %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s falhou: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "formato incorrecto: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "substituído   "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "não instalado "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "partilhado"
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(sem estado)  "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(desconhecido %3d)"
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "o pacote nem tem um dono do ficheiro ou as listas de IDs\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "o grupo %s não contém nenhum pacote\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "nenhum pacote activa o %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "malformado %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "nenhum pacote coincide com %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "nenhum pacote precisa do %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "nenhum pacote oferece o %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "ficheiro %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "o ficheiro %s não pertence a nenhum pacote\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "número de pacote inválido: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "o pacote %s não está instalado\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NÃO-OK"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (FALTAM AS CHAVES:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (CHAVES SUSPEITAS:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: o acesso falhou: %s\n"
@@ -2450,212 +2813,442 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "não foi definido o dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: não consigo ler o cabeçalho em 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "não foi definido o dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "não consigo adicionar o registo originalmente em %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"falhou a reconstrução da base de dados: a base de dados original mantém-se\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "falhou a substituição da base de dados antiga pela nova!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NÃO"
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "SIM"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr ""
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr ""
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr ""
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr ""
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr ""
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr ""
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr ""
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr ""
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr ""
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr ""
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Código de integridade inválido"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Cabeçalho inválido/ilegível"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Tamanho do cabeçalho demasiado grande"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Tipo de ficheiro desconhecido"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Erro interno"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Ficheiro de arquivo não está no cabeçalho"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " falhou - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "o acesso ao %s falhou: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "A preparar..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "o %s não pode ser instalado\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "A obter o %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "erro ao ler do ficheiros %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "não consigo aceder ao %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "A instalar o %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr ""
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr ""
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "a leitura falhou: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr ""
@@ -2732,797 +3325,633 @@ msgstr ""
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "encontrado o erro desconhecido %d ao manipular o pacote %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "falta o segundo ':' em %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "falta o nome da arquitectura em %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Linha de dados incompleta em %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Demasiados argumentos na linha de dados em %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr "Número de arq./SO errado: %s (%s:%d)\n"
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr "Linha por omissão incompleta em %s:%d\n"
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr "Demasiados argumentos na linha por omissão em %s:%d\n"
-
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "falta um ':' (encontrado um 0x%02x) em %s:%d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "faltam argumentos para o %s em %s:%d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr ""
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "falta a arquitectura para o %s em %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "má opção '%s' em %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Sistema desconhecido: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Por favor contacte o %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "não consigo abrir a base de dados Packages em %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr ""
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr ""
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "falta um { depois do %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "falta um } depois do %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "formato da opção em branco"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "nome da opção em branco"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "opção desconhecida"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] esperado no fim do vector"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "] inesperado"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "} inesperado"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "esperado um ? na expressão"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "esperado um { a seguir ao ? na expressão"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "esperado um } na expressão"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "esperado um : a seguir à sub-expressão ?"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "esperado um { a seguir ao : na expressão"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "esperado um | no fim da expressão"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
+msgstr "Número de arq./SO errado: %s (%s:%d)\n"
 
-#: lib/rpmdb.c:191
+#: lib/rpmrc.c:413
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "não consigo abrir o índice de %s usando o db%d - %s (%d)\n"
+msgid "Incomplete default line at %s:%d\n"
+msgstr "Linha por omissão incompleta em %s:%d\n"
 
-#: lib/rpmdb.c:516
+#: lib/rpmrc.c:418
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
+msgid "Too many args in default line at %s:%d\n"
+msgstr "Demasiados argumentos na linha por omissão em %s:%d\n"
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "não foi definido o dbpath\n"
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "falta um ':' (encontrado um 0x%02x) em %s:%d\n"
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr ""
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
+msgstr "faltam argumentos para o %s em %s:%d\n"
 
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:564
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr ""
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "falta a arquitectura para o %s em %s:%d\n"
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:632
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr ""
+msgid "bad option '%s' at %s:%d\n"
+msgstr "má opção '%s' em %s:%d\n"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr ""
+msgid "Unknown system: %s\n"
+msgstr "Sistema desconhecido: %s\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
+msgid "Please contact %s\n"
+msgstr "Por favor contacte o %s\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/rpmdb.c:2382
-#, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: não consigo ler o cabeçalho em 0x%x\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "erro(%d) ao criar uma nova instância do pacote\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:353
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "erro(%d) ao obter os registos \"%s\" do índice %s\n"
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:371
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "erro(%d) ao guardar o registo %s em %s\n"
-
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "não foi definido o dbpath"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:375
 #, c-format
-msgid "failed to create directory %s: %s\n"
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:378
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
-#, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "não consigo adicionar o registo originalmente em %u\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
-"falhou a reconstrução da base de dados: a base de dados original mantém-se\n"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "falhou a substituição da base de dados antiga pela nova!\n"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:100
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "substituir os ficheiros em %s por ficheiros de %s a recuperar"
+msgid "cannot open Packages database in %s\n"
+msgstr "não consigo abrir a base de dados Packages em %s\n"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:199
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "falhou a remoção da directoria %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "erro do db%d (%d) do %s: %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:225
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "erro do db%d (%d): %s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "não consigo trancar o %s no %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "partilhado"
+msgid "%s: reading of public key failed.\n"
+msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "exclusivo"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "opção do db desconhecida: \"%s\" ignorada.\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "O %s tem um valor numérico inválido, foi ignorado\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "O %s tem um valor demasiado elevado ou pequeno, foi ignorado\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "O %s tem um valor inteiro demasiado elevado ou pequeno, foi ignorado\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:231
-#, c-format
-msgid "Failed to write %s policy to file %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:268
+#, c-format
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Não consegui reler o cabeçalho do assinatura.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== activo %d vazio %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(vazio)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(vazio)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "A macro %%%s tem o conteúdo incompleto\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "A macro %%%s tem as opções incompletas\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "A macro %%%s tem um nome inválido (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "A macro %%%s tem o conteúdo incompleto\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "A macro %%%s tem as opções incompletas\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "A macro %%%s tem o conteúdo em branco\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "A macro %%%s não conseguiu ser expandida\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "A macro %%%s tem um nome ilegal (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "A macro %%%s (%s) não foi usada abaixo do nível %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Opção desconhecida %c em %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "%c não terminado: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Segue-se uma macro impossível de analisar ao %%\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== activo %d vazio %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Ficheiro %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "O ficheiro %s tem menos de %u bytes\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(nenhum erro)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "erro fatal: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "erro: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "aviso: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "a alocação de memória (%u bytes) devolveu NULL.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(nenhum erro)"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "erro fatal: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "erro: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "aviso: "
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "a alocação de memória (%u bytes) devolveu NULL.\n"
+msgid "error creating fifo %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: O fwrite falhou: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: O fread falhou: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Não consegui executar %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "o gpg não conseguiu gravar a assinatura\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "incapaz de ler a assinatura\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: o writeLead falhou: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: o rpmWriteSignature falhou: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: o writeLead falhou: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: a leitura do manifesto falhou: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index bb742144cf331e2c4ebd5326bef7dbebbacf4f62..a1ae3046a9d983cbb880fbc55aecf949990b753d 100644 (file)
@@ -7,10 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/rpm/"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/rpm-team/rpm/"
 "language/pt_BR/)\n"
 "Language: pt_BR\n"
 "MIME-Version: 1.0\n"
@@ -45,518 +45,580 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "a criação de um pipe para o --pipe falhou: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "a execução falhou\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "o argumento não é um pacote RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "erro ao ler o cabeçalho do pacote\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "Não foi possível reabrir a carga útil: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Consultar/Verificar as opções de seleção do pacote:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Opções de consulta (com -q ou --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Opções de verificação (com -V ou --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Opções de Instalação/Atualização/Remoção:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Opções comuns para todos os executáveis e modos rpm:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "somente um tipo de consulta/verificação pode ser feita por vez"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "sinalizador de consulta não esperado"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "formato de consulta não esperado"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "fonte de pesquisa não esperada"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "somente um modo principal pode ser especificado"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr ""
-"os arquivos somente podem ser realocados durante a instalação de pacotes"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "não é possível usar --prefix com --relocate ou --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate e --excludepath somente podem ser usados na instalação de novos "
-"pacotes"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix somente pode ser usado na instalação de novos pacotes"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "argumentos para --prefix devem começar com uma /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr ""
-"--replacepkgs somente pode ser especificado durante a instalação de pacotes"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr ""
-"--excludedocs somente pode ser especificado durante instalação de pacotes"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr ""
-"--includedocs somente pode ser especificado durante instalação de pacotes"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "somente um entre --excludedocs e --includedocs pode ser especificado"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr ""
-"--ignorearch somente pode ser especificado durante a instalação de pacotes"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr ""
-"--ignoreos somente pode ser especificado durante a instalação de pacotes"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr ""
-"--ignoresize somente pode ser especificado durante a instalação de pacotes"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr ""
-"--allmatches somente pode ser especificado durante a remoção de pacotes"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr ""
-"--allfiles somente pode ser especificado durante a instalação de pacotes"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"--justdb somente pode ser especificado durante a instalação ou remoção de "
-"pacotes"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"opções de desativação de scripts somente podem ser especificadas durante a "
-"instalação ou remoção de pacotes"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"opções de desativação de disparador somente podem ser especificadas durante "
-"a instalação ou remoção de pacotes"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "os argumentos para --root (-r) devem começar com uma /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "nenhum pacote foi passado para remoção"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "nenhum pacote foi passado para instalação"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "nenhum argumento foi passado para consulta"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "nenhum argumento foi passado para verificação"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot já especificado, ignorando %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "construir através de %prep (desempacote os fontes e aplique as correções) a "
 "partir do <specfile>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specfile>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 "construir através de %build (%prep, então compile) a partir do <specfile>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "construir através de %install (%prep, %build, então instale) a partir do "
 "<specfile>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "verificar seção %files do <specfile>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "construir os pacotes fontes e binários a partir do <specfile>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "construir pacote binário somente a partir do <specfile>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "construir pacote fonte somente a partir do <specfile>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<pacote fonte>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"construir através de %install (%prep, %build, então instale) a partir do "
+"<pacote fonte>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "construir através de %prep (desempacote os fontes e aplique as correções) a "
 "partir do <tarball>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 "construindo através de %build (%prep, então compile) a partir do <tarball>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "construir através de %install (%prep, %build, então instale) a partir do "
 "<tarball>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "verificar seção %files do <tarball>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "construir os pacotes fontes e binários a partir do <tarball>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "construir pacote binário somente a partir do <tarball>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "construir pacote fonte somente a partir do <tarball>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "construir pacote binário a partir do <pacote fonte>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<pacote fonte>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"construir através de %install (%prep, %build, então instale) a partir do "
-"<pacote fonte>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "substituir raíz da construção"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "remover a árvore de construção quando terminar"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignorar ExcludeArch: diretivas do arquivo spec"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "depurar máquina de estados do arquivo"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "não executar nenhum estágio da construção"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "não verificar dependências de construção"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "não aceitar msgstr's i18N do specfile"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "remover fontes ao finalizar"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "remover specfile ao finalizar"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "pule direto para o estágio especificado (somente para c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "substituir plataforma de destino"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "opções de construção com [ <specfile> | <tarball> | <pacote fonte> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Opções comuns para todos os executáveis e modos rpm:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Falha ao construir dependências:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Não foi possível abrir o arquivo spec %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Não foi possível abrir o pipe do tar: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Falha ao ler o arquivo spec de %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Falha ao renomear %s para %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "falha ao iniciar %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "O arquivo %s não é um arquivo normal.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "O arquivo %s não parece ser um specfile.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Construindo plataformas de destino: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Construindo para o destino %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "os argumentos para --root (-r) devem começar com uma /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "Inicializar banco de dados"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "reconstruir as listas invertidas do banco de dados a partir dos cabeçalhos "
 "dos pacotes instalados"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "verificar arquivos do banco de dados"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Opções de banco de dados:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "somente um modo principal pode ser especificado"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "verificar a(s) assinatura(s) do pacote"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "importar uma chave pública blindada"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "nenhum argumento foi passado"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Consultar/Verificar as opções de seleção do pacote:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Opções de consulta (com -q ou --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Opções de verificação (com -V ou --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Opções de Instalação/Atualização/Remoção:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "somente um tipo de consulta/verificação pode ser feita por vez"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "sinalizador de consulta não esperado"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "formato de consulta não esperado"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "fonte de pesquisa não esperada"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr ""
+"os arquivos somente podem ser realocados durante a instalação de pacotes"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "não é possível usar --prefix com --relocate ou --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate e --excludepath somente podem ser usados na instalação de novos "
+"pacotes"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix somente pode ser usado na instalação de novos pacotes"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "argumentos para --prefix devem começar com uma /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr ""
+"--replacepkgs somente pode ser especificado durante a instalação de pacotes"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr ""
+"--excludedocs somente pode ser especificado durante instalação de pacotes"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr ""
+"--includedocs somente pode ser especificado durante instalação de pacotes"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "somente um entre --excludedocs e --includedocs pode ser especificado"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr ""
+"--ignorearch somente pode ser especificado durante a instalação de pacotes"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
+"--ignoreos somente pode ser especificado durante a instalação de pacotes"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr ""
+"--ignoresize somente pode ser especificado durante a instalação de pacotes"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+"--allmatches somente pode ser especificado durante a remoção de pacotes"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
+"--allfiles somente pode ser especificado durante a instalação de pacotes"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"--justdb somente pode ser especificado durante a instalação ou remoção de "
+"pacotes"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"opções de desativação de scripts somente podem ser especificadas durante a "
+"instalação ou remoção de pacotes"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"opções de desativação de disparador somente podem ser especificadas durante "
+"a instalação ou remoção de pacotes"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "nenhum pacote foi passado para remoção"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "nenhum pacote foi passado para instalação"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "nenhum argumento foi passado para consulta"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "nenhum argumento foi passado para verificação"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "assinar pacote(s) (idêntico ao --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "remover a assinatura dos pacotes"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Opções de assinatura:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Não foi possível executar %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Você deve definir o \"%%_gpg_name\" no seu arquivo de macro\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Digite a senha: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Senha ok.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "utilizar o seguinte formato de consulta"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -565,32 +627,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Executando (%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "A execução de %s falhou (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Status de saída de %s inválido (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -600,237 +667,317 @@ msgstr ""
 "\n"
 "Erros na construção do RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "erro de sintaxe ao analisar ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "erro de sintaxe ao analisar &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "erro de sintaxe ao analisar ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "erro de análise na expressão\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "( sem correspondência\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- somente em números\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! somente em números\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "os tipos devem corresponder\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / não são suportados para strings\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- não é suportado para strings\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& e || não são suportados para strings\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "erro de sintaxe na expressão\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "\"(\" faltando em %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "\"(\" faltando em %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Token de %s inválido: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "%s faltando em %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "caractere de espaço após %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Sintaxe inválida: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Modo spec inválido: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Dirmode spec inválido: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Capacidade inválida: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Suporte à capacidade de arquivo não embutida\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "O arquivo deve começar com uma \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 "Algoritmo de digest %u do arquivo é desconhecido, utilizando o MD5 como "
 "alternativa\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Arquivo listado duas vezes: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Ligação simbólica aponta para BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Arquivo não encontrado: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: não foi possível carregar a etiqueta desconhecida (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: falha ao ler a chave pública.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: não é uma chave pública blindada.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: falha ao codificar\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "falha ao criar o diretório"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "O arquivo precisa da \"/\" inicial: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "O arquivo não foi encontrado pelo glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Não foi possível abrir %%files arquivo %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "linha: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "O arquivo não foi encontrado pelo glob: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Arquivo inválido: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Proprietário/grupo inválido: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Procurando por arquivos desempacotados: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -839,549 +986,606 @@ msgstr ""
 "Arquivo(s) instalado(s) (mas não empacotado(s)) encontrado(s):\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Processando arquivos: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "Binários dependentes de arquitetura no pacote noarch\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: linha: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Não foi possível canonizar o nome de máquina: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Não foi possível gravar carga útil em %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Não foi possível ler carga útil a partir de %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Não foi possível canonizar o nome de máquina: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Compactação de carga útil desconhecida: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Não foi possível criar uma região de cabeçalho imutável.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Não foi possível abrir o arquivo temporário.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Não foi possível gravar o cabeçalho temporário\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Falha ao ler o arquivo spec de %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Dados CSA inválidos\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Não foi possível recarregar o cabeçalho da assinatura.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Não foi possível abrir %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Não foi possível gravar o pacote: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Não foi possível abrir sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Não foi possível ler o cabeçalho a partir de %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Não foi possível gravar o cabeçalho em %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Gravou: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Executando \"%s\":\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "A execução de \"%s\" falhou.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Falha na verificação \"%s\" do pacote.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 "Não foi possível gerar o nome de arquivo de saída para o pacote %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "Não foi possível criar %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "linha %d: segundo %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "entradas do %%changelog devem começar com *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "entrada do %%changelog incompleta\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "data inválida no %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog não está na ordem cronológica decrescente\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "Nome faltando no %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "nenhuma descrição no %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "linha %d: Erro ao analisar %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "linha %d: Opção inválida %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "linha %d: Nomes em excesso: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "linha %d: O pacote não existe: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "linha %d: Segunda descrição\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "linha %d: Erro ao analisar %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "linha %d: Número inválido: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "linha %d: Número %s inválido: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "linha %d: Número %s inválido: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d definido várias vezes\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "A arquitetura está excluída: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "A arquitetura não está excluída: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "O SO está excluído: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "O SO não está incluído: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "o campo %s deve estar presente no pacote: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Entrada %s duplicada no pacote: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Não foi possível abrir o ícone %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Não foi possível ler o ícone %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Tipo de ícone desconhecido: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "linha %d: A etiqueta toma apenas um token: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "linha %d: caractere inválido \"%c\" em: %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "linha %d: caractere inválido em: %s\n"
+msgid "%s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "linha %d: caractere inválido \"..\" em: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "linha %d: Etiqueta mal formada: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "linha %d: Etiqueta vazia: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "linha %d: Os prefixos não podem terminar com \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "linha %d: O docdir deve começar com \"/\": %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "linha %d: campo Epoch deve ser um número sem sinal: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "linha %d: %s inválido: qualificadores: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "linha %d: formato BuildArchitecture inválido: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "linha %d: Somente subpacotes noarch são suportados: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Erro interno: tag %d falsa\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "linha %d: %s é obsoleto: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Especificação do pacote inválida: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "O pacote já existe: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "linha %d: Etiqueta desconhecida: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} não pode ser vazio\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} não pode ser \"/\"\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Fonte inválida: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Nenhum número de patch %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch não corresponde à etiqueta \"Patch:\"\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Nenhum número de fonte %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "Nenhuma etiqueta \"Source:\" no arquivo .spec\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Erro ao analisar %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "linha %d: Argumento inválido para %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "linha %d: Opção inválida %s de %%setup: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "número da correção %s inválido: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "linha %d: segundo %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "linha %d: os disparadores devem ter --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "linha %d: Erro ao analisar %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "linha %d: o script interno deve terminar com \">\": %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "linha %d: o script deve começar com \"/\": %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "linha %d: Segundo %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "linha %d: script interno não suportado: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "linha %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Não foi possível abrir %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: Há um %%else sem um %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: Há um %%endif sem um %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Nenhuma arquitetura compatível encontrada para a construção\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "O pacote não tem %%description: %s\n"
@@ -1452,452 +1656,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "Ignorar regex inválida %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Não foi possível criar um pipe para %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Não foi possível executar %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Não foi possível bifurcar %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "A conversão de %s para inteiro longo falhou.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "Os atributos do arquivo não foram configurados\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) falhou: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load falhou: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Falha no reconhecimento do arquivo \"%s\": modo %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Localizando %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Falha ao localizar %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "a consulta ao specfile %s falhou, não foi possível analisá-lo\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(erro 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Magic inválido"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Cabeçalho inválido/impossível de ler"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "opção db não reconhecida: \"%s\" ignorado.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Tamanho do cabeçalho muito grande"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s tem um valor numérico inválido, ignorado\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s tem valor inteiro longo muito grande ou muito pequeno, ignorado\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s tem um valor inteiro muito grande ou muito pequeno, ignorado\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "não foi possível obter o bloqueio %s em %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "compartilhado"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "exclusivo"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Tipo de arquivo desconhecido"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Ligação(ões) absoluta(s) faltando"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "erro (%d) ao armazenar o registro \"%s\" em %s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Digest incompatível"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "erro (%d) ao remover o registro \"%s\" a partir de %s\n"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Erro interno"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "erro(%d) ao adicionar o registro de cabeçalho #%d\n"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Arquivo de pacote não está no cabeçalho"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "erro(%d) ao remover o registro de cabeçalho #%d\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " falhou - "
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "erro (%d) ao alocar nova instância do pacote\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s é um Delta RPM e não pode ser instalado diretamente\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Carga útil (%s) não suportada no pacote %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "o pacote %s já foi adicionado, ignorando %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "o pacote %s já foi adicionado, substituindo por %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(não é um blob)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(não é um número)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(não é uma sequência)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(tipo inválido)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(não é base 64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(tipo inválido)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(não é um blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(tipo xml inválido)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(não é uma assinatura OpenPGP)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normal"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "substituído"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "não instalado"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "compartilhado pela rede"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "cor errada"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "faltando"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(desconhecido)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(não é uma sequência)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "o usuário %s não existe - usando o root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "o grupo %s não existe - usando o root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s salvo como %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s criado como %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "etiqueta[%d]: INVÁLIDA, etiqueta %d tipo %d offset %d contagem %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: INVÁLIDO, não é hexadecimal\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: INVÁLIDO, não é binário\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: INVÁLIDO, não é binário\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "tamanho do blob(%d): INVÁLIDO, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
-"offset da região: INVÁLIDA, etiqueta %d tipo %d offset %d contagem %d\n"
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
-"trailer da região: INVÁLIDA, etiqueta %d tipo %d offset %d contagem %d\n"
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "tamanho da região: INVÁLIDO, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "tamanho hdr(%d): INVÁLIDO, a leitura retornou %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "magic hdr: INVÁLIDO\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "etiquetas hdr: INVÁLIDAS, número de etiquetas (%d) fora do intervalo\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "dados hdr: INVÁLIDOS, número de bytes (%d) fora do intervalo\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr blob(%zd): INVÁLIDO, a leitura retornou %d\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "carregamento hdr: INVÁLIDO\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "formato da etiqueta vazio"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature falhou: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "nome da etiqueta vazio"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Nenhuma assinatura disponível\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead falhou: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] esperado no fim da matriz"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "] não esperado"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "} não esperado"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? esperado na expressão"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ esperado após ? na expressão"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} esperado na expressão"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": esperado após a subexpressão ?"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ esperado após : na expressão"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| esperado no fim da expressão"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "iterador da matriz utilizado com diferentes tamanhos de matrizes"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread falhou: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "predefinir MACRO com valor EXPR"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "\"MACRO EXPR\""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "definir MACRO com valor EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "imprimir expansão do macro da EXPR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "\"EXPR\""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "ler <ARQUIVO:...> ao invés do(s) arquivo(s) padrão"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<ARQUIVO:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "não verificar digest(s) dos pacotes"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "não verificar cabeçalho(s) do banco de dados ao recuperá-lo(s)"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "não verificar a(s) assinatura(s) do pacote"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "enviar stdout para CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "utilizar ROOT como o diretório de nível mais alto"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "exibir etiquetas de consulta conhecidas"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "exibir configuração final do rpmrc e do macro"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "fornece uma saída menos detalhada"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "fornece uma saída mais detalhada"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "mostra a versão do rpm que está sendo usada"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "depurar máquina de estados do arquivo de carga últil"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "depurar E/S rpmio"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: tabela de opções mal configurada (%d)\n"
@@ -1918,12 +2231,12 @@ msgstr "realocações devem conter um ="
 msgid "relocations must have a / following the ="
 msgstr "realocações devem conter uma / após o ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "instala todos os arquivos, até configurações que poderiam ser ignoradas"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1931,151 +2244,161 @@ msgstr ""
 "remover todos os pacotes iguais ao <pacote> (normalmente um erro é gerado se "
 "o <pacote> especificou múltiplos pacotes)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "realocar arquivos em pacotes não realocáveis"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "exibir loops de dependências como aviso"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "remover (desinstalar) pacote"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<pacote>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "não instalar arquivos de configuração"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "não instalar documentação"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "ignorar arquivos com componentes principais <caminho> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<caminho>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "atalho para --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "atualizar pacote(s) se já estiver(em) instalado(s)"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<arquivo_do_pacote>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "exibir cerquilhas a medida que o pacote instala (bom com -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "não verificar a arquitetura do pacote"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "não verificar o sistema operacional do pacote"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "não verificar o espaço em disco antes de instalar"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "instalar a documentação"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "instalar pacote(s)"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "atualizar o banco de dados, mas não modificar o sistema de arquivos"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "não verificar as dependências do pacote"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "não verificar o digest dos arquivos"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "não verificar o digest dos arquivos (obsoleto)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "não instalar contextos de segurança dos arquivos"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "não reordenar a instalação dos pacotes para satisfazer as dependências"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "não executar scriptlet(s) do pacote"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "não executar o scriptlet %%pre (se existir)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "não executar o scriptlet %%post (se existir)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "não executar o scriptlet %%preun (se existir)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "não executar o scriptlet %%postun (se existir)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "não executar nenhum scriptlet disparado por este pacote"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "não executar nenhum scriptlet %%triggerprein"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "não executar nenhum scriptlet %%triggerin"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "não executar nenhum scriptlet %%triggerun"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "não executar nenhum scriptlet %%triggerpostun"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "não realizar nenhuma ação de coleção"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2083,369 +2406,407 @@ msgstr ""
 "atualizar para uma versão mais antiga do pacote (--force em atualizações faz "
 "isso automaticamente)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "exibir porcentagens na medida em que o pacote vai sendo instalado"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "realocar o pacote para <dir>, se for realocável"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "realocar arquivos do caminho <antigo> para o <novo>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<antigo>=<novo>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "ignorar conflitos de arquivos entre pacotes"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "reinstalar se o pacote já estiver presente"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "não instalar, mas dizer se a instalação funcionaria ou não"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "atualizar pacote(s)"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "consultar/verificar todos os pacotes"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "modo checksig do rpm"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "consultar/verificar pacote(s) que detém o arquivo"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "consultar/verificar pacote(s) em um grupo"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "consultar/verificar um arquivo de pacote"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "consultar/verificar pacote(s) com um identificador de pacotes"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "consultar/verificar pacote(s) com um identificador de cabeçalhos"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "modo de consulta do rpm"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "consultar/verificar uma instância do cabeçalho"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "consultar/verificar pacote(s) da transação de instalação"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "consultar o(s) pacote(s) disparado pelo pacote"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "modo de verificação do rpm"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "consultar/verificar pacotes que precisam de uma dependência"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "consultar/verificar pacote(s) que fornecem uma dependência"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "não fazer glob com os argumentos"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "não processar arquivos que não são de pacotes como manifestos"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "listar todos os arquivos de configuração"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "listar todos os arquivos de documentação"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "listar todos os arquivos de documentação"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "listar todos os arquivos de configuração"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "descarregar informações básicas do arquivo"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "listar arquivos do pacote"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "ignorar arquivos %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "ignorar arquivos %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "exibir o estado dos arquivos listados"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "não verificar o tamanho dos arquivos"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "não verificar o caminho da ligação simbólica dos arquivos"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "não verificar o proprietário dos arquivos"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "não verificar o grupo dos arquivos"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "não verificar a hora de modificação dos arquivos"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "não verificar o modo dos arquivos"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "não verifica as capacidades dos arquivos"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "não verificar os contextos de segurança dos arquivos"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "não verifica as capacidades dos arquivos"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "não verificar os arquivos do pacote"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "não verificar as dependências do pacote"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "não executar script(s) de verificação"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "Faltando recursos do rpmlib para %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "um pacote fonte era esperado, mas um binário foi encontrado\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "o pacote fonte não contém um arquivo .spec\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "a descompactação do arquivo falhou %s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " no arquivo "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s falhou no arquivo %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s falhou: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "formato incorreto: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(não contém arquivos)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "substituído      "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "não instalado "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "compartilhado pela rede    "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "cor errada   "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(sem estado)    "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(%3d desconhecido) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "o pacote não tem listas de proprietários/grupos\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "o pacote não tem listas de proprietários nem de ids\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "o grupo %s não contém nenhum pacote\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "nenhum disparador de pacote %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "%s malformado: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "nenhum pacote corresponde com %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "nenhum pacote requer %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "nenhum pacote fornece %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "arquivo %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "o arquivo %s não pertence a nenhum pacote\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "número de pacote inválido: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "o registro %u não pôde ser lido\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "o pacote %s não está instalado\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "etiqueta desconhecida: \"%s\"\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s: a importação da chave %d falhou.\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s: %d não é uma chave pública blindada.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: leitura de importação falhou (%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
-"%s: A região de cabeçalho imutável não pôde ser lida. Pacote corrompido?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "Não está OK"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (CHAVES FALTANDO:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (CHAVES NÃO CONFIÁVEIS:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: falha ao abrir: %s\n"
@@ -2470,218 +2831,449 @@ msgstr "Não foi possível alterar o diretório raiz: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "Não foi possível restaurar o diretório raiz: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "nenhum dbpath foi definido\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: ignorando"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "erro (%d) ao armazenar o registro #%d em %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: o regexec falhou: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: o regcomp falhou: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: ignorando"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: cabeçalho danificado #%u recuperado -- ignorando.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: não foi possível ler o cabeçalho em 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "nenhum dbpath foi definido"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "falha ao criar o diretório %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "o cabeçalho #%u do banco de dados é inválido -- ignorando.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "não é possível adicionar o registro originalmente em %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"falha ao reconstruir o banco de dados: o banco de dados original permanece "
+"no lugar\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "falha ao substituir o banco de dados velho pela novo!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NÃO "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "SIM"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 "PreReq:, Capacidades: e Obsoletos: as dependências suportam as versões."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 "Nome(s) de arquivo(s) armazenados como tuplas (dirName,baseName,dirIndex), "
 "não como um caminho."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "a carga útil do pacote pode ser compactada utilizando bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr "a carga útil do pacote pode ser compactada utilizando o xz."
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr "a carga útil do pacote pode ser compactada utilizando lzma."
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr "a carga útil do pacote pode ser compactada utilizando lzma."
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "o(s) arquivo(s) da carga útil do pacote tem o prefixo \"./\"."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "o nome-versão-lançamento do pacote não está fornecido implicitamente."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr ""
+"As etiquetas de cabeçalho sempre são classificadas após serem carregadas."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "o interpretador do scriptlet pode usar argumentos do cabeçalho."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr ""
+"um conjunto de arquivos de ligação absoluta podem ser instalados sem estarem "
+"completos."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+"scriptlets de pacotes podem acessar o banco de dados rpm durante a "
+"instalação."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "suporte interno para scripts lua."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr "o algoritmo digest é configurável por pacote"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "suporte para as capacidades de arquivo do POSIX.1e"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr "scriptlets de pacotes podem ser expandidos durante a instalação."
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Magic inválido"
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "o(s) arquivo(s) da carga útil do pacote tem o prefixo \"./\"."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Cabeçalho inválido/impossível de ler"
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "o nome-versão-lançamento do pacote não está fornecido implicitamente."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Tamanho do cabeçalho muito grande"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
-"As etiquetas de cabeçalho sempre são classificadas após serem carregadas."
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "o interpretador do scriptlet pode usar argumentos do cabeçalho."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Tipo de arquivo desconhecido"
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
-"um conjunto de arquivos de ligação absoluta podem ser instalados sem estarem "
-"completos."
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr ""
-"scriptlets de pacotes podem acessar o banco de dados rpm durante a "
-"instalação."
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Digest incompatível"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "suporte interno para scripts lua."
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Erro interno"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr "o algoritmo digest é configurável por pacote"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Arquivo de pacote não está no cabeçalho"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "suporte para as capacidades de arquivo do POSIX.1e"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr "scriptlets de pacotes podem ser expandidos durante a instalação."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " falhou - "
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "falha ao abrir %s: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: não é um pacote rpm (ou um manifesto de pacote)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Preparando..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Dependências não satisfeitas:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: não é um pacote rpm (ou um manifesto de pacote): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s não pode ser instalado\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Obtendo %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "ignorando %s - a transferência falhou\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "o pacote %s não é realocável\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "erro ao ler o arquivo %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "\"%s\" especifica múltiplos pacotes:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "Não foi possível abrir %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Instalando %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "não é um pacote rpm"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "tipo inválido de assinatura"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "versão do pacote RPM não suportada"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "falha na leitura: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "não é um pacote rpm\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "não foi possível criar o bloqueio de transação %s em %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "esperando pelo bloqueio de transação %s em %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "Falha ao resolver o símbolo %s: %s\n"
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "Falha ao expandir a macro %%__collection_%s\n"
-
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Plugin %s not loaded\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
+#: lib/rpmplugins.c:199
 #, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
 #: lib/rpmprob.c:109
@@ -2760,798 +3352,633 @@ msgstr "%s tornou-se obsoleto pelo(a) %s%s"
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "erro desconhecido %d encontrado ao manipular o pacote %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "segundo \":\" faltando em %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "nome da arquitetura faltando em %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Linha de dados incompleta em %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Argumentos em excesso na linha de dados em %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Número de arquitetura/SO inválido: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Linha padrão incompleta em %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Argumentos em excesso na linha padrão em %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "\":\" faltando (0x%02x encontrado) em %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "argumento faltando para %s em %s:%d\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr "não foi possível abrir %s em %s:%d: %m\n"
 
-#: lib/rpmrc.c:536
+#: lib/rpmrc.c:564
 #, c-format
 msgid "missing architecture for %s at %s:%d\n"
 msgstr "arquitetura faltando para %s em %s:%d\n"
 
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "opção inválida \"%s\" em %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Sistema desconhecido: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Por favor, contate %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Não foi possível abrir %s para leitura: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "suporte a scriptlet <lua> não embutido\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Não foi possível criar um arquivo temporário para %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Não foi possível duplicar o descritor do arquivo: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "o scriptlet %s falhou, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "o scriptlet %s falhou, sinal %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "o scriptlet %s falhou, status de saída %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Formato desconhecido"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "instalar"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "apagar"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "não foi possível abrir o banco de dados de pacotes em %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "\"(\" extra no rótulo do pacote: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "\"(\" faltando no rótulo do pacote: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "\")\" faltando no rótulo do pacote: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: falha na leitura da chave pública.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "transação"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh size(%d): INVÁLIDO, a leitura retornou %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic: INVÁLIDO\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh tags: INVÁLIDO, número de etiquetas (%d) fora do intervalo\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh data: INVÁLIDO, número de bytes (%d) fora do intervalo\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d): INVÁLIDO, a leitura retornou %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh tag[%d]: INVÁLIDO, etiqueta %d tipo %d offset %d contagem %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh load: INVÁLIDO\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh pad(%zd): INVÁLIDO, %zd bytes lidos\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd): INVÁLIDO, fstat(2) falhou\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "A região de cabeçalho imutável não pôde ser lida. Pacote corrompido?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "Digest MD5:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "Digest do cabeçalho SHA1:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Cabeçalho "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "ignorado"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "falhou"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "%c %s faltando"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Dependências não satisfeitas para %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "{ faltando após %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "} faltando após %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "formato da etiqueta vazio"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "nome da etiqueta vazio"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "etiqueta desconhecida"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] esperado no fim da matriz"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "] não esperado"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "} não esperado"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? esperado na expressão"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ esperado após ? na expressão"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} esperado na expressão"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": esperado após a subexpressão ?"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ esperado após : na expressão"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| esperado no fim da expressão"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "iterador da matriz utilizado com diferentes tamanhos de matrizes"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "não foi possível abrir o índice %s usando o db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "nenhum dbpath foi definido\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: ignorando"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "erro (%d) ao armazenar o registro #%d em %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: o regexec falhou: %s\n"
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: o regcomp falhou: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: ignorando"
-
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: cabeçalho danificado #%u recuperado -- ignorando.\n"
-
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "opção inválida \"%s\" em %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "erro(%d) ao adicionar o registro de cabeçalho #%d\n"
+msgid "Unknown system: %s\n"
+msgstr "Sistema desconhecido: %s\n"
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "erro(%d) ao remover o registro de cabeçalho #%d\n"
+msgid "Please contact %s\n"
+msgstr "Por favor, contate %s\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: não foi possível ler o cabeçalho em 0x%x\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Não foi possível abrir %s para leitura: %m.\n"
 
-#: lib/rpmdb.c:2448
-#, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "erro (%d) ao definir registros \"%s\" a partir do índice %s\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "erro (%d) ao armazenar o registro \"%s\" em %s\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "erro (%d) ao remover o registro \"%s\" a partir de %s\n"
+msgid "Unable to restore current directory: %m"
+msgstr ""
 
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "erro (%d) ao alocar nova instância do pacote\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "suporte a scriptlet <lua> não embutido\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "erro (%d) ao obter os registros \"%s\" a partir do índice %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Não foi possível criar um arquivo temporário para %s: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "erro (%d) ao armazenar o registro %s em %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Não foi possível duplicar o descritor do arquivo: %s: %s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "nenhum dbpath foi definido"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "falha ao criar o diretório %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "o scriptlet %s falhou, waitpid(%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "o cabeçalho #%u do banco de dados é inválido -- ignorando.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "o scriptlet %s falhou, sinal %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "não é possível adicionar o registro originalmente em %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "o scriptlet %s falhou, status de saída %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr ""
-"falha ao reconstruir o banco de dados: o banco de dados original permanece "
-"no lugar\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Formato desconhecido"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "falha ao substituir o banco de dados velho pela novo!\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "instalar"
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "substituir arquivos em %s com arquivos de %s para recuperação"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "apagar"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "falha ao remover o diretório %s: %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "não foi possível abrir o banco de dados de pacotes em %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "erro db%d (%d) de %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "\"(\" extra no rótulo do pacote: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "erro db%d (%d): %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "\"(\" faltando no rótulo do pacote: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "não foi possível obter o bloqueio %s em %s/%s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "\")\" faltando no rótulo do pacote: %s\n"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "compartilhado"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: falha na leitura da chave pública.\n"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "exclusivo"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "transação"
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "opção db não reconhecida: \"%s\" ignorado.\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s tem um valor numérico inválido, ignorado\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s tem valor inteiro longo muito grande ou muito pequeno, ignorado\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s tem um valor inteiro muito grande ou muito pequeno, ignorado\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:231
-#, c-format
-msgid "Failed to write %s policy to file %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:268
+#, c-format
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Cabeçalho "
+
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Não foi possível recarregar o cabeçalho da assinatura.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "ignorado"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "falhou"
+
+#: lib/verify.c:263
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: lib/verify.c:284
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:448
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr ""
+msgid "missing   %c %s"
+msgstr "%c %s faltando"
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr ""
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Dependências não satisfeitas para %s:\n"
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:185
-#, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== %d ativo %d vazio\n"
-
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(vazio)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(vazio)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "O macro %%%s tem um corpo incompleto\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "O macro %%%s tem opções incompletas\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "O macro %%%s tem um nome inválido (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "O macro %%%s tem um corpo incompleto\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "O macro %%%s tem opções incompletas\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "O macro %%%s tem um corpo vazio\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "O macro %%%s falhou ao expandir\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "O macro %%%s tem um nome inválido (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "O macro %%%s (%s) não foi usado abaixo do nível %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Opção desconhecida %c em %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "%c incompleto: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Um %% é seguido por um macro não analisável\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== %d ativo %d vazio\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "erro ao criar o arquivo temporário %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Arquivo %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "O arquivo %s tem menos de %u bytes\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "falha ao criar o diretório"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr ""
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(sem erros)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "erro fatal: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "erro: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "aviso: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "sintaxe inválida no scriptlet lua: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "sintaxe inválida no script lua: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "falha no script lua: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "sintaxe inválida no arquivo lua: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "falha na conexão lua: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr ""
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(sem erros)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "erro fatal: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "erro: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "aviso: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "a alocação de memória (%u bytes) retornou NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, ID da chave %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(nada)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite falhou: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread falhou: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush falhou: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Não foi possível executar %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Não foi possível criar um canal para assinar: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "a execução do gpg falhou (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "o gpg falhou ao gravar a assinatura\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "não foi possível ler a assinatura\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "o rpmMkTemp falhou\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead falhou: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature falhou: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature falhou: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead falhou: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: falha na leitura do manifesto: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "não verificar a assinatura do cabeçalho+carga útil"
index a5188da2f91a95cf32a2830100a5d47f7bbec7ff..a2881502ac1fbb85978c3d1f89b49283993db072 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -43,487 +43,549 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr ""
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr ""
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr ""
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr ""
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
 msgstr ""
 
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
 msgstr ""
 
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
 msgstr ""
 
-#: rpmqv.c:125
-msgid "unexpected query flags"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
 msgstr ""
 
-#: rpmqv.c:128
-msgid "unexpected query format"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:131
-msgid "unexpected query source"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
 msgstr ""
 
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
 
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
+#: rpmbuild.c:183
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
+msgid "<tarball>"
 msgstr ""
 
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
+#: rpmbuild.c:186
+msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
+#: rpmbuild.c:189
+msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
+#: rpmbuild.c:192
+#, c-format
+msgid "verify %files section from <tarball>"
 msgstr ""
 
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
+#: rpmbuild.c:195
+msgid "build source and binary packages from <tarball>"
 msgstr ""
 
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
+#: rpmbuild.c:198
+msgid "build binary package only from <tarball>"
 msgstr ""
 
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
+#: rpmbuild.c:201
+msgid "build source package only from <tarball>"
 msgstr ""
 
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
+#: rpmbuild.c:205
+msgid "build binary package from <source package>"
 msgstr ""
 
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
+#: rpmbuild.c:212
+msgid "override build root"
 msgstr ""
 
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
 
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:216
+msgid "remove build tree when done"
 msgstr ""
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:218
+msgid "ignore ExcludeArch: directives from spec file"
 msgstr ""
 
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
+#: rpmbuild.c:220
+msgid "debug file state machine"
 msgstr ""
 
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
+#: rpmbuild.c:222
+msgid "do not execute any stages of the build"
 msgstr ""
 
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
+#: rpmbuild.c:224
+msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmqv.c:256
-msgid "no packages given for erase"
+#: rpmbuild.c:226
+msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmqv.c:290
-msgid "no packages given for install"
+#: rpmbuild.c:230
+#, c-format
+msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
 msgstr ""
 
-#: rpmqv.c:314
-msgid "no arguments given for verify"
+#: rpmbuild.c:234
+#, c-format
+msgid "do not execute %check stage of the build"
+msgstr ""
+
+#: rpmbuild.c:237
+msgid "do not accept i18N msgstr's from specfile"
+msgstr ""
+
+#: rpmbuild.c:239
+msgid "remove sources when done"
 msgstr ""
 
-#: rpmbuild.c:99
+#: rpmbuild.c:241
+msgid "remove specfile when done"
+msgstr ""
+
+#: rpmbuild.c:243
+msgid "skip straight to specified stage (only for c,i)"
+msgstr ""
+
+#: rpmbuild.c:245
+msgid "override target platform"
+msgstr ""
+
+#: rpmbuild.c:262
+msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
+msgstr ""
+
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
+msgid "Failed build dependencies:\n"
+msgstr ""
+
+#: rpmbuild.c:300
 #, c-format
-msgid "buildroot already specified, ignoring %s\n"
+msgid "Unable to open spec file %s: %s\n"
 msgstr ""
 
-#: rpmbuild.c:120
+#: rpmbuild.c:363
 #, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
+msgid "Failed to open tar pipe: %m\n"
 msgstr ""
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
 msgstr ""
 
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
+#: rpmbuild.c:389
+#, c-format
+msgid "Failed to read spec file from %s\n"
 msgstr ""
 
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+#: rpmbuild.c:401
+#, c-format
+msgid "Failed to rename %s to %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:129
+#: rpmbuild.c:479
 #, c-format
-msgid "verify %files section from <specfile>"
+msgid "failed to stat %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
+#: rpmbuild.c:483
+#, c-format
+msgid "File %s is not a regular file.\n"
 msgstr ""
 
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
+#: rpmbuild.c:490
+#, c-format
+msgid "File %s does not appear to be a specfile.\n"
 msgstr ""
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:556
+#, c-format
+msgid "Building target platforms: %s\n"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:564
 #, c-format
-msgid "build through %prep (unpack sources and apply patches) from <tarball>"
+msgid "Building for target %s\n"
 msgstr ""
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
-msgid "<tarball>"
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
 msgstr ""
 
-#: rpmbuild.c:145
-msgid "build through %build (%prep, then compile) from <tarball>"
+#: rpmdb.c:21
+msgid "initialize database"
 msgstr ""
 
-#: rpmbuild.c:148
-msgid "build through %install (%prep, %build, then install) from <tarball>"
+#: rpmdb.c:23
+msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 
-#: rpmbuild.c:151
-#, c-format
-msgid "verify %files section from <tarball>"
+#: rpmdb.c:26
+msgid "verify database files"
 msgstr ""
 
-#: rpmbuild.c:154
-msgid "build source and binary packages from <tarball>"
+#: rpmdb.c:28
+msgid "export database to stdout header list"
 msgstr ""
 
-#: rpmbuild.c:157
-msgid "build binary package only from <tarball>"
+#: rpmdb.c:31
+msgid "import database from stdin header list"
 msgstr ""
 
-#: rpmbuild.c:160
-msgid "build source package only from <tarball>"
+#: rpmdb.c:38
+msgid "Database options:"
 msgstr ""
 
-#: rpmbuild.c:164
-msgid "build binary package from <source package>"
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
 msgstr ""
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
+#: rpmkeys.c:20
+msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
+#: rpmkeys.c:22
+msgid "import an armored public key"
 msgstr ""
 
-#: rpmbuild.c:171
-msgid "override build root"
+#: rpmkeys.c:24
+msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmbuild.c:173
-msgid "remove build tree when done"
+#: rpmkeys.c:27 rpmkeys.c:29
+msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmbuild.c:175
-msgid "ignore ExcludeArch: directives from spec file"
+#: rpmkeys.c:36
+msgid "Keyring options:"
 msgstr ""
 
-#: rpmbuild.c:177
-msgid "debug file state machine"
+#: rpmkeys.c:64 rpmsign.c:161
+msgid "no arguments given"
 msgstr ""
 
-#: rpmbuild.c:179
-msgid "do not execute any stages of the build"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
 msgstr ""
 
-#: rpmbuild.c:181
-msgid "do not verify build dependencies"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
 msgstr ""
 
-#: rpmbuild.c:183
-msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
 msgstr ""
 
-#: rpmbuild.c:187
-#, c-format
-msgid "do not execute %clean stage of the build"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
 msgstr ""
 
-#: rpmbuild.c:189
-#, c-format
-msgid "do not execute %check stage of the build"
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
 msgstr ""
 
-#: rpmbuild.c:192
-msgid "do not accept i18N msgstr's from specfile"
+#: rpmqv.c:126
+msgid "unexpected query flags"
 msgstr ""
 
-#: rpmbuild.c:194
-msgid "remove sources when done"
+#: rpmqv.c:129
+msgid "unexpected query format"
 msgstr ""
 
-#: rpmbuild.c:196
-msgid "remove specfile when done"
+#: rpmqv.c:132
+msgid "unexpected query source"
 msgstr ""
 
-#: rpmbuild.c:198
-msgid "skip straight to specified stage (only for c,i)"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
 msgstr ""
 
-#: rpmbuild.c:200 rpmspec.c:34
-msgid "override target platform"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
 msgstr ""
 
-#: rpmbuild.c:217
-msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
 msgstr ""
 
-#: rpmbuild.c:237
-msgid "Failed build dependencies:\n"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
 
-#: rpmbuild.c:255
-#, c-format
-msgid "Unable to open spec file %s: %s\n"
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
 msgstr ""
 
-#: rpmbuild.c:317
-#, c-format
-msgid "Failed to open tar pipe: %m\n"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
 msgstr ""
 
-#: rpmbuild.c:336
-#, c-format
-msgid "Failed to read spec file from %s\n"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmbuild.c:348
-#, c-format
-msgid "Failed to rename %s to %s: %m\n"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmbuild.c:419
-#, c-format
-msgid "failed to stat %s: %m\n"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
 
-#: rpmbuild.c:423
-#, c-format
-msgid "File %s is not a regular file.\n"
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
 msgstr ""
 
-#: rpmbuild.c:430
-#, c-format
-msgid "File %s does not appear to be a specfile.\n"
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
 msgstr ""
 
-#: rpmbuild.c:496
-#, c-format
-msgid "Building target platforms: %s\n"
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
 msgstr ""
 
-#: rpmbuild.c:504
-#, c-format
-msgid "Building for target %s\n"
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
 msgstr ""
 
-#: rpmdb.c:22
-msgid "initialize database"
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
 msgstr ""
 
-#: rpmdb.c:24
-msgid "rebuild database inverted lists from installed package headers"
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
 msgstr ""
 
-#: rpmdb.c:27
-msgid "verify database files"
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
 msgstr ""
 
-#: rpmdb.c:33
-msgid "Database options:"
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
 msgstr ""
 
-#: rpmkeys.c:24
-msgid "verify package signature(s)"
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmkeys.c:26
-msgid "import an armored public key"
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
 msgstr ""
 
-#: rpmkeys.c:28
-msgid "don't import, but tell if it would work or not"
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
-msgid "list keys from RPM keyring"
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
 msgstr ""
 
-#: rpmkeys.c:40
-msgid "Keyring options:"
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
-msgid "no arguments given"
+#: rpmqv.c:258
+msgid "no packages given for erase"
 msgstr ""
 
-#: rpmsign.c:25
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr ""
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr ""
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr ""
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr ""
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
+#: rpmsign.c:37
+msgid "sign package(s) files"
 msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
+#: rpmsign.c:39
+msgid "use file signing key <key>"
 msgstr ""
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
 msgstr ""
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
+#: rpmsign.c:49
+msgid "Signature options:"
 msgstr ""
 
-#: rpmsign.c:117
+#: rpmsign.c:101
 #, c-format
-msgid "Pass phrase is good.\n"
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr ""
 
-#: rpmsign.c:123
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr ""
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -532,473 +594,546 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr ""
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr ""
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr ""
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
 "RPM build errors:\n"
 msgstr ""
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr ""
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr ""
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr ""
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr ""
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr ""
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr ""
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr ""
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr ""
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr ""
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr ""
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr ""
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr ""
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr ""
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr ""
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr ""
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr ""
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
-#, c-format
-msgid "Bad file: %s: %s\n"
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2039 build/parsePrep.c:33
+#: build/files.c:2657
 #, c-format
-msgid "Bad owner/group: %s\n"
+msgid "Bad file: %s: %s\n"
 msgstr ""
 
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
 msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
 msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr ""
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr ""
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:434
 #, c-format
-msgid "Could not open %s: %s\n"
+msgid "Failed to read %jd bytes in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:452
-#, c-format
-msgid "Unable to write package: %s\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:468
+#: build/pack.c:453
 #, c-format
-msgid "Unable to open sigtarget %s: %s\n"
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:479
+#: build/pack.c:520
 #, c-format
-msgid "Unable to read header from %s: %s\n"
+msgid "Could not open %s: %s\n"
 msgstr ""
 
-#: build/pack.c:489
+#: build/pack.c:527
 #, c-format
-msgid "Unable to write header to %s: %s\n"
+msgid "Unable to write package: %s\n"
 msgstr ""
 
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr ""
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr ""
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr ""
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
+#: build/parseFiles.c:33
 #, c-format
-msgid "line %d: Second description\n"
+msgid "line %d: Error parsing %%files: %s\n"
 msgstr ""
 
-#: build/parseFiles.c:33
+#: build/parseFiles.c:73
 #, c-format
-msgid "line %d: Error parsing %%files: %s\n"
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
@@ -1006,341 +1141,410 @@ msgstr ""
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr ""
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr ""
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr ""
@@ -1411,450 +1615,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr ""
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
 msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
 msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
 msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:810
+msgid "shared"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr ""
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
 msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
 msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr ""
 
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
+#: lib/formats.c:44
+msgid "(not a string)"
 msgstr ""
 
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
 msgstr ""
 
-#: lib/formats.c:314
-msgid "(not base64)"
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
+#: lib/formats.c:253
+msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr ""
+
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
+msgid "unknown tag: \"%s\""
 msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr ""
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr ""
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr ""
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr ""
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr ""
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr ""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr ""
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
 msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr ""
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr ""
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr ""
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr ""
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr ""
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1875,1620 +2190,1735 @@ msgstr ""
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr ""
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr ""
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr ""
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr ""
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr ""
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr ""
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr ""
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr ""
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr ""
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr ""
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr ""
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr ""
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr ""
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr ""
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr ""
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr ""
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr ""
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/poptQV.c:176
+#: lib/poptQV.c:197
 msgid "list all license files"
 msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+msgid "list all artifact files"
+msgstr ""
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr ""
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr ""
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr ""
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr ""
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr ""
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr ""
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr ""
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr ""
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr ""
 
-#: lib/psm.c:941
+#: lib/query.c:108
+#, c-format
+msgid "incorrect format: %s\n"
+msgstr ""
+
+#: lib/query.c:120
+msgid "(contains no files)\n"
+msgstr ""
+
+#: lib/query.c:161
+msgid "normal        "
+msgstr ""
+
+#: lib/query.c:164
+msgid "replaced      "
+msgstr ""
+
+#: lib/query.c:167
+msgid "not installed "
+msgstr ""
+
+#: lib/query.c:170
+msgid "net shared    "
+msgstr ""
+
+#: lib/query.c:173
+msgid "wrong color   "
+msgstr ""
+
+#: lib/query.c:176
+msgid "(no state)    "
+msgstr ""
+
+#: lib/query.c:179
 #, c-format
-msgid "%s failed on file %s: %s\n"
+msgid "(unknown %3d) "
+msgstr ""
+
+#: lib/query.c:199
+msgid "package has not file owner/group lists\n"
+msgstr ""
+
+#: lib/query.c:233
+msgid "package has neither file owner or id lists\n"
 msgstr ""
 
-#: lib/psm.c:944
+#: lib/query.c:321
 #, c-format
-msgid "%s failed: %s\n"
+msgid "group %s does not contain any packages\n"
 msgstr ""
 
-#: lib/query.c:111
+#: lib/query.c:328
 #, c-format
-msgid "incorrect format: %s\n"
+msgid "no package triggers %s\n"
 msgstr ""
 
-#: lib/query.c:123
-msgid "(contains no files)\n"
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
+#, c-format
+msgid "malformed %s: %s\n"
 msgstr ""
 
-#: lib/query.c:160
-msgid "normal        "
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
+#, c-format
+msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:163
-msgid "replaced      "
+#: lib/query.c:387
+#, c-format
+msgid "no package requires %s\n"
+msgstr ""
+
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
+#, c-format
+msgid "no package provides %s\n"
+msgstr ""
+
+#: lib/query.c:455
+#, c-format
+msgid "file %s: %s\n"
+msgstr ""
+
+#: lib/query.c:458
+#, c-format
+msgid "file %s is not owned by any package\n"
+msgstr ""
+
+#: lib/query.c:469
+#, c-format
+msgid "invalid package number: %s\n"
+msgstr ""
+
+#: lib/query.c:476
+#, c-format
+msgid "record %u could not be read\n"
+msgstr ""
+
+#: lib/query.c:491 lib/rpminstall.c:690
+#, c-format
+msgid "package %s is not installed\n"
+msgstr ""
+
+#: lib/query.c:525
+#, c-format
+msgid "unknown tag: \"%s\"\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
+#, c-format
+msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/query.c:166
-msgid "not installed "
+#: lib/rpmchecksig.c:66
+#, c-format
+msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/query.c:169
-msgid "net shared    "
+#: lib/rpmchecksig.c:111
+#, c-format
+msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/query.c:172
-msgid "wrong color   "
+#: lib/rpmchecksig.c:131
+#, c-format
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/query.c:175
-msgid "(no state)    "
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/query.c:178
-#, c-format
-msgid "(unknown %3d) "
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/query.c:198
-msgid "package has not file owner/group lists\n"
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
 
-#: lib/query.c:229
-msgid "package has neither file owner or id lists\n"
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/query.c:318
-#, c-format
-msgid "group %s does not contain any packages\n"
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
 msgstr ""
 
-#: lib/query.c:325
-#, c-format
-msgid "no package triggers %s\n"
+#: lib/rpmchecksig.c:268
+msgid "OK"
 msgstr ""
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
-msgid "malformed %s: %s\n"
+msgid "%s: open failed: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/rpmchroot.c:43
 #, c-format
-msgid "no package matches %s: %s\n"
+msgid "Unable to open current directory: %m\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
 #, c-format
-msgid "no package requires %s\n"
+msgid "%s: chroot directory not set\n"
 msgstr ""
 
-#: lib/query.c:392
+#: lib/rpmchroot.c:70
 #, c-format
-msgid "no package provides %s\n"
+msgid "Unable to change root directory: %m\n"
 msgstr ""
 
-#: lib/query.c:424
+#: lib/rpmchroot.c:95
 #, c-format
-msgid "file %s: %s\n"
+msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/query.c:427
+#: lib/rpmdb.c:72
 #, c-format
-msgid "file %s is not owned by any package\n"
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/query.c:438
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
 #, c-format
-msgid "invalid package number: %s\n"
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/query.c:445
-#, c-format
-msgid "record %u could not be read\n"
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
-#, c-format
-msgid "package %s is not installed\n"
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
 msgstr ""
 
-#: lib/query.c:492
+#: lib/rpmdb.c:988
 #, c-format
-msgid "unknown tag: \"%s\"\n"
+msgid "error(%d) storing record #%d into %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmdb.c:1100
 #, c-format
-msgid "%s: key %d import failed.\n"
+msgid "%s: regexec failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmdb.c:1281
 #, c-format
-msgid "%s: key %d not an armored public key.\n"
+msgid "%s: regcomp failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
-#, c-format
-msgid "%s: import read failed(%d).\n"
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmdb.c:1531
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
+#: lib/rpmdb.c:2061
 #, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+msgid "%s: cannot read header at 0x%x\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "OK"
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ") "
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:393
-msgid ")"
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmdb.c:2520
 #, c-format
-msgid "%s: open failed: %s\n"
+msgid "failed to create directory %s: %s\n"
 msgstr ""
 
-#: lib/rpmchroot.c:43
+#: lib/rpmdb.c:2557
 #, c-format
-msgid "Unable to open current directory: %m\n"
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
+#: lib/rpmdb.c:2572
 #, c-format
-msgid "%s: chroot directory not set\n"
+msgid "cannot add record originally at %u\n"
 msgstr ""
 
-#: lib/rpmchroot.c:70
-#, c-format
-msgid "Unable to change root directory: %m\n"
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
 msgstr ""
 
-#: lib/rpmchroot.c:95
-#, c-format
-msgid "Unable to restore root directory: %m\n"
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr ""
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr ""
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr ""
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
 msgstr ""
 
-#: lib/rpmds.c:961
+#: lib/rpmds.c:1249
 msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmds.c:964
+#: lib/rpmds.c:1252
 msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpmds.c:967
+#: lib/rpmds.c:1255
 msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpmds.c:971
+#: lib/rpmds.c:1259
 msgid "internal support for lua scripts."
 msgstr ""
 
-#: lib/rpmds.c:975
+#: lib/rpmds.c:1263
 msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmds.c:979
+#: lib/rpmds.c:1267
 msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmds.c:983
+#: lib/rpmds.c:1271
 msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmds.c:986
+#: lib/rpmds.c:1274
 msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmgi.c:136
-#, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpminstall.c:141
-#, c-format
-msgid "Updating / installing...\n"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpmds.c:1410
 #, c-format
-msgid "Cleaning up / removing...\n"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpmds.c:1544
 #, c-format
-msgid "package %s is not relocatable\n"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpminstall.c:706
+#: lib/rpmfi.c:810
 #, c-format
-msgid "Installing %s\n"
-msgstr ""
-
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
-msgstr ""
-
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
-msgstr ""
-
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmlead.c:123
+#: lib/rpmfi.c:817
 #, c-format
-msgid "read failed: %s (%d)\n"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "can't create %s lock on %s (%s)\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
 msgstr ""
 
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
 msgstr ""
 
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmprob.c:109
-msgid "different"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
 msgstr ""
 
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
+#: lib/rpmfi.c:2389
+msgid " failed - "
 msgstr ""
 
-#: lib/rpmprob.c:130
+#: lib/rpmfi.c:2392
 #, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmprob.c:135
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+msgid "open of %s failed: %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:140
+#: lib/rpmgi.c:144
 #, c-format
-msgid "package %s (which is newer than %s) is already installed"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:145
+#: lib/rpmgi.c:155
 #, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmprob.c:155
+#: lib/rpminstall.c:142
 #, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpmprob.c:159
+#: lib/rpminstall.c:144
 #, c-format
-msgid "%s is needed by %s%s"
+msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
+#: lib/rpminstall.c:193
+msgid "Preparing..."
 msgstr ""
 
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpmprob.c:172
+#: lib/rpminstall.c:323
 #, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:194
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "missing second ':' at %s:%d\n"
+msgid "%s cannot be installed\n"
 msgstr ""
 
-#: lib/rpmrc.c:197
+#: lib/rpminstall.c:490
 #, c-format
-msgid "missing architecture name at %s:%d\n"
+msgid "Retrieving %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:342
+#: lib/rpminstall.c:502
 #, c-format
-msgid "Incomplete data line at %s:%d\n"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpmrc.c:347
+#: lib/rpminstall.c:572
 #, c-format
-msgid "Too many args in data line at %s:%d\n"
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpmrc.c:354
+#: lib/rpminstall.c:603
 #, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+msgid "error reading from file %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:385
+#: lib/rpminstall.c:697
 #, c-format
-msgid "Incomplete default line at %s:%d\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpmrc.c:390
+#: lib/rpminstall.c:736
 #, c-format
-msgid "Too many args in default line at %s:%d\n"
+msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:495
+#: lib/rpminstall.c:742
 #, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgid "Installing %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
 msgstr ""
 
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/rpmrc.c:603
+#: lib/rpmlead.c:118
 #, c-format
-msgid "bad option '%s' at %s:%d\n"
+msgid "read failed: %s (%d)\n"
 msgstr ""
 
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/rpmrc.c:1349
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
-msgid "Unknown system: %s\n"
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmrc.c:1350
+#: lib/rpmlock.c:133
 #, c-format
-msgid "Please contact %s\n"
+msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:1591
+#: lib/rpmplugins.c:65
 #, c-format
-msgid "Unable to open %s for reading: %m.\n"
+msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:75
+#: lib/rpmplugins.c:73
 #, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:221
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmscript.c:248
+#: lib/rpmplugins.c:199
 #, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+#: lib/rpmprob.c:109
+msgid "different"
 msgstr ""
 
-#: lib/rpmscript.c:276
+#: lib/rpmprob.c:114
 #, c-format
-msgid "%s scriptlet failed, signal %d\n"
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/rpmscript.c:279
+#: lib/rpmprob.c:118
 #, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/rpmte.c:869
-msgid "erase"
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
 msgstr ""
 
-#: lib/rpmts.c:92
+#: lib/rpmprob.c:125
 #, c-format
-msgid "cannot open Packages database in %s\n"
+msgid "path %s in package %s is not relocatable"
 msgstr ""
 
-#: lib/rpmts.c:191
+#: lib/rpmprob.c:130
 #, c-format
-msgid "extra '(' in package label: %s\n"
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/rpmts.c:209
+#: lib/rpmprob.c:135
 #, c-format
-msgid "missing '(' in package label: %s\n"
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/rpmts.c:217
+#: lib/rpmprob.c:140
 #, c-format
-msgid "missing ')' in package label: %s\n"
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/rpmts.c:273
+#: lib/rpmprob.c:145
 #, c-format
-msgid "%s: reading of public key failed.\n"
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/rpmts.c:1087
-msgid "transaction"
+#: lib/rpmprob.c:155
+#, c-format
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/signature.c:90
+#: lib/rpmprob.c:159
 #, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
+msgid "%s is needed by %s%s"
 msgstr ""
 
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
 msgstr ""
 
-#: lib/signature.c:101
+#: lib/rpmprob.c:163
 #, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/signature.c:107
+#: lib/rpmprob.c:167
 #, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+msgid "%s is obsoleted by %s%s"
 msgstr ""
 
-#: lib/signature.c:123
+#: lib/rpmprob.c:172
 #, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
+msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 
-#: lib/signature.c:196
+#: lib/rpmrc.c:222
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "missing second ':' at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
+#: lib/rpmrc.c:225
+#, c-format
+msgid "missing architecture name at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:219
+#: lib/rpmrc.c:370
 #, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+msgid "Incomplete data line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpmrc.c:375
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
+msgid "Too many args in data line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmrc.c:382
+#, c-format
+msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr ""
 
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+#: lib/rpmrc.c:413
+#, c-format
+msgid "Incomplete default line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:489
-msgid "Header "
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:530
+#: lib/rpmrc.c:551
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "skipped"
+#: lib/rpmrc.c:564
+#, c-format
+msgid "missing architecture for %s at %s:%d\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "failed"
+#: lib/rpmrc.c:632
+#, c-format
+msgid "bad option '%s' at %s:%d\n"
 msgstr ""
 
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
+msgid "Unknown system: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:336
-msgid "invalid field width"
+#: lib/rpmrc.c:1471
+#, c-format
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:342
-msgid "missing { after %"
+#: lib/rpmrc.c:1604
+#, c-format
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/headerfmt.c:375
-msgid "empty tag format"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/headerfmt.c:386
-msgid "empty tag name"
+#: lib/rpmscript.c:138
+#, c-format
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/headerfmt.c:393
-msgid "unknown tag"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
+#: lib/rpmscript.c:278
+#, c-format
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
+#: lib/rpmscript.c:313
+#, c-format
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:435
-msgid "unexpected }"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
 msgstr ""
 
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
+#: lib/rpmscript.c:371
+#, c-format
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
+#: lib/rpmscript.c:375
+#, c-format
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
+#: lib/rpmscript.c:378
+#, c-format
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
 msgstr ""
 
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
 
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
+#: lib/rpmte.c:730
+msgid "erase"
 msgstr ""
 
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
+#: lib/rpmts.c:100
+#, c-format
+msgid "cannot open Packages database in %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:97
+#: lib/rpmts.c:199
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:191
+#: lib/rpmts.c:217
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:516
+#: lib/rpmts.c:225
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmvs.c:152
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmvs.c:158
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmvs.c:188
+#, c-format
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmvs.c:195
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmvs.c:206
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmvs.c:261
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmvs.c:268
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
+msgid "%s%s"
 msgstr ""
 
-#: lib/rpmdb.c:2448
-#, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: lib/rpmdb.c:2644
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
 msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: lib/rpmdb.c:2875
-#, c-format
-msgid "failed to create directory %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/verify.c:263
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/verify.c:284
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/verify.c:448
 #, c-format
-msgid "replace files in %s with files from %s to recover"
+msgid "missing   %c %s"
 msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/verify.c:503
 #, c-format
-msgid "failed to remove directory %s: %s\n"
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: lib/backend/db3.c:33
+#: plugins/prioreset.c:29
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: lib/backend/db3.c:36
+#: plugins/prioreset.c:40
 #, c-format
-msgid "db%d error(%d): %s\n"
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
 
-#: lib/backend/db3.c:500
-#, c-format
-msgid "cannot get %s lock on %s/%s\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
+#: rpmio/digest_nss.c:79
+#, c-format
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
+#: rpmio/macro.c:286
+#, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr ""
 
-#: lib/backend/db3.c:582
+#: rpmio/macro.c:316
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%3d<%*s(empty)\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: rpmio/macro.c:483
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: rpmio/macro.c:551
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: rpmio/macro.c:557
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: rpmio/macro.c:562
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "Macro %%%s needs whitespace before body\n"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: rpmio/macro.c:566
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "Macro %%%s failed to expand\n"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: rpmio/macro.c:607
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: rpmio/macro.c:637
+#, c-format
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: rpmio/macro.c:761
+#, c-format
+msgid "Unknown option %c in %s(%s)\n"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: rpmio/macro.c:1055
+msgid ""
+"Too many levels of recursion in macro expansion. It is likely caused by "
+"recursive macro declaration.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:337
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:386
+#: rpmio/macro.c:1182
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: rpmio/macro.c:1197
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "failed to load macro file %s"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: rpmio/macro.c:1578
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "======================== active %d empty %d\n"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: rpmio/rpmfileutil.c:258
 #, c-format
-msgid "Failed to execute %s: %s\n"
+msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "File %s: %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: rpmio/rpmfileutil.c:332
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: rpmio/rpmlog.c:194
+msgid "error: "
 msgstr ""
 
-#: plugins/sepolicy.c:594
-#, c-format
-msgid "Failed to extract policy from %s\n"
+#: rpmio/rpmlog.c:195
+msgid "warning: "
 msgstr ""
 
-#: rpmio/macro.c:185
+#: rpmio/rpmlua.c:523
 #, c-format
-msgid "======================== active %d empty %d\n"
+msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/rpmlua.c:541
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:364
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
-msgid "%3d<%*s(empty)\n"
+msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/rpmlua.c:560
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/rpmlua.c:756
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/rpmmalloc.c:25
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
 #, c-format
-msgid "Macro %%%s has empty body\n"
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/rpmpgp.c:1127
 #, c-format
-msgid "Macro %%%s failed to expand\n"
+msgid "V%d %s/%s %s, key ID %s"
 msgstr ""
 
-#: rpmio/macro.c:649
-#, c-format
-msgid "Macro %%%s has illegal name (%%undefine)\n"
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/rpmsq.c:37
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "exiting on signal %d from pid %d\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: sign/rpmgensig.c:54
 #, c-format
-msgid "Unknown option %c in %s(%s)\n"
+msgid "error creating temp directory %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1048
-msgid ""
-"Too many levels of recursion in macro expansion. It is likely caused by "
-"recursive macro declaration.\n"
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "Unterminated %c: %s\n"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: sign/rpmgensig.c:91
 #, c-format
-msgid "A %% is followed by an unparseable macro\n"
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: sign/rpmgensig.c:167
 #, c-format
-msgid "error creating temporary file %s: %m\n"
+msgid "%s: Fwrite failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: sign/rpmgensig.c:173
 #, c-format
-msgid "File %s: %s\n"
+msgid "%s: Fread failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:319
+#: sign/rpmgensig.c:177
 #, c-format
-msgid "File %s is smaller than %u bytes\n"
+msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: sign/rpmgensig.c:202
+msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: sign/rpmgensig.c:208
 #, c-format
-msgid "invalid syntax in lua scriptlet: %s\n"
+msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: sign/rpmgensig.c:221
 #, c-format
-msgid "invalid syntax in lua script: %s\n"
+msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "lua script failed: %s\n"
+msgid "Could not exec %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
-#, c-format
-msgid "invalid syntax in lua file: %s\n"
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "lua hook failed: %s\n"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: sign/rpmgensig.c:312
+#, c-format
+msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
+#: sign/rpmgensig.c:354
+msgid "gpg failed to write signature\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
+#: sign/rpmgensig.c:371
+msgid "unable to read the signature\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
 msgstr ""
 
-#: rpmio/rpmmalloc.c:25
-#, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1008
-#, c-format
-msgid "V%d %s/%s %s, key ID %s"
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
+msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
-#, c-format
-msgid "%s: Fwrite failed: %s\n"
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s: Fflush failed: %s\n"
+msgid "%s already contains identical file signatures\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
-msgid "Unsupported PGP signature\n"
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "Unsupported PGP hash algorithm %u\n"
+msgid "%s: rpmReadSignature failed: %s"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:689
 #, c-format
-msgid "Unsupported PGP pubkey algorithm %u\n"
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:722
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "%s already contains identical signature, skipping\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
-msgid "gpg exec failed (%d)\n"
+msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
-msgid "gpg failed to write signature\n"
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:263
-msgid "unable to read the signature\n"
+#: sign/rpmgensig.c:812
+#, c-format
+msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
-msgid "rpmMkTemp failed\n"
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
-#, c-format
-msgid "%s already contains identical signature, skipping\n"
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
 msgstr ""
 
-#: sign/rpmgensig.c:525
-#, c-format
-msgid "%s: writeLead failed: %s\n"
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:531
-#, c-format
-msgid "%s: rpmWriteSignature failed: %s\n"
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:545
-#, c-format
-msgid "replacing %s failed: %s\n"
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 9628937eac20bdc20a6d8e14eaa8d203bb6ae198..5d927c0de9c82b46fdc0884cf465b6d89fcad4e9 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -3,21 +3,23 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
+# pbludov <pbludov@gmail.com>, 2017
+# pbludov <pbludov@gmail.com>, 2017
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Russian (http://www.transifex.com/projects/p/rpm/language/"
-"ru/)\n"
+"Language-Team: Russian (http://www.transifex.com/rpm-team/rpm/language/ru/)\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
+"%100>=11 && n%100<=14)? 2 : 3);\n"
 
 #: cliutils.c:21 lib/poptI.c:29
 #, c-format
@@ -45,508 +47,571 @@ msgstr "Эту программу можно свободно распростр
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "запуск не удался\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "заданный аргумент не является пакетом RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "ошибка чтения заголовка из пакета\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "невозможно повторно открыть payload: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Параметры запроса (с -q или --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Параметры проверки (с -V или --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Параметры Установки/Обновления/Удаления:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Общие параметры для всех режимов и компонентов rpm:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "за один раз может быть исполнен только один тип проверки или запроса"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "неожиданные флаги запроса"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "неожиданный формат запроса"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "неожиданный источник запроса"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "может быть указан только один из основных режимов"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "файлы могут быть перемещены только при установке пакета"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "--prefix нельзя использовать с --relocate или --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"варианты --relocate и --excludepath можно использовать только при установке "
-"новых пакетов"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "вариант --prefix можно использовать только при установке новых пакетов"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "аргументы для --prefix должны начинаться с /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs может быть указан только при установке пакета"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs может быть указан только при установке пакета"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs может быть указан только при установке пакета"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-"может быть использован только один из параметров --excludedocs или --"
-"includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch может быть указан только при установке пакета"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos может быть указан только при установке пакета"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize может быть указан только при установке пакета"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches может быть указан только при удалении пакета"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles может быть указан только при установке пакета"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb может быть указан только при установке или удалении пакета"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"параметры запрета сценариев могут быть указаны только при установке или "
-"удалении пакета"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"параметры запрета триггеров могут быть указан только при установке или "
-"удалении пакета(ов)"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "аргументы для --root (-r) должны начинаться с /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "не заданы пакеты для удаления"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "не заданы пакеты для установки"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "не заданы аргументы запроса"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "не заданы аргументы для верификации"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot уже указан, %s игнорируется\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "выполнить по стадию %prep (развернуть исходники и наложить заплаты) из <файл "
 "спецификации>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<файл спецификации>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 "выполнить по стадию %build (%prep, затем компиляция) из <файл спецификации>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "выполнить по стадию %install (%prep, %build, затем установка) из <файл "
 "спецификации>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "проверить раздел %files из <файл спецификации>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "собрать исходный и двоичный пакеты по <файл спецификации>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "собрать двоичный пакет по <файл спецификации>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "собрать исходный пакет по <файлу спецификации>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<исходный пакет>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"выполнить по стадию %install (%prep, %build, затем установка)  из <исходный "
+"пакет>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "выполнить по стадию %prep (развернуть исходники и наложить заплаты) из "
 "<архив tar>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<архив tar>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "выполнить по стадию %build (%prep, затем компиляция) из <архив tar>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "выполнить по стадию %install (%prep, %build, затем установка) из <архив tar>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "проверить секцию %files из <архив tar>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "собрать исходный и двоичный пакеты из <архив tar>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "собрать двоичный пакет из <архив tar>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "собрать исходный пакет из <архив tar>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "собрать двоичный пакет из <исходный пакет>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<исходный пакет>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"выполнить по стадию %install (%prep, %build, затем установка)  из <исходный "
-"пакет>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "переопределить build root"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "после завершения удалить дерево исходников"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "игнорировать ExcludeArch: в файле конфигурации"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "отладка машины состояния файлов"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "не выполнять никаких этапов сборки"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "не проверять зависимости пакета перед сборкой"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "игнорировать строки i18N из файла спецификации"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "после завершения удалить исходники"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "после завершения удалить файл спецификации"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "перейти непосредственно к указанному этапу (только для c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "переопределить целевую платформу"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 "Параметры сборки с [ <файл спецификации> | <тар архив> | <исходный пакет> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Общие параметры для всех режимов и компонентов rpm:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Неудовлетворенные зависимости сборки:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Ошибка открытия файла спецификации %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Ошибка открытия канала tar: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Ошибка чтения файла спецификации из %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Невозможно переименовать %s в %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "невозможно получить информацию о %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Не обычный файл: %s.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Файл %s не похож на файл спецификации.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Платформы для сборки: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Сборка для платформы %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "аргументы для --root (-r) должны начинаться с /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "инициализировать базу данных"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "переиндексировать базу инвертированных списков из установленных заголовков "
 "пакетов"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "проверить файлы базы данных"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Параметры базы данных"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "может быть указан только один из основных режимов"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "проверить подпись(и) пакета"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "импортировать открытый ключ"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "не заданы аргументы"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Параметры запроса (с -q или --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Параметры проверки (с -V или --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Параметры Установки/Обновления/Удаления:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "за один раз может быть исполнен только один тип проверки или запроса"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "неожиданные флаги запроса"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "неожиданный формат запроса"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "неожиданный источник запроса"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "файлы могут быть перемещены только при установке пакета"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "--prefix нельзя использовать с --relocate или --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"варианты --relocate и --excludepath можно использовать только при установке "
+"новых пакетов"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "вариант --prefix можно использовать только при установке новых пакетов"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "аргументы для --prefix должны начинаться с /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr "--hash (-h) может быть указан только при установке или удалении пакета"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr "--percent может быть указан только при установке или удалении пакета"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs может быть указан только при установке пакета"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs может быть указан только при установке пакета"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs может быть указан только при установке пакета"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr ""
+"может быть использован только один из параметров --excludedocs или --"
+"includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch может быть указан только при установке пакета"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos может быть указан только при установке пакета"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize может быть указан только при установке пакета"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches может быть указан только при удалении пакета"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles может быть указан только при установке пакета"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb может быть указан только при установке или удалении пакета"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"параметры запрета сценариев могут быть указаны только при установке или "
+"удалении пакета"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"параметры запрета триггеров могут быть указаны только при установке или "
+"удалении пакета"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps может быть указан только при установке, удалении или проверке пакета"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr "--test может быть указан только при установке или удалении пакета"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "не заданы пакеты для удаления"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "не заданы пакеты для установки"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "не заданы аргументы запроса"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "не заданы аргументы для проверки"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr "подписать пакет(ы)"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "подписать пакет (то же самое что --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "удалить подписи пакета"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Параметры подписи:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Невозможно выполнить %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Вы должны установить \"%%_gpg_name\" в вашем макрофайле\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Введите ключевую фразу: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Ключевая фраза принята.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "используйте следующий формат запроса"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -555,32 +620,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Выполняется(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Выполнить %s не удалось (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Неверный код возврата из %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -590,235 +660,315 @@ msgstr ""
 "\n"
 "Ошибки сборки пакетов:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "синтаксическая ошибка при анализе ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "синтаксическая ошибка при анализе &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "синтаксическая ошибка при анализе ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "ошибка анализа выражения\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "незакрытая (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- только для чисел\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! только для чисел\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "типы должны совпадать\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / не поддерживается для строк\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- не поддерживается для строк\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& и || не поддерживаются для строк\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "синтаксическая ошибка в выражении\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Отсутствует '(' в %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "отсутствует ')' в %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Неверный токен %s: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Отсутствует %s в %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Не пробел следует после %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Неверный синтаксис: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Неверные права: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Неверные права на каталог %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Файл должен начинаться с \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "Не удается проверить файл %u, возврат к MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Файл указан дважды: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Символическая ссылка указывает на BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Файл не найден: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: это не открытый ключ.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "не удалось создать каталог"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Файл должен начинаться с \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Файл не найден: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "строка: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Файл не найден: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Неверный файл %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Неверная пара владелец/группа: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Проверка на неупакованный(е) файл(ы): %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -827,548 +977,605 @@ msgstr ""
 "Обнаружен(ы) установленный(е) (но не упакованный(е)) файл(ы):\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
-msgstr "Ð\94воиÑ\87нÑ\8bе Ð´Ð°Ð½Ð½Ñ\8bе Ñ\81 Ð°Ñ\80Ñ\85иÑ\82екÑ\83Ñ\82рой в пакете noarch\n"
+msgstr "Ð\94воиÑ\87нÑ\8bе Ð´Ð°Ð½Ð½Ñ\8bе Ñ\81 Ð°Ñ\80Ñ\85иÑ\82екÑ\82Ñ\83рой в пакете noarch\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Невозможно канонизировать имя компьютера: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Невозможно записать содержимое в %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Ð\9dевозможно Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ñ\81одеÑ\80жимое Ð¸Ð· %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Ð\9dевозможно ÐºÐ°Ð½Ð¾Ð½Ð¸Ð·Ð¸Ñ\80оваÑ\82Ñ\8c Ð¸Ð¼Ñ\8f ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80а: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Невозможно поместить заголовок в нерперывную область памяти.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Невозможно открыть временный файл.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Невозможно записать временный заголовок\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Ошибка чтения файла спецификации из %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Неверные данные CSA\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Невозможно перезагрузить заголовок подписи.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Невозможно открыть %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Невозможно записать пакет: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Невозможно открыть цель подписи %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Невозможно прочитать заголовок из %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Невозможно записать заголовок в %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Записан: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Выполнение \"%s\":\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Выполнение \"%s\" не удалось.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Невозможно создать имя файла для пакета %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "невозможно создать %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
-msgstr "строка %d: второе %s\n"
+msgstr "строка %d: %s повторно\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "записи %%changelog должны начинаться с *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "неполная запись %%changelog\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "неверная дата в %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog не в нисходящем хронологическом порядке\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "пропущено имя в %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "нет описания в %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "строка %d: %%changelog повторно\n"
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "строка %d: Ошибка анализа %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "строка %d: Неверный параметр %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "строка %d: Слишком много имен: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "строка %d: Пакет не существует: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "строка %d: Второе описание\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "строка %d: Ошибка разбора %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "строка %d: Неверное число: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "строка %d: Неверное число %s: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "Загрузка %s в %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "Невозможно загрузить %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Архитектура исключена: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Архитектура не включена: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "ОС исключена: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "ОС не включена: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "Поле %s обязано присутствовать в пакете: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Повторяющиеся записи %s в пакете: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Невозможно открыть пиктограмму %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Невозможно прочитать пиктограмму %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Неизвестный тип пиктограммы: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "строка %d: Ярлык требует только один аргумент: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr ""
+msgid "line %d: %s in: %s\n"
+msgstr "строка %d: %s в: %s\n"
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr ""
+msgid "%s in: %s\n"
+msgstr "%s в: %s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr "Недопустимый символ '%c' (0x%x)"
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr "Недопустимая последовательность \"..\""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "строка %d: Неверный тэг: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "строка %d: Пустой тэг: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "строка %d: Префикс не может заканчиваться на \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "строка %d: Docdir должен начинаться с '/': %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "строка %d: Неверное число %s: определяет: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "строка %d: Неверный формат BuildArchitecture: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Внутренняя ошибка: Неизвестный ярлык %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Неверная спецификация пакета: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Пакет уже существует: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "строка %d: Неизвестный тэг: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
-msgstr ""
+msgstr "%%{buildroot} не может быть пустой\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
-msgstr ""
+msgstr "%%{buildroot} не может быть \"/\"\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Неверный исходник: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
-msgstr ""
+msgstr "Нет заплаты номер %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
-msgstr ""
+msgstr "Нет исходника номер %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Ошибка анализа %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "строка %d: Неверный аргумент для %%setup %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "строка %d: Неверный параметр %%setup %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "строка %d: второй %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr "В триггерах файлов допустимы только абсолютные пути"
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
-msgstr ""
+msgstr "строка %d: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "строка %d: триггеры должны содержать --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "строка %d: Ошибка анализа %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
-msgstr ""
+msgstr "строка %d: внутренние сценарии должны заканчиваться на '>': %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "строка %d: Программы в сценариях должны начинаться с '/': %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr "строка %d: Приоритеты разрешены только для триггеров файлов: %s\n"
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "строка %d: Второе %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "строка %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Невозможно открыть %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
-msgstr ""
+msgstr "%s:%d: Для %s требуется аргумент\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
-msgstr ""
+msgstr "%s:%d: плохое %%if условие\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: Найден %%else без %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: Найден %%endif без %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr "кодировка %s не поддерживается системой\n"
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Не найдены совместимые архитектуры для сборки.\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Пакет не имеет %%description: %s\n"
@@ -1439,450 +1646,562 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Невозможно выполнить %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Сбой ветвления %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s не удалось: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "не удалось записать все данные в %s: %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Идет поиск  %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Невозможно найти %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "запрос файла спецификации %s не удался, невозможно разобрать файл\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(ошибка 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s ошибка(%d) из %s: %s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Неверный magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s ошибка(%d): %s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Неверный/нечитаемый заголовок"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "неопознанный параметр базы данных: \"%s\" проигнорирован\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Заголовок слишком велик"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "неверное числовое значение %s, пропущено\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s имеет слишком малую или слишком большую величину long, пропущено\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
 msgstr ""
+"%s имеет слишком малую или слишком большую величину integer, пропущено\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Неизвестный тип файла"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "невозможно получить блокировку %s на %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "разделяемый"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Ð\9eÑ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ð¶ÐµÑ\81Ñ\82каÑ\8f Ñ\81Ñ\81Ñ\8bлка"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "иÑ\81клÑ\8eÑ\87иÑ\82елÑ\8cнÑ\8bй"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Внутренняя ошибка"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Файл архива не найден в заголовке пакета"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "ошибка(%d) сохранения записи \"%s\" в %s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " не удалось - "
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "ошибка(%d) удаления записи %s из %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "ошибка(%d) резервирования памяти для образа нового пакета\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s является Delta RPM и не может быть установлен напрямую\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "пакет %s был уже добавлен, пропускаем %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "пакет %s уже был добавлен, заменяется %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(не двоичный объект)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(не число)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(не строка)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(неправильный тип)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(не base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(неправильный тип)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(not a blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(неверный тип xml)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(не подпись формата OpenPGP)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr "Неверная дата %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "нормальный"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "перемещен"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "не установлен"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(неизвестный)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(не строка)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "пользователь %s не существует - используется root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "группа %s не существует - используется root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s сохранен как %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s создан как %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1833
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1841
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1876
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1885
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1890
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1909
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:452
+#: lib/header.c:1949
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:362
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:384
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Подпись недоступна\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "пустой формат тэга"
 
-#: lib/package.c:581
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "пустое имя тэга"
+
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: headerRead failed: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "в конце массива ожидалась \"]\""
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "неожиданная \"]\""
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "неожиданная \"}\""
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "в выражении ожидалось \"?\""
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "в выражении после \"?\" ожидалось \"{\""
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "в выражении ожидалось \"}\""
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "в выражении после \"?\" ожидалось \":\""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "в выражении после \":\" ожидалось \"{\""
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "в конце выражения ожидался \"|\""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: ошибка Fread: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "преопределить MACRO со значением EXPR"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'MACRO EXPR'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "определить MACRO со значением EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "вывести значение макроса EXPR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'EXPR'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "использовать <FILE:...> вместо файла(ов) по умолчанию"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FILE:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "не проверять дайджест пакета(ов)"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "не проверять заголовки, извлекаемые из базы данных"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "не проверять подпись(и) в пакете(ах)"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "послать стандартный вывод в CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "использовать ROOT как корневой каталог"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "отобразить известные ключи запроса"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "показать текущее значение rpmrc и макросов"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "выводить минимум сообщений"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "выводить более детальные сообщения"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "вывести номер версии этой прграммы"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "отладка машины состояния присоединенных файлов "
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "отладка процесса ввода/вывода rpmio"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: таблица параметров неправильно настроена (%d)\n"
@@ -1903,13 +2222,13 @@ msgstr "перемещения должны содержать ="
 msgid "relocations must have a / following the ="
 msgstr "перемещения должны иметь / после ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "устанавливать все файлы, даже конфигурационные, которые могли бы быть "
 "пропущены"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1917,151 +2236,161 @@ msgstr ""
 "удалить все пакеты, совпадающие с <пакет> (обычно, если <пакет> "
 "соответствует нескольким пакетам, генерируется ошибка)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "удалить (деинсталлировать) пакет"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<пакет>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
-msgstr ""
+msgstr "не устанавливать конфигурационные файлы"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "не устанавливать документацию"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "пропустить файлы в пути <путь>"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<путь>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "сокращение для --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "обновить пакет(ы) если уже установлен"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<файл пакета>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "выводить \"#\" по мере установки пакета (хорошо с -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "не проверять архитектуру пакета"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "не проверять операционную систему пакета"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "не проверять дисковое пространство перед установкой"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "установить документацию"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "установить пакет(ы)"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "обновить базу данных, но не модифицировать файловую систему"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "не проверять зависимости пакета"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "не менять порядок установки пакетов для удовлетворения зависимостей"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "не исполнять никаких сценариев пакета(ов)"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "не исполнять  %%pre сценариев (если есть)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "не исполнять %%post сценариев (если есть)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "не исполнять %%preun сценариев (если есть)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "не исполнять %%postun сценариев (если есть)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "не исполнять %%pretrans сценариев (если есть)"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "не исполнять %%posttrans сценариев (если есть)"
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "не исполнять триггер-сценариев, взведенных этим пакетом"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "не исполнять %%triggerprein сценариев"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "не исполнять %%triggerin сценариев"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "не исполнять %%triggerun сценариев"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "не исполнять %%triggerpostun сценариев"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2069,368 +2398,407 @@ msgstr ""
 "откат на более старую версию пакета (--force при обновлении делает это "
 "автоматически)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "выводить процент готовности по мере установки пакета"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "переместить пакет в <каталог>, если пакет это позволяет"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<каталог>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "переместить файлы из пути <old> в <new>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<old>=<new>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "переустановить, если пакет уже установлен"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "не устанавливать, а только сообщить, удастся ли установка"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "обновить пакет(ы)"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "заново установить пакет(ы)"
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "запросить/проверить все пакеты"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "режим проверки подписи"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "запросить/проверить пакет, которому принадлежит файл"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "запросить/проверить пакеты в группе"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "запросить/проверить файл пакета"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "запросить/проверить пакет(ы) по идентификатору пакета"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "запросить/проверить пакет(ы), по идентификатору заголовка"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "режим запроса rpm"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "запросить/проверить заголовок"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "запросить/проверить пакет(ы) из транзакции установки"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "запросить пакеты с триггер-сценариями на пакет"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "режим проверки rpm"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "найти/проверить пакеты, требующие сервис"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "найти/проверить пакеты, предоставляющие сервис"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "показать все файлы конфигурации"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "показать все файлы документации"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "показать все файлы документации"
+msgstr "показать все файлы лицензии"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "показать все файлы лицензии"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "показать основную информацию о файле"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "показать список файлов пакета"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "пропустить файлы %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "пропустить файлы %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "показать состояние перечисленных файлов"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "не проверять размер файлов"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "не проверять путь символических ссылок"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "не проверять хозяина файлов"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "не проверять группу файлов"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "не проверять время модификации файлов"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "не проверять права доступа файлов пакета"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "не проверять файлы пакета"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "не проверять зависимости пакета"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "не исполнять сценарий(и) проверки"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "обнаружен двоичный пакет вместо ожидаемого исходного\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "исходный пакет не содержит файла спецификации\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "распаковка архива не удалась%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " на файле "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s ошибка на файле %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s не удалось: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "ошибка в формате: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
-msgstr ""
+msgstr "(не содержит файлов)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "нормальный    "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "замененный    "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "не установлен "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "сетевой       "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "неверный цвет"
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(сост. нет)   "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(неизв. %3d)  "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "пакет не содержит списков владельцев/групп-владельцев файлов\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "пакет не содержит списков ни хозяев файлов, ни их ID\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "группа %s не содержит никаких пакетов\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "ни один из пакетов не взводит триггер %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "ошибка формата %s: %s.\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "ни один пакет не подходит к %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "ни один из пакетов не требует %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "ни один из пакетов не предоставляет %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "файл %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "файл %s не принадлежит ни одному из пакетов\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "неверный номер пакета: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
-msgstr ""
+msgstr "запись %u не может быть прочитана\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "пакет %s не установлен\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "НЕ ОК"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "ОК"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (ОТСУТСТВУЮТ КЛЮЧИ:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (НЕТ ДОВЕРИЯ К КЛЮЧАМ:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: ошибка открытия: %s\n"
@@ -2450,217 +2818,447 @@ msgstr ""
 msgid "Unable to change root directory: %m\n"
 msgstr ""
 
-#: lib/rpmchroot.c:95
+#: lib/rpmchroot.c:95
+#, c-format
+msgid "Unable to restore root directory: %m\n"
+msgstr ""
+
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "параметер dbpath не установлен\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "ошибка (%d) сохранения записи #%d в %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: получен поврежденный заголовок #%u -- пропускается.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: невозможно прочесть заголовок в 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "параметер dbpath не установлен"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "не удалось создать каталог %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "заголовок номер %u в базе данных неверный -- пропускается.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "невозможно добавить запись (первоначально в %u)\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"перестроение базы данных не удалось, старая база данных остается на месте\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "невозможно заменить старую базу данных на новую!\n"
+
+#: lib/rpmds.c:744
+msgid "NO "
+msgstr "НЕT"
+
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "ДА"
+
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+msgstr "PreReq:, Provides:, и Obsoletes: зависимости поддерживают версии."
+
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr "имена файла(ов) хранятся в формате (dirName,baseName,dirIndex)."
+
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr ""
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr ""
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr ""
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "префикс \"./\" используется для фала(ов) содержимого пакета."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "имя-версия-выпуск пакета не предоставляется автоматически."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "ярлыки заголовков всегда сортируются после загрузки."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "интерпретатор сценариев может использовать аргументы из заголовка."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "поддерживается частичная установка набора жестких ссылок пакета."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr ""
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr ""
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
 #, c-format
-msgid "Unable to restore root directory: %m\n"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr "НЕT"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
 
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr "ДА"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
 
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr "PreReq:, Provides:, и Obsoletes: зависимости поддерживают версии."
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
-msgstr "имена файла(ов) хранятся в формате (dirName,baseName,dirIndex)."
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "пÑ\80еÑ\84икÑ\81 \"./\" Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f Ð´Ð»Ñ\8f Ñ\84ала(ов) Ñ\81одеÑ\80жимого Ð¿Ð°ÐºÐµÑ\82а."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Ð\9dевеÑ\80нÑ\8bй magic"
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "имÑ\8f-веÑ\80Ñ\81иÑ\8f-вÑ\8bпÑ\83Ñ\81к Ð¿Ð°ÐºÐµÑ\82а Ð½Ðµ Ð¿Ñ\80едоÑ\81Ñ\82авлÑ\8fеÑ\82Ñ\81Ñ\8f Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Ð\9dевеÑ\80нÑ\8bй/неÑ\87иÑ\82аемÑ\8bй Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "ярлыки заголовков всегда сортируются после загрузки."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Заголовок слишком велик"
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "интерпретатор сценариев может использовать аргументы из заголовка."
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "поддеÑ\80живаеÑ\82Ñ\81Ñ\8f Ñ\87аÑ\81Ñ\82иÑ\87наÑ\8f Ñ\83Ñ\81Ñ\82ановка Ð½Ð°Ð±Ð¾Ñ\80а Ð¶ÐµÑ\81Ñ\82киÑ\85 Ñ\81Ñ\81Ñ\8bлок Ð¿Ð°ÐºÐµÑ\82а."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Ð\9dеизвеÑ\81Ñ\82нÑ\8bй Ñ\82ип Ñ\84айла"
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr ""
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "Отсутствует файл(ы)"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr ""
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Внутренняя ошибка"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr ""
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Файл архива не найден в заголовке пакета"
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
-msgstr ""
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " не удалось - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: (ошибка 0x%x)"
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "невозможно открыть %s: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr "Обновление / установка...\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr "Очистка / удаление... \n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Подготовка..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr "Подготовка пакетов..."
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Неудовлетворенные зависимости:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: не пакет (или манифест пакета) rpm : %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s не может быть установлен\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Загружается %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "ошибка чтения из файла %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "невозможно открыть %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Устанавливается %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "не rpm-пакет"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "неверный тип подписи"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "неподдерживаемая версия пакета RPM"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "ошибка чтения: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
-msgstr ""
+msgstr "не rpm пакет\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "различный"
@@ -2728,805 +3326,640 @@ msgstr "%s конфликтует с %s%s"
 #: lib/rpmprob.c:167
 #, c-format
 msgid "%s is obsoleted by %s%s"
-msgstr ""
+msgstr "%s устарел из-за %s%s"
 
 #: lib/rpmprob.c:172
 #, c-format
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "неизвестная ошибка %d при работе с пакетом %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "отсутствует второе ':' в %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "отсутствует название архитектуры в %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Неполная строка данных в %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Слишком много аргументов в строке данных в %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Неверный номер arch/os: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Неполная строка по умолчанию в %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Слишком много аргументов в строке по умолчанию в %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "отсутствует ':' (найден 0x%02x) в %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "отсутствует аргумент для %s в %s:%d\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "отсутствует архитектура для %s в %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "неверный параметр '%s' в %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Неизвестная система: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Неизвестный формат"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "установить"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "стереть"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "не могу открыть базу данных Packages в %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "транзакция"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Заголовок "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "пропущено"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr ""
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "отсутствует \"{\" после \"%\""
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "отсутствует \"}\" после \"%{\""
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "пустой формат тэга"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "пустое имя тэга"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "неизвестный тэг"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "в конце массива ожидалась \"]\""
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "неожиданная \"]\""
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "неожиданная \"}\""
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "в выражении ожидалось \"?\""
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "в выражении после \"?\" ожидалось \"{\""
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "в выражении ожидалось \"}\""
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "в выражении после \"?\" ожидалось \":\""
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "в выражении после \":\" ожидалось \"{\""
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "в конце выражения ожидался \"|\""
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
+#: lib/rpmrc.c:564
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "невозможно Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ð¸Ð½Ð´ÐµÐºÑ\81 %s Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8f db%d - %s (%d)\n"
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "оÑ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ð°Ñ\80Ñ\85иÑ\82екÑ\82Ñ\83Ñ\80а Ð´Ð»Ñ\8f %s Ð² %s:%d\n"
 
-#: lib/rpmdb.c:516
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "параметер dbpath не установлен\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "неверный параметр '%s' в %s:%d\n"
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "оÑ\88ибка (%d) Ñ\81оÑ\85Ñ\80анениÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81и #%d Ð² %s\n"
+msgid "Unknown system: %s\n"
+msgstr "Ð\9dеизвеÑ\81Ñ\82наÑ\8f Ñ\81иÑ\81Ñ\82ема: %s\n"
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: получен поврежденный заголовок #%u -- пропускается.\n"
-
-#: lib/rpmdb.c:2250
-#, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmscript.c:278
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: невозможно прочесть заголовок в 0x%x\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "ошибка(%d) получения \"%s\" записей из индекса %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2467
+#: lib/rpmscript.c:353
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "ошибка(%d) сохранения записи \"%s\" в %s\n"
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmscript.c:371
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "ошибка(%d) удаления записи %s из %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:375
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "ошибка(%d) резервирования памяти для образа нового пакета\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:378
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "ошибка(%d) получения записей \"%s\" из индекса %s\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr ""
 
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "ошибка(%d) записи записи %s в %s\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Неизвестный формат"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "параметер dbpath не установлен"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "установить"
 
-#: lib/rpmdb.c:2875
-#, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr ""
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "стереть"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmts.c:100
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "заголовок Ð½Ð¾Ð¼ÐµÑ\80 %u Ð² Ð±Ð°Ð·Ðµ Ð´Ð°Ð½Ð½Ñ\8bÑ\85 Ð½ÐµÐ²ÐµÑ\80нÑ\8bй -- Ð¿Ñ\80опÑ\83Ñ\81каеÑ\82Ñ\81Ñ\8f.\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "не Ð¼Ð¾Ð³Ñ\83 Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ð±Ð°Ð·Ñ\83 Ð´Ð°Ð½Ð½Ñ\8bÑ\85 Packages Ð² %s\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmts.c:199
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "невозможно добавить запись (первоначально в %u)\n"
-
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
-"перестроение базы данных не удалось, старая база данных остается на месте\n"
-
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "невозможно заменить старую базу данных на новую!\n"
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:217
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "файлы в %s заменяются файлами из %s для восстановления"
+msgid "missing '(' in package label: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:225
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "ошибка удаления каталога %s: %s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:284
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "ошибка(%d) db%d из %s: %s\n"
+msgid "%s: reading of public key failed.\n"
+msgstr ""
 
-#: lib/backend/db3.c:36
-#, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "ошибка(%d) db%d: %s\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "транзакция"
 
-#: lib/backend/db3.c:500
+#: lib/rpmvs.c:152
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "невозможно получить блокировку %s на %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "разделяемый"
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "исключительный"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:158
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:178
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "неопознанный параметр базы данных: \"%s\" проигнорирован\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "неверное числовое значение %s, пропущено\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s имеет слишком малую или слишком большую величину long, пропущено\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:206
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
-"%s имеет слишком малую или слишком большую величину integer, пропущено\n"
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr ""
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Заголовок "
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Невозможно перезагрузить заголовок подписи.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "пропущено"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "не удалось"
+
+#: lib/verify.c:263
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: lib/verify.c:284
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:448
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "missing   %c %s"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:185
-#, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "====================== активных %d пустых %d\n"
-
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(пусто)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(пусто)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Ð\9dезакÑ\80Ñ\8bÑ\82Ñ\8bй Ð¼Ð°ÐºÑ\80оÑ\81 %%%s\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Ð\9dезакÑ\80Ñ\8bÑ\82Ñ\8bе Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\8b Ð² Ð¼Ð°ÐºÑ\80оÑ\81е %%%s\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имое Ð¸Ð¼Ñ\8f (%%define) Ð¼Ð°ÐºÑ\80оÑ\81а %%%s\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Ð\9dезакÑ\80Ñ\8bÑ\82Ñ\8bй Ð¼Ð°ÐºÑ\80оÑ\81 %%%s\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Незакрытые параметры в макросе %%%s\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Макрос %%%s пуст\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Невозможно раскрыть макрос %%%s\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Недопустимое имя (%%undefine) макроса %%%s\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Макрос %%%s (%s) не был использован ниже уровня %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Неизвестный параметр %c в %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Незакрытая %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "непонятный макрос после %%\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
 #, c-format
-msgid "error creating temporary file %s: %m\n"
+msgid "failed to load macro file %s"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "====================== активных %d пустых %d\n"
+
+#: rpmio/rpmfileutil.c:258
+#, c-format
+msgid "error creating temporary file %s: %m\n"
+msgstr "ошибка создания временного файла %s: %m\n"
+
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Файл %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Длина файла %s меньше чем %u байт\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(нет ошибки)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "фатальная ошибка: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "ошибка: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr ""
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(нет ошибки)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "фатальная ошибка: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "ошибка: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "предупреждение: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "memory alloc (%u bytes) returned NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr "ошибка создания временного каталога %s: %m\n"
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr "ошибка удаления каталога %s: %m\n"
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: ошибка Fwrite: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: ошибка Fread: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
-msgstr ""
+msgstr "%s: ошибка Fflush: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr "Неподдерживаемая подпись PGP\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Невозможно выполнить %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
-msgstr ""
+msgstr "запуск gpg не удался (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "ошибка gpg при записи подписи\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "невозможно прочесть подпись\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: ошибка writeLead: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: ошибка rpmWriteSignature: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: ошибка writeLead: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: ошибка чтения списка файлов: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "не проверять подпись заголовока и содержимого"
index 8ec1c22b41e0cba63f859ba0fe16f9bbe2b1cbcb..6de499dca9ee6de584b9e2e04564d2a1e85edcef 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -3,16 +3,17 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Tomáš Vadina <kyberdev@gmail.com>, 2011.
+# Lubos Kardos <kardos.lubos@gmail.com>, 2015
+# Tomáš Vadina <inactive+kyberdev@transifex.com>, 2011
+# Tomáš Vadina <inactive+kyberdev@transifex.com>, 2011
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Slovak (http://www.transifex.com/projects/p/rpm/language/"
-"sk/)\n"
+"Language-Team: Slovak (http://www.transifex.com/rpm-team/rpm/language/sk/)\n"
 "Language: sk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -45,504 +46,566 @@ msgstr "Tento program je možné voľne šíriť podľa podmienok GNU GPL\n"
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "vytvorenie rúry pre --pipe zlyhalo: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "vykonanie zlyhalo\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "argument nie je RPM balík\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "chyba pri čítaní hlavičky balíka\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "nie je možné znova otvoriť payload: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Možnosti požiadavky a overenia balíčka:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Možnosti požiadaviek (s -q alebo --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Možnosti kontroly (s -V alebo --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Možnosti pre Inštaláciu/Upgrade/Mazanie:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Spoočné možnosti pre všetky režimy rpm a spustiteľné súbory:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "naraz môže byť vykonaný jeden typ otázky alebo overenia"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "neočakávaný príznak pre požiadavku"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "neočakávaný formát požiadavky"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "neočakávaný zdroj pre otázku"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "môže byť použitý iba jeden hlavný režim"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "vynútená môže byť len inštalácia a upgrade"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "súbory môžu byť presunuté iba počas inčtalácie balíka"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "nie je možné použiť --prefix s --relocate alebo --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate a --excludepath môžu byť použité iba počas inštalácie nových "
-"balíkov"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix môže byť použitý iba počas inštalácie nových balíkov"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "argumenty pre --prefix musia začínať znakom /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs môže byť použité iba počas inštalácie balíka"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs môže byť použité iba počas inštalácie balíka"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs môže byť použité iba počas inštalácie balíka"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "môže byť použitá iba jedna voľba z --excludedocs a --includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch môže byť použité iba počas inštalácie balíka"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos môže byť použité iba počas inštalácie balíka"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize môže byť použité iba počas inštalácie balíka"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches môže byť použité iba počas odstránenia balíkov"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles môže byť použité iba počas inštalácie balíka"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb môže byť použité iba počas inštalácie a odstránenia balíka"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"možnosť pre potlačenie skriptov môže byť použitá len pri inštalácii alebo "
-"pri odstraňovaní balíčkov"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"možnosť pre potlačenie triggerov môže byť použitá len pri inštalácii alebo "
-"odstraňovaní balíčkov"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-"--nodeps môže byť špecifikovaný iba počas inštalácie, mazania a overovania "
-"balíčka"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr "-- test môže byť špecifikovaný iba počas inštalácie a mazania balíčka"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "argumenty pre --root (-r) musia začínať znakom /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "nezadané žiadne balíčky pre vymazanie"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "neboli zadané žiadne balíky pre inštaláciu"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "neboli zadané žiadne argumenty pre otázku"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "neboli zadané žiadne argumenty pre overenie"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot už bol nastavený, ignoruje sa %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "zostavenie podľa %prep (rozbalenie zdrojových kódov a aplikácia patchov) z "
 "<spec_subor>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<spec_subor>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "zostavenie podľa %build (%prep, potom kompilácia) z <spec_subor>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "zostavenie podľa %install (%prep, %build, potom install) z <spec_subor>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "kontrola častí %files z <spec_subor>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "vytvorenie zdrojového kódu a binárnych balíčkov z <spec_subor>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "vytvorenie iba binárneho balíčka z <spec_subor>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "vytvorenie zdrojového balíčka z <spec_subor>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<zdrojovy balicek>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"zostavenie podľa %install (%prep, %build, potom inštalácia) z <zdrojovy "
+"balicek>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "zostavenie podľa %prep (rozbalenie zdrojových kódov a aplikácia patchov) z "
 "<tar_subor>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tar_subor>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "zostavenie podľa %build (%prep, potom kompilácia) z <tar_subor>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "zostavenie podľa %install (%prep, %build, potom inštalácia) z <tar_subor>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "kontrola častí %files z <tar_subor>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "vytvorenie zdrojového kódu a binárneho balíčka z <tar_subor>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "vytvorenie iba binárneho balíčka z <tar_subor>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "vytvorenie iba zdrojového balíčka z <tar_subor>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "vytvorenie binárneho balíčka z <zdrojovy balicek>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<zdrojovy balicek>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"zostavenie podľa %install (%prep, %build, potom inštalácia) z <zdrojovy "
-"balicek>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "predefinovať adresár pre zostavenie balíka"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "po ukončení odstrániť adresár, v ktorom sa balík zostavoval"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignorovať ExcludeArch: direktívy z spec súboru"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "ladiť nástroj stavu súborov"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "nevykonať žiadne etapy zostavenia"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "nekontrolovať závislosti balíčkov"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr "generovanie hlavičiek balíčka kompatibilné s (legacy) rpm v3 packaging"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
+msgstr "nevykonať %clean fázu zostavenia"
+
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
-msgstr ""
+msgstr "nevykonať %check fázu zostavenia"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "neakceptovať i18N popisy z spec súboru"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "po dokončení odstrániť zdrojové kódy"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "po dokončení odstrániť spec súbor"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "preskočiť priamo k určenej etape (iba pre c, i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "predefinovať cieľovú platformu"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 "Zostavovacie možnosti s [ <spec_subor> | <tar_subor> | <zdrojovy balicek> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Spoočné možnosti pre všetky režimy rpm a spustiteľné súbory:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Chybné závislosti pri zostavovaní:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Nie je možné otvoriť spec súbor %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Nie je možné otvoriť rúru pre tar: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Nie je možné čítať spec súbor z %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Nie je možné premenovať %s na %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "nie je možné zistiť stav %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Súbor %s nie je obyčajný súbor.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Súbor %s nevyzerá ako spec súbor.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Zostavujú sa cieľové platformy: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Zostavuje sa pre cieľ %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "argumenty pre --root (-r) musia začínať znakom /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "inicializuje sa databáza"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr "znovu zostaviť obrátené zoznamy inštalovaných hlavičiek balíčka"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "skontrolovať databázové súbory"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr "exportuj databázu na stdout ako postupnosť hlavičiek"
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr "importuj databázu z stdin postupnosti hlavičiek"
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Možnosti databázy:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "môže byť použitý iba jeden hlavný režim"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "overiť podpis v balíčku"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "importovať obrnený verejný kľúč"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "zobraziť kľúče z kľúčového zväzku RPM"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Možnosti zväzku kľúčov:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "nezadané žiadne parametre"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Možnosti požiadavky a overenia balíčka:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Možnosti požiadaviek (s -q alebo --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Možnosti kontroly (s -V alebo --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Možnosti pre Inštaláciu/Upgrade/Mazanie:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "naraz môže byť vykonaný jeden typ otázky alebo overenia"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "neočakávaný príznak pre požiadavku"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "neočakávaný formát požiadavky"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "neočakávaný zdroj pre otázku"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "vynútená môže byť len inštalácia a upgrade"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "súbory môžu byť presunuté iba počas inčtalácie balíka"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "nie je možné použiť --prefix s --relocate alebo --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate a --excludepath môžu byť použité iba počas inštalácie nových "
+"balíkov"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix môže byť použitý iba počas inštalácie nových balíkov"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "argumenty pre --prefix musia začínať znakom /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs môže byť použité iba počas inštalácie balíka"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs môže byť použité iba počas inštalácie balíka"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs môže byť použité iba počas inštalácie balíka"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "môže byť použitá iba jedna voľba z --excludedocs a --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch môže byť použité iba počas inštalácie balíka"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos môže byť použité iba počas inštalácie balíka"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize môže byť použité iba počas inštalácie balíka"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches môže byť použité iba počas odstránenia balíkov"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles môže byť použité iba počas inštalácie balíka"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb môže byť použité iba počas inštalácie a odstránenia balíka"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"možnosť pre potlačenie skriptov môže byť použitá len pri inštalácii alebo "
+"pri odstraňovaní balíčkov"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"možnosť pre potlačenie triggerov môže byť použitá len pri inštalácii alebo "
+"odstraňovaní balíčkov"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps môže byť špecifikovaný iba počas inštalácie, mazania a overovania "
+"balíčka"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr "-- test môže byť špecifikovaný iba počas inštalácie a mazania balíčka"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "nezadané žiadne balíčky pre vymazanie"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "neboli zadané žiadne balíky pre inštaláciu"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "neboli zadané žiadne argumenty pre otázku"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "neboli zadané žiadne argumenty pre overenie"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr "podpísať balíčky"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "podpísať balíčky (identické s --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "vymazať podpis balíčka"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Možnosti podpisu:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Nie je možné spustiť %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Je potrebné nastaviť \"%%_gpg_name\" v makro súbore\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Zadajte helo:"
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Heslo je v poriadku.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr "Chybne zadané heslo, alebo expirovaný kľúč gpg\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr "parsovanie spec súborov na stdout"
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr "generovanie spec súborov"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr "pôsobenie v binárke rpm generovanej spec (predvolené)"
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr "pôsobenie v zdroji rpm generovaného spec"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "použiť nasledovný formát otázky"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "Spec možnosti:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr "žiadne argumenty pre parsovanie"
 
@@ -551,32 +614,37 @@ msgstr "žiadne argumenty pre parsovanie"
 msgid "Unable to open temp file: %s\n"
 msgstr "Nie je možné otvoriť dočasný súbor: %s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr "Nie je možné otvoriť prúd: %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Vykonávanie(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Spustenie %s zlyhalo (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr "Chyba spustenia skriptletu %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Chybný návratový kód z %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -586,235 +654,315 @@ msgstr ""
 "\n"
 "Chyby zostavenia RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "chyba syntaxe pri spracovaní ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "chyba syntaxe pri spracovaní &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "chyba syntaxe pri spracovaní ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "chyba spracovania vo výraze\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "nedoplnená (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- len na číslach\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! len na číslach\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "typy musia súhlasiť\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / nie sú podporované pre reťazce\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- nie je podporované pre reťazce\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& a || nie sú podporované pre reťazce\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "chyba syntaxe vo výraze\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Chýba '(' v %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Chýba ')' v %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Neplatný %s token: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Chýba %s v %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Nasleduje nie prázdny znak %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Zlá syntax: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Zlý režim spec: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Zlý režim adresára spec: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr "Nepoužiteľná dĺžka lokalizácie: \"%s\" v %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr "Dvojitá lokalizácia %s v %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Neplatná možnosť: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Podpora možností súboru nie je zabudovaná\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Súbor musí začínať na \"/\": %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "Neznámy prehľad súborového algoritmu %u, návrat späť k MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Súbor uvedený dvakrát: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "čítanie symlinku %s zlyhalo: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Symbolický link ukazuje na BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "Cesta sa nachádza mimo buildroot: %s\n"
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "Priečinok nenájdený: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Súbor nenájdený: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Toto nie je adresár: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: nie je možné načítať neznámu značku (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: čítanie verejného kľúča zlyhalo.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: nie je obrnený verejný kľúč.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: zlyhalo kódovanie\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "vytvorenie priečinka zlyhalo"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Súbor potrebuje úvodný \"/\": %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "%%dev glob nie je povolený: %s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "Priečinok nebol nájdený globom: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Súbor nenájdený globom: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Nie je možné otvoriť %%files súbor %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "riadok: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "Chyba čítania %%files súboru %s: %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Súbor nenájdený globom: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
+msgstr "Viac než jeden súbor na riadku: %s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Zlý súbor: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Chybný vlastník/skupina: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Kontrolujú sa nezabalené súbory: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -823,548 +971,605 @@ msgstr ""
 "Nájdené nainštalované (ale nezabalené) súbory:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Spracovávajú sa súbory: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "Binárky závislé na architektúre v bezarchitektúrnom balíčku\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
-msgstr ""
+msgstr "vytvorenie archívu zlyhalo na súbore %s: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
-msgstr ""
+msgstr "vytvorenie archívu zlyhalo: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "Nie je možné otvoriť súbor %s: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: riadok: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Nie je možné kanonizovať názov počítača: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Nie je možné zapísať payload do %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Nie je možné čítať payload z %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Nie je možné kanonizovať názov počítača: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Neznáma kompresia payloadu: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Nie je možné vytvoriť nezmeniteľný region hlavičky.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Nie je možné otvoriť dočasný súbor.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Nie je možné zapísať dočasnú hlavičku\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Chyba čítania súboru politiky: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Zlé CSA dáta\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Nie je možné znova načítať hlavičku podpisu.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Nie je možné otvoriť %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Nie je možné zapísať balíček: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Nie je možné otvoriť cieľ pre podpísanie %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Nie je možné prečítať hlavičku z %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Nie je možné zapísať hlavičku do %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Zapísané: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Spúšťa sa \"%s\":\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Spustenie \"%s\" zlyhalo.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Kontrola balíčka \"%s\" zlyhala.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Nie je možné vytvoriť meno výstupného súboru pre balík %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "nie je možné vytvoriť %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "riadok %d: druhý %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "Položky v %%changelog musia začínať znakom *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "nekompletná položka v %%changelog\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "zlý dátum v %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog nie je zoradený zostupne podľa času\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "chýbajúce meno v %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "žiadny popis v %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "riadok %d: Chyba pri parsovaní %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "riadok %d: zlá možnosť %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "riadok %d: Príliš veľa názvov: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "riadok %d: Balíček neexistuje: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "riadok %d: Druhý popis\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "riadok %d: Chyba pri parsovaní %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr "riadok %d: Chyba parsovania %%policies: %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr "Chyna parsovania značky poľa: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "riadok %d: Zlé číslo: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "riadok %d: Zlé číslo no%s: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "riadok %d: Chybné %s číslo: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d definované viac krát\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "Sťahuje sa %s do %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "Nie je možné stiahnuť %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Architektúra je vyradená: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Architektúra nie je zahrnutá: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS je vyradený: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS nie je zahrnutý: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "Položka %s musí byť v balíčku prítomná: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Duplikovaná položka %s v balíčku: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Nie je možné otvoriť ikonu %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Nie je možné prečítať ikonu %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Neznámy typ ikony: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "riadok %d: Značka má len jeden token: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "riadok %d: Neplatný znak '%c' v: %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "riadok %d: Neplatný znak v: %s\n"
+msgid "%s in: %s\n"
+msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "riadok %d: Neplatná sekvencia \"..\" v: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "riadok %d: Poškodená značka: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "riadok %d: Prázdna značka: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "riadok %d: Prefixy nemôžu končiť \"/\": %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "riadok %d: Docdir musí začínať '/': %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "riadok %d: Súbor epochy musí byť nepodpísané číslo: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "riadok %d: Zlé určenie %s: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "riadok %d: Zlý formát BuildArchitecture: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "riadok %d: Podporované sú iba subbalíčky typu noarch: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Interná chyba: Chybná značka %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "riadok %d: %s je zastaralý: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Zlá špecifikácia balíčka: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Balíček už existuje: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "riadok %d: neznáma značka: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} nemôže byť prázdne\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} nemôže byť \"/\"\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Zlý zdroj: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Bez čísla záplaty %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch bez zodpovedajúcej značky \"Patch:\"\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Bez čísla zdroja %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "Bez značky \"Source:\" v spec súbore\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Chyba pri parsovaní %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "riadok %d: Zlý parameter v %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "riadok %d: Zlá možnosť v %%setup %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Neplatné číslo záplaty %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "riadok %d: druhý %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr "Tokeny závislosti musia začínať alfa-numerickými znakmi, '_' alebo '/'"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr "Názov súboru s verziou nie je povolený"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "Vyžadovaná verzia"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "Neplatná závislosť"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "Vyžadovaná verzia"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr "riadok %d: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "riadok %d: triggery musia obsahovať --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "riadok %d: Chyba parsovania %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "riadok %d: interné skripty musia končiť s '>': %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "riadok %d: skriptovací program musí začínať s '/': %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "riadok %d: Druhý %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "riadok %d: nepodporovaný interný skript: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr "riadok %d: argumenty interpretera nie sú v triggeroch povolené: %s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "riadok %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Nie je možné otvoriť %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr "%s:%d: Očakávaný argument pre %s\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr "riadok %d: neuzatvorené makro alebo zlá náväznosť riadka\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr "%s:%d: zlá kondícia %%if\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: %%else bez počiatočného %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: %%endif bez počiatočného %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Nenájdené žiadne kompatibilné architektúry pre zostavenie\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Balíček neobsahuje %%description: %s\n"
@@ -1436,450 +1641,561 @@ msgstr "Príliž veľa argumentov v riadku: %s\n"
 msgid "Processing policies: %s\n"
 msgstr "Vykonávaná politika: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "Ignorovanie neplatného regexu %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Nie je možné vytvoriť rúru pre %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Nie je možné spustiť %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Nie je možné vykonať fork %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s zlyhalo: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "nie je možné zapísať všetky dáta do %s: %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Konverzia %s na dlhý integer zlyhala.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr "Klasifikátor prázdneho súboru\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "Nenastavené žiadne atribúty\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) zlyhalo: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load zlyhal: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Rozpoznávanie súboru \"%s\" zlyhalo: režim %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Hľadá sa  %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Zlyhalo vyhľadávanie %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "otázka na spec-súbor %s zlyhala, nie je možné analyzovať\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(chyba 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Chybné magické číslo"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Chybná/nečitateľná hlavička"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "nerozpoznaný db parameter: \"%s\" ignorovaný.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Priveľká hlavička"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s má neplatnú číselnú hodnotu, preskakuje sa\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr ""
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s má príliš veľkú alebo príliš malú long hodnotu, preskakuje sa\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Neznámy typ súboru"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s má príliš veľkú alebo príliš malú int hodnotu, preskakuje sa\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "nie je možné získaž zámok %s na %s/%s\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Chýbajúce hardlinky"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "zdieľaný"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Prehľad sa nezhoduje"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "výhradný"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Interná chyba"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "neplatný typ indexu %x v %s/%s\n"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Súbor z archívu nie je v hlavičke"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "chyba(%d) získaných \"%s\" záznamov z %s indexu: %s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " zlyhalo - "
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "chyba(%d) pri ukladaní záznamu \"%s\" do %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "chyba(%d) v odstraňovaní záznamu \"%s\" z %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "chyba(%d) pridania hlavičky #%d záznamu\n"
 
-#: lib/depends.c:68
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "chyba(%d) odstránenia hlavičky #%d záznamu\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "chyba(%d) pri alokácii novej inštancii balíčka\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s je Delta RPM a nemôže byž priamo inštalovaný\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Nepodporovaný payload (%s) v balíčku %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "balíček %s už bol pridaný, %s sa preskakuje\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "balíček %s už bol pridaný, nahradzuje sa s %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(nie je blob)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(nie je číslo)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(nie je reťazec)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(neplatný typ)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(nie je base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(neplatný typ)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(nie je blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(neplatný typ xml)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(nie je OpenPGP podpis)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normálny"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "nahradený"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "nenainštalovaný"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "zdieľaný sieťou"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "zlá farba"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "chýbajúci"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(neznámy)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(nie je reťazec)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "používateľ %s neexistuje - použije sa root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "skupina %s neexistuje - použije sa root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s uložený ako %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s vytvorený ako %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "značka[%d]: ZLÁ, značka %d typ %d offset %d počet %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: ZLÁ, nie je hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: ZLÁ, nie je binárna\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: ZLÁ, nie je binárna\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "veľkosť blobu(%d): ZLÁ, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "offset regiónu: ZLÝ, značka %d typ %d offset %d počet %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "trailer regiónu: ZLÝ, značka %d typ %d offset %d počet %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "veľkosť regiónu: ZLÁ, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr veľkosť(%d): ZLÁ, čítanie vrátilo %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic: ZLÝ\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr značky: ZLÉ, počet značiek (%d) mimo rozsah\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "neplatná šírka poľa"
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hdr dáta: ZLÉ, bajtov (%d) mimo rozsah\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr blob(%zd): ZLÝ, čítanie vrátilo %d\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "nahratie hdr: ZLÉ\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "prázdny tag formát"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature zlyhalo: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "prázdne meno tagu"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Podpis nie je k dispozícii\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead zlahal: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] očakávané na konci poľa"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "neočakávané ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "neočakávané }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? očakávané vo výraze"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ očakávané po ? vo výraze"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} očakávané vo výraze"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": očakávané po ? podvýraze"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ očakávané po : vo výraze"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| očakávené na konci výrazu"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "iterátor poľa použitý s poľami inej veľkosti"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread zlyhalo: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "predefinovať <makro> s hodnotou <vyraz>"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'<makro> <vyraz>'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "definovať <makro> s hodnotou <vyraz>"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "vypísať expanziu makra <vyraz>"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'<vyraz>'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "čítať <subor:...> namiesto implicitného súboru"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<SUBOR:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "nekontrolovať súhrny balíčka"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "nekontrolovať získané hlavičky databázy"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "nekontrolovať podpisy balíčka"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "odoslať stdout do PRÍKAZU"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "PRÍKAZ"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "použiť KOREŇ ako adresár najvyššej úrovne"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "KOREŇ"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr "použiť databázu v PRIEČINKU"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "PRIEČINOK"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "zobraziť známe značky pre požiadavky"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "zobraziť finálne nastavenie rpmrc a makier"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "poskytnúť výstup s menej detailami"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "poskytnúť detailnejší výstup"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "vypísať verziu používaného rpm"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "ladiť nástroj stavu súboru payload"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "ladiť rpmio I/O"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: tabuľka možností chybne nastavená (%d)\n"
@@ -1900,13 +2216,13 @@ msgstr "presunutia musia obsahovať znak ="
 msgid "relocations must have a / following the ="
 msgstr "presunutia musia mať za znakom = znak /"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "inštalovať všetky súbory vrátane konfiguračných súborov, ktoré by inak mohli "
 "byť vynechané"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1914,151 +2230,161 @@ msgstr ""
 "odinštalovať všetky balíky určené <balíkom> (inak je chybou, pokiaľ <balík> "
 "špecifikuje viac ako jeden balík)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "premiestnenie súborov v nepriemiestniteľnom balíčku"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "zobraziť závislostné slučky ako varovanie"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "odinštalovať balík"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<balicek>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "neinštalovať súbory s nastaveniami"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "neinštalovať dokumentáciu"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "preskočiť súbory s úvodnou cestou <path> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<cesta>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "skratka pre --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "upgradovať balíčky ak už sú nainštalované"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<subor_balickov>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "vypisovať značky počas inštalácie balíka (vhodné s -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "neoverovať architektúru balíka"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "neoverovať operačný systém balíka"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "pred inštaláciou nekontrolovať dostupné miesto na disku"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "inštalovať dokumentáciu"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "inštalovať balíčky"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "aktualizovať databázu bez zmeny súborového systému"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "neoverovať závislosti balíka"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "neoverovať prehľad súborov"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "neoverovať prehľad súborov (zastarané)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "neinštalovať bezpečnostné kontexty súboru"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "nemeniť poradie balíkov kvôli vyriešeniu závislostí"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "nespúšťať žiadne skripty určené pre balíčky"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "nespúšťať žiadne %%pre skripty (ak nejaké sú)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "nespúšťať žiadne %%post skripty (ak nejaké sú)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "nespúšťať žiadne %%preun skripty (ak nejaké sú)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "nespúšťať žiadne %%postun skripty (ak nejaké sú)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "nespúšťať žiadne skripty aktivované týmto balíčkom"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "nespúšťať žiadne %%triggerprein skripty"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "nespúšťať žiadne %%triggerin skripty"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "nespúšťať žiadne %%triggerun skripty"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "nespúšťať žiadne %%triggerpostun skripty"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "nevykonať žiadne kolekcie akcií"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2066,369 +2392,407 @@ msgstr ""
 "aktualizovať na staršiu verziu balíka (--force to pri aktualizácii urobí "
 "automaticky)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "vypisovať percentá počas inštalácie balíka"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "presunúť balík do <adresára>, pokiaľ to balík povoľuje"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<adresár>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "premiestniť súbory zo <starej> to <novej> cesty"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<stará>=<nová>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "ignorovať súborové konflikty medzi balíčkami"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "preinštalovať, pokiaľ už balík existuje"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "neinštalovať, ale oznámiť, či by to bolo možné"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "upgradovať balíčky"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "vyžiadať/overiť všetky balíčky"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "režim rpm checksig"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "požiadavka/overenie balíčkov vlastniacich súbor"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "požiadavka/overenie balíčkov v skupine"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "požiadavka/overenie súboru balíčka"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "požiadavka/overenie balíčkov s identifikátorom balíčka"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "požiadavka/overenie balíčkov identifikátorom hlavičky"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "režim požiadavok"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "požiadavka/overenie inštancie hlavičky"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "požiadavka/overenie balíčkov z inštalačnej transakcie"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "požiadavka pre balíčky aktivované balíčkom"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "režim kontroly"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "požiadavka/overenie balíčkov vyžadujúcich závislosť"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "požiadavka/overenie balíčkov poskytujúcich závislosť"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "neseparovať argumenty"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "nespracovávať nebalíčkové súbory ako zoznamy"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "zobraziť všetky konfiguračné súbory"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "zobraziť všetky súbory s dokumentáciou"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "zobraziť všetky súbory s dokumentáciou"
+msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "zobraziť všetky konfiguračné súbory"
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "zobraziť základné informácie o balíku"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "zobraziť súbory v balíku"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "vynechať %%ghost súbory"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "vynechať %%ghost súbory"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "zobraziiť stav daných súborov"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "nekontrolovať veľkosť súborov"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "nekontrolovať cesty symbolických linkov"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "nekontrolovať vlastníka súborov"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "nekontrolovať skupinu súborov"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "nekontrolovať čas zmeny súborov"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "nekontrolovať režim súborov"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "nekontrolovať možnosti súborov"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "nekontrolovať bezpečnostné kontexty súboru"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "nekontrolovať možnosti súborov"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "nekontorlovať súbory v balíčku"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "nekontrolovať závislosti balíčka"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "nespúšťať kontrolné skripty"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "Chýbajúce funkcie rpmlib pre %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "očakáva sa balíček so zdrojovým kódom, nájdený bol binárny\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "balíček so zdrojovými kódmi neobsahuje .spec súbor\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "rozbaľovanie archívu zlyhalo %s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " pre súbor "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s zlyhal na súbore %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s zlyhalo: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "nesprávny formát: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(neobsahuje žiadne súbory)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normálny      "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "nahradený     "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "neinštalovaný "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "zdieľaný      "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "chybná farba"
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(žiadny stav) "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(neznámy %d)  "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "balíček nemá vlastníka súboru ani zoznamy skupín\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "balíček nemá vlastníka súboru alebo zoznamy ID\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "skupina %s neobsahuje žiadne balíky\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "žiadny z balíkov nespúšťa %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "poškodený %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "žiadny z balíčkov sa nezhoduje s %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "žiadny z balíkov nevyžaduje %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "žiadny z balíkov neposkytuje %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "súbor %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "súbor %s nie je vlastnený žiadnym balíkom\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "chybné číslo balíku: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "záznam %u nie je možné čítať\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "balík %s nie je nainštalovaný\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "neznáma značka: \"%s\"\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s: kľúč %d import zlyhal.\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s: kľúč %d nie je verejný obrnený kľúč.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: importné čítanie zlyhalo(%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
-"%s: Nezmeniteľná oblasť hlavičky nemôže byť čítaná. Poškodený balíček?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NIE JE V PORIADKU"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "V PORIADKU"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (CHÝBAJÚCE KĽÚČE):"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (NEDÔVERUJE SA KĽÚČOM: "
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: otvorenie zlyhalo: %s\n"
@@ -2453,212 +2817,441 @@ msgstr "Nie je možné zmeniť koreňový adresár: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "Nie je možné obnoviť koreňový adresár: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "Generuje sa %d chýbajúcich indexov, prosím čakajte...\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "nenastavená dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: preskakuje sa"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "chyba(%d) ukladania záznamu #%d do %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec zlyhal: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp zlyhal: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: preskakuje sa"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: poškodená hlavička #%u získaná -- preskakuje sa.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: nie je možné čítať hlavičku na 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "nebola nastavená žiadna dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "zlyhanie pri vytváraní priečinka %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "hlavička #%u v databázy je zlá -- preskakuje sa.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "nie je možné pridať záznam pôvodne na %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "zlyhalo znovuzostavenie databázy: pôvodná databáza zostáva na mieste\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "nepodarilo sa nahradiť starú databázu novou!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NIE"
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "ÁNO"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr "PreReq:, Provides:, a Obsoletes: verzie pre podporu závislostí."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr "názvy súborov uložené ako (dirName,baseName,dirIndex), nie ako cesta."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "payload balíčka môže byť komprimovaný pomocou bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr "payload balíčka môže byť komprimovaný pomocou xz."
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr "payload balíčka môže byť komprimovaný pomocou lzma."
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr "payload balíčka môže byť komprimovaný pomocou lzma."
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "súbory payloadu balíčka majú predponu \"./\"."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "názov-verzia-vydanie balíčka nie je implicitne sprostredkované."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "značky hlavičky sú vždy zoradené po nahratí."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "interpreter skriptletov môže použiť argumenty z hlavičky."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "hardlinkovaný súbor môže byť inštalovaný bez toho, aby bol kompletný."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr "skriptlety balíčka môžu pristupovať k databáze rpm pri inštalácii."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "interná podpora pre lua skripty."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr "prehľad algoritmu súboru je nastaviteľný v každom balíčku"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "podpora pre schopnosti súboru POSIX.1e"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr "skriptlety balíčka môžu byť rozbalené počas inštalácie."
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Chybné magické číslo"
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "súbory payloadu balíčka majú predponu \"./\"."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Chybná/nečitateľná hlavička"
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "názov-verzia-vydanie balíčka nie je implicitne sprostredkované."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Priveľká hlavička"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "značky hlavičky sú vždy zoradené po nahratí."
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "interpreter skriptletov môže použiť argumenty z hlavičky."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Neznámy typ súboru"
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "hardlinkovaný súbor môže byť inštalovaný bez toho, aby bol kompletný."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr "skriptlety balíčka môžu pristupovať k databáze rpm pri inštalácii."
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Prehľad sa nezhoduje"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "interná podpora pre lua skripty."
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Interná chyba"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr "prehľad algoritmu súboru je nastaviteľný v každom balíčku"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Súbor z archívu nie je v hlavičke"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "podpora pre schopnosti súboru POSIX.1e"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr "skriptlety balíčka môžu byť rozbalené počas inštalácie."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " zlyhalo - "
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "otvorenie %s zlyhalo: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: nie je balíček rpm (alebo balíček manifestu)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Pripravuje sa..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Zlyhané závislosti:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: nie je balíček rpm (alebo balíček manifestu): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s nie je možné nainštalovať\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Prenáša sa %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "preskakuje sa %s - transfer zlyhal\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "balíček %s nie je premiestniteľný\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "chyba pri čítaní zo súboru %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "\"%s\" špecifikuje viacero balíčkov:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "nie je možné otvoriť %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Inštaluje sa %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "nie je balíček rpm"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "nepovolený typ podpisu"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "nepodporovaná verzia RPM balíčka"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "čítanie zlyhalo: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "nie je balíček rpm\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "nie je možné vytvoriť %s zámok na %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "čaká sa na %s zámok na %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr "Zlyhalo dlopen %s %s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "Zlyhalo vyriešenie symbolu %s: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "Zlyhalo rozbalenie %%__kolekcie_%s makier\n"
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "Zásuvný modul %s nenačítaný\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr "Zlyhalo vyriešenie %s zásuvného modulu symbolu %s: %s\n"
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "iný"
@@ -2733,634 +3326,352 @@ msgstr "%s je zastaraný %s%s"
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "neznáma chyba %d vznikla pri manipulácii s balíčkom %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "chýba druhá ':' na %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "chýba názov architektúry na %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Neúplný dátový riadok na %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Príliž veľa argumentov na dátovom riadku na %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Zlé číslo architektúry alebo operačného systému: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Neúplný predvolený riadok na %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Príliž veľa argumentov v predvolenom riadku na %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "chýbajúce ':' (nájdené 0x%02x) na %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "chýba argument pre %s na %s:%d\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr "nie je možné otvoriť %s na %s:%d: %m\n"
 
-#: lib/rpmrc.c:536
+#: lib/rpmrc.c:564
 #, c-format
 msgid "missing architecture for %s at %s:%d\n"
 msgstr "chýba architektúra pre %s na %s:%d\n"
 
-#: lib/rpmrc.c:603
+#: lib/rpmrc.c:632
 #, c-format
 msgid "bad option '%s' at %s:%d\n"
 msgstr "zlá možnosť '%s' na %s:%d\n"
 
-#: lib/rpmrc.c:927
+#: lib/rpmrc.c:972
 msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmrc.c:1349
+#: lib/rpmrc.c:1469
 #, c-format
 msgid "Unknown system: %s\n"
 msgstr "Neznámy systém: %s\n"
 
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Prosím kontaktujte %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Nie je možné otvoriť %s pre čítanie: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr "Nie je možné obnoviť aktuálny priečinok: %m"
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "nie je zabudovaná podpora pre skriptlety <lua>\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Nie je možné vytvoriť dočasný súbor pre %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Nie je možné duplikovať popisovač súboru: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "%s skriptlet zlyhal, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s skriplet zlahal, signál %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "%s skriplet zlyhal, návratový kód: %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Neznámy formát"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "inštalovať"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "zmazať"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "nie je možné otvoriť databázu balíčkov v %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "nadbytočná '(' v popise balíčka: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "chýbajúca '(' v popise balíčka: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "chýbajúca ')' v popise balíčka: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: čítanie verejného kľúča zlyhalo.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "transakcia"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh veľkosť(%d): ZLÁ, čítanie vrátilo %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic: ZLÉ\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh značky: ZLÉ, počet značiek(%d) mimo rozsah\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh dáta: ZLÉ, počet bajtov(%d) mimo rozsah\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d): ZLÝ, čítane vrátilo %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh značka[%d]: ZLÁ, značka %d typ %d offset %d počet %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh načítanie: ZLÉ\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh zarovnanie(%zd): ZLÉ, čítanie %zd bajtov\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd): ZLÉ, fstat(2) zlyhalo\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "Nezmeniteľná oblasť hlavičky nemôže byť čítaná. Poškodený balíček?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5 digest:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "SHA1 digest v hlavičke:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Hlavička"
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "preskočené"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "zlyhané"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "chýba   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Nesplené závislosti pre %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr "neplatná šírka poľa"
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "chýbajúce { po %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "chýbajúce } po %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "prázdny tag formát"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "prázdne meno tagu"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "neznámy tag"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] očakávané na konci poľa"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "neočakávané ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "neočakávané }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? očakávané vo výraze"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ očakávané po ? vo výraze"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} očakávané vo výraze"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": očakávané po ? podvýraze"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ očakávané po : vo výraze"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| očakávené na konci výrazu"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "iterátor poľa použitý s poľami inej veľkosti"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "Generuje sa %d chýbajúcich indexov, prosím čakajte...\n"
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "nie je možné otvoriť %s index pomocou db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr "chyba(%d) získaných \"%s\" záznamov z %s indexu: %s\n"
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "nenastavená dbpath\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: preskakuje sa"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "chyba(%d) ukladania záznamu #%d do %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec zlyhal: %s\n"
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp zlyhal: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: preskakuje sa"
-
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: poškodená hlavička #%u získaná -- preskakuje sa.\n"
-
-#: lib/rpmdb.c:2250
-#, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr "chyba(%d:%s) získania ďalšieho kľúča z %s indexu\n"
-
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "chyba(%d) pridania hlavičky #%d záznamu\n"
-
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "chyba(%d) odstránenia hlavičky #%d záznamu\n"
-
-#: lib/rpmdb.c:2382
-#, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: nie je možné čítať hlavičku na 0x%x\n"
-
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "chyba(%d) nastavenia \"%s\" záznamov z %s index\n"
+msgid "Please contact %s\n"
+msgstr "Prosím kontaktujte %s\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "chyba(%d) pri ukladaní záznamu \"%s\" do %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Nie je možné otvoriť %s pre čítanie: %m.\n"
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "chyba(%d) v odstraňovaní záznamu \"%s\" z %s\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "chyba(%d) pri alokácii novej inštancii balíčka\n"
+msgid "Unable to restore current directory: %m"
+msgstr "Nie je možné obnoviť aktuálny priečinok: %m"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "nie je zabudovaná podpora pre skriptlety <lua>\n"
+
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "chyba(%d) získavania \"%s\" záznamov z %s indexu\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Nie je možné vytvoriť dočasný súbor pre %s: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "chyba(%d) pri ukladaní záznamu %s do %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Nie je možné duplikovať popisovač súboru: %s: %s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "nebola nastavená žiadna dbpath"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "zlyhanie pri vytváraní priečinka %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s skriptlet zlyhal, waitpid(%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "hlavička #%u v databázy je zlá -- preskakuje sa.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s skriplet zlahal, signál %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "nie je možné pridať záznam pôvodne na %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s skriplet zlyhal, návratový kód: %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr "zlyhalo znovuzostavenie databázy: pôvodná databáza zostáva na mieste\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Neznámy formát"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "nepodarilo sa nahradiť starú databázu novou!\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "inštalovať"
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "nahradiť súbory v %s súbormi z %s pre obnovenie"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "zmazať"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "nepodarilo sa odstrániť adresár %s: %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "nie je možné otvoriť databázu balíčkov v %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d chyba(%d) z %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "nadbytočná '(' v popise balíčka: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d chyba(%d): %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "chýbajúca '(' v popise balíčka: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "nie je možné získaž zámok %s na %s/%s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "chýbajúca ')' v popise balíčka: %s\n"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "zdieľaný"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: čítanie verejného kľúča zlyhalo.\n"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "výhradný"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "transakcia"
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr "neplatný typ indexu %x v %s/%s\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "nerozpoznaný db parameter: \"%s\" ignorovaný.\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s má neplatnú číselnú hodnotu, preskakuje sa\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s má príliš veľkú alebo príliš malú long hodnotu, preskakuje sa\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s má príliš veľkú alebo príliš malú int hodnotu, preskakuje sa\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "Zlyhalo dekódovanie politiky pre %s\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "Zlyhalo vytvorenie dočasného súboru pre %s: %s\n"
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "Zlyhalo zapísanie %s politiky do súboru %s\n"
+msgid "%s%s"
+msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr "Zlyhalo vytvorenie obsluhy semanage\n"
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "Zlyhalo pripojenie k politike obsluhy\n"
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "Zlyhalo začatie transakcie politiky: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr "Zlyhalo odstránenie dočasnej politky súboru %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Hlavička"
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "Zlyhala inštalácia modulu politiky: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "Zlyhalo odstránenie modulu politiky: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Nie je možné znova načítať hlavičku podpisu.\n"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "Zlyhal proces forku: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "preskočené"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "Zlyhalo spustenie %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "zlyhané"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "%s nebol ukončený v poriadku\n"
+msgid "Duplicate username or UID for user %s\n"
+msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "%s zlyhal s exit kódom %i\n"
-
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "Zlyhalo odoslanie zmien politiky\n"
-
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "Zlyhalo rozbalenie cesty restorecon"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
-"Zlyhalo preznačkovanie súborového systému. Súbory môžu mať nesprávne značky\n"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
-"Zlyhalo znovunačítanie kontextu súboru. Súbory môžu mať nesprávne značky\n"
 
-#: plugins/sepolicy.c:594
+#: lib/verify.c:448
 #, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "Zlyhalo rozbalenie politiky z %s\n"
+msgid "missing   %c %s"
+msgstr "chýba   %c %s"
 
-#: rpmio/macro.c:185
+#: lib/verify.c:503
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktívnych %d prázdnych %d\n"
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Nesplené závislosti pre %s:\n"
+
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
+msgstr ""
+
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
+
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(prázdne)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(prázdne)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Makro %%%s má neukončené telo\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Makro %%%s má neukončené parametre\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Makro %%%s má neprípustné meno (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Makro %%%s má neukončené telo\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Makro %%%s má neukončené parametre\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Makro %%%s má prázdné telo\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Zlyhalo vyhodnotenie makra %%%s\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Makro %%%s má nedovolené meno (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Makro %%%s (%s) nebolo použité pod úrovňou %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Neznáma možnosť %c v %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
@@ -3368,165 +3679,282 @@ msgstr ""
 "Príliž veľa úrovní rekurzie v rozbaľovaní makra. Zrejme je to spôsobené "
 "vyhlásením rekurzívneho makra.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Neukončené %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Po %% nasleduje nespracovateľné makro\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktívnych %d prázdnych %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "chyba pri vytvárané dočasného súboru %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Súbor %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Súbor %s je menší než %u bytov\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "vytvorenie priečinka zlyhalo"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[žiadne]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(žiadna chyba)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "fatálna chyba: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "chyba: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "varovanie: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "neplatná syntax v lua skriptlete: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "nesprávna syntax v lua skripte: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "lua skript zlyhal: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "neplatná syntax v súbore lua: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "obslúženie lua zlyhalo: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[žiadne]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(žiadna chyba)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "fatálna chyba: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "chyba: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "varovanie: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "alokácia pamäti (%u bajtov) vrátila NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, ID kľúča %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(žiadne)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite zlyhalo: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread zlyhalo: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush zlyhal: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Nie je možné spustiť %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Nie je možné vytvoriť rúru pre podpísanie: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "spustenie gpg zlyhalo (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg zlyhal pri zápise podpisu\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "nie je možné prečítať podpis\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp zlyhal\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr "%s už obsahuje rovnaký podpis, preskakuje sa\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead zlyhalo: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature zlyhalo: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s už obsahuje rovnaký podpis, preskakuje sa\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature zlyhalo: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead zlyhalo: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "nahradenie %s zlyhalo: %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: čítanie zoznamu zlyhalo: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "neoverovať podpis hlavičky a payloadu"
index a6b30cc713e44f055b1b404176d82abc796232ed..d852767fc5eac4f1ea16b4649c2365d2b66c2fb2 100644 (file)
--- a/po/sl.po
+++ b/po/sl.po
@@ -7,10 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Slovenian (http://www.transifex.com/rpm-team/rpm/language/"
+"sl/)\n"
 "Language: sl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -44,962 +45,1097 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "izvajanje je bilo neuspešno\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "navedeni argument ni paket RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "napaka pri branju glave paketa\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "ni možno vnovič odpreti (payload): %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr ""
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr ""
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr ""
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr ""
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "samo en tip poizvedbe/preverjanja je možen naenkrat"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "nepričakovane zastavice pri poizvedbi"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "nepričakovana oblika poizvedbe"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "nepričakovan izvor poizvedbe"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "izbran sme biti le en glavni način"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "datoteke smemo premakniti samo med namestitvijo paketa"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
 msgstr ""
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr "izbiri --relocate in --excludepath se lahko uporabi le pri namestitvi"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix se sme uporabiti le pri namestitvi"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "argumenti izbire --prefix se morajo začeti z /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
 msgstr ""
 
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs sme biti podan le ob namestitvi paketa"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs sme biti podatn le ob namestitvi paketa"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs sme biti podan le ob namestitvi paketa"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "izbiri --excludedocs in --includedocs se medsebojno izključujeta"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch sme biti podan le ob namestitvi paketa"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos sme podan le ob namestitvi paketa"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize sme biti podan le ob namestitvi paketa"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches sme biti podan le ob odstranitvi paketa"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles sme biti podati le ob namestitvi paketa"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb sme biti podan le ob namestitvi ali odstranitvi paketa"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
 msgstr ""
 
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
 msgstr ""
 
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "argumenti izbire --root (-r) se morajo začeti z /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "paketi katere bi bilo potrebno namestiti niso navedeni"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "argumenti za poizvedbo niso podani"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "argumenti za preverjanje niso podani"
-
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
 msgstr ""
 
-#: rpmbuild.c:120
+#: rpmbuild.c:161
 #, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
 msgstr ""
 
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
 
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
 
-#: rpmbuild.c:129
+#: rpmbuild.c:170
 #, c-format
-msgid "verify %files section from <specfile>"
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr ""
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr ""
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr ""
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr ""
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "brez upoštevanja vrhnjega imenika izgradnje"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "po zaključku drevo imenikov v katerih smo pakete gradili odstrani"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr ""
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr ""
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "brez izvajanja katerekoli od stopenj izgradnje"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "po zaključku naj se izvorna koda izbriše"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "po zaključku odstrani datoteko s specifikacijami"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "preskok naravnost na določeno stopnjo (samo za c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "brez upoštevanja strojnega okolja ciljnega sistema"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Datoteke s specifikacijami %s ni možno odpreti: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr ""
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr ""
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr ""
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr ""
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Izgradnja za ciljna strojna okolja: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Izgradnja za ciljni sistem %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "argumenti izbire --root (-r) se morajo začeti z /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr ""
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr ""
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr ""
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "izbran sme biti le en glavni način"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr ""
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
-msgid "sign package(s)"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
 msgstr ""
 
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
 msgstr ""
 
-#: rpmsign.c:29
-msgid "delete package signatures"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
 msgstr ""
 
-#: rpmsign.c:35
-msgid "Signature options:"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
 msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr ""
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "samo en tip poizvedbe/preverjanja je možen naenkrat"
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
-msgstr ""
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "nepričakovane zastavice pri poizvedbi"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Vnesite pristopno geslo: "
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "nepričakovana oblika poizvedbe"
 
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Pristopno geslo je pravo.\n"
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "nepričakovan izvor poizvedbe"
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
 msgstr ""
 
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
-msgstr ""
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "datoteke smemo premakniti samo med namestitvijo paketa"
 
-#: rpmspec.c:28
-msgid "query spec file(s)"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
 msgstr ""
 
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
-msgstr ""
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr "izbiri --relocate in --excludepath se lahko uporabi le pri namestitvi"
 
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
-msgstr ""
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix se sme uporabiti le pri namestitvi"
 
-#: rpmspec.c:36 lib/poptQV.c:192
-msgid "use the following query format"
-msgstr "uporabi naslednjo obliko poizvedbe"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "argumenti izbire --prefix se morajo začeti z /"
 
-#: rpmspec.c:45
-msgid "Spec options:"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmspec.c:90
-msgid "no arguments given for parse"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
 msgstr ""
 
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
-msgstr ""
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs sme biti podan le ob namestitvi paketa"
 
-#: build/build.c:126
-#, c-format
-msgid "Unable to open stream: %s\n"
-msgstr ""
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs sme biti podatn le ob namestitvi paketa"
 
-#: build/build.c:161
-#, c-format
-msgid "Executing(%s): %s\n"
-msgstr "Izvajanje(%s): %s\n"
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs sme biti podan le ob namestitvi paketa"
 
-#: build/build.c:168
-#, c-format
-msgid "Exec of %s failed (%s): %s\n"
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "izbiri --excludedocs in --includedocs se medsebojno izključujeta"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch sme biti podan le ob namestitvi paketa"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos sme podan le ob namestitvi paketa"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize sme biti podan le ob namestitvi paketa"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches sme biti podan le ob odstranitvi paketa"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles sme biti podati le ob namestitvi paketa"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb sme biti podan le ob namestitvi ali odstranitvi paketa"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr ""
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "paketi katere bi bilo potrebno namestiti niso navedeni"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "argumenti za poizvedbo niso podani"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "argumenti za preverjanje niso podani"
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr ""
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr ""
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr ""
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
 msgstr ""
 
-#: build/build.c:177
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr ""
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr ""
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr ""
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr ""
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr ""
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr ""
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr "uporabi naslednjo obliko poizvedbe"
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr ""
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr ""
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr ""
+
+#: build/build.c:125
+#, c-format
+msgid "Unable to open stream: %s\n"
+msgstr ""
+
+#: build/build.c:158
+#, c-format
+msgid "Executing(%s): %s\n"
+msgstr "Izvajanje(%s): %s\n"
+
+#: build/build.c:163
+#, c-format
+msgid "Exec of %s failed (%s): %s\n"
+msgstr ""
+
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr ""
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
 "RPM build errors:\n"
 msgstr ""
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr ""
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr ""
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr ""
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr ""
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr ""
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr ""
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr ""
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr ""
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr ""
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr ""
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr ""
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr ""
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr ""
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr ""
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr ""
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr ""
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
-#, c-format
-msgid "Bad file: %s: %s\n"
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2039 build/parsePrep.c:33
+#: build/files.c:2657
 #, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Neobstoječ lastnik/skupina: %s\n"
+msgid "Bad file: %s: %s\n"
+msgstr ""
 
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Iskanje kanoničnega imena gostitelja je bilo neuspešno: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
 msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr ""
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Iskanje kanoničnega imena gostitelja je bilo neuspešno: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Datoteke s specifikacijami %s ni možno odpreti: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Ni možno odpreti %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr ""
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr ""
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr ""
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Zapisano: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Neuspešno ustvarjanje izhodne datoteke za paket %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "ni možno ustvariti %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr ""
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
+#: build/parseFiles.c:33
 #, c-format
-msgid "line %d: Second description\n"
+msgid "line %d: Error parsing %%files: %s\n"
 msgstr ""
 
-#: build/parseFiles.c:33
+#: build/parseFiles.c:73
 #, c-format
-msgid "line %d: Error parsing %%files: %s\n"
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
@@ -1007,348 +1143,417 @@ msgstr ""
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "vrstica %d: Napačno število %s: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr ""
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr ""
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Ni možno odpreti %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:674
 #, c-format
-msgid "Package has no %%description: %s\n"
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
 msgstr ""
 
-#: build/policies.c:87
+#: build/parseSpec.c:710
 #, c-format
-msgid "Policy module '%s' duplicated with overlapping types\n"
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr ""
+
+#: build/parseSpec.c:912
+#, c-format
+msgid "Package has no %%description: %s\n"
+msgstr ""
+
+#: build/policies.c:87
+#, c-format
+msgid "Policy module '%s' duplicated with overlapping types\n"
 msgstr ""
 
 #: build/policies.c:93
@@ -1412,450 +1617,563 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr ""
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "poizvedba po datoteki spec. %s je bila neuspešna, razčlemba ni možna\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(napaka 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Napačno magično število"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Poškodovana/neberljiva glava"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Glava je predolga"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s ima neveljavno številčno vrednost, prezrto\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s ima preveliko ali premajhno dolgo (long) vrednost, prezrto\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
 msgstr ""
+"%s ima preveliko ali premajhno vrednost malega (small) celega\n"
+"števila, prezrto\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Neznan tip datoteke"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr ""
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "skupno"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "izključujoče"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Notranja napaka"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " neuspešno - "
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(ni število)"
 
-#: lib/formats.c:125
-#, c-format
-msgid "%c"
+#: lib/formats.c:44
+msgid "(not a string)"
 msgstr ""
 
-#: lib/formats.c:135
-msgid "%a %b %d %Y"
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
 msgstr ""
 
-#: lib/formats.c:314
-msgid "(not base64)"
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
+#: lib/formats.c:253
+msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1833
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1841
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1876
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1885
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1890
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1909
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:452
+#: lib/header.c:1949
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:362
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:384
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Podpis ni na voljo\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "oblika značke manjka"
 
-#: lib/package.c:581
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "ime značke manjka"
+
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: headerRead failed: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "na koncu polja je pričakovan ]"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "nepričakovan ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "nepričakovan }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "v izrazu je pričakovan ?"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "v izrazu je za { pričakovan ?"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "v izrazu je pričakovan }"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "za podizrazom ? je pričakovano :"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "v izrazu je za : pričakovan {"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "na koncu izraza je pričakovan |"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: branje Fread je bilo neuspešno: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "prikaži znane značke za poizvedovanje"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "prikaži končni rpmrc in nastavitev makra"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr ""
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr ""
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "različica rpm, ki jo uporabljate"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1876,12 +2194,12 @@ msgstr "premikanja morajo vsebovati ="
 msgid "relocations must have a / following the ="
 msgstr "premikanja morajo imeti /, ki mu sledi ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "namestitev vseh datotek, vključno z nastavitvenimi, ki so sicer izpuščene"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1889,152 +2207,162 @@ msgstr ""
 "odstrani vse pakete, ki vsebujejo vzorec <paket> (sicer program izide z "
 "napako, če paket <paket> določa več paketov)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "izbriši (odstrani) paket"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr ""
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "brez namestitve dokumentacije"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr ""
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "okrajšava za --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr ""
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "z izpisom znakov # ob namestitvi (uporabno z -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "brez preverjanja arhitekture paketa"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "brez preverjanja operacijskega sistema paketa"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "brez preverjanja prostora na disku pred nameščanjem"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "namesti dokumentacijo"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "obnovi podatkovno zbirko, a ne spreminjaj datotečnega sistema"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "brez preverjanja soodvisnosti paketa"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 "brez spreminjanja vrstnega reda paketov z namenom zadovoljevanja soodvisnosti"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2042,368 +2370,407 @@ msgstr ""
 "nadgraditev na starejšo različico paketa (--force pri nadgradnjah "
 "avtomatično vključi to izbiro)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "izpis odstotkov med namestitvijo"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "če je mogoče, bo paket prestavljen v imenik <imenik>"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr ""
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr ""
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "ponovno namesti, če paket že obstaja"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "ne namesti, a ugotovi, če bi delovalo"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr ""
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr ""
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr ""
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr ""
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr ""
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr ""
 
-#: lib/poptQV.c:98
-msgid "do not glob arguments"
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
 msgstr ""
 
-#: lib/poptQV.c:100
-msgid "do not process non-package files as manifests"
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
 msgstr ""
 
-#: lib/poptQV.c:172
-msgid "list all configuration files"
-msgstr "izpis vseh nastavitvene datoteke"
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
+msgid "do not glob arguments"
+msgstr ""
+
+#: lib/poptQV.c:116
+msgid "do not process non-package files as manifests"
+msgstr ""
+
+#: lib/poptQV.c:193
+msgid "list all configuration files"
+msgstr "izpis vseh nastavitvene datoteke"
+
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "izpis vseh dokumentacijske datoteke"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "izpis vseh dokumentacijske datoteke"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "izpis vseh nastavitvene datoteke"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "iznos osnovnih podatkov o datoteki"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "izpis seznama datotek v paketu"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "izpis stanja seznama datotek"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr ""
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr ""
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr ""
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr ""
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr ""
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "brez preverjanja datotek v paketu"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr ""
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " za datoteko "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr ""
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normalno      "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "nadomeščeno   "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "ni nameščeno  "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "omrežni       "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(brez stanja) "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(neznano %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "skupina %s ne vsebuje nobenega paketa\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "noben paket ne proži %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "noben paket ne potrebuje %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "noben paket ne nudi %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "datoteka %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "datoteka %s ni del nobenega paketa\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "neveljavna številka paketa: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "paket %s ni nameščen\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NI DOBRO"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "V REDU"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (MANJKAJOČI KLJUČI:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (NEPREVERJENI KLJUČI:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: odpiranje je bilo neuspešno: %s\n"
@@ -2428,1077 +2795,1141 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "NO "
-msgstr ""
-
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr ""
-
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
-msgstr ""
-
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
 msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
 msgstr ""
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
 msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
-msgstr "odpiranje %s je bilo neuspešno: %s\n"
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "dbpath ni nastavljena"
 
-#: lib/rpmgi.c:136
+#: lib/rpmdb.c:2520
 #, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+msgid "failed to create directory %s: %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpmdb.c:2557
 #, c-format
-msgid "Updating / installing...\n"
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpmdb.c:2572
 #, c-format
-msgid "Cleaning up / removing...\n"
-msgstr ""
-
-#: lib/rpminstall.c:192
-msgid "Preparing..."
+msgid "cannot add record originally at %u\n"
 msgstr ""
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
-msgstr ""
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "zamenjava stare podatkovne zbirke z novo je bila neuspešna!\n"
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
+#: lib/rpmds.c:744
+msgid "NO "
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
-msgstr "%s ni možno namestiti\n"
-
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
-msgstr "Prenašanje %s\n"
-
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
+#: lib/rpmds.c:744
+msgid "YES"
 msgstr ""
 
-#: lib/rpminstall.c:542
-#, c-format
-msgid "package %s is not relocatable\n"
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
-msgstr "napaka pri branju iz datoteke %s\n"
-
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "ni možno odpreti %s: %s\n"
-
-#: lib/rpminstall.c:706
-#, c-format
-msgid "Installing %s\n"
-msgstr "Nameščanje %s\n"
-
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
 msgstr ""
 
-#: lib/rpmlead.c:123
-#, c-format
-msgid "read failed: %s (%d)\n"
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
-#, c-format
-msgid "can't create %s lock on %s (%s)\n"
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
 msgstr ""
 
-#: lib/rpmlock.c:106
-#, c-format
-msgid "waiting for %s lock on %s\n"
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmprob.c:109
-msgid "different"
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpmprob.c:130
+#: lib/rpmds.c:1410
 #, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpmprob.c:135
-#, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpmprob.c:140
-#, c-format
-msgid "package %s (which is newer than %s) is already installed"
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpmprob.c:145
-#, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpmprob.c:155
-#, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpmprob.c:159
-#, c-format
-msgid "%s is needed by %s%s"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpmprob.c:167
+#: lib/rpmds.c:1544
 #, c-format
-msgid "%s is obsoleted by %s%s"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmprob.c:172
-#, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmrc.c:342
+#: lib/rpmfi.c:810
 #, c-format
-msgid "Incomplete data line at %s:%d\n"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:347
+#: lib/rpmfi.c:817
 #, c-format
-msgid "Too many args in data line at %s:%d\n"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:354
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmrc.c:385
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "Incomplete default line at %s:%d\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr ""
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Napačno magično število"
 
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr ""
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Poškodovana/neberljiva glava"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr ""
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Glava je predolga"
 
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr ""
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Neznan tip datoteke"
 
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Neznan sistem: %s\n"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Notranja napaka"
 
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " neuspešno - "
 
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmscript.c:221
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
+msgid "open of %s failed: %s\n"
+msgstr "odpiranje %s je bilo neuspešno: %s\n"
 
-#: lib/rpmscript.c:248
+#: lib/rpmgi.c:144
 #, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:272
+#: lib/rpmgi.c:155
 #, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmscript.c:276
+#: lib/rpminstall.c:142
 #, c-format
-msgid "%s scriptlet failed, signal %d\n"
+msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpmscript.c:279
+#: lib/rpminstall.c:144
 #, c-format
-msgid "%s scriptlet failed, exit status %d\n"
+msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpmtd.c:258
-msgid "Unknown format"
+#: lib/rpminstall.c:193
+msgid "Preparing..."
 msgstr ""
 
-#: lib/rpmte.c:868
-msgid "install"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpmte.c:869
-msgid "erase"
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpmts.c:92
+#: lib/rpminstall.c:323
 #, c-format
-msgid "cannot open Packages database in %s\n"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpmts.c:191
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
+msgid "%s cannot be installed\n"
+msgstr "%s ni možno namestiti\n"
 
-#: lib/rpmts.c:209
+#: lib/rpminstall.c:490
 #, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
+msgid "Retrieving %s\n"
+msgstr "Prenašanje %s\n"
 
-#: lib/rpmts.c:217
+#: lib/rpminstall.c:502
 #, c-format
-msgid "missing ')' in package label: %s\n"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpmts.c:273
+#: lib/rpminstall.c:572
 #, c-format
-msgid "%s: reading of public key failed.\n"
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
+#: lib/rpminstall.c:603
+#, c-format
+msgid "error reading from file %s\n"
+msgstr "napaka pri branju iz datoteke %s\n"
 
-#: lib/signature.c:90
+#: lib/rpminstall.c:697
 #, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
+#: lib/rpminstall.c:736
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "ni možno odpreti %s: %s\n"
 
-#: lib/signature.c:101
+#: lib/rpminstall.c:742
 #, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
+msgid "Installing %s\n"
+msgstr "Nameščanje %s\n"
+
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
 msgstr ""
 
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/signature.c:196
+#: lib/rpmlead.c:118
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "read failed: %s (%d)\n"
 msgstr ""
 
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/signature.c:219
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpmlock.c:133
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
+msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmplugins.c:65
+#, c-format
+msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+#: lib/rpmplugins.c:73
+#, c-format
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
+#: lib/rpmplugins.c:154
+#, c-format
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
+#: lib/rpmplugins.c:199
+#, c-format
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/signature.c:489
-msgid "Header "
+#: lib/rpmprob.c:109
+msgid "different"
 msgstr ""
 
-#: lib/signature.c:530
+#: lib/rpmprob.c:114
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "failed"
+#: lib/rpmprob.c:118
+#, c-format
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/verify.c:372
+#: lib/rpmprob.c:122
 #, c-format
-msgid "missing   %c %s"
+msgid "package %s is already installed"
 msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmprob.c:125
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
+msgid "path %s in package %s is not relocatable"
 msgstr ""
 
-#: lib/headerfmt.c:336
-msgid "invalid field width"
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "manjkajoči { za %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "manjkajoči } za %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "oblika značke manjka"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "ime značke manjka"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "neznana značka"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "na koncu polja je pričakovan ]"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "nepričakovan ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "nepričakovan }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "v izrazu je pričakovan ?"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "v izrazu je za { pričakovan ?"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "v izrazu je pričakovan }"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "za podizrazom ? je pričakovano :"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "v izrazu je za : pričakovan {"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "na koncu izraza je pričakovan |"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
+#: lib/rpmprob.c:135
+#, c-format
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/rpmdb.c:97
+#: lib/rpmprob.c:140
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/rpmdb.c:191
+#: lib/rpmprob.c:145
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/rpmdb.c:516
+#: lib/rpmprob.c:155
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
 msgstr ""
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmprob.c:163
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmprob.c:167
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "%s is obsoleted by %s%s"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmprob.c:172
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmrc.c:222
+#, c-format
+msgid "missing second ':' at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:225
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "missing architecture name at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:370
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "Incomplete data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:375
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "Too many args in data line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:382
 #, c-format
-msgid "error(%d) removing header #%d record\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:413
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
+msgid "Incomplete default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:418
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:523
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+msgid "missing argument for %s at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d) allocating new package instance\n"
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+msgid "missing architecture for %s at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2660
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
+msgid "bad option '%s' at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "dbpath ni nastavljena"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "failed to create directory %s: %s\n"
+msgid "Unknown system: %s\n"
+msgstr "Neznan sistem: %s\n"
+
+#: lib/rpmrc.c:1471
+#, c-format
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr ""
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:138
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "zamenjava stare podatkovne zbirke z novo je bila neuspešna!\n"
+#: lib/rpmscript.c:278
+#, c-format
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmscript.c:313
 #, c-format
-msgid "replace files in %s with files from %s to recover"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/rpmscript.c:353
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "neuspešna odstranitev imenika %s: %s\n"
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmscript.c:371
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/backend/db3.c:36
+#: lib/rpmscript.c:375
 #, c-format
-msgid "db%d error(%d): %s\n"
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "skupno"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "izključujoče"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr ""
 
-#: lib/backend/db3.c:582
-#, c-format
-msgid "invalid index type %x on %s/%s\n"
+#: lib/rpmte.c:730
+msgid "erase"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmts.c:100
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "cannot open Packages database in %s\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmts.c:199
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s ima neveljavno številčno vrednost, prezrto\n"
+msgid "extra '(' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmts.c:217
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s ima preveliko ali premajhno dolgo (long) vrednost, prezrto\n"
+msgid "missing '(' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmts.c:225
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
-"%s ima preveliko ali premajhno vrednost malega (small) celega\n"
-"števila, prezrto\n"
 
-#: plugins/sepolicy.c:218
+#: lib/rpmts.c:284
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s: reading of public key failed.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:152
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:158
+#, c-format
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:178
+#, c-format
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: plugins/sepolicy.c:306
+#: lib/rpmvs.c:188
 #, c-format
-msgid "Failed to begin policy transaction: %s\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: plugins/sepolicy.c:337
+#: lib/rpmvs.c:195
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: plugins/sepolicy.c:386
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to execute %s: %s\n"
+msgid "%s%s"
+msgstr ""
+
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
+
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr ""
+
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
+
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr ""
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr ""
+
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktivni %d prazni %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(prazni)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(prazni)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr ""
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktivni %d prazni %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr ""
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "usodna napaka: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "napaka: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "opozorilo: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "alokacija pomnilnika (%u bajtov) vrnjeno NIČ.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
 msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "usodna napaka: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "napaka: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "opozorilo: "
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "alokacija pomnilnika (%u bajtov) vrnjeno NIČ.\n"
+msgid "error creating fifo %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: pisanje Fwrite je bilo neuspešno: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: branje Fread je bilo neuspešno: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead je bil neuspešen: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature je bilo neuspešno: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead je bil neuspešen: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 2f9620f4e05b1d95d09f01c1847b44ac7f063c23..96407a5e80e4c541920ff4b01a3b385e72dbcedc 100644 (file)
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,10 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Serbian (http://www.transifex.com/rpm-team/rpm/language/sr/)\n"
 "Language: sr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -44,497 +44,559 @@ msgstr "Овај програм се сме слободно дистрибуи
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "неуспело прављење цеви за --pipe: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "неуспело извршавање\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "аргумент није RPM пакет\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "грешка при читању заглавља из пакета\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "не могу да поново отворим товар: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Опције упита (са -q или --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Опције провере (са -V или --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Опције инсталације/надградње/брисања:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Заједничке опције за све rpm режиме и извршне програме:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "једна врста упита/провере сме бити урађена одједном"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "неочекиване заставице упита"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "неочекиван облик упита"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "неочекивани извор упита"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "само један главни режим сме бити наведен"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "датотеке смеју бити премештане само током инсталације пакета"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "не може се користити --prefix уз --relocate или --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate и --excludepath могу бити употребљене само при инсталацији нових "
-"пакета"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix може бити употребљена само при инсталацији нових пакета"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "аргументи за --prefix морају почети знаком /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs може бити наведена само током инсталације пакета"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludecocs може бити наведена само током инсталације пакета"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includecocs може бити наведена само током инсталације пакета"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "може се навести само једна од --excludedocs или --includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch може бити наведена само током инсталације пакета"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos може бити наведена само током инсталације пакета"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize може бити наведена само током инсталације пакета"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches може бити наведена само током брисања пакета"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles може бити наведена само током инсталације пакета"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb може бити наведена само током инсталације и брисања пакета"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"опције искључивања скрипте могу бити наведене само током инсталације и "
-"брисања пакета"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"опције искључивања окидача могу бити наведене само током инсталације и "
-"брисања пакета"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "аргументи за --root (-r) морају почети знаком /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "нема задатих пакета за брисање"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "нема задатих пакета за инсталацију"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "нема задатих аргумената за упит"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "нема задатих аргумената за проверу"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot је већ наведен, занемарујем %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "направи кроз %prep (распаковани извори и примењене закрпе) из <specfile>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specfile>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "направи кроз %build (%prep, онда компилирај) из <specfile>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr "направи кроз %install (%prep, %build, затим инсталирај) из <specfile>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "провери %files одељак из <specfile>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "направи изворне и бинарне пакете из <specfile>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "направи бинарне пакете само из <specfile>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "направи изворне пакете само из <specfile>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<source package>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"направи кроз %install (%prep, %build, затим инсталирај) из <source package>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "направи кроз %prep (распаковани извори и примењене закрпе) из <tarball>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "направи кроз %build (%prep, онда компилирај) из <tarball>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "направи кроз %install (%prep, %build, онда инсталирај) из <tarball>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "провери %files одељак из <tarball>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "направи изворне и бинарне пакете из <tarball>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "направи бинарне пакете само из <tarball>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "направи изворне пакете само из <tarball>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "направи бинарни пакет из <source package>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<source package>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"направи кроз %install (%prep, %build, затим инсталирај) из <source package>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "премости корен прављења"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "уклони стабло прављења по завршетку"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "занемари ExcludeArch: упутства из датотеке спецификације"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "отклони грешке у машини стања датотека"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "немој извршити ниједну фазу прављења"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "немој проверавати зависности прављења"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "не прихватај i18N msgstr ниске из датотеке спецификације"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "уклони изворе по завршетку"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "уклони датотеку спецификације по завршетку"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "прескочи право до одређене фазе (само за c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "премости циљну платформу"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "Опције прављења уз [ <specfile> | <tarball> | <source package> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Заједничке опције за све rpm режиме и извршне програме:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Неуспело прављење зависности:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Не могу да отворим датотеку спецификације %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Неуспело отварање tar цеви: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Неуспело читање датотеке спецификације из %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Неуспела промена имена %s у %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "stat није успео %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Датотека %s није обична датотека.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Датотека %s не личи на датотеку спецификације.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Правим циљне платформе: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Правим за циљ %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "аргументи за --root (-r) морају почети знаком /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "иницијализуј базу података"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "поново направи обрнуте спискове базе података из заглавља инсталираних пакета"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "провера датотека базе података"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Опције базе података:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "само један главни режим сме бити наведен"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "провери потписе пакета"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "увези ојачани јавни кључ"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "нема задатих аргумената"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Опције упита (са -q или --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Опције провере (са -V или --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Опције инсталације/надградње/брисања:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "једна врста упита/провере сме бити урађена одједном"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "неочекиване заставице упита"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "неочекиван облик упита"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "неочекивани извор упита"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "датотеке смеју бити премештане само током инсталације пакета"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "не може се користити --prefix уз --relocate или --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate и --excludepath могу бити употребљене само при инсталацији нових "
+"пакета"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix може бити употребљена само при инсталацији нових пакета"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "аргументи за --prefix морају почети знаком /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs може бити наведена само током инсталације пакета"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludecocs може бити наведена само током инсталације пакета"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includecocs може бити наведена само током инсталације пакета"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "може се навести само једна од --excludedocs или --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch може бити наведена само током инсталације пакета"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos може бити наведена само током инсталације пакета"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize може бити наведена само током инсталације пакета"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches може бити наведена само током брисања пакета"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles може бити наведена само током инсталације пакета"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb може бити наведена само током инсталације и брисања пакета"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"опције искључивања скрипте могу бити наведене само током инсталације и "
+"брисања пакета"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"опције искључивања окидача могу бити наведене само током инсталације и "
+"брисања пакета"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "нема задатих пакета за брисање"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "нема задатих пакета за инсталацију"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "нема задатих аргумената за упит"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "нема задатих аргумената за проверу"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "потпиши пакет(е) (истоветно са --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "обриши потписе пакета"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Опције потписа:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Не могу да извршим %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Морате поставити „%%_gpg_name“ у макро датотеци\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Унесите лозинку: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Лозинка је добра.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "користи следећи облик упита"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -543,32 +605,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Извршавам(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Извршавање %s није успело (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Лош статус излаза из %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -578,235 +645,315 @@ msgstr ""
 "\n"
 "Грешке RPM прављења:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "синтаксна грешка при рашчлањивању ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "синтаксна грешка при рашчлањивању &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "синтаксна грешка при рашчлањивању ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "грешка рашчлањивања у изразу\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "неупарена (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- само код бројева\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! само код бројева\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "врсте се морају поклапати\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / није подржано за стрингове\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- није подржано за стрингове\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& и || нису подржани за стрингове\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "синтаксна грешка у изразу\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Недостаје „(“ у %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Недостаје „)“ у %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Неисправан %s знак: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Недостаје %s у %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Размак који није празан следи %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Лоша синтакса: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Лоша спецификација режима: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Лоша спецификација режима директоријума: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Неисправна могућност: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Није уграђена подршка за могућност датотеке\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Датотека мора почети са „/“: %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "Непознат алгоритам %u за сажимање датотека, враћам се на MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Датотека наведена двапут: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Symlink тачке за BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Датотека није пронађена: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: не могу да учитам непознату ознаку (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: неуспело читање јавног кључа.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: јавни кључ није ојачан.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "неуспело креирање директоријума"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Испред датотеке је потребно да стоји „/“: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Датотека није пронађена поклапањем: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Не могу да отворим %%files датотеку %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "ред: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Датотека није пронађена поклапањем: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Лоша датотека: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Лош власник/група: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Проверавам за незапаковане датотеке: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -815,548 +962,605 @@ msgstr ""
 "Пронађене су инсталиране (али незапаковане) датотеке:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "Бинарне датотеке зависне од архитектуре у noarch пакету\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: ред: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Није могуће утврдити назив домаћина: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Не могу да упишем товар у %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80оÑ\87иÑ\82ам Ñ\82оваÑ\80 Ð¸Ð· %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\83Ñ\82вÑ\80диÑ\82и Ð½Ð°Ð·Ð¸Ð² Ð´Ð¾Ð¼Ð°Ñ\9bина: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Непозната компресија товара: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Не могу да направим непроменљиву област заглавља.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Не могу да отворим temp датотеку.\n"
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Не могу да упишем привремено заглавље\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Лоши CSA подаци\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Неуспело читање датотеке спецификације из %s\n"
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Не могу да поново учитам заглавље потписа.\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
+
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Не могу да отворим %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Не могу да запишем пакет: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Не могу да отворим sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Не могу да прочитам заглавље из %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Не могу да упишем заглавље у %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Записано: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Извршавам „%s“:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Извршавање „%s“ није успело.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Неуспела провера пакета „%s“.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Не могу да направим име излазне датотеке за пакет %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "не могу да направим %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "ред %d: други %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "%%changelog ставке морају почети са *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "непотпуна %%changelog ставка\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "лош датум у %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog није у опадајућем хронолошком редоследу\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "недостаје име у %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "нема описа у %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "ред %d: Грешка при тумачењу %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "ред %d: Лоша опција %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "ред %d: Превише имена: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "ред %d: Пакет не постоји: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "ред %d: Други опис\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "ред %d: Грешка при тумачењу %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "ред %d: Лош број: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "ред %d: Лош no%s број: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "ред %d: Лош %s број: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d дефинисано више пута\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Архитектура је изостављена: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Архитектура није уврштена: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS је изостављен: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS није уврштен: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "%s поље мора бити присутно у пакету: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Удвојене %s ставке у пакету: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Не могу да отворим икону %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Не могу да прочитам икону %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Непозната врста иконе: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "ред %d: Ознака прихвата само један жетон: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "ред %d: Лоше обликована ознака: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "ред %d: Празна ознака: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "ред %d: Префикси се не смеју завршавати са „/“: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "ред %d: Docdir мора почети са „/“: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "ред %d: Поље епохе мора бити број без предзнака: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "ред %d: Лоши %s: квалификатори: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "ред %d: Лош облик за BuildArchitecture: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "ред %d: Само noarch подпакети су подржани: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Интерна грешка: Лажна ознака %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Лоша спецификација пакета: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Пакет већ постоји: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "ред %d: Непозната ознака: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} не може бити празно\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} не може бити „/“\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Лош извор: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Нема закрпе број %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch без одговарајуће „Patch:“ ознаке\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Нема извора број %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "Нема ознаке „Source:“ у датотеци спецификације\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Грешка у тумачењу %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "ред %d: Лош аргумент за %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "ред %d: Лоша %%setup опција %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Неисправан број закрпе %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "ред %d: други %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "ред %d: окидачи морају имати --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "ред %d: Грешка при тумачењу %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "ред %d: интерна скрипта се мора завршити са „>“: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "ред %d: скрипта програма мора почети са „/“: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "ред %d: Други %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "ред %d: неподржана интерна скрипта: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "ред %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Не могу да отворим %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: Добио %%else без %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: Добио %%endif без %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Нису пронађене усаглашене архитектуре за прављење\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Пакет нема %%description: %s\n"
@@ -1427,450 +1631,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Не могу да направим цев за %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Не могу да извршим %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Не могу да одвојим %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Пребацивање %s у дуги цео број није успело.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) није успело: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load није успело: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Препознавање датотеке „%s“ није успело: режим %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Проналазак %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Неуспело тражење %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "упит на датотеком спецификације %s није успео, не могу да протумачим\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(грешка 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Лош magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Лоше/нечитљиво  заглавље"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "није препозната опција базе података: „%s“ занемарено.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Превелика величина заглавља"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s има неправилну бројчану вредност, прескочено\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s има превелику или премалу long вредност, прескочено\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s има превелику или премалу целобројну вредност, прескочено\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "не могу да добијем %s катанац на %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "дељено"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "ексклузивно"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Непозната врста датотеке"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "грешка(%d) при складиштењу слога „%s“ у %s\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Недостаје чврста веза"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "грешка(%d) при уклањању слога „%s“ из %s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Интерна грешка"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Датотека архиве није у заглављу"
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "грешка(%d) при заузимању новог примерка пакета\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " неуспело - "
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s је Делта RPM и не може се директно инсталирати\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Неподржан терет (%s) у пакету %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "пакет %s је већ додат, прескачем %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "пакет %s је већ додат, замењујем са %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(није blob)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(није број)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr ""
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(неисправна врста)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(није base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(неисправна врста)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(није blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(неисправна xml врста)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(није OpenPGP потпис)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "корисник %s не постоји - користим root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "група %s не постоји - користим root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s сачувано као %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s направљено као %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "ознака[%d]: ЛОШЕ, ознака %d врста %d померај %d број %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: ЛОШЕ, није хексадекадно\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: ЛОШЕ, није бинарно\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: ЛОШЕ, није бинарно\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "blob величина (%d): ЛОШЕ, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr ""
+
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "померај региона: ЛОШЕ, ознака %d врста %d померај %d број %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "репни регион: ЛОШЕ, ознака %d врста %d померај %d број %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "величина региона: ЛОШЕ, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr size(%d): ЛОШЕ, читам враћено %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic: ЛОШЕ\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr tags: ЛОШЕ, број ознака(%d) је ван домета\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr ""
+
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hdr data: ЛОШЕ, број бајтова(%d) је ван домета\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr blob(%zd): ЛОШЕ, читам враћено %d\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "hdr load: ЛОШЕ\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "празан облик ознаке"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature није успело: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "празно име ознаке"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Нема потписа на располагању\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead није успело: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] очекиван на крају низа"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "неочекиван ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "неочекиван }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? очекиван у изразу"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ очекивано после ? у изразу"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} очекиван у изразу"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": очекиван након ? подизраза"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ очекивано после : у изразу"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| очекиван на крају израза"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "показивач низа коришћен са низовима различитих величина"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread није успело: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "унапред дефинисани MACRO са вредношћу EXPR"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "„MACRO EXPR“"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "дефинише MACRO са вредношћу EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "испиши макро проширење за EXPR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "„EXPR“"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "читај <FILE:...> уместо подразумеваних датотека"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FILE:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "немој проверавати сажетак(е) пакета"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "немој проверавати заглавље(а) базе података по добављању"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "немој проверавати потпис(е) пакета"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "пошаљи stdout ка CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "користи ROOT као директоријум највишег нивоа"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "прикажи ознаке познатих упита"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "прикажи коначну конфигурацију за rpmrc и macro"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "пружа мање детаљан излаз"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "пружа детаљнији излаз"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "напиши која се rpm верзија користи"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "отклони грешке у машини стања датотеке товара"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "отклони грешке за rpmio У/И"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: табела опција није добро подешена (%d)\n"
@@ -1891,12 +2206,12 @@ msgstr "премештања морају садржати ="
 msgid "relocations must have a / following the ="
 msgstr "премештања морају имати / након ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "инсталирај све датотеке, чак и подешавања која би иначе могла бити прескочена"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1904,520 +2219,569 @@ msgstr ""
 "уклони све пакете који одговарају <package> (обично се пријављује грешка ако "
 "<package> одређује више пакета)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "премести датотеке у пакету који се не може преместити"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "штампај петље зависности као упозорење"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "избриши (деинсталирај) пакет"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<package>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "немој инсталирати датотеке подешавања"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "немој да инсталираш документацију"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "прескочи датотеке које садрже компоненту <path> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<path>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "скраћеница за --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "надгради пакете ако су већ инсталирани"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<packagefile>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "исписуј знак тарабе док се пакет инсталира (добро уз -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "немој проверавати архитектуру пакета"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "немој проверавати оперативни систем пакета"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "немој проверавати простор на диску пре инсталације"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "инсталирај документацију"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "инсталирај пакет(е)"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "ажурирај базу података, али немој мењати систем датотека"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "немој проверавати зависности пакета"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "немој инсталирати безбедносне контексте датотека"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 "немој преуређивати редослед инсталације пакета ради задовољавања зависности"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "немој извршити скриптицу(е) пакета"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "немој извршити %%pre скриптицу (ако постоји)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "немој извршити %%post скриптицу (ако постоји)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "немој извршити %%preun скриптицу (ако постоји)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "немој извршити %%postun скриптицу (ако постоји)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "немој извршити ниједну скриптицу(е) коју активира овај пакет"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "немој извршити ниједну %%triggerprein скриптицу(е)"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "немој извршити ниједну %%triggerin скриптицу(е)"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "немој извршити ниједну %%triggerun скриптицу(е)"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "немој извршити ниједну %%triggerpostun скриптицу(е)"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 "надгради на стару верзију пакета (--force код надградње ово ради самостално)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "исписуј проценте док се пакет инсталира"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "премести пакет у <dir>, ако се може преместити"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "премести датотеке из путање <old> у <new>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<old>=<new>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "занемари сукобе датотека између пакета"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "поново инсталирај ако је пакет већ присутан"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "немој инсталирати, али реци да ли би радило или не"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "надгради пакет(е)"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "испитај/провери све пакете"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "rpm checksig режим"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "испитај/провери пакет(е) које поседују датотеку"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "испитај/провери пакет(е) у групи"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "испитај/провери датотеку пакета"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "испитај/провери пакет(е) са идентификатором пакета"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "испитај/провери пакет(е) са идентификатором заглавља"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "режим rpm упита"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "испитај/провери инстанцу заглавља"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "испитај/провери пакет(е) из трансакције инсталације"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "испитај пакет(е) које је активирао овај пакет"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "режим rpm провере"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "испитај/провери пакет(е) који захтевају зависности"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "испитај/провери пакет(е) који пружају зависности"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "немој преклапати аргументе"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "немој обрађивати датотеке које нису пакети као манифесте"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "испиши све датотеке подешавања"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "испиши све датотеке документације"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "испиши све датотеке документације"
+msgstr ""
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "испиши све датотеке подешавања"
+
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "избаци основне податке о датотеци"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "испиши датотеке у пакету"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "прескочи %%ghost датотеке"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "прескочи %%ghost датотеке"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "прикажи стања наведених датотека"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "немој проверавати величину датотека"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "немој проверавати путање симболичких веза датотека"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "немој проверавати власника датотека"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "немој проверавати групу датотека"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "немој проверавати време мењања датотека"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "немој проверавати режим приступа датотека"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "немој проверавати могућности датотека"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "немој проверавати безбедносне контексте датотека"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "немој проверавати могућности датотека"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "немој проверавати датотеке у пакету"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "немој проверавати зависности пакета"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "немој извршити скрипту(е) провере"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "очекиван је изворни пакет, пронађен је бинарни\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "изворни пакет не садржи .spec датотеку\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "распакивање архиве није успело %s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " на датотеци "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s није успело код датотеке %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s није успело: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "неисправан облик: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(не садржи датотеке)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "нормално        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "замењено      "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "није инсталиран "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "дељено на мрежи    "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "погрешна боја   "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(без стања)    "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(непознат %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "пакет нема спискове власника/групе датотека\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "пакет нема спискове нити власника ни id датотека\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "група %s не садржи ниједан пакет\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "ниједан пакет не активира %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "лоше обликован %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "ниједан пакет не одговара %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "ниједан пакет не захтева %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "ниједан пакет не пружа %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "датотека %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "датотека %s не припада ниједном пакету\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "неисправан број пакета: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "пакет %s није инсталиран\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "непозната ознака: „%s“\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: увозно читање није успело(%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
-msgstr "%s: Непромењива регија заглавља се не може ишчитати. Оштећен пакет?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "НИЈЕ УРЕДУ"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "УРЕДУ"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (НЕДОСТАЈУЋИ КЉУЧЕВИ:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (НЕПОУЗДАНИ КЉУЧЕВИ:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: отварање није успело: %s\n"
@@ -2442,214 +2806,445 @@ msgstr "Не могу да променим коренски директори
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "није постављен dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: прескачем"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "грешка(%d) при записивању слога #%d у %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec није успео: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp није успео: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: прескачем"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: оштећено заглавље #%u враћено -- прескачем.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: не могу да прочитам заглавље на 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "није постављен dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "неуспело креирање директоријума %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "заглавље #%u у бази податак је лоше -- прескачем.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "не могу да додам слог првобитно на %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"неуспело поновно прављење базе података: основна база података је остала на "
+"месту\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "неуспела замена старе базе података са новом базом података!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "НЕ "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "ДА"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr "Неопходне:, Обезбеђене:, и Застареле: верзије подршке зависности."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 "име(на) датотеке сачувано као (називДиректоријума,основноИме,"
 "индексДиректоријума) пар, не као путања."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "товар пакета може бити компримован користећи bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr "товар пакета може бити компримован користећи lzma."
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "датотека(е) товара пакета има префикс „./“."
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "датотека(е) товара пакета има префикс „./“."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "назив пакета-верзија-издање није имплицитно наведено."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "ознаке заглавља се увек сортирају након учитавања."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "преводилац скриптице може користити аргументе заглавља."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "датотека чврсте везе може бити инсталирана иако није потпуна."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr "скриптица пакета може приступити rpm бази података током инсталације."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "унутрашња подршка за скрипте lua."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "подршка за POSIX.1e могућности датотека"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "назив Ð¿Ð°ÐºÐµÑ\82а-веÑ\80зиÑ\98а-издаÑ\9aе Ð½Ð¸Ñ\98е Ð¸Ð¼Ð¿Ð»Ð¸Ñ\86иÑ\82но Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Ð\9bоÑ\88 magic"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "ознаке Ð·Ð°Ð³Ð»Ð°Ð²Ñ\99а Ñ\81е Ñ\83век Ñ\81оÑ\80Ñ\82иÑ\80аÑ\98Ñ\83 Ð½Ð°ÐºÐ¾Ð½ Ñ\83Ñ\87иÑ\82аваÑ\9aа."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Ð\9bоÑ\88е/неÑ\87иÑ\82Ñ\99иво  Ð·Ð°Ð³Ð»Ð°Ð²Ñ\99е"
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "пÑ\80еводилаÑ\86 Ñ\81кÑ\80ипÑ\82иÑ\86е Ð¼Ð¾Ð¶Ðµ ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð°Ñ\80гÑ\83менÑ\82е Ð·Ð°Ð³Ð»Ð°Ð²Ñ\99а."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Ð\9fÑ\80евелика Ð²ÐµÐ»Ð¸Ñ\87ина Ð·Ð°Ð³Ð»Ð°Ð²Ñ\99а"
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "датотека чврсте везе може бити инсталирана иако није потпуна."
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr "скриптица пакета може приступити rpm бази података током инсталације."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Непозната врста датотеке"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "унутрашња подршка за скрипте lua."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "подÑ\80Ñ\88ка Ð·Ð° POSIX.1e Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð´Ð°Ñ\82оÑ\82ека"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Ð\98нÑ\82еÑ\80на Ð³Ñ\80еÑ\88ка"
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Датотека архиве није у заглављу"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " неуспело - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "отварање %s није успело: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: није rpm пакет (или манифест пакета)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Припремам..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Неуспеле зависности:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: није rpm пакет (или манифест пакета): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s се не може инсталирати\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Прибављам %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "прескачем %s - неуспео пренос\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "пакет %s се не може премештати\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "грешка при читању из датотеке %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "„%s“ одређује више пакета:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "не могу да отворим %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Инсталирам %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "није rpm пакет"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "неправилан тип потписа"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "неподржана верзија RPM пакета"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "неуспело читање: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "различито"
@@ -2724,798 +3319,633 @@ msgstr ""
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "непозната грешка %d се десила у току руковања пакетом %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "недостаје друго „:“ код %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "недостаје име архитектуре на %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Непотпун ред података на %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Превише аргумената у реду података на %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Лош број архитектуре/ос-а: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Непотпун подразумевани ред на %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Премало аргумената у подразумеваном реду на %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "недостаје „:“ (пронађено 0x%02x) код %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "недостаје аргумент за %s на %s:%d\n"
 
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr "не могу да отворим %s на %s:%d: %m\n"
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "недостаје архитектура за %s на %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "лоша опција „%s“ код %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Непознати систем: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Молим вас контактирајте %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Не могу да отворим %s за читање: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "није уграђена подршка <lua> скриптица\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Не могу да направим привремену датотеку за %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Не могу да удвојим описника датотеке: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "%s скриптица није успела, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s скриптица није успела, сигнал %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "%s скриптица није успела, излазни статус %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Непознат облик"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "не могу да отворим Packages базу података у %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "сувишна „(“ у ознаци пакета: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "недостаје „(“ у ознаци пакета: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "недостаје „)“ у ознаци пакета: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: неуспело читање јавног кључа.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh величина(%d): ЛОШЕ, читање враћено %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic: ЛОШЕ\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh ознаке: ЛОШЕ, број ознака(%d) је ван домета\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh подаци: ЛОШЕ, број  бајтова(%d) је ван домета\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d): ЛОШЕ, читање враћено %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh ознака[%d]: ЛОШЕ, ознака %d врста %d померај %d број %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh учитавање: ЛОШЕ\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh подлошка(%zd): ЛОШЕ, читам %zd бајтова\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd): ЛОШЕ, fstat(2) није успео\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "Непромењива регија заглавља се не може ишчитати. Оштећен пакет?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5 сажетак:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "SHA1 сажетак заглавља:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Заглавље "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "недостаје   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Незадовољене зависности за %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "недостаје { после %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "недостаје } после %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "празан облик ознаке"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "празно име ознаке"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "непозната ознака"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] очекиван на крају низа"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "неочекиван ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "неочекиван }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? очекиван у изразу"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ очекивано после ? у изразу"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} очекиван у изразу"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": очекиван након ? подизраза"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ очекивано после : у изразу"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| очекиван на крају израза"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "показивач низа коришћен са низовима различитих величина"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "не могу да отворим %s индекс користећи db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "није постављен dbpath\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: прескачем"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "грешка(%d) при записивању слога #%d у %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec није успео: %s\n"
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp није успео: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: прескачем"
-
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:551
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: оштећено заглавље #%u враћено -- прескачем.\n"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "не могу да отворим %s на %s:%d: %m\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "недостаје архитектура за %s на %s:%d\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr ""
+msgid "bad option '%s' at %s:%d\n"
+msgstr "лоша опција „%s“ код %s:%d\n"
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: не могу да прочитам заглавље на 0x%x\n"
+msgid "Unknown system: %s\n"
+msgstr "Непознати систем: %s\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "гÑ\80еÑ\88ка(%d) Ð¿Ñ\80и Ð¿Ð¾Ñ\81Ñ\82авÑ\99аÑ\9aÑ\83 â\80\9e%sâ\80\9c Ñ\81логова Ð¸Ð· %s Ð¸Ð½Ð´ÐµÐºÑ\81а\n"
+msgid "Please contact %s\n"
+msgstr "Ð\9cолим Ð²Ð°Ñ\81 ÐºÐ¾Ð½Ñ\82акÑ\82иÑ\80аÑ\98Ñ\82е %s\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "гÑ\80еÑ\88ка(%d) Ð¿Ñ\80и Ñ\81кладиÑ\88Ñ\82еÑ\9aÑ\83 Ñ\81лога â\80\9e%sâ\80\9c Ñ\83 %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им %s Ð·Ð° Ñ\87иÑ\82аÑ\9aе: %m.\n"
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "грешка(%d) при уклањању слога „%s“ из %s\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
+
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "грешка(%d) при заузимању новог примерка пакета\n"
+msgid "Unable to restore current directory: %m"
+msgstr ""
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "није уграђена подршка <lua> скриптица\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "гÑ\80еÑ\88ка(%d) Ð¿Ñ\80и Ð´Ð¾Ð±Ð°Ð²Ñ\99аÑ\9aÑ\83 â\80\9e%sâ\80\9c Ñ\81логова Ð¸Ð· %s Ð¸Ð½Ð´ÐµÐºÑ\81а\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ð¿Ñ\80ивÑ\80еменÑ\83 Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° %s: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "гÑ\80еÑ\88ка(%d) Ð¿Ñ\80и Ð·Ð°Ð¿Ð¸Ñ\81иваÑ\9aÑ\83 Ñ\81лога %s Ñ\83 %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83двоÑ\98им Ð¾Ð¿Ð¸Ñ\81ника Ð´Ð°Ñ\82оÑ\82еке: %s: %s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "није постављен dbpath"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "неуспело креирање директоријума %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s скриптица није успела, waitpid(%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "заглавље #%u у бази податак је лоше -- прескачем.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s скриптица није успела, сигнал %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "не могу да додам слог првобитно на %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s скриптица није успела, излазни статус %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Непознат облик"
+
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
-"неуспело поновно прављење базе података: основна база података је остала на "
-"месту\n"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "неуспела замена старе базе података са новом базом података!\n"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:100
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "замени Ð´Ð°Ñ\82оÑ\82еке Ñ\83 %s Ñ\81а Ð´Ð°Ñ\82оÑ\82екама Ð¸Ð· %s Ð´Ð° Ð²Ñ\80аÑ\82иÑ\88 Ñ\83 Ð¿Ñ\80еÑ\82Ñ\85одно Ñ\81Ñ\82аÑ\9aе"
+msgid "cannot open Packages database in %s\n"
+msgstr "не Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им Packages Ð±Ð°Ð·Ñ\83 Ð¿Ð¾Ð´Ð°Ñ\82ака Ñ\83 %s\n"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:199
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "неуспело уклањање директоријума %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "сувишна „(“ у ознаци пакета: %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "база Ð¿Ð¾Ð´Ð°Ñ\82ака%d Ð³Ñ\80еÑ\88ка(%d) Ð¸Ð· %s: %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "недоÑ\81Ñ\82аÑ\98е â\80\9e\80\9c Ñ\83 Ð¾Ð·Ð½Ð°Ñ\86и Ð¿Ð°ÐºÐµÑ\82а: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:225
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "база Ð¿Ð¾Ð´Ð°Ñ\82ака%d Ð³Ñ\80аÑ\88ка(%d): %s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "недоÑ\81Ñ\82аÑ\98е â\80\9e\80\9c Ñ\83 Ð¾Ð·Ð½Ð°Ñ\86и Ð¿Ð°ÐºÐµÑ\82а: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "не могу да добијем %s катанац на %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "дељено"
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "ексклузивно"
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: неуспело читање јавног кључа.\n"
 
-#: lib/backend/db3.c:582
-#, c-format
-msgid "invalid index type %x on %s/%s\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:152
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "није препозната опција базе података: „%s“ занемарено.\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:158
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s има неправилну бројчану вредност, прескочено\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s има превелику или премалу long вредност, прескочено\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s има превелику или премалу целобројну вредност, прескочено\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:195
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:268
+#, c-format
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Заглавље "
+
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Не могу да поново учитам заглавље потписа.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "недостаје   %c %s"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Незадовољене зависности за %s:\n"
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== активно %d празно %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
+
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(празно)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(празно)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Ð\9cакÑ\80о %%%s Ð¸Ð¼Ð° Ð½ÐµÐ·Ð°Ð²Ñ\80Ñ\88ено Ñ\82ело\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Ð\9cакÑ\80о %%%s Ð¸Ð¼Ð° Ð½ÐµÐ·Ð°Ð²Ñ\80Ñ\88ене Ð¾Ð¿Ñ\86иÑ\98е\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Ð\9cакÑ\80о %%%s Ð¸Ð¼Ð° Ð½ÐµÐ¿Ñ\80авилно Ð¸Ð¼Ðµ (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Ð\9cакÑ\80о %%%s Ð¸Ð¼Ð° Ð½ÐµÐ·Ð°Ð²Ñ\80Ñ\88ено Ñ\82ело\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Макро %%%s има незавршене опције\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Макро %%%s има празно тело\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Макро %%%s није могао да се прошири\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Макро %%%s има неправилно име (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Макро %%%s (%s) није коришћен испод нивоа %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Непозната опција %c у %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Неограничено %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "%% је праћена са макроом кога није могуће рашчланити\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== активно %d празно %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "грешка при прављењу привремене датотеке %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Датотека %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Датотека %s је мања од %u бајтова\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "неуспело креирање директоријума"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr ""
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(без грешке)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "кобна грешка: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "грешка: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "упозорење: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "неправилна синтакса у lua скриптици: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "неправилна синтакса у lua скрипти: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "lua скрипта није успела: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "неправилна синтакса у lua датотеци: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "lua удица није успела: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "алокација меморије (%u бајта) је вратила НАЛ.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(без грешке)"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "кобна грешка: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "грешка: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "упозорење: "
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "алокација меморије (%u бајта) је вратила НАЛ.\n"
+msgid "error creating fifo %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite није успело: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread није успело: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush није успело: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Не могу да извршим %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Не могу да направим цев за потписивање: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "неуспело gpg извршавање (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg није успео да запише потпис\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "не могу да прочитам потпис\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp није успело\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead није успело: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature није успело: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature није успело: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead није успело: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: неуспело читање манифеста: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "немој проверавати потпис заглавља+товара"
index 679131cfe40579c99914fee98d4e52c5d10d4d68..dcc5ef06bc68ccf7d5acf1c0ff456f554850df36 100644 (file)
@@ -7,10 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Serbian (Latin) (http://www.transifex.com/rpm-team/rpm/"
+"language/sr@latin/)\n"
 "Language: sr@latin\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -44,498 +45,560 @@ msgstr "Ovaj program se sme slobodno distribuirati pod GNU OJL odredbama.\n"
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "neuspelo pravljenje cevi za --pipe: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "neuspelo izvršavanje\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "argument nije RPM paket\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "greška pri čitanju zaglavlja iz paketa\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "ne mogu da ponovo otvorim tovar: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Opcije upita (sa -q ili --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Opcije provere (sa -V ili --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Opcije instalacije/nadgradnje/brisanja:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Zajedničke opcije za sve rpm režime i izvršne programe:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "jedna vrsta upita/provere sme biti urađena odjednom"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "neočekivane zastavice upita"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "neočekivan oblik upita"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "neočekivani izvor upita"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "samo jedan glavni režim sme biti naveden"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "datoteke smeju biti premeštane samo tokom instalacije paketa"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "ne može se koristiti --prefix uz --relocate ili --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate i --excludepath mogu biti upotrebljene samo pri instalaciji novih "
-"paketa"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix može biti upotrebljena samo pri instalaciji novih paketa"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "argumenti za --prefix moraju početi znakom /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs može biti navedena samo tokom instalacije paketa"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludecocs može biti navedena samo tokom instalacije paketa"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includecocs može biti navedena samo tokom instalacije paketa"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "može se navesti samo jedna od --excludedocs ili --includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch može biti navedena samo tokom instalacije paketa"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos može biti navedena samo tokom instalacije paketa"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize može biti navedena samo tokom instalacije paketa"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches može biti navedena samo tokom brisanja paketa"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles može biti navedena samo tokom instalacije paketa"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb može biti navedena samo tokom instalacije i brisanja paketa"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"opcije isključivanja skripte mogu biti navedene samo tokom instalacije i "
-"brisanja paketa"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"opcije isključivanja okidača mogu biti navedene samo tokom instalacije i "
-"brisanja paketa"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "argumenti za --root (-r) moraju početi znakom /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "nema zadatih paketa za brisanje"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "nema zadatih paketa za instalaciju"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "nema zadatih argumenata za upit"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "nema zadatih argumenata za proveru"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot je već naveden, zanemarujem %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "napravi kroz %prep (raspakovani izvori i primenjene zakrpe) iz <specfile>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specfile>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "napravi kroz %build (%prep, onda kompiliraj) iz <specfile>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr "napravi kroz %install (%prep, %build, zatim instaliraj) iz <specfile>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "proveri %files odeljak iz <specfile>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "napravi izvorne i binarne pakete iz <specfile>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "napravi binarne pakete samo iz <specfile>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "napravi izvorne pakete samo iz <specfile>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<source package>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"napravi kroz %install (%prep, %build, zatim instaliraj) iz <source package>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "napravi kroz %prep (raspakovani izvori i primenjene zakrpe) iz <tarball>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "napravi kroz %build (%prep, onda kompiliraj) iz <tarball>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "napravi kroz %install (%prep, %build, onda instaliraj) iz <tarball>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "proveri %files odeljak iz <tarball>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "napravi izvorne i binarne pakete iz <tarball>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "napravi binarne pakete samo iz <tarball>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "napravi izvorne pakete samo iz <tarball>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "napravi binarni paket iz <source package>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<source package>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"napravi kroz %install (%prep, %build, zatim instaliraj) iz <source package>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "premosti koren pravljenja"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "ukloni stablo pravljenja po završetku"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "zanemari ExcludeArch: uputstva iz datoteke specifikacije"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "otkloni greške u mašini stanja datoteka"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "nemoj izvršiti nijednu fazu pravljenja"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "nemoj proveravati zavisnosti pravljenja"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "ne prihvataj i18N msgstr niske iz datoteke specifikacije"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "ukloni izvore po završetku"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "ukloni datoteku specifikacije po završetku"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "preskoči pravo do određene faze (samo za c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "premosti ciljnu platformu"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "Opcije pravljenja uz [ <specfile> | <tarball> | <source package> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Zajedničke opcije za sve rpm režime i izvršne programe:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Neuspelo pravljenje zavisnosti:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Ne mogu da otvorim datoteku specifikacije %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Neuspelo otvaranje tar cevi: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Neuspelo čitanje datoteke specifikacije iz %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Neuspela promena imena %s u %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "stat nije uspeo %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Datoteka %s nije obična datoteka.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Datoteka %s ne liči na datoteku specifikacije.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Pravim ciljne platforme: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Pravim za cilj %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "argumenti za --root (-r) moraju početi znakom /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "inicijalizuj bazu podataka"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "ponovo napravi obrnute spiskove baze podataka iz zaglavlja instaliranih "
 "paketa"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "provera datoteka baze podataka"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Opcije baze podataka:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "samo jedan glavni režim sme biti naveden"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "proveri potpise paketa"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "uvezi ojačani javni ključ"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "nema zadatih argumenata"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Opcije upita (sa -q ili --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Opcije provere (sa -V ili --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Opcije instalacije/nadgradnje/brisanja:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "jedna vrsta upita/provere sme biti urađena odjednom"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "neočekivane zastavice upita"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "neočekivan oblik upita"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "neočekivani izvor upita"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "datoteke smeju biti premeštane samo tokom instalacije paketa"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "ne može se koristiti --prefix uz --relocate ili --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate i --excludepath mogu biti upotrebljene samo pri instalaciji novih "
+"paketa"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix može biti upotrebljena samo pri instalaciji novih paketa"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "argumenti za --prefix moraju početi znakom /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs može biti navedena samo tokom instalacije paketa"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludecocs može biti navedena samo tokom instalacije paketa"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includecocs može biti navedena samo tokom instalacije paketa"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "može se navesti samo jedna od --excludedocs ili --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch može biti navedena samo tokom instalacije paketa"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos može biti navedena samo tokom instalacije paketa"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize može biti navedena samo tokom instalacije paketa"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches može biti navedena samo tokom brisanja paketa"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles može biti navedena samo tokom instalacije paketa"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb može biti navedena samo tokom instalacije i brisanja paketa"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"opcije isključivanja skripte mogu biti navedene samo tokom instalacije i "
+"brisanja paketa"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"opcije isključivanja okidača mogu biti navedene samo tokom instalacije i "
+"brisanja paketa"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "nema zadatih paketa za brisanje"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "nema zadatih paketa za instalaciju"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "nema zadatih argumenata za upit"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "nema zadatih argumenata za proveru"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "potpiši paket(e) (istovetno sa --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "obriši potpise paketa"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Opcije potpisa:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Ne mogu da izvršim %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Morate postaviti „%%_gpg_name“ u makro datoteci\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Unesite lozinku: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Lozinka je dobra.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "koristi sledeći oblik upita"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -544,32 +607,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Izvršavam(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Izvršavanje %s nije uspelo (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Loš status izlaza iz %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -579,235 +647,315 @@ msgstr ""
 "\n"
 "Greške RPM pravljenja:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "sintaksna greška pri raščlanjivanju ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "sintaksna greška pri raščlanjivanju &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "sintaksna greška pri raščlanjivanju ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "greška raščlanjivanja u izrazu\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "neuparena (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- samo kod brojeva\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! samo kod brojeva\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "vrste se moraju poklapati\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / nije podržano za stringove\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- nije podržano za stringove\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& i || nisu podržani za stringove\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "sintaksna greška u izrazu\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Nedostaje „(“ u %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Nedostaje „)“ u %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Neispravan %s znak: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Nedostaje %s u %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Razmak koji nije prazan sledi %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Loša sintaksa: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Loša specifikacija režima: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Loša specifikacija režima direktorijuma: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Neispravna mogućnost: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Nije ugrađena podrška za mogućnost datoteke\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Datoteka mora početi sa „/“: %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "Nepoznat algoritam %u za sažimanje datoteka, vraćam se na MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Datoteka navedena dvaput: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Symlink tačke za BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Datoteka nije pronađena: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: ne mogu da učitam nepoznatu oznaku (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: neuspelo čitanje javnog ključa.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: javni ključ nije ojačan.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "neuspelo kreiranje direktorijuma"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Ispred datoteke je potrebno da stoji „/“: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Datoteka nije pronađena poklapanjem: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Ne mogu da otvorim %%files datoteku %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "red: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Datoteka nije pronađena poklapanjem: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Loša datoteka: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Loš vlasnik/grupa: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Proveravam za nezapakovane datoteke: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -816,548 +964,605 @@ msgstr ""
 "Pronađene su instalirane (ali nezapakovane) datoteke:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "Binarne datoteke zavisne od arhitekture u noarch paketu\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: red: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Nije moguće utvrditi naziv domaćina: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Ne mogu da upišem tovar u %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Ne mogu da pročitam tovar iz %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Nije moguće utvrditi naziv domaćina: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Nepoznata kompresija tovara: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Ne mogu da napravim nepromenljivu oblast zaglavlja.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Ne mogu da otvorim temp datoteku.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Ne mogu da upišem privremeno zaglavlje\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Neuspelo čitanje datoteke specifikacije iz %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Loši CSA podaci\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Ne mogu da ponovo učitam zaglavlje potpisa.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Ne mogu da otvorim %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Ne mogu da zapišem paket: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Ne mogu da otvorim sigtarget %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Ne mogu da pročitam zaglavlje iz %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Ne mogu da upišem zaglavlje u %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Zapisano: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Izvršavam „%s“:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Izvršavanje „%s“ nije uspelo.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Neuspela provera paketa „%s“.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Ne mogu da napravim ime izlazne datoteke za paket %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "ne mogu da napravim %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "red %d: drugi %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "%%changelog stavke moraju početi sa *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "nepotpuna %%changelog stavka\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "loš datum u %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog nije u opadajućem hronološkom redosledu\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "nedostaje ime u %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "nema opisa u %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "red %d: Greška pri tumačenju %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "red %d: Loša opcija %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "red %d: Previše imena: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "red %d: Paket ne postoji: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "red %d: Drugi opis\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "red %d: Greška pri tumačenju %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "red %d: Loš broj: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "red %d: Loš no%s broj: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "red %d: Loš %s broj: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d definisano više puta\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Arhitektura je izostavljena: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Arhitektura nije uvrštena: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS je izostavljen: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS nije uvršten: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "%s polje mora biti prisutno u paketu: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Udvojene %s stavke u paketu: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Ne mogu da otvorim ikonu %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Ne mogu da pročitam ikonu %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Nepoznata vrsta ikone: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "red %d: Oznaka prihvata samo jedan žeton: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "red %d: Loše oblikovana oznaka: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "red %d: Prazna oznaka: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "red %d: Prefiksi se ne smeju završavati sa „/“: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "red %d: Docdir mora početi sa „/“: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "red %d: Polje epohe mora biti broj bez predznaka: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "red %d: Loši %s: kvalifikatori: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "red %d: Loš oblik za BuildArchitecture: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "red %d: Samo noarch podpaketi su podržani: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Interna greška: Lažna oznaka %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Loša specifikacija paketa: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Paket već postoji: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "red %d: Nepoznata oznaka: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} ne može biti prazno\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} ne može biti „/“\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Loš izvor: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Nema zakrpe broj %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch bez odgovarajuće „Patch:“ oznake\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Nema izvora broj %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "Nema oznake „Source:“ u datoteci specifikacije\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Greška u tumačenju %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "red %d: Loš argument za %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "red %d: Loša %%setup opcija %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Neispravan broj zakrpe %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "red %d: drugi %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "red %d: okidači moraju imati --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "red %d: Greška pri tumačenju %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "red %d: interna skripta se mora završiti sa „>“: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "red %d: skripta programa mora početi sa „/“: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "red %d: Drugi %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "red %d: nepodržana interna skripta: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "red %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Ne mogu da otvorim %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: Dobio %%else bez %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: Dobio %%endif bez %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Nisu pronađene usaglašene arhitekture za pravljenje\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Paket nema %%description: %s\n"
@@ -1428,450 +1633,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Ne mogu da napravim cev za %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Ne mogu da izvršim %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Ne mogu da odvojim %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Prebacivanje %s u dugi ceo broj nije uspelo.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) nije uspelo: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load nije uspelo: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Prepoznavanje datoteke „%s“ nije uspelo: režim %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Pronalazak %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Neuspelo traženje %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "upit na datotekom specifikacije %s nije uspeo, ne mogu da protumačim\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(greška 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Loš magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Loše/nečitljivo  zaglavlje"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "nije prepoznata opcija baze podataka: „%s“ zanemareno.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Prevelika veličina zaglavlja"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s ima nepravilnu brojčanu vrednost, preskočeno\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s ima preveliku ili premalu long vrednost, preskočeno\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s ima preveliku ili premalu celobrojnu vrednost, preskočeno\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "ne mogu da dobijem %s katanac na %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "deljeno"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "ekskluzivno"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Nepoznata vrsta datoteke"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "greška(%d) pri skladištenju sloga „%s“ u %s\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Nedostaje čvrsta veza"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "greška(%d) pri uklanjanju sloga „%s“ iz %s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Interna greška"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Datoteka arhive nije u zaglavlju"
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "greška(%d) pri zauzimanju novog primerka paketa\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " neuspelo - "
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s je Delta RPM i ne može se direktno instalirati\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Nepodržan teret (%s) u paketu %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "paket %s je već dodat, preskačem %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "paket %s je već dodat, zamenjujem sa %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(nije blob)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(nije broj)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr ""
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(neispravna vrsta)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(nije base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(neispravna vrsta)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(nije blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(neispravna xml vrsta)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(nije OpenPGP potpis)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "korisnik %s ne postoji - koristim root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "grupa %s ne postoji - koristim root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s sačuvano kao %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s napravljeno kao %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "oznaka[%d]: LOŠE, oznaka %d vrsta %d pomeraj %d broj %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: LOŠE, nije heksadekadno\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: LOŠE, nije binarno\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: LOŠE, nije binarno\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "blob veličina (%d): LOŠE, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "pomeraj regiona: LOŠE, oznaka %d vrsta %d pomeraj %d broj %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "repni region: LOŠE, oznaka %d vrsta %d pomeraj %d broj %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "veličina regiona: LOŠE, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr size(%d): LOŠE, čitam vraćeno %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic: LOŠE\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr tags: LOŠE, broj oznaka(%d) je van dometa\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hdr data: LOŠE, broj bajtova(%d) je van dometa\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hdr blob(%zd): LOŠE, čitam vraćeno %d\n"
+msgid "missing } after %%{"
+msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "hdr load: LOŠE\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "prazan oblik oznake"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature nije uspelo: %s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "prazno ime oznake"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Nema potpisa na raspolaganju\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead nije uspelo: %s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] očekivan na kraju niza"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "neočekivan ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "neočekivan }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? očekivan u izrazu"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ očekivano posle ? u izrazu"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} očekivan u izrazu"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": očekivan nakon ? podizraza"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ očekivano posle : u izrazu"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| očekivan na kraju izraza"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "pokazivač niza korišćen sa nizovima različitih veličina"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread nije uspelo: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "unapred definisani MACRO sa vrednošću EXPR"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "„MACRO EXPR“"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "definiše MACRO sa vrednošću EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "ispiši makro proširenje za EXPR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "„EXPR“"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "čitaj <FILE:...> umesto podrazumevanih datoteka"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FILE:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "nemoj proveravati sažetak(e) paketa"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "nemoj proveravati zaglavlje(a) baze podataka po dobavljanju"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "nemoj proveravati potpis(e) paketa"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "pošalji stdout ka CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "koristi ROOT kao direktorijum najvišeg nivoa"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "prikaži oznake poznatih upita"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "prikaži konačnu konfiguraciju za rpmrc i macro"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "pruža manje detaljan izlaz"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "pruža detaljniji izlaz"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "napiši koja se rpm verzija koristi"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "otkloni greške u mašini stanja datoteke tovara"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "otkloni greške za rpmio U/I"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: tabela opcija nije dobro podešena (%d)\n"
@@ -1892,13 +2208,13 @@ msgstr "premeštanja moraju sadržati ="
 msgid "relocations must have a / following the ="
 msgstr "premeštanja moraju imati / nakon ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "instaliraj sve datoteke, čak i podešavanja koja bi inače mogla biti "
 "preskočena"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1906,521 +2222,569 @@ msgstr ""
 "ukloni sve pakete koji odgovaraju <package> (obično se prijavljuje greška "
 "ako <package> određuje više paketa)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "premesti datoteke u paketu koji se ne može premestiti"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "štampaj petlje zavisnosti kao upozorenje"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "izbriši (deinstaliraj) paket"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<package>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "nemoj instalirati datoteke podešavanja"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "nemoj da instaliraš dokumentaciju"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "preskoči datoteke koje sadrže komponentu <path> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<path>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "skraćenica za --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "nadgradi pakete ako su već instalirani"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<packagefile>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "ispisuj znak tarabe dok se paket instalira (dobro uz -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "nemoj proveravati arhitekturu paketa"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "nemoj proveravati operativni sistem paketa"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "nemoj proveravati prostor na disku pre instalacije"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "instaliraj dokumentaciju"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "instaliraj paket(e)"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "ažuriraj bazu podataka, ali nemoj menjati sistem datoteka"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "nemoj proveravati zavisnosti paketa"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "nemoj instalirati bezbednosne kontekste datoteka"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 "nemoj preuređivati redosled instalacije paketa radi zadovoljavanja zavisnosti"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "nemoj izvršiti skripticu(e) paketa"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "nemoj izvršiti %%pre skripticu (ako postoji)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "nemoj izvršiti %%post skripticu (ako postoji)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "nemoj izvršiti %%preun skripticu (ako postoji)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "nemoj izvršiti %%postun skripticu (ako postoji)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "nemoj izvršiti nijednu skripticu(e) koju aktivira ovaj paket"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "nemoj izvršiti nijednu %%triggerprein skripticu(e)"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "nemoj izvršiti nijednu %%triggerin skripticu(e)"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "nemoj izvršiti nijednu %%triggerun skripticu(e)"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "nemoj izvršiti nijednu %%triggerpostun skripticu(e)"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 "nadgradi na staru verziju paketa (--force kod nadgradnje ovo radi samostalno)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "ispisuj procente dok se paket instalira"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "premesti paket u <dir>, ako se može premestiti"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "premesti datoteke iz putanje <old> u <new>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<old>=<new>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "zanemari sukobe datoteka između paketa"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "ponovo instaliraj ako je paket već prisutan"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "nemoj instalirati, ali reci da li bi radilo ili ne"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "nadgradi paket(e)"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "ispitaj/proveri sve pakete"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "rpm checksig režim"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "ispitaj/proveri paket(e) koje poseduju datoteku"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "ispitaj/proveri paket(e) u grupi"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "ispitaj/proveri datoteku paketa"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "ispitaj/proveri paket(e) sa identifikatorom paketa"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "ispitaj/proveri paket(e) sa identifikatorom zaglavlja"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "režim rpm upita"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "ispitaj/proveri instancu zaglavlja"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "ispitaj/proveri paket(e) iz transakcije instalacije"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "ispitaj paket(e) koje je aktivirao ovaj paket"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "režim rpm provere"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "ispitaj/proveri paket(e) koji zahtevaju zavisnosti"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "ispitaj/proveri paket(e) koji pružaju zavisnosti"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "nemoj preklapati argumente"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "nemoj obrađivati datoteke koje nisu paketi kao manifeste"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "ispiši sve datoteke podešavanja"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "ispiši sve datoteke dokumentacije"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "ispiši sve datoteke dokumentacije"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "ispiši sve datoteke podešavanja"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "izbaci osnovne podatke o datoteci"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "ispiši datoteke u paketu"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "preskoči %%ghost datoteke"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "preskoči %%ghost datoteke"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "prikaži stanja navedenih datoteka"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "nemoj proveravati veličinu datoteka"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "nemoj proveravati putanje simboličkih veza datoteka"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "nemoj proveravati vlasnika datoteka"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "nemoj proveravati grupu datoteka"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "nemoj proveravati vreme menjanja datoteka"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "nemoj proveravati režim pristupa datoteka"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "nemoj proveravati mogućnosti datoteka"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "nemoj proveravati bezbednosne kontekste datoteka"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "nemoj proveravati mogućnosti datoteka"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "nemoj proveravati datoteke u paketu"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "nemoj proveravati zavisnosti paketa"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "nemoj izvršiti skriptu(e) provere"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "očekivan je izvorni paket, pronađen je binarni\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "izvorni paket ne sadrži .spec datoteku\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "raspakivanje arhive nije uspelo %s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " na datoteci "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s nije uspelo kod datoteke %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s nije uspelo: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "neispravan oblik: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(ne sadrži datoteke)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normalno        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "zamenjeno      "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "nije instaliran "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "deljeno na mreži    "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "pogrešna boja   "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(bez stanja)    "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(nepoznat %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "paket nema spiskove vlasnika/grupe datoteka\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "paket nema spiskove niti vlasnika ni id datoteka\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "grupa %s ne sadrži nijedan paket\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "nijedan paket ne aktivira %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "loše oblikovan %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "nijedan paket ne odgovara %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "nijedan paket ne zahteva %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "nijedan paket ne pruža %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "datoteka %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "datoteka %s ne pripada nijednom paketu\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "neispravan broj paketa: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "paket %s nije instaliran\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "nepoznata oznaka: „%s“\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: uvozno čitanje nije uspelo(%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
-"%s: Nepromenjiva regija zaglavlja se ne može iščitati. Oštećen paket?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "NIJE UREDU"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "UREDU"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (NEDOSTAJUĆI KLJUČEVI:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (NEPOUZDANI KLJUČEVI:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: otvaranje nije uspelo: %s\n"
@@ -2445,214 +2809,445 @@ msgstr "Ne mogu da promenim korenski direktorijum: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "nije postavljen dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: preskačem"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "greška(%d) pri zapisivanju sloga #%d u %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec nije uspeo: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp nije uspeo: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: preskačem"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: oštećeno zaglavlje #%u vraćeno -- preskačem.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: ne mogu da pročitam zaglavlje na 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "nije postavljen dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "neuspelo kreiranje direktorijuma %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "zaglavlje #%u u bazi podatak je loše -- preskačem.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "ne mogu da dodam slog prvobitno na %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"neuspelo ponovno pravljenje baze podataka: osnovna baza podataka je ostala "
+"na mestu\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "neuspela zamena stare baze podataka sa novom bazom podataka!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NE "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "DA"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr "Neophodne:, Obezbeđene:, i Zastarele: verzije podrške zavisnosti."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 "ime(na) datoteke sačuvano kao (nazivDirektorijuma,osnovnoIme,"
 "indeksDirektorijuma) par, ne kao putanja."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "tovar paketa može biti komprimovan koristeći bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr "tovar paketa može biti komprimovan koristeći lzma."
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "datoteka(e) tovara paketa ima prefiks „./“."
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "datoteka(e) tovara paketa ima prefiks „./“."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "naziv paketa-verzija-izdanje nije implicitno navedeno."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "oznake zaglavlja se uvek sortiraju nakon učitavanja."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "prevodilac skriptice može koristiti argumente zaglavlja."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "datoteka čvrste veze može biti instalirana iako nije potpuna."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr "skriptica paketa može pristupiti rpm bazi podataka tokom instalacije."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "unutrašnja podrška za skripte lua."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "podrška za POSIX.1e mogućnosti datoteka"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "naziv paketa-verzija-izdanje nije implicitno navedeno."
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Loš magic"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "oznake zaglavlja se uvek sortiraju nakon učitavanja."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Loše/nečitljivo  zaglavlje"
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "prevodilac skriptice može koristiti argumente zaglavlja."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Prevelika veličina zaglavlja"
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "datoteka čvrste veze može biti instalirana iako nije potpuna."
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr "skriptica paketa može pristupiti rpm bazi podataka tokom instalacije."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Nepoznata vrsta datoteke"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "unutrašnja podrška za skripte lua."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "podrška za POSIX.1e mogućnosti datoteka"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Interna greška"
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Datoteka arhive nije u zaglavlju"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " neuspelo - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "otvaranje %s nije uspelo: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: nije rpm paket (ili manifest paketa)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Pripremam..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Neuspele zavisnosti:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: nije rpm paket (ili manifest paketa): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s se ne može instalirati\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Pribavljam %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "preskačem %s - neuspeo prenos\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "paket %s se ne može premeštati\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "greška pri čitanju iz datoteke %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "„%s“ određuje više paketa:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "ne mogu da otvorim %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Instaliram %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "nije rpm paket"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "nepravilan tip potpisa"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "nepodržana verzija RPM paketa"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "neuspelo čitanje: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr ""
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "različito"
@@ -2727,798 +3322,633 @@ msgstr ""
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "nepoznata greška %d se desila u toku rukovanja paketom %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "nedostaje drugo „:“ kod %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "nedostaje ime arhitekture na %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Nepotpun red podataka na %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Previše argumenata u redu podataka na %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Loš broj arhitekture/os-a: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Nepotpun podrazumevani red na %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Premalo argumenata u podrazumevanom redu na %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "nedostaje „:“ (pronađeno 0x%02x) kod %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "nedostaje argument za %s na %s:%d\n"
 
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr "ne mogu da otvorim %s na %s:%d: %m\n"
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "nedostaje arhitektura za %s na %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "loša opcija „%s“ kod %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Nepoznati sistem: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Molim vas kontaktirajte %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Ne mogu da otvorim %s za čitanje: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "nije ugrađena podrška <lua> skriptica\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Ne mogu da napravim privremenu datoteku za %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Ne mogu da udvojim opisnika datoteke: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "%s skriptica nije uspela, waitpid(%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s skriptica nije uspela, signal %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "%s skriptica nije uspela, izlazni status %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Nepoznat oblik"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "ne mogu da otvorim Packages bazu podataka u %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "suvišna „(“ u oznaci paketa: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "nedostaje „(“ u oznaci paketa: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "nedostaje „)“ u oznaci paketa: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: neuspelo čitanje javnog ključa.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh veličina(%d): LOŠE, čitanje vraćeno %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic: LOŠE\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh oznake: LOŠE, broj oznaka(%d) je van dometa\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh podaci: LOŠE, broj  bajtova(%d) je van dometa\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d): LOŠE, čitanje vraćeno %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh oznaka[%d]: LOŠE, oznaka %d vrsta %d pomeraj %d broj %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh učitavanje: LOŠE\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sigh podloška(%zd): LOŠE, čitam %zd bajtova\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd): LOŠE, fstat(2) nije uspeo\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "Nepromenjiva regija zaglavlja se ne može iščitati. Oštećen paket?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5 sažetak:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "SHA1 sažetak zaglavlja:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Zaglavlje "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "nedostaje   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Nezadovoljene zavisnosti za %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "nedostaje { posle %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "nedostaje } posle %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "prazan oblik oznake"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "prazno ime oznake"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "nepoznata oznaka"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] očekivan na kraju niza"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "neočekivan ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "neočekivan }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? očekivan u izrazu"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ očekivano posle ? u izrazu"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} očekivan u izrazu"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": očekivan nakon ? podizraza"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ očekivano posle : u izrazu"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| očekivan na kraju izraza"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "pokazivač niza korišćen sa nizovima različitih veličina"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "ne mogu da otvorim %s indeks koristeći db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "nije postavljen dbpath\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: preskačem"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "greška(%d) pri zapisivanju sloga #%d u %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec nije uspeo: %s\n"
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp nije uspeo: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: preskačem"
-
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:551
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: oštećeno zaglavlje #%u vraćeno -- preskačem.\n"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "ne mogu da otvorim %s na %s:%d: %m\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "nedostaje arhitektura za %s na %s:%d\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr ""
+msgid "bad option '%s' at %s:%d\n"
+msgstr "loša opcija „%s“ kod %s:%d\n"
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: ne mogu da pročitam zaglavlje na 0x%x\n"
+msgid "Unknown system: %s\n"
+msgstr "Nepoznati sistem: %s\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "greška(%d) pri postavljanju „%s“ slogova iz %s indeksa\n"
+msgid "Please contact %s\n"
+msgstr "Molim vas kontaktirajte %s\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "greška(%d) pri skladištenju sloga „%s“ u %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Ne mogu da otvorim %s za čitanje: %m.\n"
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "greška(%d) pri uklanjanju sloga „%s“ iz %s\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
+
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "greška(%d) pri zauzimanju novog primerka paketa\n"
+msgid "Unable to restore current directory: %m"
+msgstr ""
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "nije ugrađena podrška <lua> skriptica\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "greška(%d) pri dobavljanju „%s“ slogova iz %s indeksa\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Ne mogu da napravim privremenu datoteku za %s: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "greška(%d) pri zapisivanju sloga %s u %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Ne mogu da udvojim opisnika datoteke: %s: %s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "nije postavljen dbpath"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "neuspelo kreiranje direktorijuma %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s skriptica nije uspela, waitpid(%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "zaglavlje #%u u bazi podatak je loše -- preskačem.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s skriptica nije uspela, signal %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "ne mogu da dodam slog prvobitno na %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s skriptica nije uspela, izlazni status %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Nepoznat oblik"
+
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
-"neuspelo ponovno pravljenje baze podataka: osnovna baza podataka je ostala "
-"na mestu\n"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "neuspela zamena stare baze podataka sa novom bazom podataka!\n"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:100
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "zameni datoteke u %s sa datotekama iz %s da vratiš u prethodno stanje"
+msgid "cannot open Packages database in %s\n"
+msgstr "ne mogu da otvorim Packages bazu podataka u %s\n"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:199
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "neuspelo uklanjanje direktorijuma %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "suvišna „(“ u oznaci paketa: %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "baza podataka%d greška(%d) iz %s: %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "nedostaje „(“ u oznaci paketa: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:225
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "baza podataka%d graška(%d): %s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "nedostaje „)“ u oznaci paketa: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "ne mogu da dobijem %s katanac na %s/%s\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "deljeno"
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "ekskluzivno"
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: neuspelo čitanje javnog ključa.\n"
 
-#: lib/backend/db3.c:582
-#, c-format
-msgid "invalid index type %x on %s/%s\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:152
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "nije prepoznata opcija baze podataka: „%s“ zanemareno.\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:158
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s ima nepravilnu brojčanu vrednost, preskočeno\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s ima preveliku ili premalu long vrednost, preskočeno\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s ima preveliku ili premalu celobrojnu vrednost, preskočeno\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:195
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:268
+#, c-format
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Zaglavlje "
+
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Ne mogu da ponovo učitam zaglavlje potpisa.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "nedostaje   %c %s"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Nezadovoljene zavisnosti za %s:\n"
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktivno %d prazno %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
+
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(prazno)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(prazno)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Makro %%%s ima nezavršeno telo\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Makro %%%s ima nezavršene opcije\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Makro %%%s ima nepravilno ime (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Makro %%%s ima nezavršeno telo\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Makro %%%s ima nezavršene opcije\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Makro %%%s ima prazno telo\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Makro %%%s nije mogao da se proširi\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Makro %%%s ima nepravilno ime (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Makro %%%s (%s) nije korišćen ispod nivoa %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Nepoznata opcija %c u %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Neograničeno %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "%% je praćena sa makroom koga nije moguće raščlaniti\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktivno %d prazno %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "greška pri pravljenju privremene datoteke %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Datoteka %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Datoteka %s je manja od %u bajtova\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "neuspelo kreiranje direktorijuma"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr ""
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(bez greške)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "kobna greška: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "greška: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "upozorenje: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "nepravilna sintaksa u lua skriptici: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "nepravilna sintaksa u lua skripti: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "lua skripta nije uspela: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "nepravilna sintaksa u lua datoteci: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "lua udica nije uspela: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "alokacija memorije (%u bajta) je vratila NAL.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(bez greške)"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "kobna greška: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "greška: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "upozorenje: "
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "alokacija memorije (%u bajta) je vratila NAL.\n"
+msgid "error creating fifo %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite nije uspelo: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread nije uspelo: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush nije uspelo: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Ne mogu da izvršim %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Ne mogu da napravim cev za potpisivanje: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "neuspelo gpg izvršavanje (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg nije uspeo da zapiše potpis\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "ne mogu da pročitam potpis\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp nije uspelo\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead nije uspelo: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature nije uspelo: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature nije uspelo: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead nije uspelo: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: neuspelo čitanje manifesta: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "nemoj proveravati potpis zaglavlja+tovara"
index d318714de594d88b2a6cae32de8a9d4f89a26c64..cfdb9335757c8ad3596eca8edf8ef7445539f11b 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -3,17 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Göran Uddeborg <goeran@uddeborg.se>, 2011.
-# Göran Uddeborg <goeran@uddeborg.se>, 2004, 2007-2009, 2011.
+# Göran Uddeborg <goeran@uddeborg.se>, 2011,2013,2015
+# Göran Uddeborg <goeran@uddeborg.se>, 2011,2013,2015
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Swedish (http://www.transifex.com/projects/p/rpm/language/"
-"sv/)\n"
+"Language-Team: Swedish (http://www.transifex.com/rpm-team/rpm/language/sv/)\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,500 +45,563 @@ msgstr "Detta program kan distribueras fritt enligt villkoren i GNU GPL\n"
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "misslyckades att skapa rör för --pipe: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "exec misslyckades\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "argumentet är inte ett RPM-paket\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "fel vid läsning av pakethuvud\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "kan inte återöppna lasten: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Flaggor för att fråga/kontrollera paket:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Frågeflaggor (med -q eller --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Verifieringsflaggor (med -V eller --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Installations-/Uppdaterings-/Raderingsflaggor"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Gemensamma flaggor för alla rpm-lägen och binärer:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "endast en typ av fråga/verifiering kan utföras åt gången"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "oväntade frågeflaggor"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "oväntat frågeformat"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "oväntad frågekälla"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "enbart ett huvudläge kan anges"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "bara installation och uppgradering kan tvingas fram"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "filer kan relokeras endast under paketinstallation"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "kan inte använda --prefix med --relocate eller --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate och --excludepath kan endast användas när nya paket installeras"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix kan endast användas när nya paket installeras"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "argument till --prefix måste börja med /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs kan enbart användas vid paketinstallation"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs kan enbart användas vid paketinstallation"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs kan enbart användas vid paketinstallation"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "enbart en av --excludedocs och --includedocs kan användas"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch kan enbart användas vid paketinstallation"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos kan enbart användas vid paketinstallation"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize kan enbart användas vid paketinstallation"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches kan enbart användas när paket raderas"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles kan enbart användas vid paketinstallation"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb kan enbart användas när paket installeras eller raderas"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"skriptinaktiveringsflaggor kan enbart användas när paket installeras eller "
-"raderas"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"utlösarinaktiveringsflaggor kan enbart användas när paket installeras eller "
-"raderas"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-"--nodeps kan enbart användas vid paketinstallation, -radering och -"
-"verifikation"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr "--test kan enbart användas vid paketinstallation och -radering"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "argument till --root (-r) måste börja med /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "inga paket angivna att radera"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "inga paket angivna för installation"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "inga parametrar angivna för fråga"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "inga parametrar angivna för verifiering"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot redan angivet, ignorerar %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "bygg till %prep (packa upp källkod samt applicera patchar) från <specfil>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specfil>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "bygg till och med %build (%prep, kompilera sedan) från <specfil>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "bygg till och med %install (%prep, %build, installera sedan) från <specfil>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "verifiera %files-sektionen i <specfil>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "bygg käll- och binärpaket från <specfil>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "bygg endast binärpaket från <specfil>"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "bygg endast källpaket från <specfil>"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+"bygg till %prep (packa upp källkod samt applicera patchar) från <källpaket>"
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<källpaket>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr "bygg till och med %build (%prep, kompilera sedan) från <källpaket>"
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"bygg till och med %install (%prep, %build, installera sedan) från <källpaket>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr "verifiera %files-sektionen från <källpaket>"
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr "bygg käll- och binärpaket från <källpaket>"
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr "bygg endast binärpaket från <källpaket>"
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr "bygg endast källpaket från <källpaket>"
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "bygg till och med %prep (packa upp källkod samt applicera patchar) från <tar-"
 "arkiv>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tar-arkiv>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "bygg till och med %build (%prep, kompilera sedan) från <tar-arkiv>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "bygg till och med %install (%prep, %build, installera sedan) från <tar-arkiv>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "verifiera %files-sektionen från <tar-arkiv>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "bygg käll- och binärpaket från <tar-arkiv>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "bygg endast binärpaket från <tar-arkiv>"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "bygg endast källpaket från <tar-arkiv>"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "bygg binärpaket från <källpaket>"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<källpaket>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"bygg till och med %install (%prep, %build, installera sedan) från <källpaket>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "åsidosätt byggrot"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr "kör bygget i aktuell katalog"
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "ta bort byggträd efteråt"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ignorera ExcludeArch:-direktiv från specfil"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "felsök filtillståndsmaskin"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "utför inga steg i byggnationen"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "verifiera inte byggberoenden"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr "generera pakethuvd(en) kompatibla med (äldre) rpm-v3-paketering"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
-msgstr ""
+msgstr "utför inte %clean-steget i byggnationen"
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr "utför inte %prep-steget i byggnationen"
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
-msgstr ""
+msgstr "utför inte %check-steget i byggnationen"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
-msgstr "acceptera inte översatta ”msgstr” från specfilen"
+msgstr "acceptera inte i18N-msgstr:er från specfilen"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "ta bort källkod efteråt"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "ta bort specfil efteråt"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "gå direkt till angivet steg (endast för c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "åsidosätt målplattform"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "Byggflaggor med [ <specfil> | <tar-arkiv> | <källpaket> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Gemensamma flaggor för alla rpm-lägen och binärer:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Ouppfyllda byggberoenden:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Kan inte öppna specfilen %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Kunde inte öppna ”tar”-rör: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr "Hittade mer än en spec-fil i %s\n"
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Kunde inte läsa specfil från %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Kunde inte byta namn på %s till %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "kunde inte ta status på %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Filen %s är inte en vanlig fil.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Filen %s tycks inte vara en specfil.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Bygger målplattformar: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Bygger för målet %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "argument till --root (-r) måste börja med /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "initiera databas"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr "bygg om databasens inverterade listor från installerade pakets huvuden"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "verifiera databasfiler"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr "exportera databasen till standard ut huvudlista"
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr "importera databasen från standard in huvudlista"
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Databasflaggor:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "enbart ett huvudläge kan anges"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "verifiera paketsignatur(er)"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "importera en publik nyckel med skal"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
-msgstr ""
+msgstr "importera inte, men tala om ifall det skulle fungera eller inte"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "lista nycklar från RPM-nyckelringen"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Nyckelringsflaggor:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "inga argument angivna"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Flaggor för att fråga/kontrollera paket:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Frågeflaggor (med -q eller --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Verifieringsflaggor (med -V eller --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Installations-/Uppdaterings-/Raderingsflaggor:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "endast en typ av fråga/verifiering kan utföras åt gången"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "oväntade frågeflaggor"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "oväntat frågeformat"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "oväntad frågekälla"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "bara installation och uppgradering kan tvingas fram"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "filer kan relokeras endast under paketinstallation"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "kan inte använda --prefix med --relocate eller --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate och --excludepath kan endast användas när nya paket installeras"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix kan endast användas när nya paket installeras"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "argument till --prefix måste börja med /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr "--hash (-h) kan enbart användas vid paketinstallation och -radering"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr "--percent kan enbart användas vid paketinstallation och -radering"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs kan enbart användas vid paketinstallation"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs kan enbart användas vid paketinstallation"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs kan enbart användas vid paketinstallation"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "enbart en av --excludedocs och --includedocs kan användas"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch kan enbart användas vid paketinstallation"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos kan enbart användas vid paketinstallation"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize kan enbart användas vid paketinstallation"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches kan enbart användas när paket raderas"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles kan enbart användas vid paketinstallation"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb kan enbart användas när paket installeras eller raderas"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"skriptinaktiveringsflaggor kan enbart användas när paket installeras eller "
+"raderas"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"utlösarinaktiveringsflaggor kan enbart användas när paket installeras eller "
+"raderas"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps kan enbart användas vid paketinstallation, -radering och -"
+"verifikation"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr "--test kan enbart användas vid paketinstallation och -radering"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "inga paket angivna att radera"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "inga paket angivna för installation"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "inga parametrar angivna för fråga"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "inga parametrar angivna för verifiering"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr "signera paket"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "signera paket (detsamma som --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "tag bort paketsignaturer"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Signaturflaggor:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Kunde inte köra %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Du måste sätta ”%%_gpg_name” i din makrofil\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Ange lösenfras: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Lösenfrasen är ok.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr "Kontrollen av lösenfrasen misslyckades eller gpg-nyckeln har gått ut\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr "tolka spec-fil(er) till standard ut"
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr "fråga spec-fil(er)"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr "arbeta på binära rpm:er som genereras av spec (standard)"
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr "arbeta på käll-rpm genererad av spec"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "använd följande frågeformat"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "Spec-flaggor:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr "inga parametrar angivna för tolkning"
 
@@ -548,32 +610,37 @@ msgstr "inga parametrar angivna för tolkning"
 msgid "Unable to open temp file: %s\n"
 msgstr "Kan inte öppna temporär fil: %s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr "Kan inte öppna ström: %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Kör(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Körning (exec) av %s misslyckades (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr "Fel vid körning av skript %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Dålig slutstatus från %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -583,235 +650,315 @@ msgstr ""
 "\n"
 "RPM-byggfel:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "syntaxfel vid tolkning av ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "syntaxfel vid tolkning av &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "syntaxfel vid tolkning av ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "tolkningsfel i uttryck\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "ensam (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- endast i tal\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! endast på tal\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "typer måste passa ihop\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / stöds inte för strängar\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- stöds inte för strängar\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& och || stöds inte för strängar\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "syntaxfel i uttryck\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "”(” saknas i %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "”)” saknas i %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Ogiltigt %s-element: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "%s saknas i %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "Annat än blanktecken följer på %s(): %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Felaktig syntax: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Felaktig rättighetsspecifikation: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Felaktig specifikation av katalogrättigheter: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr "Ovanlig lokallängd: ”%s” i %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr "Duplicerad lokal %s i %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Ogiltig förmåga (capability): %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Stöd för filförmågor (capability) är inte inbyggt\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Filnamn måste börja med ”/”: %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "Okänd filkontrollsummealgoritm %u, faller tillbaka på MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Filen uppräknad två gånger: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "läsning av symlänk %s misslyckades: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Symbolisk länk pekar på BuildRoot: %s → %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "Sökvägen är utanför buildroot: %s\n"
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "Katalogen hittades inte: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Filen hittades inte: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Inte en katalog: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: kan inte läsa okänd tagg (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: läsning av publik nyckel misslyckades.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: inte en publik nyckel med skal.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: misslyckades att koda\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "misslyckades att skapa katalog"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Filen behöver inledande ”/”: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "%%dev-matchning inte tillåten: %s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "Hittade ingen katalog vid matchningen: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
-#, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Hittade ingen fil vid matchningen: %s\n"
+#: build/files.c:2136
+#, c-format
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Kunde inte öppna %%files-fil %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "rad: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr "Tom %%files-fil %s\n"
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "Fel vid läsning av %%files-fil %s: %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
+msgstr "ogiltigt _docdir_fmt: %s: %s\n"
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Hittade ingen fil vid matchningen: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
-msgstr ""
+msgstr "Kan inte blanda special %s med andra former: %s\n"
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
+msgstr "Mer än en fil på en rad: %s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Felaktig fil: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Felaktig ägare/grupp: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Letar efter opackade fil(er): %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -820,548 +967,605 @@ msgstr ""
 "Installerade (men opaketerade) filer funna:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Bearberar filer: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
-msgstr ""
+msgstr "Binärers arkitektur (%d) matchar inte paketarkitekturen (%d).\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "Arkitekturberoende binärfiler i noarch-paket\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
-msgstr ""
+msgstr "misslyckades skapa arkiv vid filen %s: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
-msgstr ""
+msgstr "misslyckades skapa arkiv: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "Kunde inte öppna %s-fil: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: rad: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Kunde inte kanonisera värdnamn: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Kan inte skriva last till %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Kan inte läsa last från %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Kunde inte kanonisera värdnamn: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Okänd lastkomprimering: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Kan inte skapa oföränderlig huvudregion.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Kan inte öppna temporär fil.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr "Kunde inte söka i filen %s: %s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Kan inte skriva temporärhuvud\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Misslyckades med att läsa policyfil: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Felaktig CSA-data\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Kan inte läsa om signaturhuvud.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Kunde inte öppna %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Kunde inte skriva paket: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Kan inte läsa signaturen %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Kan inte läsa huvud från %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Kan inte skriva huvud till %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Skrev: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Kör ”%s”:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Körning av ”%s” misslyckades.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Paketkontroll ”%s” misslyckades.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Kunde inte generera utfilnamn för paketet %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "kan inte skapa %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "rad %d: andra %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
-msgstr ""
+msgstr "felaktigt datum i %%changelog: %s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "%%changelog-poster måste starta med *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "ofullständig %%changelog-post\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "felaktigt datum i %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog är inte i fallande kronologisk ordning\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "saknat namn i %%changelog\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "ingen beskrivning i %%changelog\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "rad %d: andra %%changelog\n"
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "rad %d: Fel i tolkning av %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "rad %d: otillåten flagga %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "rad %d: För många namn: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "rad %d: Paketet existerar inte: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "rad %d: En andra beskrivning\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "rad %d: Fel i tolkning av %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr "rad %d: Fel vid tolkning av %%policies: %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr "Fel vid tolkning av taggfält: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "rad %d: Felaktigt nummer: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "rad %d: Felaktigt no%s-nummer: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "rad %d: Felaktigt %s-tal: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d definierat flera gånger\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "Hämtar %s till %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "Kunde inte hämta %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Arkitekturen är utesluten: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Arkitekturen är inte medtagen: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS är uteslutet: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS är inte medtaget: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "%s-fält måste finnas med i paketet: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Dubbla %s-poster i paketet: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Kan inte öppna ikon %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Kan inte läsa ikon %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Okänd ikontyp: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "rad %d: Taggen tar endast ett värde: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "rad %d: Otillåtet tecken ”%c” i: %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr "rad %d: %s i: %s\n"
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "rad %d: Otillåtet tecken i: %s\n"
+msgid "%s in: %s\n"
+msgstr "%s i: %s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "rad %d: Otillåten sekvens ”..” i: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr "Otillåtet tecken ”%c” (0x%x)"
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr "Otillåten sekvens ”..”"
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "rad %d: Felaktig tagg: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "rad %d: Tom tagg: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "rad %d: Prefix får inte sluta med ”/”: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "rad %d: Docdir måste börja med ”/”: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "rad %d: Epoch-fält måste vara ett teckenlöst tal: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "rad %d: Felaktigt %s: bestämningar: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "rad %d: Felaktigt BuildArchitecture-format: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "rad %d: Endast noarch-underpaket stöds: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Internt fel: felaktig tagg %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "rad %d: %s är föråldrad: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Felaktig paketangivelse %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Paketet existerar redan: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "rad %d: Okänd tagg: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} fick inte vara tom\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} kan inte vara ”/”\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Dålig källa: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Inget patch-nummer %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch utan motsvarande ”Patch:”-tagg\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Inget källkodsnummer %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "Ingen ”Source:”-tagg i spec-filen\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Fel i tolkning av %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "rad %d: Felaktigt argument till %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "rad %d: Felaktig %%setup-flagga %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Felaktigt patch-nummer %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "rad %d: andra %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr "Beroenden måste börja alfanumeriskt, med ”_” eller med ”/”"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr "Filnamn med version inte tillåtet"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "Version krävs"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr "Inga rika beroenden tillåtna för denna typ"
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "ogiltigt beroende"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "Version krävs"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr "Endast absoluta sökvägar är tillåtna i filutlösare"
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr "En utlösare startad av samma paket är redan definierad i spec-filen"
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr "rad %d: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "rad %d: utlösare måste ha --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "rad %d: Fel vid tolkning av %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "rad %d: internt skript måste sluta med ”>”: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "rad %d: skriptprogram måste börja med ”/”: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr "rad %d: prioriteter är endast tillåta för filutlösare: %s\n"
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "rad %d: En andra %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "rad %d: ej stött internt skript: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr "rad %d: argument till tolken tillåts inte i utlösare: %s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "rad %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr "Makro expanderat i kommentar på rad %d: %s\n"
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Kan inte öppna %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr "%s:%d: Argument förväntades för %s\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
-msgstr ""
+msgstr "rad %d: Oavslutat %%if\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr "rad %d: oavslutat makro eller felaktig fortsättning på rad\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr "%s:%d: felaktigt %%if-villkor\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: Fick ett %%else utan något %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: Fick ett %%endif utan något %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
+msgstr "%s:%d: felformaterad %%include-sats\n"
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr "kodningen %s stödjs inte av systemet\n"
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr "Paketet %s: felaktig %s-kodning i %s: %s — %s\n"
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Hittade inga kompatibla arkitekturer att bygga\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Paketet har ingen %%description: %s\n"
@@ -1433,450 +1637,561 @@ msgstr "För många argument på rad: %s\n"
 msgid "Processing policies: %s\n"
 msgstr "Bearbetning policyer: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "Ignorerar ogiltigt reguttr %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Kunde inte öppna rör för %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Kunde inte köra %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Kunde inte grena (fork) %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s misslyckades: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "misslyckades med att skriva all data till %s: %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Konvertering av %s till långt heltal misslyckades.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr "Tom filklassificerare\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "Inga filattribut konfigurerade\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) misslyckades: %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load misslyckades: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Igenkänning av filen ”%s” misslyckades: läge %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Letar efter %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Misslyckades med att hitta %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "fråga av specfil %s misslyckades, kan inte tolka\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(fel 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s-fel(%d) från %s: %s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Felaktigt magiskt tal"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s-fel(%d): %s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Felaktigt/oläsbart huvud"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "okänd db-flagga: ”%s” ignorerad\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Huvudstorleken för stor"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s har ett ogiltigt numeriskt värde, hoppar över\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr ""
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s har för stort eller för litet ”long”-värde, hoppar över\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Okänd filtyp"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s har för stort eller för litet heltalsvärde, hoppar över\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Saknade hårda länkar"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "kan inte få %s lås på %s/%s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Kontrollsumman stämmer inte"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "delat"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Internt fel"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "uteslutande"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Ingen arkivfilen i huvud"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "ogiltig indextyp %x på %s/%s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " misslyckades - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "fel(%d) när ”%s”-poster hämtades från %s-indexet: %s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "fel(%d) när post ”%s” sparades i %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "fel(%d) när post ”%s” togs bort från %s\n"
 
-#: lib/depends.c:68
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "fel(%d) vid tillägg av post för huvud nr. %d\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "fel(%d) tar bort post för huvud nr. %d\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "fel(%d) vid allokering av ny paketinstans\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr "%s är en delta-RPM och kan inte installeras direkt\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Ej stödd last (%s) i paket %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "paket %s var redan tillagt, hoppar över %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "paket %s är redan tillagt, ersätter med %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(inte en klick)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(inte ett tal)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(inte en sträng)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(felaktig typ)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %d %b %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(inte base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(felaktig typ)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(inte en klick)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(felaktig xml-typ)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(inte en OpenPGP-signatur)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
-msgstr ""
+msgstr "Ogiltig tidpunkt %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normal"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "ersatt"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "inte installerad"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "nätdelad"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "fel färg"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "saknas"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(okänd)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(inte en sträng)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "användare %s finns inte - använder root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "grupp %s finns inte - använder root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s sparades som %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s skapades som %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
-msgstr ""
+msgstr "%s %s: borttagande misslyckades: %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
-msgstr ""
+msgstr "katalog"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
-msgstr ""
+msgstr "fil"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr "hvdlast: FEL"
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "tagg[%d]: FEL, tagg %d typ %d position %d antal %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr "regiontagg: FEL, tagg %d typ %d position %d antal %d"
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hvd SHA1: FEL, ej hex\n"
-
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hvd RSA: FEL, ej binär\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr "regionposition: FEL, tagg %d typ %d position %d antal %d"
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hvd DSA: FEL, ej binär\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr "regionavslutning: FEL, tagg %d typ %d position %d antal %d"
 
-#: lib/package.c:296
+#: lib/header.c:1833
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "klickstorlek(%d): FEL, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1841
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1876
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "regionposition: FEL, tagg %d typ %d position %d antal %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr "hvdstorlek(%d): FEL, läsning returnerade %d"
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr "hvdmagi: FEL"
+
+#: lib/header.c:1885
+#, c-format
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr "hvdtaggar: FEL, antal taggar(%d) utanför intervall"
+
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "regionavslutning: FEL, tagg %d typ %d position %d antal %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr "hvddata: FEL, antal byte(%d) utanför intervall"
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "regionstorlek: FEL, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr "hvdklick(%zd): FEL, läsning returnerade %d"
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hvdstorlek(%d): FEL, läsning returnerade %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr "sighutfyllnad(%zd): FEL, läste %zd byte"
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hvdmagi: FEL\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hvdtaggar: FEL, antal taggar(%d) utanför intervall\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr "klickstorlek(%d): FEL, 8 + 16 * il(%d) + dl(%d)"
 
-#: lib/package.c:442
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "ogiltig fältbredd"
+
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hvddata: FEL, antal byte(%d) utanför intervall\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "hvdklick(%zd): FEL, läsning returnerade %d\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "tomt taggformat"
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "hvdlast: FEL\n"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "tomt taggnamn"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: rpmReadSignature misslyckades: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] förväntades vid slutet på vektor"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "oväntad ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "oväntad }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? förväntades i uttryck"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ förväntades efter ? i uttryck"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} förväntades i uttryck"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": förväntades efter ? i deluttryck"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: Ingen signatur tillgänglig\n"
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ förväntades efter : i uttryck"
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: headerRead misslyckades: %s"
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| förväntades vid slutet på uttryck"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "vektoriterator använd med vektor av annan storlek"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread misslyckades: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr "%s: fel: mer än en --pipe angiven (inkompatibla popt-alias?)\n"
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "fördefiniera MAKRO till värdet UTTR"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'MAKRO UTTR'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "definiera MAKRO till värdet UTTR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
-msgstr ""
+msgstr "odefinierat MAKRO"
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
-msgstr ""
+msgstr "MAKRO"
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "skriv ut makroexpansion av UTTR"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'UTTR'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "läs <FIL:...> istället för standardfil(er)"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FIL:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr "aktivera inga insticksmoduler"
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "verifiera inte paketkontrollsummor"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "verifiera inte databashuvuden när de hämtas"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "verifiera inte paketsignatur(er)"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "skicka standard ut till KMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "KMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "använd ROT som toppnivåkatalog"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr "använd databasen i KATALOG"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "KATALOG"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "visa kända frågetaggar"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "visa slutliga rpmrc- och makrokonfigurationer"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "visa mindre detaljerad utdata"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "visa mer detaljerad utdata"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "visa vilken version av rpm som används"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "felsök lastfilstillståndsmaskin"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "felsök rpmio I/O"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: flaggtabell felkonfigurerad (%d)\n"
@@ -1897,12 +2212,12 @@ msgstr "omflyttningar måste innehålla ett ="
 msgid "relocations must have a / following the ="
 msgstr "omflyttningar måste ha ett / efter ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "installera alla filer, även konfigurationer som annars kunde hoppats över"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1910,152 +2225,162 @@ msgstr ""
 "ta bort alla paket som matchar <paket> (normalt ger det ett fel om <paket> "
 "anger flera paket)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "relokera filer i ej relokerbart paket"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "skriv beroendecykler som varningar"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "radera (avinstallera) paket"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<paket>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "installera inte konfigurationsfiler"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "installera inte dokumentation"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "hoppa över filer med inledande <sökväg>"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<sökväg>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "kortform för --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "uppgradera paket om redan installerade"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<paketfil>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 "skriv ut brädgårdar allteftersom paketet installeras (bra tillsammans med -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "verifiera inte paketarkitektur"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "verifiera inte paketets operativsystem"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "kontrollera inte diskutrymme före installation"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "installera dokumentation"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "installera paket"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "uppdatera databasen, men ändra inte filsystemet"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "verifiera inte paketberoenden"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "verifiera inte kontrollsummor av filer"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "verifiera inte kontrollsummor av filer (föråldrad)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "installera inte filsäkerhetskontexter"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "flytta inte om paketinstallationen för att tillfredsställa beroenden"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "kör inte paketskript"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "utför inte (eventuellt) %%pre-skript"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "utför inte (eventuellt) %%post-skript"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "utför inte (eventuellt) %%preun-skript"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "utför inte (eventuellt) %%postun-skript"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "utför inte (eventuellt) %%pretrans-skript"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "utför inte (eventuellt) %%posttrans-skript"
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "kör inte skript utlösta av detta paket"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "kör inte %%triggerprein-skript"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "kör inte %%triggerin-skript"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "kör inte %%triggerun-skript"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "kör inte %%triggerpostun-skript"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "utför inte några samlingsåtgärder"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2063,368 +2388,407 @@ msgstr ""
 "uppgradera till en gammal version av paketet (--force vid uppgraderingar gör "
 "detta automatiskt)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "skriv procent allt eftersom paketet installeras"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "flytta paketet till <katalog>, om flyttbart"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<kat>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "relokera filer från <gammal> till <ny>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<gammal>=<ny>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "ingorera filkonflikter mellan paket"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "ominstallera när paketet redan är installerat"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "installera inte, men tala om ifall det skulle fungera eller inte"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "uppgradera paket"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "ominstallera paket"
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "fråga/verifiera alla paket"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "rpm signaturkontrolläge"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "fråga/verifiera paket som äger fil"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "fråga/verifiera paket i grupp"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "fråga/verifiera en paketfil"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "fråga/verifiera paket som med paketidentifierare"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "fråga/verifiera paket med huvudidentifierare"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "rpm frågeläge"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "fråga/verifiera en huvudinstans"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "fråga/verifiera paket från installationstransaktion"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "fråga paket utlösta av paketet"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "rpm verifieringsläge"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "fråga/verifiera paket som behöver ett beroende"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "fråga/verifiera paket som tillhandahåller ett beroende"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr "fråga/verifiera paket som rekommenderar ett beroende"
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr "fråga/verifiera paket som föreslår ett beroende"
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr "fråga/verifiera paket som kompletterar ett beroende"
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr "fråga/verifiera paket som förbättrar ett beroende"
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "mönstermatcha inte argument"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "behandla inte icke-paket-filer som förteckningar"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "lista alla konfigurationsfiler"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "lista alla dokumentationsfiler"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "lista alla dokumentationsfiler"
+msgstr "lista alla licensfiler"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "lista alla licensfiler"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "visa filinformation"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "lista filer i paketet"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "hoppa över %%ghost-filer"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "hoppa över %%ghost-filer"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "visa tillstånd för de listade filerna"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "verifiera inte storlekar på filer"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "verifiera inte sökvägen i symboliska länkar"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "verifiera inte ägare till filer"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "verifiera inte grupper till filer"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "verifiera inte modifikationstiden för filer"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "verifiera inte rättigheter för filer"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "verifiera inte förmågor (capabilities) på filer"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "verifiera inte filsäkerhetskontexter"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "verifiera inte förmågor (capabilities) på filer"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "verifiera inte filerna i paketet"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "verifiera inte paketberoenden"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "utför inte verifieringsskript"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "Saknade rpmlib-funktioner för %s:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "källpaket förväntades, fann binärpaket\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "källpaket innehåller ingen .spec-fil\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "uppackning av arkiv misslyckades%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " vid fil "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%s misslyckades på fil %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s misslyckades: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "fel format: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(innehåller inga filer)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "ersatt        "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "oinstallerat  "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "nätdelad      "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "fel färg      "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(ej tillstnd) "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(okänd %3d)   "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "paketet har inte filägare-/-grupplistor\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "paketet har varken filägare eller id-listor\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "grupp %s innehåller inga paket\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "inga paketutlösare %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "felformaterad %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "inga paket matchar %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "inget paket behöver %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr "inget paket rekommenderar %s\n"
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr "inget paket föreslår %s\n"
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr "inget paket kompletterar %s\n"
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr "inget paket förbättrar %s\n"
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "inget paket tillhandahåller %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "fil %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "filen %s tillhör inget paket\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "felaktigt paketnummer: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "post %u kunde inte läsas\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "paket %s är inte installerat\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "okänd tagg: ”%s”\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s: import av nyckeln %d misslyckades.\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s: nyckeln %d är inte en bepansrad publik nyckel.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: importläsning misslyckades(%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
-msgstr "%s: Oföränderlig huvudregion kunde inte läsas.  Trasigt paket?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "EJ OK"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "OK"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (SAKNADE NYCKLAR:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (EJ BETRODDA NYCKLAR:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: open misslyckades: %s\n"
@@ -2449,212 +2813,442 @@ msgstr "Kunde inte ändra rotkatalog: %m\n"
 msgid "Unable to restore root directory: %m\n"
 msgstr "Det går inte att återställa root-katalogen: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "Genererar %d saknade index, vänta …\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr "kan inte öppna %s-indexet med %s - %s (%d)\n"
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "ingen dbpath har satts\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: hoppar över"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "fel(%d) när post nr. %d sparades i %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec misslyckades: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp misslyckades: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: hoppar över"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: skadat huvud nr. %u hämtat -- hoppar över.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: kan inte läsa huvud vid 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "ingen dbpath har satts"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "misslyckades att skapa katalogen %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "huvud nr. %u i databasen är felaktigt -- hoppar över.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "kan inte lägga till post ursprungligen vid %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "kunde inte bygga om databasen: orginaldatabasen finns kvar\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "kunde inte ersätta gammal databas med ny databas!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "NEJ "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "JA"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr "PreReq:, Provides:, and Obsoletes:-beroenden stödjer versioner."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr "filnamn lagrade som (katNamn,basNam,katIndex)-tupel, inte som sökväg."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "paketlasten kan komprimeras med bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr "paketets nyttolast kan komprimeras med xz."
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr "paketlasten kan komprimeras med lzma."
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
 msgstr "paketlastfiler har ”./”-prefix."
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr "paketets namn-version-utgåva tillhandahålls inte implicit."
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "huvudtaggar sorteras alltid efter att ha lästs in."
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "huvudtaggar sorteras alltid efter att ha lästs in."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "skriptinterpretatorn kan använda argument från huvudet."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "en hårdlänkad filuppsättning får installeras utan att vara komplett."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr "paketskript kan komma åt rpm-databasen under installation."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "internt stöd för lua-skript."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr "kontrollsummealgoritm för filer kan konfigureras per paket"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "stöd för filförmågor (capabilities) enligt POSIX.1e"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr "paketskript kan utökas vid installationstillfället."
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr "beroendejämförelser stödjer versioner med tilde."
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "stöd filer större än 4 GB"
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr "stöd för rika beroenden"
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr "Okänt rikt-beroende-op ”%.*s”"
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr "Namn behövs"
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr "Rikt beroende börjar inte med ”(”"
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr "Argument saknas till rikt-beroende-op"
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr "Tomt rikt beroende"
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr "Oavslutat rikt beroende: %s"
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr "Kan inte kedja olika operatorer"
+
+#: lib/rpmds.c:1564
+#, fuzzy
+msgid "Can only chain and/or/with ops"
+msgstr "Kan endast kedja AND- och OR-operatorer"
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr "Skräp efter rikt beroende"
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Felaktigt magiskt tal"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Felaktigt/oläsbart huvud"
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "skriptinterpretatorn kan använda argument från huvudet."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Huvudstorleken för stor"
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "en hårdlänkad filuppsättning får installeras utan att vara komplett."
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "Filen är för stor att arkivera"
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr "paketskript kan komma åt rpm-databasen under installation."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Okänd filtyp"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "internt stöd för lua-skript."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "Saknade filer"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr "kontrollsummealgoritm för filer kan konfigureras per paket"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Kontrollsumman stämmer inte"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "stöd för filförmågor (capabilities) enligt POSIX.1e"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Internt fel"
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr "paketskript kan utökas vid installationstillfället."
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Ingen arkivfilen i huvud"
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " misslyckades - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: (fel 0x%x)"
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "misslyckades med att öppna %s: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr "Maxnivå på förteckningsrekursion överskriden: %s\n"
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: inte ett rpm-paket (eller paketspecifikation)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
-msgstr ""
+msgstr "Uppdaterar / installerar …\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
-msgstr ""
+msgstr "Städar upp / tar bort …\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Förbereder..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
-msgstr ""
+msgstr "Förbereder paket …"
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Ouppfyllda beroenden:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: inte ett rpm-paket (eller paketspecifikation): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s kan inte installeras\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Hämtar %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "hoppar över %s - överföring misslyckades\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "paket %s är inte relokerbart\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "fel vid läsning från fil %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "”%s” anger flera paket:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "kan inte öppna %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Installerar %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "inte ett rpm-paket"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "ogiltig signaturtyp"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "ej stödd RPM-paketversion"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "läsning misslyckades: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "inte ett rpm-paket\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "det går inte att skapa %s-lås på %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "väntar på %s-lås på %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr "Misslyckades med att göra dlopen på %s %s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "Misslyckades med att lösa upp symbolen %s: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "Det gick inte att expandera makrot %%__collection_%s\n"
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "Insticksmodulen %%__%s_%s är inte konfigurerad\n"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "Insticksmodulen %s är inte inläst\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr "Misslyckades med att lösa upp insticksmodulen %s symbol %s: %s\n"
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "annan"
@@ -2728,800 +3322,635 @@ msgstr "%s är föråldrat av %s%s"
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "okänt fel %d uppträdde under behandling av paket %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "andra ”:” saknas vid %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "arkitekturnamn saknas vid %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Ofullständig datarad vid %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "För många argument i datarad vid %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Felaktigt arkitektur-/os-nummer: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Ofullständig standardvärdesrad vid %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "För många argument i standardvärdesrad vid %s:%d\n"
 
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr "”:” saknas (hittade 0x%02x) vid %s:%d\n"
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "argument till %s saknas vid %s:%d\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr "kan inte öppna %s vid %s:%d: %m\n"
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "arkitektur saknas för %s vid %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "okänd flagga ”%s” vid %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Okänt system: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Var god kontakta %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Kan inte öppna %s för läsning: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr "Det går inte att återställa aktuell katalog: %m"
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr "<lua>-skriptstöd är inte inbyggt\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Kunde inte skapa temporärfil för %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Kunde inte duplicera filbeskrivare: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "%s-skript misslyckades, waitpid(%d) rk %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "%s-skript misslyckades, signal %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "%s-skript misslyckades, slutstatus %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Okänt format"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "installera"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "radera"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "kan inte öppna paketdatabas i %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "överflödigt ”(” i paketetikett: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "”(” saknas i etikett: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "”)” saknas i paketetikett: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: misslyckades att läsa publik nyckel.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "transaktion"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sighstorlek(%d): FEL, läsning returnerade %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sighmagi: FEL\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sightaggar: FEL, antal taggar(%d) utanför intervall\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sighdata: FEL, antal byte(%d) itanför intevall\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sighklick(%d): FEL, läsning returnerade %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sightagg[%d]: FEL, tagg %d typ %d position %d antal %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sighlast: FEL\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "sighutfyllnad(%zd): FEL, läste %zd byte\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigh sigSize(%zd): FEL, fstat(2) misslyckades\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "Oföränderlig huvudregion kunde inte läsas.  Trasigt paket?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5-summa:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "Huvudets SHA1-summa:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Huvud "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "hoppade över"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "misslyckades"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "saknas    %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Ouppfyllda beroenden för %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr "ogiltig fältbredd"
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "{ saknas efter %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "} saknas efter %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "tomt taggformat"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "tomt taggnamn"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "okänd tagg"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] förväntades vid slutet på vektor"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "oväntad ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "oväntad }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? förväntades i uttryck"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ förväntades efter ? i uttryck"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} förväntades i uttryck"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": förväntades efter ? i deluttryck"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ förväntades efter : i uttryck"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| förväntades vid slutet på uttryck"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "vektoriterator använd med vektor av annan storlek"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "Genererar %d saknade index, vänta …\n"
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "kan inte öppna %s-indexet med db%d - %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr "fel(%d) när ”%s”-poster hämtades från %s-indexet: %s\n"
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "ingen dbpath har satts\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: hoppar över"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "fel(%d) när post nr. %d sparades i %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: regexec misslyckades: %s\n"
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: regcomp misslyckades: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: hoppar över"
-
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:523
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: skadat huvud nr. %u hämtat -- hoppar över.\n"
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "”:” saknas (hittade 0x%02x) vid %s:%d\n"
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr "fel(%d:%s) när nästa nyckel från %s-index hämtades\n"
+msgid "missing argument for %s at %s:%d\n"
+msgstr "argument till %s saknas vid %s:%d\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "fel(%d) vid tillägg av post för huvud nr. %d\n"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "kan inte öppna %s vid %s:%d: %m\n"
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "fel(%d) tar bort post för huvud nr. %d\n"
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "arkitektur saknas för %s vid %s:%d\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:632
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: kan inte läsa huvud vid 0x%x\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "okänd flagga ”%s” vid %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr "Misslyckades att läsa extra vektor, /proc inte monterat?\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "fel(%d) när ”%s”-poster från %s-indexet sattes\n"
+msgid "Unknown system: %s\n"
+msgstr "Okänt system: %s\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "fel(%d) när post ”%s” sparades i %s\n"
+msgid "Please contact %s\n"
+msgstr "Var god kontakta %s\n"
 
-#: lib/rpmdb.c:2477
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "fel(%d) när post ”%s” togs bort från %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Kan inte öppna %s för läsning: %m.\n"
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr "Ingen exec() anropad efter fork() i lua-skript\n"
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "fel(%d) vid allokering av ny paketinstans\n"
+msgid "Unable to restore current directory: %m"
+msgstr "Det går inte att återställa aktuell katalog: %m"
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "<lua>-skriptstöd är inte inbyggt\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "fel(%d) när ”%s”-poster hämtades från %s-indexet\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Kunde inte skapa temporärfil för %s: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "fel(%d) när post %s sparades i %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Kunde inte duplicera filidentifierare: %s: %s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "ingen dbpath har satts"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr "Fwrite misslyckades: %s"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "misslyckades att skapa katalogen %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s-skript misslyckades, waitpid(%d) rk %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "huvud nr. %u i databasen är felaktigt -- hoppar över.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s-skript misslyckades, signal %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "kan inte lägga till post ursprungligen vid %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s-skript misslyckades, slutstatus %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr "kunde inte bygga om databasen: orginaldatabasen finns kvar\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Okänt format"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "kunde inte ersätta gammal databas med ny databas!\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "installera"
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "byt ut filer i %s med filer från %s för att återställa"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "radera"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "kunde inte ta bort katalogen %s: %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "kan inte öppna paketdatabas i %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d-fel(%d) från %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "överflödigt ”(” i paketetikett: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d-fel(%d): %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "”(” saknas i etikett: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "kan inte få %s lås på %s/%s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "”)” saknas i paketetikett: %s\n"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "delat"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: misslyckades att läsa publik nyckel.\n"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "uteslutande"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "transaktion"
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr "ogiltig indextyp %x på %s/%s\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "okänd db-flagga: ”%s” ignorerad\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s har ogiltigt ogiltigt numeriskt värde, hoppar över\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s har för stort eller för litet ”long”-värde, hoppar över\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s har för stort eller för litet heltalsvärde, hoppar över\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "Misslyckades med att avkoda policy för %s\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "Misslyckades med att skapa temporär fil för %s: %s\n"
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "Misslyckades med att skriva %s-policy för att filen %s\n"
+msgid "%s%s"
+msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr "Misslyckades med att skapa semanage-handtag\n"
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "Misslyckades att ansluta till policyhanterare\n"
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "Misslyckades med att börja policytransaktion: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr "Misslyckades att ta bort den tillfälliga policyfilen %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Huvud "
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "Misslyckades att installera policymodul: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "Misslyckades att ta bort policymodul: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Kan inte läsa om signaturhuvud.\n"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "Misslyckades med att grena process: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "hoppade över"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "Misslyckades med att köra %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "misslyckades"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "%s avslutades onormalt\n"
+msgid "Duplicate username or UID for user %s\n"
+msgstr "Dubblerat användarnamn eller UID för användaren %s\n"
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "%s misslyckades med slutstatus %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr "Dubblerat gruppnamn eller GID för gruppen %s\n"
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "Misslyckades med att fastställa policyförändringar\n"
+#: lib/verify.c:395
+msgid "no state"
+msgstr "inget tillstånd"
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "Misslyckades med att expandera restorecon-sökväg"
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "okänt tillstånd"
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
-"Misslyckades med etikettera om filsystemet.  Filer kan vara felmärkta\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "saknas    %c %s"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
-"Misslyckades med att ladda om filkontexter.  Filer kan vara felmärkta\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Ouppfyllda beroenden för %s:\n"
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "Misslyckades att extrahera policy från %s\n"
+msgid "Unable to reset nice value: %s"
+msgstr "Kan inte återställa nice-värde: %s"
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== aktiva %d tomma %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr "Kan inte återställa I/O-prioritet: %s"
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(tom)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(tom)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Makro %%%s har oavslutad kropp\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Makrot %%%s har oavslutade flaggor\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Makro %%%s har otillåtet namn (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Makrot %%%s har oavslutad kropp\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Makro %%%s har oavslutade flaggor\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
-msgstr "makro %%%s har tom kropp\n"
+msgstr "Makrot %%%s har tom kropp\n"
+
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "Makrot %%%s måste ha blanksteg före kroppen\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Makro %%%s misslyckades att expandera\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
-msgstr "Makro %%%s har otillåtet namn (%%undefine)\n"
+msgstr "Makrot %%%s har ett otillåtet namn (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Makro %%%s (%s) användes inte under nivå %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr "Makrot %%%s definierat men inte använt i sin räckvidd\n"
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Okänd flagga %c i %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
-"Alltför många nivåer av rekursion i makro expansion.  Det beror sannolikt på "
-"en rekursiv makrodeklaration.\n"
+"Alltför många nivåer av rekursion i en makroexpansion.  Det beror sannolikt "
+"på en rekursiv makrodeklaration.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Oavslutad %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Ett %% följs av ett makro som inte kan tolkas\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "misslyckades med att läsa in makrofilen %s"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== aktiva %d tomma %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "fel när tämporärfil %s skapades: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Fil %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Filen %s är mindre än %u byte\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "misslyckades att skapa katalog"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[ingen]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(inget fel)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "ödesdigert fel: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "fel: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "varning: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "felaktig syntax i lua-skript: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "felaktig syntax i lua-skript: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "lua-skript misslyckades: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "felaktig syntax i lua-fil: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "lua-hake misslyckades: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[ingen]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(inget fel)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "ödesdigert fel: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "fel: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "varning: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "minnesallokering (%u byte) returnerade NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, nyckel-ID %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(ingen)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr "fel när temporärkatalog %s skapades: %m\n"
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr "fel när fifo %s skapades: %m\n"
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr "fel när fifo %s togs bort: %m\n"
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr "fel när katalogen %s togs bort: %m\n"
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite misslyckades: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread misslyckades: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush misslyckades: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
-msgstr ""
+msgstr "PGP-signaturen stödjs inte\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
-msgstr ""
+msgstr "PGP-hash-algoritm %u stödjs inte\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
-msgstr ""
+msgstr "PGP-publik nyckelalgoritm %u stödjs inte\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Det gick inte att skapa ett rör för signering: %m"
+msgid "Could not exec %s: %s\n"
+msgstr "Kunde inte köra %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr "Fopen misslyckades\n"
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "Kunde inte skriva till ett rör\n"
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:302
+#, c-format
+msgid "Could not read from file %s: %s\n"
+msgstr "Kunde inte läsa från filen %s: %s\n"
+
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "gpg exec misslyckades (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg kunde inte skriva signatur\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "kan inte läsa signaturen\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp misslyckades\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr "%s innehåller redan en identisk signatur, hoppar över\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead misslyckades: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature misslyckades: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: headerRead misslyckades: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "Kan inte signera RPM-v3-paket\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s innehåller redan en identisk signatur, hoppar över\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature misslyckades: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead misslyckades: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "misslyckades med att ersätta %s: %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: läsning av paketlista misslyckades: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "verifiera inte huvud+lastsignatur"
index 0e9ae62a5d35bf180c3dc2fdfeaf7e98bf95d4fa..32ba90e66377cf7fad2fc93f95d855d3a6e25efa 100644 (file)
--- a/po/te.po
+++ b/po/te.po
@@ -3,17 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# ప్రవీణ్ ఇళ్ళ <mail2ipn@gmail.com>, 2011.
-# à°ªà±\8dà°°à°µà±\80à°£à±\8d à°¯à°¿à°³à±\8dà°³ <mail2ipn@gmail.com>, 2011.
+# ప్రవీణ్ ఇళ్ళ <mail2ipn@gmail.com>, 2011
+# à°ªà±\8dà°°à°µà±\80à°£à±\8d à°\87à°³à±\8dà°³ <mail2ipn@gmail.com>, 2011
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Telugu (http://www.transifex.com/projects/p/rpm/language/"
-"te/)\n"
+"Language-Team: Telugu (http://www.transifex.com/rpm-team/rpm/language/te/)\n"
 "Language: te\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,487 +45,549 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr ""
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr ""
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr ""
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr ""
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
 msgstr ""
 
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
 msgstr ""
 
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
 msgstr ""
 
-#: rpmqv.c:125
-msgid "unexpected query flags"
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
 msgstr ""
 
-#: rpmqv.c:128
-msgid "unexpected query format"
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:131
-msgid "unexpected query source"
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
 msgstr ""
 
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
 msgstr ""
 
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<వనరు ప్యాకేజీ>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
 msgstr ""
 
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
 msgstr ""
 
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
 msgstr ""
 
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
 msgstr ""
 
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
 msgstr ""
 
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
 msgstr ""
 
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
+#: rpmbuild.c:183
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
+msgid "<tarball>"
 msgstr ""
 
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
+#: rpmbuild.c:186
+msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
+#: rpmbuild.c:189
+msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
+#: rpmbuild.c:192
+#, c-format
+msgid "verify %files section from <tarball>"
 msgstr ""
 
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
+#: rpmbuild.c:195
+msgid "build source and binary packages from <tarball>"
 msgstr ""
 
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
+#: rpmbuild.c:198
+msgid "build binary package only from <tarball>"
 msgstr ""
 
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
+#: rpmbuild.c:201
+msgid "build source package only from <tarball>"
 msgstr ""
 
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
+#: rpmbuild.c:205
+msgid "build binary package from <source package>"
 msgstr ""
 
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
+#: rpmbuild.c:212
+msgid "override build root"
 msgstr ""
 
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
+#: rpmbuild.c:214
+msgid "run build in current directory"
 msgstr ""
 
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
+#: rpmbuild.c:216
+msgid "remove build tree when done"
 msgstr ""
 
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:218
+msgid "ignore ExcludeArch: directives from spec file"
 msgstr ""
 
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
+#: rpmbuild.c:220
+msgid "debug file state machine"
 msgstr ""
 
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
+#: rpmbuild.c:222
+msgid "do not execute any stages of the build"
 msgstr ""
 
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
+#: rpmbuild.c:224
+msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
+#: rpmbuild.c:226
+msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmqv.c:256
-msgid "no packages given for erase"
+#: rpmbuild.c:230
+#, c-format
+msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmqv.c:290
-msgid "no packages given for install"
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
 msgstr ""
 
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
+#: rpmbuild.c:234
+#, c-format
+msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmqv.c:314
-msgid "no arguments given for verify"
+#: rpmbuild.c:237
+msgid "do not accept i18N msgstr's from specfile"
 msgstr ""
 
-#: rpmbuild.c:99
-#, c-format
-msgid "buildroot already specified, ignoring %s\n"
+#: rpmbuild.c:239
+msgid "remove sources when done"
+msgstr "అయిన తరువాత వనరులను తీసివేయి"
+
+#: rpmbuild.c:241
+msgid "remove specfile when done"
 msgstr ""
 
-#: rpmbuild.c:120
-#, c-format
-msgid "build through %prep (unpack sources and apply patches) from <specfile>"
+#: rpmbuild.c:243
+msgid "skip straight to specified stage (only for c,i)"
 msgstr ""
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
-msgid "<specfile>"
+#: rpmbuild.c:245
+msgid "override target platform"
 msgstr ""
 
-#: rpmbuild.c:123
-msgid "build through %build (%prep, then compile) from <specfile>"
+#: rpmbuild.c:262
+msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 
-#: rpmbuild.c:126
-msgid "build through %install (%prep, %build, then install) from <specfile>"
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr ""
+
+#: rpmbuild.c:282
+msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:129
+#: rpmbuild.c:300
 #, c-format
-msgid "verify %files section from <specfile>"
+msgid "Unable to open spec file %s: %s\n"
 msgstr ""
 
-#: rpmbuild.c:132
-msgid "build source and binary packages from <specfile>"
+#: rpmbuild.c:363
+#, c-format
+msgid "Failed to open tar pipe: %m\n"
 msgstr ""
 
-#: rpmbuild.c:135
-msgid "build binary package only from <specfile>"
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
 msgstr ""
 
-#: rpmbuild.c:138
-msgid "build source package only from <specfile>"
+#: rpmbuild.c:389
+#, c-format
+msgid "Failed to read spec file from %s\n"
 msgstr ""
 
-#: rpmbuild.c:142
+#: rpmbuild.c:401
 #, c-format
-msgid "build through %prep (unpack sources and apply patches) from <tarball>"
+msgid "Failed to rename %s to %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
-msgid "<tarball>"
+#: rpmbuild.c:479
+#, c-format
+msgid "failed to stat %s: %m\n"
 msgstr ""
 
-#: rpmbuild.c:145
-msgid "build through %build (%prep, then compile) from <tarball>"
+#: rpmbuild.c:483
+#, c-format
+msgid "File %s is not a regular file.\n"
 msgstr ""
 
-#: rpmbuild.c:148
-msgid "build through %install (%prep, %build, then install) from <tarball>"
+#: rpmbuild.c:490
+#, c-format
+msgid "File %s does not appear to be a specfile.\n"
 msgstr ""
 
-#: rpmbuild.c:151
+#: rpmbuild.c:556
 #, c-format
-msgid "verify %files section from <tarball>"
+msgid "Building target platforms: %s\n"
 msgstr ""
 
-#: rpmbuild.c:154
-msgid "build source and binary packages from <tarball>"
+#: rpmbuild.c:564
+#, c-format
+msgid "Building for target %s\n"
 msgstr ""
 
-#: rpmbuild.c:157
-msgid "build binary package only from <tarball>"
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
 msgstr ""
 
-#: rpmbuild.c:160
-msgid "build source package only from <tarball>"
+#: rpmdb.c:21
+msgid "initialize database"
+msgstr "డేటాబేసును ఆరంభించు"
+
+#: rpmdb.c:23
+msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 
-#: rpmbuild.c:164
-msgid "build binary package from <source package>"
+#: rpmdb.c:26
+msgid "verify database files"
+msgstr "డేటాబేసు ఫైళ్ళను సరిచూడు"
+
+#: rpmdb.c:28
+msgid "export database to stdout header list"
 msgstr ""
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<వనరు ప్యాకేజీ>"
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
 
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
+#: rpmdb.c:38
+msgid "Database options:"
+msgstr "డేటాబేసు ఐచ్ఛికాలు:"
+
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
 msgstr ""
 
-#: rpmbuild.c:171
-msgid "override build root"
+#: rpmkeys.c:20
+msgid "verify package signature(s)"
+msgstr "ప్యాకేజీ సంతకా(ల)ను సరిచూడు"
+
+#: rpmkeys.c:22
+msgid "import an armored public key"
 msgstr ""
 
-#: rpmbuild.c:173
-msgid "remove build tree when done"
+#: rpmkeys.c:24
+msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmbuild.c:175
-msgid "ignore ExcludeArch: directives from spec file"
+#: rpmkeys.c:27 rpmkeys.c:29
+msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmbuild.c:177
-msgid "debug file state machine"
+#: rpmkeys.c:36
+msgid "Keyring options:"
+msgstr "కీరింగ్ ఐచ్ఛికాలు:"
+
+#: rpmkeys.c:64 rpmsign.c:161
+msgid "no arguments given"
 msgstr ""
 
-#: rpmbuild.c:179
-msgid "do not execute any stages of the build"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
 msgstr ""
 
-#: rpmbuild.c:181
-msgid "do not verify build dependencies"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
 msgstr ""
 
-#: rpmbuild.c:183
-msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
 msgstr ""
 
-#: rpmbuild.c:187
-#, c-format
-msgid "do not execute %clean stage of the build"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
 msgstr ""
 
-#: rpmbuild.c:189
-#, c-format
-msgid "do not execute %check stage of the build"
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
 msgstr ""
 
-#: rpmbuild.c:192
-msgid "do not accept i18N msgstr's from specfile"
+#: rpmqv.c:126
+msgid "unexpected query flags"
 msgstr ""
 
-#: rpmbuild.c:194
-msgid "remove sources when done"
-msgstr "అయిన తరువాత వనరులను తీసివేయి"
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr ""
 
-#: rpmbuild.c:196
-msgid "remove specfile when done"
+#: rpmqv.c:132
+msgid "unexpected query source"
 msgstr ""
 
-#: rpmbuild.c:198
-msgid "skip straight to specified stage (only for c,i)"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
 msgstr ""
 
-#: rpmbuild.c:200 rpmspec.c:34
-msgid "override target platform"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
 msgstr ""
 
-#: rpmbuild.c:217
-msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
 msgstr ""
 
-#: rpmbuild.c:237
-msgid "Failed build dependencies:\n"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
 msgstr ""
 
-#: rpmbuild.c:255
-#, c-format
-msgid "Unable to open spec file %s: %s\n"
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
 msgstr ""
 
-#: rpmbuild.c:317
-#, c-format
-msgid "Failed to open tar pipe: %m\n"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
 msgstr ""
 
-#: rpmbuild.c:336
-#, c-format
-msgid "Failed to read spec file from %s\n"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmbuild.c:348
-#, c-format
-msgid "Failed to rename %s to %s: %m\n"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmbuild.c:419
-#, c-format
-msgid "failed to stat %s: %m\n"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
 msgstr ""
 
-#: rpmbuild.c:423
-#, c-format
-msgid "File %s is not a regular file.\n"
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
 msgstr ""
 
-#: rpmbuild.c:430
-#, c-format
-msgid "File %s does not appear to be a specfile.\n"
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
 msgstr ""
 
-#: rpmbuild.c:496
-#, c-format
-msgid "Building target platforms: %s\n"
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
 msgstr ""
 
-#: rpmbuild.c:504
-#, c-format
-msgid "Building for target %s\n"
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
 msgstr ""
 
-#: rpmdb.c:22
-msgid "initialize database"
-msgstr "డేటాబేసును ఆరంభించు"
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
 
-#: rpmdb.c:24
-msgid "rebuild database inverted lists from installed package headers"
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
 msgstr ""
 
-#: rpmdb.c:27
-msgid "verify database files"
-msgstr "డేటాబేసు ఫైళ్ళను సరిచూడు"
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
 
-#: rpmdb.c:33
-msgid "Database options:"
-msgstr "డేటాబేసు ఐచ్ఛికాలు:"
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
 
-#: rpmkeys.c:24
-msgid "verify package signature(s)"
-msgstr "ప్యాకేజీ సంతకా(ల)ను సరిచూడు"
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
 
-#: rpmkeys.c:26
-msgid "import an armored public key"
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
 msgstr ""
 
-#: rpmkeys.c:28
-msgid "don't import, but tell if it would work or not"
+#: rpmqv.c:258
+msgid "no packages given for erase"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
-msgid "list keys from RPM keyring"
+#: rpmqv.c:292
+msgid "no packages given for install"
 msgstr ""
 
-#: rpmkeys.c:40
-msgid "Keyring options:"
-msgstr "కీరింగ్ ఐచ్ఛికాలు:"
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr ""
 
-#: rpmkeys.c:64 rpmsign.c:144
-msgid "no arguments given"
+#: rpmqv.c:318
+msgid "no arguments given for verify"
 msgstr ""
 
-#: rpmsign.c:25
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr ""
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr ""
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "ప్యాకేజీ సంతకాలను తొలగించు"
 
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr "సంతకం ఐచ్ఛికాలు:"
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
+#: rpmsign.c:39
+msgid "use file signing key <key>"
 msgstr ""
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
+#: rpmsign.c:40
+msgid "<key>"
 msgstr ""
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
 msgstr ""
 
-#: rpmsign.c:117
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "సంతకం ఐచ్ఛికాలు:"
+
+#: rpmsign.c:101
 #, c-format
-msgid "Pass phrase is good.\n"
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr ""
 
-#: rpmsign.c:123
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr ""
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr ""
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr ""
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -535,32 +596,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr ""
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr ""
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr ""
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -570,441 +636,509 @@ msgstr ""
 "\n"
 "RPM నిర్మాణ దోషాలు:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr ""
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr ""
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr ""
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr ""
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr ""
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr ""
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr ""
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr ""
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr ""
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr ""
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr ""
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr ""
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr ""
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr ""
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr ""
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr ""
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr ""
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr ""
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "ఫైలు కనపడలేదు: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr ""
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr ""
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr ""
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "వరుస: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr ""
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "చెడ్డ ఫైలు: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr ""
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr ""
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr ""
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
 msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
 msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
 msgstr ""
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr ""
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr ""
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr ""
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:434
 #, c-format
-msgid "Could not open %s: %s\n"
+msgid "Failed to read %jd bytes in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:452
-#, c-format
-msgid "Unable to write package: %s\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:468
+#: build/pack.c:453
 #, c-format
-msgid "Unable to open sigtarget %s: %s\n"
+msgid "Unable to write header to %s: %s\n"
 msgstr ""
 
-#: build/pack.c:479
+#: build/pack.c:520
 #, c-format
-msgid "Unable to read header from %s: %s\n"
+msgid "Could not open %s: %s\n"
 msgstr ""
 
-#: build/pack.c:489
+#: build/pack.c:527
 #, c-format
-msgid "Unable to write header to %s: %s\n"
+msgid "Unable to write package: %s\n"
 msgstr ""
 
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr ""
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr ""
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr ""
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr ""
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr ""
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr ""
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr ""
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr ""
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr ""
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr ""
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
+#: build/parseFiles.c:33
 #, c-format
-msgid "line %d: Second description\n"
+msgid "line %d: Error parsing %%files: %s\n"
 msgstr ""
 
-#: build/parseFiles.c:33
+#: build/parseFiles.c:73
 #, c-format
-msgid "line %d: Error parsing %%files: %s\n"
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
@@ -1012,341 +1146,410 @@ msgstr ""
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr ""
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "చెడ్డ వనరు: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr ""
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr ""
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr ""
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr ""
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr ""
@@ -1417,450 +1620,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr ""
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
 msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
 msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
 msgstr ""
 
-#: lib/cpio.c:392
-msgid "Header size too big"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "తెలియని ఫైల్ రకం"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:810
+msgid "shared"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
+#: lib/backend/db3.c:810
+msgid "exclusive"
 msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr ""
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr ""
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
 msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
-#, c-format
-msgid "package %s was already added, replacing with %s\n"
+#: lib/depends.c:378
+#, c-format
+msgid "package %s was already added, replacing with %s\n"
+msgstr ""
+
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
+msgid "(not a number)"
+msgstr ""
+
+#: lib/formats.c:44
+msgid "(not a string)"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
-msgid "(not a number)"
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
 msgstr ""
 
-#: lib/formats.c:125
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr ""
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr ""
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr ""
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr ""
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr ""
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr ""
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr ""
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr ""
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr ""
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr ""
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr ""
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr ""
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr ""
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr ""
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr ""
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr ""
+
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr ""
+
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
+msgid "unknown tag: \"%s\""
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
 msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr ""
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr ""
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr ""
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr ""
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ""
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr ""
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr ""
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
 msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr ""
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr ""
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr ""
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr ""
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr ""
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr ""
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1881,1621 +2195,1736 @@ msgstr ""
 msgid "relocations must have a / following the ="
 msgstr ""
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr ""
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr ""
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr ""
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr ""
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr ""
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr ""
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr ""
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr ""
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr ""
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr ""
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr ""
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr ""
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr ""
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr ""
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr ""
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr ""
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr ""
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr ""
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr ""
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr ""
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr ""
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr ""
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr ""
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr ""
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr ""
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr ""
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr ""
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr ""
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr ""
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr ""
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr ""
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr ""
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr ""
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr ""
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "అన్ని స్వరూపణం ఫైళ్ళను జాబితాగా చూపు"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr ""
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
 msgstr "అన్ని స్వరూపణం ఫైళ్ళను జాబితాగా చూపు"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr ""
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr ""
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr ""
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, c-format
+msgid "skip %%artifact files"
+msgstr ""
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr ""
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr ""
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr ""
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr ""
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr ""
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr ""
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr ""
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr ""
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr ""
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr ""
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr ""
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr ""
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr ""
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr ""
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr ""
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr ""
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr ""
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr ""
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr ""
 
-#: lib/query.c:175
-msgid "(no state)    "
+#: lib/query.c:176
+msgid "(no state)    "
+msgstr ""
+
+#: lib/query.c:179
+#, c-format
+msgid "(unknown %3d) "
+msgstr ""
+
+#: lib/query.c:199
+msgid "package has not file owner/group lists\n"
+msgstr ""
+
+#: lib/query.c:233
+msgid "package has neither file owner or id lists\n"
+msgstr ""
+
+#: lib/query.c:321
+#, c-format
+msgid "group %s does not contain any packages\n"
+msgstr ""
+
+#: lib/query.c:328
+#, c-format
+msgid "no package triggers %s\n"
+msgstr ""
+
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
+#, c-format
+msgid "malformed %s: %s\n"
+msgstr ""
+
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
+#, c-format
+msgid "no package matches %s: %s\n"
+msgstr ""
+
+#: lib/query.c:387
+#, c-format
+msgid "no package requires %s\n"
+msgstr ""
+
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
+#, c-format
+msgid "no package provides %s\n"
+msgstr ""
+
+#: lib/query.c:455
+#, c-format
+msgid "file %s: %s\n"
+msgstr "ఫైల్ %s: %s\n"
+
+#: lib/query.c:458
+#, c-format
+msgid "file %s is not owned by any package\n"
+msgstr ""
+
+#: lib/query.c:469
+#, c-format
+msgid "invalid package number: %s\n"
+msgstr ""
+
+#: lib/query.c:476
+#, c-format
+msgid "record %u could not be read\n"
+msgstr ""
+
+#: lib/query.c:491 lib/rpminstall.c:690
+#, c-format
+msgid "package %s is not installed\n"
+msgstr ""
+
+#: lib/query.c:525
+#, c-format
+msgid "unknown tag: \"%s\"\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
+#, c-format
+msgid "%s: key %d import failed.\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:66
+#, c-format
+msgid "%s: key %d not an armored public key.\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:111
+#, c-format
+msgid "%s: import read failed(%d).\n"
+msgstr ""
+
+#: lib/rpmchecksig.c:131
+#, c-format
+msgid "Fread failed: %s"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/query.c:178
-#, c-format
-msgid "(unknown %3d) "
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/query.c:198
-msgid "package has not file owner/group lists\n"
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
 
-#: lib/query.c:229
-msgid "package has neither file owner or id lists\n"
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/query.c:318
-#, c-format
-msgid "group %s does not contain any packages\n"
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
 msgstr ""
 
-#: lib/query.c:325
-#, c-format
-msgid "no package triggers %s\n"
+#: lib/rpmchecksig.c:268
+msgid "OK"
 msgstr ""
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
-msgid "malformed %s: %s\n"
+msgid "%s: open failed: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/rpmchroot.c:43
 #, c-format
-msgid "no package matches %s: %s\n"
+msgid "Unable to open current directory: %m\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
 #, c-format
-msgid "no package requires %s\n"
+msgid "%s: chroot directory not set\n"
 msgstr ""
 
-#: lib/query.c:392
+#: lib/rpmchroot.c:70
 #, c-format
-msgid "no package provides %s\n"
+msgid "Unable to change root directory: %m\n"
 msgstr ""
 
-#: lib/query.c:424
+#: lib/rpmchroot.c:95
 #, c-format
-msgid "file %s: %s\n"
-msgstr "ఫైల్ %s: %s\n"
+msgid "Unable to restore root directory: %m\n"
+msgstr ""
 
-#: lib/query.c:427
+#: lib/rpmdb.c:72
 #, c-format
-msgid "file %s is not owned by any package\n"
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/query.c:438
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
 #, c-format
-msgid "invalid package number: %s\n"
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/query.c:445
-#, c-format
-msgid "record %u could not be read\n"
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
-#, c-format
-msgid "package %s is not installed\n"
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
 msgstr ""
 
-#: lib/query.c:492
+#: lib/rpmdb.c:988
 #, c-format
-msgid "unknown tag: \"%s\"\n"
+msgid "error(%d) storing record #%d into %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmdb.c:1100
 #, c-format
-msgid "%s: key %d import failed.\n"
+msgid "%s: regexec failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmdb.c:1281
 #, c-format
-msgid "%s: key %d not an armored public key.\n"
+msgid "%s: regcomp failed: %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
-#, c-format
-msgid "%s: import read failed(%d).\n"
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmdb.c:1531
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
+#: lib/rpmdb.c:2061
 #, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+msgid "%s: cannot read header at 0x%x\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "OK"
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ") "
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:393
-msgid ")"
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmdb.c:2520
 #, c-format
-msgid "%s: open failed: %s\n"
+msgid "failed to create directory %s: %s\n"
 msgstr ""
 
-#: lib/rpmchroot.c:43
+#: lib/rpmdb.c:2557
 #, c-format
-msgid "Unable to open current directory: %m\n"
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
+#: lib/rpmdb.c:2572
 #, c-format
-msgid "%s: chroot directory not set\n"
+msgid "cannot add record originally at %u\n"
 msgstr ""
 
-#: lib/rpmchroot.c:70
-#, c-format
-msgid "Unable to change root directory: %m\n"
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
 msgstr ""
 
-#: lib/rpmchroot.c:95
-#, c-format
-msgid "Unable to restore root directory: %m\n"
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr ""
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr ""
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr ""
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
 msgstr ""
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
 msgstr ""
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
 msgstr ""
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
 msgstr ""
 
-#: lib/rpmds.c:961
+#: lib/rpmds.c:1249
 msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmds.c:964
+#: lib/rpmds.c:1252
 msgid "a hardlink file set may be installed without being complete."
 msgstr ""
 
-#: lib/rpmds.c:967
+#: lib/rpmds.c:1255
 msgid "package scriptlets may access the rpm database while installing."
 msgstr ""
 
-#: lib/rpmds.c:971
+#: lib/rpmds.c:1259
 msgid "internal support for lua scripts."
 msgstr ""
 
-#: lib/rpmds.c:975
+#: lib/rpmds.c:1263
 msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmds.c:979
+#: lib/rpmds.c:1267
 msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmds.c:983
+#: lib/rpmds.c:1271
 msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmds.c:986
+#: lib/rpmds.c:1274
 msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
 msgstr ""
 
-#: lib/rpmgi.c:136
-#, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
 msgstr ""
 
-#: lib/rpminstall.c:141
-#, c-format
-msgid "Updating / installing...\n"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpmds.c:1410
 #, c-format
-msgid "Cleaning up / removing...\n"
+msgid "Unknown rich dependency op '%.*s'"
 msgstr ""
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
+#: lib/rpmds.c:1451
+msgid "Name required"
 msgstr ""
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpminstall.c:476
-#, c-format
-msgid "skipping %s - transfer failed\n"
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpmds.c:1544
 #, c-format
-msgid "package %s is not relocatable\n"
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpminstall.c:570
-#, c-format
-msgid "error reading from file %s\n"
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpminstall.c:661
-#, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpminstall.c:700
-#, c-format
-msgid "cannot open %s: %s\n"
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpminstall.c:706
+#: lib/rpmfi.c:810
 #, c-format
-msgid "Installing %s\n"
-msgstr ""
-
-#: lib/rpmlead.c:100
-msgid "not an rpm package"
-msgstr "rpm ప్యాకేజీ కాదు"
-
-#: lib/rpmlead.c:104
-msgid "illegal signature type"
-msgstr ""
-
-#: lib/rpmlead.c:108
-msgid "unsupported RPM package version"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmlead.c:123
+#: lib/rpmfi.c:817
 #, c-format
-msgid "read failed: %s (%d)\n"
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmlead.c:126
-msgid "not an rpm package\n"
-msgstr "rpm ప్యాకేజీ కాదు\n"
-
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "can't create %s lock on %s (%s)\n"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmfi.c:1379
 #, c-format
-msgid "waiting for %s lock on %s\n"
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
-#, c-format
-msgid "Failed to dlopen %s %s\n"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
 msgstr ""
 
-#: lib/rpmplugins.c:66
-#, c-format
-msgid "Failed to resolve symbol %s: %s\n"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
 msgstr ""
 
-#: lib/rpmplugins.c:87
-#, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
-#, c-format
-msgid "Plugin %s not loaded\n"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "తెలియని ఫైల్ రకం"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmprob.c:109
-msgid "different"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmprob.c:114
-#, c-format
-msgid "package %s is intended for a %s architecture"
+#: lib/rpmfi.c:2377
+msgid "Internal error"
 msgstr ""
 
-#: lib/rpmprob.c:118
-#, c-format
-msgid "package %s is intended for a %s operating system"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmprob.c:122
-#, c-format
-msgid "package %s is already installed"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmprob.c:125
-#, c-format
-msgid "path %s in package %s is not relocatable"
+#: lib/rpmfi.c:2389
+msgid " failed - "
 msgstr ""
 
-#: lib/rpmprob.c:130
+#: lib/rpmfi.c:2392
 #, c-format
-msgid "file %s conflicts between attempted installs of %s and %s"
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmprob.c:135
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
-msgid "file %s from install of %s conflicts with file from package %s"
+msgid "open of %s failed: %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:140
+#: lib/rpmgi.c:144
 #, c-format
-msgid "package %s (which is newer than %s) is already installed"
+msgid "Max level of manifest recursion exceeded: %s\n"
 msgstr ""
 
-#: lib/rpmprob.c:145
+#: lib/rpmgi.c:155
 #, c-format
-msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpmprob.c:155
+#: lib/rpminstall.c:142
 #, c-format
-msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpmprob.c:159
+#: lib/rpminstall.c:144
 #, c-format
-msgid "%s is needed by %s%s"
+msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
-msgid "(installed) "
+#: lib/rpminstall.c:193
+msgid "Preparing..."
 msgstr ""
 
-#: lib/rpmprob.c:163
-#, c-format
-msgid "%s conflicts with %s%s"
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpmprob.c:167
-#, c-format
-msgid "%s is obsoleted by %s%s"
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
 msgstr ""
 
-#: lib/rpmprob.c:172
+#: lib/rpminstall.c:323
 #, c-format
-msgid "unknown error %d encountered while manipulating package %s"
+msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:194
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
-msgid "missing second ':' at %s:%d\n"
+msgid "%s cannot be installed\n"
 msgstr ""
 
-#: lib/rpmrc.c:197
+#: lib/rpminstall.c:490
 #, c-format
-msgid "missing architecture name at %s:%d\n"
+msgid "Retrieving %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:342
+#: lib/rpminstall.c:502
 #, c-format
-msgid "Incomplete data line at %s:%d\n"
+msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpmrc.c:347
+#: lib/rpminstall.c:572
 #, c-format
-msgid "Too many args in data line at %s:%d\n"
+msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpmrc.c:354
+#: lib/rpminstall.c:603
 #, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
+msgid "error reading from file %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:385
+#: lib/rpminstall.c:697
 #, c-format
-msgid "Incomplete default line at %s:%d\n"
+msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpmrc.c:390
+#: lib/rpminstall.c:736
 #, c-format
-msgid "Too many args in default line at %s:%d\n"
+msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:495
+#: lib/rpminstall.c:742
 #, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgid "Installing %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr ""
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
+msgstr "rpm ప్యాకేజీ కాదు"
 
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
 msgstr ""
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
 msgstr ""
 
-#: lib/rpmrc.c:603
+#: lib/rpmlead.c:118
 #, c-format
-msgid "bad option '%s' at %s:%d\n"
+msgid "read failed: %s (%d)\n"
 msgstr ""
 
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
+msgstr "rpm ప్యాకేజీ కాదు\n"
 
-#: lib/rpmrc.c:1349
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
-msgid "Unknown system: %s\n"
+msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmrc.c:1350
+#: lib/rpmlock.c:133
 #, c-format
-msgid "Please contact %s\n"
+msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmrc.c:1591
+#: lib/rpmplugins.c:65
 #, c-format
-msgid "Unable to open %s for reading: %m.\n"
+msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:75
+#: lib/rpmplugins.c:73
 #, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
+msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmscript.c:221
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmscript.c:248
+#: lib/rpmplugins.c:199
 #, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+#: lib/rpmprob.c:109
+msgid "different"
 msgstr ""
 
-#: lib/rpmscript.c:276
+#: lib/rpmprob.c:114
 #, c-format
-msgid "%s scriptlet failed, signal %d\n"
+msgid "package %s is intended for a %s architecture"
 msgstr ""
 
-#: lib/rpmscript.c:279
+#: lib/rpmprob.c:118
 #, c-format
-msgid "%s scriptlet failed, exit status %d\n"
+msgid "package %s is intended for a %s operating system"
 msgstr ""
 
-#: lib/rpmtd.c:258
-msgid "Unknown format"
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
 msgstr ""
 
-#: lib/rpmte.c:868
-msgid "install"
+#: lib/rpmprob.c:125
+#, c-format
+msgid "path %s in package %s is not relocatable"
 msgstr ""
 
-#: lib/rpmte.c:869
-msgid "erase"
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
 msgstr ""
 
-#: lib/rpmts.c:92
+#: lib/rpmprob.c:135
 #, c-format
-msgid "cannot open Packages database in %s\n"
+msgid "file %s from install of %s conflicts with file from package %s"
 msgstr ""
 
-#: lib/rpmts.c:191
+#: lib/rpmprob.c:140
 #, c-format
-msgid "extra '(' in package label: %s\n"
+msgid "package %s (which is newer than %s) is already installed"
 msgstr ""
 
-#: lib/rpmts.c:209
+#: lib/rpmprob.c:145
 #, c-format
-msgid "missing '(' in package label: %s\n"
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
 msgstr ""
 
-#: lib/rpmts.c:217
+#: lib/rpmprob.c:155
 #, c-format
-msgid "missing ')' in package label: %s\n"
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
 msgstr ""
 
-#: lib/rpmts.c:273
+#: lib/rpmprob.c:159
 #, c-format
-msgid "%s: reading of public key failed.\n"
+msgid "%s is needed by %s%s"
 msgstr ""
 
-#: lib/rpmts.c:1087
-msgid "transaction"
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
 msgstr ""
 
-#: lib/signature.c:90
+#: lib/rpmprob.c:163
 #, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
+msgid "%s conflicts with %s%s"
 msgstr ""
 
-#: lib/signature.c:101
+#: lib/rpmprob.c:167
 #, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
+msgid "%s is obsoleted by %s%s"
 msgstr ""
 
-#: lib/signature.c:107
+#: lib/rpmprob.c:172
 #, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
+msgid "unknown error %d encountered while manipulating package %s"
 msgstr ""
 
-#: lib/signature.c:123
+#: lib/rpmrc.c:222
 #, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
+msgid "missing second ':' at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:196
+#: lib/rpmrc.c:225
 #, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+msgid "missing architecture name at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
+#: lib/rpmrc.c:370
+#, c-format
+msgid "Incomplete data line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:219
+#: lib/rpmrc.c:375
 #, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
+msgid "Too many args in data line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:235
+#: lib/rpmrc.c:382
 #, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
+msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr ""
 
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmrc.c:413
+#, c-format
+msgid "Incomplete default line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:408
-msgid "MD5 digest:"
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
 msgstr ""
 
-#: lib/signature.c:489
-msgid "Header "
+#: lib/rpmrc.c:551
+#, c-format
+msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/signature.c:530
+#: lib/rpmrc.c:564
 #, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
+msgid "missing architecture for %s at %s:%d\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "skipped"
+#: lib/rpmrc.c:632
+#, c-format
+msgid "bad option '%s' at %s:%d\n"
 msgstr ""
 
-#: lib/transaction.c:1426
-msgid "failed"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/verify.c:372
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "missing   %c %s"
+msgid "Unknown system: %s\n"
 msgstr ""
 
-#: lib/verify.c:422
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:342
-msgid "missing { after %"
+#: lib/rpmrc.c:1604
+#, c-format
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/headerfmt.c:375
-msgid "empty tag format"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/headerfmt.c:386
-msgid "empty tag name"
+#: lib/rpmscript.c:138
+#, c-format
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/headerfmt.c:393
-msgid "unknown tag"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
+#: lib/rpmscript.c:278
+#, c-format
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
+#: lib/rpmscript.c:313
+#, c-format
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:435
-msgid "unexpected }"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
 msgstr ""
 
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
+#: lib/rpmscript.c:371
+#, c-format
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
+#: lib/rpmscript.c:375
+#, c-format
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
+#: lib/rpmscript.c:378
+#, c-format
+msgid "%s scriptlet failed, exit status %d\n"
 msgstr ""
 
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
 msgstr ""
 
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
+#: lib/rpmte.c:729
+msgid "install"
 msgstr ""
 
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
+#: lib/rpmte.c:730
+msgid "erase"
 msgstr ""
 
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
+#: lib/rpmts.c:100
+#, c-format
+msgid "cannot open Packages database in %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:97
+#: lib/rpmts.c:199
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:191
+#: lib/rpmts.c:217
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:516
+#: lib/rpmts.c:225
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgid "missing ')' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmts.c:1142
+msgid "transaction"
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmvs.c:152
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/rpmdb.c:1415
+#: lib/rpmvs.c:158
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmvs.c:188
+#, c-format
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/rpmdb.c:1897
+#: lib/rpmvs.c:195
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmvs.c:206
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: lib/rpmdb.c:2349
+#: lib/rpmvs.c:261
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: lib/rpmdb.c:2358
-#, c-format
-msgid "error(%d) removing header #%d record\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmvs.c:268
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
+msgid "%s%s"
 msgstr ""
 
-#: lib/rpmdb.c:2448
-#, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: lib/rpmdb.c:2551
-#, c-format
-msgid "error(%d) allocating new package instance\n"
+#: lib/rpmvs.c:396
+msgid "Header "
 msgstr ""
 
-#: lib/rpmdb.c:2644
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
 msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
+#: lib/transaction.c:1397
+msgid "skipped"
 msgstr ""
 
-#: lib/rpmdb.c:2875
-#, c-format
-msgid "failed to create directory %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/verify.c:263
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/verify.c:284
 #, c-format
-msgid "cannot add record originally at %u\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
+#: lib/verify.c:397
+msgid "unknown state"
 msgstr ""
 
-#: lib/rpmdb.c:2949
+#: lib/verify.c:448
 #, c-format
-msgid "replace files in %s with files from %s to recover"
+msgid "missing   %c %s"
 msgstr ""
 
-#: lib/rpmdb.c:2960
+#: lib/verify.c:503
 #, c-format
-msgid "failed to remove directory %s: %s\n"
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: lib/backend/db3.c:33
+#: plugins/prioreset.c:29
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: lib/backend/db3.c:36
+#: plugins/prioreset.c:40
 #, c-format
-msgid "db%d error(%d): %s\n"
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
 
-#: lib/backend/db3.c:500
-#, c-format
-msgid "cannot get %s lock on %s/%s\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "shared"
+#: rpmio/digest_nss.c:79
+#, c-format
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
+#: rpmio/macro.c:286
+#, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr ""
 
-#: lib/backend/db3.c:582
+#: rpmio/macro.c:316
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%3d<%*s(empty)\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: rpmio/macro.c:483
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "Macro %%%s has unterminated opts\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "Macro %%%s has unterminated body\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: rpmio/macro.c:551
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: rpmio/macro.c:557
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "Macro %%%s has empty body\n"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: rpmio/macro.c:562
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "Macro %%%s needs whitespace before body\n"
 msgstr ""
 
-#: plugins/sepolicy.c:225
+#: rpmio/macro.c:566
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+msgid "Macro %%%s failed to expand\n"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: rpmio/macro.c:607
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: rpmio/macro.c:637
+#, c-format
+msgid "Macro %%%s defined but not used within scope\n"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: rpmio/macro.c:761
+#, c-format
+msgid "Unknown option %c in %s(%s)\n"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: rpmio/macro.c:1055
+msgid ""
+"Too many levels of recursion in macro expansion. It is likely caused by "
+"recursive macro declaration.\n"
 msgstr ""
 
-#: plugins/sepolicy.c:337
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
+msgid "Unterminated %c: %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:386
+#: rpmio/macro.c:1182
 #, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+msgid "A %% is followed by an unparseable macro\n"
 msgstr ""
 
-#: plugins/sepolicy.c:416
+#: rpmio/macro.c:1197
 #, c-format
-msgid "Failed to remove policy module: %s\n"
+msgid "failed to load macro file %s"
 msgstr ""
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: rpmio/macro.c:1578
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "======================== active %d empty %d\n"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: rpmio/rpmfileutil.c:258
 #, c-format
-msgid "Failed to execute %s: %s\n"
+msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr ""
+msgid "File %s: %s\n"
+msgstr "ఫైల్ %s: %s\n"
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: rpmio/rpmfileutil.c:332
 #, c-format
-msgid "%s failed with exit code %i\n"
+msgid "File %s is smaller than %u bytes\n"
 msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: rpmio/rpmlog.c:194
+msgid "error: "
 msgstr ""
 
-#: plugins/sepolicy.c:594
-#, c-format
-msgid "Failed to extract policy from %s\n"
+#: rpmio/rpmlog.c:195
+msgid "warning: "
 msgstr ""
 
-#: rpmio/macro.c:185
+#: rpmio/rpmlua.c:523
 #, c-format
-msgid "======================== active %d empty %d\n"
+msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/rpmlua.c:541
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:364
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
-msgid "%3d<%*s(empty)\n"
+msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/rpmlua.c:560
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
+msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:594
+#: rpmio/rpmlua.c:756
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
+msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/macro.c:600
+#: rpmio/rpmmalloc.c:25
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
 #, c-format
-msgid "Macro %%%s has empty body\n"
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/macro.c:611
+#: rpmio/rpmpgp.c:1127
 #, c-format
-msgid "Macro %%%s failed to expand\n"
+msgid "V%d %s/%s %s, key ID %s"
 msgstr ""
 
-#: rpmio/macro.c:649
-#, c-format
-msgid "Macro %%%s has illegal name (%%undefine)\n"
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
 msgstr ""
 
-#: rpmio/macro.c:743
+#: rpmio/rpmsq.c:37
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
+msgid "exiting on signal %d from pid %d\n"
 msgstr ""
 
-#: rpmio/macro.c:825
+#: sign/rpmgensig.c:54
 #, c-format
-msgid "Unknown option %c in %s(%s)\n"
+msgid "error creating temp directory %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1048
-msgid ""
-"Too many levels of recursion in macro expansion. It is likely caused by "
-"recursive macro declaration.\n"
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "Unterminated %c: %s\n"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:1175
+#: sign/rpmgensig.c:91
 #, c-format
-msgid "A %% is followed by an unparseable macro\n"
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:245
+#: sign/rpmgensig.c:167
 #, c-format
-msgid "error creating temporary file %s: %m\n"
+msgid "%s: Fwrite failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: sign/rpmgensig.c:173
 #, c-format
-msgid "File %s: %s\n"
-msgstr "ఫైల్ %s: %s\n"
+msgid "%s: Fread failed: %s\n"
+msgstr ""
 
-#: rpmio/rpmfileutil.c:319
+#: sign/rpmgensig.c:177
 #, c-format
-msgid "File %s is smaller than %u bytes\n"
+msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: sign/rpmgensig.c:202
+msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: sign/rpmgensig.c:208
 #, c-format
-msgid "invalid syntax in lua scriptlet: %s\n"
+msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: sign/rpmgensig.c:221
 #, c-format
-msgid "invalid syntax in lua script: %s\n"
+msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "lua script failed: %s\n"
+msgid "Could not exec %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
-#, c-format
-msgid "invalid syntax in lua file: %s\n"
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "lua hook failed: %s\n"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: sign/rpmgensig.c:312
+#, c-format
+msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
+#: sign/rpmgensig.c:354
+msgid "gpg failed to write signature\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
+#: sign/rpmgensig.c:371
+msgid "unable to read the signature\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
 msgstr ""
 
-#: rpmio/rpmmalloc.c:25
-#, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1008
-#, c-format
-msgid "V%d %s/%s %s, key ID %s"
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
+msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
-#, c-format
-msgid "%s: Fwrite failed: %s\n"
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s: Fflush failed: %s\n"
+msgid "%s already contains identical file signatures\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
-msgid "Unsupported PGP signature\n"
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "Unsupported PGP hash algorithm %u\n"
+msgid "%s: rpmReadSignature failed: %s"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:689
 #, c-format
-msgid "Unsupported PGP pubkey algorithm %u\n"
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:722
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "%s already contains identical signature, skipping\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
-msgid "gpg exec failed (%d)\n"
+msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
-msgid "gpg failed to write signature\n"
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:263
-msgid "unable to read the signature\n"
+#: sign/rpmgensig.c:812
+#, c-format
+msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
-msgid "rpmMkTemp failed\n"
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
-#, c-format
-msgid "%s already contains identical signature, skipping\n"
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
 msgstr ""
 
-#: sign/rpmgensig.c:525
-#, c-format
-msgid "%s: writeLead failed: %s\n"
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:531
-#, c-format
-msgid "%s: rpmWriteSignature failed: %s\n"
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:545
-#, c-format
-msgid "replacing %s failed: %s\n"
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 5b6be9f2a97fc22ecb11023c733293a2354687b6..7f6ec70b8e173ef10d739b51df997a5d5dc2985a 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -3,21 +3,21 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Muhammet Kara <muhammet.k@gmail.com>, 2011-2012.
+# Muhammet Kara <muhammetk@gmail.com>, 2011-2012,2014
+# Muhammet Kara <muhammetk@gmail.com>, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 08:10+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Turkish (http://www.transifex.com/projects/p/rpm/language/"
-"tr/)\n"
+"Language-Team: Turkish (http://www.transifex.com/rpm-team/rpm/language/tr/)\n"
 "Language: tr\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"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: cliutils.c:21 lib/poptI.c:29
 #, c-format
@@ -46,508 +46,570 @@ msgstr ""
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "icra başarısız\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "argüman bir RPM paketi değil\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "paketten başlık okunması sırasında hata oluştu\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "payload %s tekrar açılamıyor\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr ""
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Sorgulama seçenekleri (-q ya da --query ile)"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Denetleme seçenekleri (-V ya da --verify ile)"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Kurma/Güncelleme/Kaldırma seçenekleri:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Tüm rpm kipleri ve yürütülebilir dosyaları için ortak seçenekler:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "bir anda sadece bir tarz sorgulama/denetleme yapılabilir"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "beklenmeyen sorgulama bayrakları"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "beklenmeyen sorgulama biçemi"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "beklenmeyen sorgulama kaynağı"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "sadece bir ana kip belirtilebilir"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr ""
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr ""
-"dosyalar sadece paket kurulumu sırasında yeni yerlerine yerleştirilebilir"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr ""
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate ve --excludepath sadece yeni paket kurulumunda kullanılabilir"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix sadece yeni paketlerin kurulması sırasında kullanılabilir"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "--prefix ile belirtilenler '/' ile başlamalı"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs sadece paket kurulumu sırasında kullanılabilir"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs sadece paket kurulumu sırasında kullanılabilir"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs sadece paket kurulumu sırasında kullanılabilir"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "--excludedocs ve --includedocs bir arada kullanılamaz"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch sadece paket kurulumu sırasında kullanılabilir"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos sadece paket kurulumu sırasında kullanılabilir"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize sadece paket kurulumu sırasında kullanılabilir"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches sadece paket kurulumu sırasında kullanılabilir"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles sadece paket kurulumu sırasında kullanılabilir"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"--justdb sadece paket kurulumu ve kaldırılması sırasında kullanılabilir"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"betik iptal etme seçenekleri sadece paketin kurulması ve silinmesi sırasında "
-"kullanılabilir"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"tetikleme iptal seçenekleri sadece paketin kurulması ve silinmesi sırasında "
-"kullanılabilir"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "--root (-r) ile verilenler '/' ile başlamalı"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr ""
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "yüklenecek paket(ler) belirtilmedi"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "sorgulama için hiç argüman belirtilmedi"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "denetleme için hiç argüman belirtilmedi"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot zaten belirtilmiş, %s yoksayılıyor\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "<specDosyası>ndan  %prep adımı sayesinde oluşturulur (kaynak paketi açılır "
 "ve yamalar uygulanır)"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specDosyası>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 "<specDosyası>ndan %build adımı sayesinde oluşturulur (%prep, sonra da "
 "derlenir)"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "<specDosyası>ndan %install adımı sayesinde oluşturulur (%prep, %build, sonra "
 "da kurulum)"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "<specDosyası>ndan %files bölümünü denetler"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "kaynak ve çalıştırılabilir paketleri <specDosyası>ndan oluşturur"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "çalıştırılabilir paketi sadece <specDosyası>ndan oluşturur"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "kaynak paketi sadece <specDosyası>ndan oluşturur"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<kaynak paketi>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"<kaynak paketi>nden %install adımı sayesinde oluşturulur (%prep, %build, "
+"sonra da kurulur)"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "<tarpaketi>nden %prep adımı sayesinde oluşturulur (kaynak paketi açılır ve "
 "yamalar uygulanır)"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarPaketi>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr ""
 "<tarPaketi>nden %build adımı sayesinde oluşturulur (%prep, sonra da derleme)"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "<tarpaketi>nden %install adımı sayesinde oluşturulur (%prep, %build, sonra "
 "da kurulur)"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "<tarpaketi>nden %files bölümünü denetler"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "kaynak ve çalıştırılabilir paketleri <tarpaketi>nden oluşturur"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "çalıştırılabilir paketi sadece <tarpaketi>nden oluşturur"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "kaynak paketi sadece <tarpaketi>nden oluşturur"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "çalıştırılabilir paketi <kaynak paketi>nden oluşturur"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<kaynak paketi>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"<kaynak paketi>nden %install adımı sayesinde oluşturulur (%prep, %build, "
-"sonra da kurulur)"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "build root'a zorlar"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "işlem sonunda paket oluşturma ağacını siler"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "spec dosyasındaki ExcludeArch: yönergeleri yoksayılıyor"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "hata ayıklama dosyası durum motoru"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "oluşumun herhangi bir adımı icra edilmez"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr ""
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "spec dosyası içindeki i18n msgstr'leri kabul edilmez"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "işlem sonunda kaynakları siler"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "işlem sonunda spec dosyasını siler"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "doğrudan belirtilen adıma atlar (sadece c ve i için)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "hedef platforma zorlar"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 "[ <specDosyası> | <tarPaketi> | <kaynakPaketi> ] ile paketleme seçenekleri:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Tüm rpm kipleri ve yürütülebilir dosyaları için ortak seçenekler:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr ""
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "%s spec dosyası açılamadı: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "tar veriyolu açılamadı: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "%s paketinden spec dosyası okunamadı\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "%s %s olarak değiştirilemedi: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "%s durum bilgileri alınamadı: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "%s bir normal bir dosya değil.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "%s bir spec dosyası gibi görünmüyor.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Hedef platformlar derleniyor: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "%s için derleniyor\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "--root (-r) ile verilenler '/' ile başlamalı"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "veritabanını başlangıç durumuna getirir"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr "kurulu paket başlıklarından veritabanı listelerini yeniden oluşturur"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "veritabanı dosyaralını doğrular"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Veritabanı seçenekleri:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "sadece bir ana kip belirtilebilir"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "paket imza(lar)ını doğrula"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr ""
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr ""
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Anahtarlık seçenekleri:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr ""
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr ""
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Sorgulama seçenekleri (-q ya da --query ile)"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Denetleme seçenekleri (-V ya da --verify ile)"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Kurma/Güncelleme/Kaldırma seçenekleri:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "bir anda sadece bir tarz sorgulama/denetleme yapılabilir"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "beklenmeyen sorgulama bayrakları"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "beklenmeyen sorgulama biçemi"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "beklenmeyen sorgulama kaynağı"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr ""
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr ""
+"dosyalar sadece paket kurulumu sırasında yeni yerlerine yerleştirilebilir"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr ""
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate ve --excludepath sadece yeni paket kurulumunda kullanılabilir"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix sadece yeni paketlerin kurulması sırasında kullanılabilir"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "--prefix ile belirtilenler '/' ile başlamalı"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs sadece paket kurulumu sırasında kullanılabilir"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs sadece paket kurulumu sırasında kullanılabilir"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs sadece paket kurulumu sırasında kullanılabilir"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "--excludedocs ve --includedocs bir arada kullanılamaz"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch sadece paket kurulumu sırasında kullanılabilir"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos sadece paket kurulumu sırasında kullanılabilir"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize sadece paket kurulumu sırasında kullanılabilir"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches sadece paket kurulumu sırasında kullanılabilir"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles sadece paket kurulumu sırasında kullanılabilir"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"--justdb sadece paket kurulumu ve kaldırılması sırasında kullanılabilir"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"betik iptal etme seçenekleri sadece paketin kurulması ve silinmesi sırasında "
+"kullanılabilir"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"tetikleme iptal seçenekleri sadece paketin kurulması ve silinmesi sırasında "
+"kullanılabilir"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr ""
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "yüklenecek paket(ler) belirtilmedi"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "sorgulama için hiç argüman belirtilmedi"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "denetleme için hiç argüman belirtilmedi"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr "paket(ler)i imzala"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr ""
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "paket imzalarını sil"
 
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr "İmza seçenekleri:"
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
 msgstr ""
 
-#: rpmsign.c:108
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "İmza seçenekleri:"
+
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Makro dosyanızda \"%%_pgp_name\" tanımlanmış olmalı\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Anahtar parolasını girin: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Anahtar parolası doğru.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr "sorgu belirtim dosyaları"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr ""
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr ""
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "izleyen sorgulama biçimini kullanır"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "Belirtim seçenekleri:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -556,32 +618,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "%s icra ediliyor: %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "%s 'in icrası başarısız (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "%s çıkışında hata (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -591,783 +658,920 @@ msgstr ""
 "\n"
 "RPM derleme hataları:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "== çözümlenirken sözdizimi hatası bulundu\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "&& çözümlenirken sözdizimi hatası bulundu\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "|| çözümlenirken sözdizimi hatası bulundu\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "ifadede çözümleme hatası\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "uyumsuz (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- sadece sayılarda\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! sadece sayılarda\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "türler eşleşmeli\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / dizgelerde desteklenmez\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- dizgelerde desteklenmez\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& ve || dizgelerde desteklenmez\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "ifadede sözdizimi hatası\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "%s içinde '(' yok: %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "%s içinde ')' yok: (%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Andaç %s geçersiz: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
+msgid "Missing %s in %s(%s)\n"
 msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "%s() boşluksuz yazılmış: %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Sözdizimi hatası: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "mode spec hatalı: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "dirmode spec hatalı: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Geçersiz yeterlilik: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr ""
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Dosya \"/\" ile başlamalı: %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Dosya iki kere gösterildi: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Sembolik bağ BuildRoot gösteriyor: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Dosya bulunamadı: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Dizin değil: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr ""
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: genel anahtar okuması başarısız oldu.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr ""
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: kodlama başarısız oldu\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr ""
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Dosya \"/\" ile içermeli: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "Dosya glob tarafından bulunamadı: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "satır: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Dosya glob tarafından bulunamadı: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Dosya hatalı: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Kullanıcı/grup hatalı: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr ""
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
 "%s"
 msgstr ""
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Dosyalar işleniyor: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr ""
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: satır: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Böyle bir makina yok: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "%s'e payload yazılamadı: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "%s'den payload okunamadı: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Böyle bir makina yok: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Geçici dosya açılamadı.\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "%s paketinden spec dosyası okunamadı\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
 msgstr ""
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "CSA verisi geçersiz\n"
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "İmza başlığı yeniden yüklenemedi.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "%s açılamadı: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "paket yazılamadı: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "sigtarget %s açılamadı: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "%s'den başlık okunamadı: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "%s'e başlık yazılamadı: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Yazıldı: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "\"%s\" yürütülüyor:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "\"%s\"in yürütülmesi başarısız oldu.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr ""
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "%s paket dosyası için çıktı dosya adı üretilemedi: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "%s dosyası oluşturulamıyor: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "%d satır: %s saniye\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "%%changelog girdi * ile başlamalı\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "%%changelog girdi eksik\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "%%changelog içinde tarih hatası: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr ""
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "%%changelog içinde isim yok\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "%%changelog içinde açıklama yok\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "satır %d: %%description ayrıştırılırken hata: %s \n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "satır %d: %s seçeneği hatalı: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "satır %d: İsim sayısı fazla: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "satır %d: Paket yok: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "satır %d: İkinci açıklama\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "satır %d: %%files ayrıştırılırken hata: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "satır %d: Numara hatalı: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "satır %d: Hatalı %s numarası: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr ""
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Mimari dışlandı: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Mimari içerilmedi: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "OS dışlandı: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "OS içerilmedi: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "Pakette %s alan mevcut olmalı: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Pakette %s girdi tekrarlanmış: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "%s kısayol simgesi açılamadı: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "%s kısayol simgesi okunamadı: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "bilinmeyen kısayol simgesi türü: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "satır %d: Etiket sadece tek dizgecik alır: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr ""
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "satır %d: Etiket bozuk: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "satır %d: Etiket boş: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "satır %d: Önekler \"/\" ile bitemez: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "satır %d: Docdir '/' ile başlamalı: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "satır %d: %s hatalı: niteleyiciler: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "satır %d: BuildArchitecture biçimi hatalı: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "İçsel hata: %d etiketi sahte\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Paket özellikleri hatalı: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Paket zaten var: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "satır %d: Bilinmeyen etiket: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Kaynak hatalı: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr ""
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr ""
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "%%setup çözümlenirken hata: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "satır %d: %%setup argumanı hatalı: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "satır %d: %%setup seçeneği %s hatalı: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Geçersiz yama numarası %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "satır %d: %%prep saniye\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "satır %d: tetikleyiciler -- içermeli: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "satır %d: %s çözümlenirken hata oluştu: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "satır %d: içsel betik '>' ile bitmeli: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "satır %d: betik programı '/' ile başlamalı: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "satır %d: %s saniye\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "satır %d: desteklenmeyen içsel betik: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "satır %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "%s açılamadı: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: %%if'siz bir  %%else alındı\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: %%if'siz bir %%endif alındı\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Kurgulamak için uyumlu mimari yok\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "Paket %%description içermiyor: %s\n"
@@ -1438,450 +1642,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr ""
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "%s icra edilemedi: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "%s ayrılamadı: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr ""
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr ""
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "%s bulunamadı:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "%s spec dosyasının sorgulanması başarısız, çözümlenemiyor\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(hata 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Magic hatalı"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Hatalı/okunamayan başlık"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "tanınmayan db seçeneği: \"%s\" yoksayıldı\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Başlık çok uzun"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s geçersiz sayısal değer içeriyor, atlandı\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s ya çok büyük ya da çok küçük 'long' değer içeriyor, atlandı\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s ya çok büyük ya da çok küçük 'integer' değer içeriyor, atlandı\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "%s kilit  %s/%s'den alınamadı\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "paylaşımlı"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "bağdaşık"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Bilinmeyen dosya türü"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Sabit bağ(lar) eksik"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
 msgstr ""
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "İç hata"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " başarısız - "
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "yeni paket örneğini tutma hatası(%d)\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr ""
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr ""
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr ""
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(bir sayı değil)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(dizge değil)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(geçersiz tür)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
-msgstr ""
+msgstr "%a %d %b %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
-msgstr ""
-
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr ""
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr ""
+msgstr "(base64 değil)"
 
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(geçersiz xml türü)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(OpenPGP imzası değil)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "normal"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr ""
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "kurulmamış"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr ""
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "yanlış renk"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "eksik"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(bilinmiyor)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(dizge değil)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "kullanıcı %s yok - root kullanılacak\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "grup %s yok - root kullanılacak\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s %s olarak kaydedildi\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s %s olarak oluşturuldu\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
-msgstr ""
+msgstr "dizin"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
-msgstr ""
+msgstr "dosya"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
 msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1833
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1841
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1876
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
-#, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1885
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
 msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1890
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
 msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1909
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
 msgstr ""
 
-#: lib/package.c:442
-#, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:452
+#: lib/header.c:1949
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
+#: lib/headerfmt.c:356
+msgid "invalid field width"
 msgstr ""
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:362
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:384
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: İmza bulundurmuyor\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "etiket biçemi boş"
 
-#: lib/package.c:581
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "etiket ismi boş"
+
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: headerRead failed: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "dizinin sonunda ] gerekli"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "beklenmeyen ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "beklenmeyen }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "ifade içerisinde ? gerekli"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "ifade içerisinde ? dan sonra { gerekli"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "ifade içinde } gerekli"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "? alt ifadesinden sonra : gerekli"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "ifade içersinde : den sonra { gerekli"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "ifadenin sonunda | gerekli"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: Fread başarısız: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr ""
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr ""
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr ""
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr ""
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr ""
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr ""
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr ""
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr ""
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr ""
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr ""
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr ""
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr ""
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "tanımlanmış sorgulama etiketlerini gösterir"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "son rpmrc ve makro yapılandırmasını gösterir"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "daha az ayrıntılı çıktı sağlar"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "daha ayrıntılı çıktı sağlar"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "Kullanılan RPM sürümünü verir"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr ""
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "rpmio G/Ç hata kontrolu"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr ""
@@ -1902,11 +2217,11 @@ msgstr "yeniden konumlandırma işlemleri = içermelidir"
 msgid "relocations must have a / following the ="
 msgstr "yeniden konumlandırma için = den sonra bir / gerekir"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr "yapılandırmalarda atlanmış bile olsa tüm dosyaları kurar"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1914,151 +2229,161 @@ msgstr ""
 "<paket> ile eşlenen tüm paketleri kaldırır(<paket> ile çok sayıda paket "
 "belirtilmişse normalde bir hata oluşur)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr ""
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr ""
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "paketi kaldırır"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<paket>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr ""
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "belgeleri kurmaz"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "<dosyayolu> ile başlayan dosyaları atlar "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<dosyaYolu>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "--replacepkgs --replacefiles için kısaltma"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "paket(ler) kurulu ise paket(ler)i günceller"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<paketDosyası>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr "paketin kurulma sürecini gösteren imler basar (-v ile)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "paket mimarisi denetlenmez"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "paketin ait olduğu işletim sistemini doğrulamaz"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "yüklemeden önce yeterli disk alanı kontrolu yapmaz"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "paket ile gelen belgeleri kurar"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
-msgstr ""
+msgstr "paket(ler)i kur"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "veri tabanını günceller, ama dosya sistemini değiştirmez"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "paket bağımlılıklarını denetlemez"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr ""
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr ""
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr ""
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "paket kurulum sırasını bağımlılıklara göre düzenlemez"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "paket betikleri çalıştırılmaz"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "%%pre betiği (varsa) çalıştırılmaz"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "%%post betiği (varsa) çalıştırılmaz"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "%%preun betiği (varsa) çalıştırılmaz"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "%%postun betiği (varsa) çalıştırılmaz"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "bu paket tarafından tetiklenen hiç bir betik çalıştırılmaz"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "hiçbir %%triggerprein betiği çalıştırılmaz"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "hiçbir %%triggerin betiği çalıştırılmaz."
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "hiçbir %%triggerun betiği çalıştırılmaz."
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "hiçbir %%triggerpostun betiği çalıştırılmaz."
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2066,368 +2391,407 @@ msgstr ""
 "paketin eski bir sürüme güncellenmesini sağlar (--force aynı işi otomatik "
 "yapar)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "kurulumun gelişimi yüzde olarak gösterilir"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "eğer değitirilebiliyorsa paketin yerini <dizin>'e değiştirir"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dizin>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "dosyaları <eski> dizininden kaldırıp <yeni> dizinine yerleştirir"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<eski>=<yeni>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr ""
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "paketi yeniden kurar"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "yükleme yapmaz, sadece çalışıp çalışmayacağını belirtir"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "paket günceller"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "tüm paketleri sorgular/doğrular"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr ""
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "dosyayı içeren paketleri sorgular/denetler"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "gruptaki paketleri sorgular/denetler"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr ""
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr ""
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr ""
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "rpm sorgulama kipi"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr ""
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr ""
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "paket tarafından tetiklenen paketleri sorgular"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "rpm denetleme kipi"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "bir bağımlılık gerektiren paketleri sorgular/denetler"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "bir bağımlılığı sağlayan  paketleri sorgular/denetler"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr ""
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "tüm yapılandırma dosyalarını listeler"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "tüm belgeleme dosyalarını gösterir"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "tüm belgeleme dosyalarını gösterir"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "tüm yapılandırma dosyalarını listeler"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "temel dosya bilgilerini gösterir"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "paketteki dosyaları gösterir"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "%%ghost dosyaları atlanır"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "%%ghost dosyaları atlanır"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "listelenmiş dosyaların durumunu gösterir"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "dosyaların uzunlukları doğrulanmaz"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "dosyaların sembolik bağ dosya yolları doğrulanmaz"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "dosyaların sahipleri doğrulanmaz"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "dosyaların grupları doğrulanmaz"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "dosyaların değişiklik zamanları doğrulanmaz"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "dosyaların kipleri doğrulanmaz"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
 msgstr ""
 
-#: lib/poptQV.c:236
-msgid "don't verify file security contexts"
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
 msgstr ""
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "paketteki dosyalar doğrulanamaz"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "paket bağımlılıkları doğrulanmaz"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr ""
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "kaynak paketi gerekirken çalıştırılabilir paketi bulundu\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "kaynak paketi .spec dosyası içermiyor\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "arşiv paketi açılırken başarısız%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " dosyada "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "biçem yanlış: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr ""
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "normal        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "yerine        "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "yüklenmedi "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "ağ paylaşımlı "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
-msgstr ""
+msgstr "yanlış renk"
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(durumsuz)    "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(bilinmeyen %3d)"
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr ""
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr "paket ne dosya sahibi ne de kimlik listesi içeriyor\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "%s grubu hiç paket içermiyor\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "%s tetikleyen paket yok\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr ""
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr ""
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "%s gerektiren paket yok\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "%s sağlayan paket yok\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "dosya %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "%s dosyası, hiç bir pakete ait değil\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "geçersiz paket numarası: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "%s paketi kurulu değil\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "TAMAM DEĞİL"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "Tamam"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (EKSİK ANAHTARLAR:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (GÜVENCESİZ ANAHTARLAR:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: açılamadı: %s\n"
@@ -2440,7 +2804,7 @@ msgstr ""
 #: lib/rpmchroot.c:59 lib/rpmchroot.c:84
 #, c-format
 msgid "%s: chroot directory not set\n"
-msgstr ""
+msgstr "%s: chroot dizini belirlenmemiş\n"
 
 #: lib/rpmchroot.c:70
 #, c-format
@@ -2452,215 +2816,446 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "belirtilmiş bir dbpath değeri yok\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr ""
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: 0x%x de başlık okunamadı\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "belirtilmiş bir dbpath yok"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr ""
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "kayıt özgün olarak %u e eklenemedi\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"veritabanı yeniden oluşturulamadı: mevcut veritabanı değişmeden\n"
+"yerinde bırakıldı\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "eski veritabanının yenisiyle değiştirilirmesi başarısız!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "HAYIR "
 
-#: lib/rpmds.c:489
-msgid "YES"
-msgstr "EVET"
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "EVET"
+
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+msgstr ""
+
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr ""
+
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr ""
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr ""
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr ""
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr ""
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr ""
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr ""
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr ""
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr ""
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "lua betikleri için dahili destek."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr ""
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
 
-#: lib/rpmds.c:933
-msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
 msgstr ""
 
-#: lib/rpmds.c:936
-msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
 msgstr ""
 
-#: lib/rpmds.c:940
-msgid "package payload can be compressed using bzip2."
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
 msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
 msgstr ""
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
 msgstr ""
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Magic hatalı"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Hatalı/okunamayan başlık"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Başlık çok uzun"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "Dosya arşiv için çok büyük"
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Bilinmeyen dosya türü"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
 msgstr ""
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
 msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "İç hata"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
+
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " başarısız - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "%s açılamadı: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
-msgstr ""
+msgstr "Güncelleniyor / kuruluyor...\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
-msgstr ""
+msgstr "Temizleniyor / kaldırılıyor...\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Hazırlanıyor..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
-msgstr ""
+msgstr "Paketler hazırlanıyor..."
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
-msgstr ""
+msgstr "Sağlanamayan bağımlılıklar:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s yüklenemedi\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "%s alınıyor\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
-msgstr ""
+msgstr "%s atlanıyor - aktarım başarısız\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr ""
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "%s dosyasından okuma hatalı\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr ""
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "%s açılamadı: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "%s kuruluyor\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
-msgstr ""
+msgstr "rpm paketi değil"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr ""
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
-msgstr ""
+msgstr "desteklenmeyen RPM paketi sürümü"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "okuma başarısız: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
-msgstr ""
+msgstr "rpm paketi değil\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr ""
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
-msgstr ""
+msgstr "farklı"
 
 #: lib/rpmprob.c:114
 #, c-format
@@ -2714,7 +3309,7 @@ msgstr ""
 
 #: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
 msgid "(installed) "
-msgstr ""
+msgstr "(kuruldu)"
 
 #: lib/rpmprob.c:163
 #, c-format
@@ -2731,798 +3326,633 @@ msgstr ""
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "anlaşılamayan %d hatası, %s paketi işlenirken saptandı"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "%s:%d - ikinci ':' eksik\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "%s:%d - mimari ismi eksik\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "%s:%d - veri satırı tamamlanmamış\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "%s:%d - veri satırında çok fazla argüman\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "arch/os numarası hatalı: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "%s:%d - öntanımlı satır tamamlanmamış\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "%s:%d - öntanımlı satırda çok fazla argüman\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "(0x%02x bulundu) %s:%d de ':' yok\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr "%s için %s:%d de argüman eksik\n"
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr ""
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "%s için %s:%d'de eksik mimari\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "seçenek '%s' (%s:%d) de hatalı\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Bilinmeyen sistem: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Bilinmeyen biçim"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "kur"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "sil"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "%s de Paket veritabanı açılamadı\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Başlık"
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "atlandı"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "başarısız oldu"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "eksik   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "%% den sonraki { yok"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "%%{ den sonraki } yok"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "etiket biçemi boş"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "etiket ismi boş"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "bilinmeyen etiket"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "dizinin sonunda ] gerekli"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "beklenmeyen ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "beklenmeyen }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "ifade içerisinde ? gerekli"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "ifade içerisinde ? dan sonra { gerekli"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "ifade içinde } gerekli"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr "? alt ifadesinden sonra : gerekli"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "ifade içersinde : den sonra { gerekli"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "ifadenin sonunda | gerekli"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
+msgid "missing argument for %s at %s:%d\n"
+msgstr "%s için %s:%d de argüman eksik\n"
 
-#: lib/rpmdb.c:191
+#: lib/rpmrc.c:551
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "%s indeksi db%d - %s (%d) kullanarak açılamadı\n"
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr ""
 
-#: lib/rpmdb.c:516
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "%s için %s:%d'de eksik mimari\n"
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "belirtilmiş bir dbpath değeri yok\n"
+#: lib/rpmrc.c:632
+#, c-format
+msgid "bad option '%s' at %s:%d\n"
+msgstr "seçenek '%s' (%s:%d) de hatalı\n"
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr ""
+msgid "Unknown system: %s\n"
+msgstr "Bilinmeyen sistem: %s\n"
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "%s: regexec failed: %s\n"
+msgid "Please contact %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "%s: regcomp failed: %s\n"
+msgid "Unable to open %s for reading: %m.\n"
 msgstr ""
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
+msgid "Unable to restore current directory: %m"
 msgstr ""
 
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) removing header #%d record\n"
+msgid "Couldn't create temporary file for %s: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmscript.c:313
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: 0x%x de başlık okunamadı\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2448
+#: lib/rpmscript.c:353
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
+msgid "Fwrite failed: %s"
 msgstr ""
 
-#: lib/rpmdb.c:2467
+#: lib/rpmscript.c:371
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2477
+#: lib/rpmscript.c:375
 #, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+msgid "%s scriptlet failed, signal %d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:378
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "yeni paket örneğini tutma hatası(%d)\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr ""
 
-#: lib/rpmdb.c:2644
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "hata(%d): \"%s\" kayıt %s indeksinden alınıyor\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Bilinmeyen biçim"
 
-#: lib/rpmdb.c:2660
-#, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "hata(%d): %s kayıt %s içine yazılıyor\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "kur"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "belirtilmiş bir dbpath yok"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "sil"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr ""
+msgid "cannot open Packages database in %s\n"
+msgstr "%s de Paket veritabanı açılamadı\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmts.c:199
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
+msgid "extra '(' in package label: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/rpmts.c:217
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "kayıt özgün olarak %u e eklenemedi\n"
-
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
+msgid "missing '(' in package label: %s\n"
 msgstr ""
-"veritabanı yeniden oluşturulamadı: mevcut veritabanı değişmeden\n"
-"yerinde bırakıldı\n"
-
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "eski veritabanının yenisiyle değiştirilirmesi başarısız!\n"
-
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "kurtarmak için %s içindeki dosyalar %s deki dosyalarla değiştiriliyor"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:225
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "%s dizininin silinmesi başarısız: %s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr ""
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:284
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d hata(%d) %s'den: %s\n"
+msgid "%s: reading of public key failed.\n"
+msgstr ""
 
-#: lib/backend/db3.c:36
-#, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d hata(%d): %s\n"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr ""
 
-#: lib/backend/db3.c:500
+#: lib/rpmvs.c:152
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "%s kilit  %s/%s'den alınamadı\n"
-
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "paylaşımlı"
-
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "bağdaşık"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:158
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:178
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "tanınmayan db seçeneği: \"%s\" yoksayıldı\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s geçersiz sayısal değer içeriyor, atlandı\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s ya çok büyük ya da çok küçük 'long' değer içeriyor, atlandı\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:206
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s ya çok büyük ya da çok küçük 'integer' değer içeriyor, atlandı\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr ""
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Başlık"
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr ""
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "İmza başlığı yeniden yüklenemedi.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "atlandı"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "başarısız oldu"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
+#: lib/verify.c:263
 #, c-format
-msgid "Failed to fork process: %s\n"
+msgid "Duplicate username or UID for user %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
+#: lib/verify.c:284
 #, c-format
-msgid "Failed to execute %s: %s\n"
+msgid "Duplicate groupname or GID for group %s\n"
 msgstr ""
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
-#, c-format
-msgid "%s terminated abnormally\n"
+#: lib/verify.c:395
+msgid "no state"
 msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "bilinmeyen durum"
+
+#: lib/verify.c:448
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr ""
+msgid "missing   %c %s"
+msgstr "eksik   %c %s"
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
 msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
 msgstr ""
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: plugins/sepolicy.c:594
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:185
-#, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== %d etkin %d boş\n"
-
-#: rpmio/macro.c:323
-#, c-format
-msgid "%3d>%*s(empty)"
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(boş)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(boş)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "%%%s makrosunun gövdesi sonlandırılmamış\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "%%%s makrosunu seçenekleri sonlandırılmamış\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "%%%s makrosunun ismi kuraldışı (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "%%%s makrosunun gövdesi sonlandırılmamış\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "%%%s makrosunu seçenekleri sonlandırılmamış\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "%%%s makrosu boş\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "%%%s makrosu genişletmede başarısız\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "%%%s makrosunun ismi kuraldışı (%%define)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "%%%s (%s) makrosu %d seviyenin altında kullanılmadı\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "%c seçeneği %s(%s) de anlaşılamadı\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "%c sonlandırılmamış: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "Bir ayrıştırılamayan makro tarafından bir %% izlendi\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "makro dosyası %s'in yüklenmesi başarısız oldu"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== %d etkin %d boş\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "%s dosyası: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "%s dosyası %u bayttan küçük\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
+#: rpmio/rpmio.c:298
+msgid "[none]"
 msgstr ""
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(hata yok)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "ölümcül hata: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "hata: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "uyarı: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "bellek ayrılırken (%u bayt) NULL döndü.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(hata yok)"
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr ""
 
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "ölümcül hata: "
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr ""
 
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "hata: "
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
 
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "uyarı: "
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmmalloc.c:25
+#: sign/rpmgensig.c:62
 #, c-format
-msgid "memory alloc (%u bytes) returned NULL.\n"
-msgstr "bellek ayrılırken (%u bayt) NULL döndü.\n"
+msgid "error creating fifo %s: %m\n"
+msgstr ""
 
-#: rpmio/rpmpgp.c:1008
+#: sign/rpmgensig.c:83
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "error delete fifo %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
-msgid "(none)"
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
 msgstr ""
 
-#: sign/rpmgensig.c:87
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite başarısız: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread başarısız: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
-msgstr ""
+msgstr "Desteklenmeyen PGP imzası\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
+msgid "Could not read from file %s: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr ""
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "imzanın yazılması sırasında gpg hata verdi\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "imza okunamadı\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: writeLead başarısız: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr ""
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "RPM v3 paketleri imzalanamıyor\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: rpmWriteSignature başarısız: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: writeLead başarısız: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr ""
index 71ec660a62dd06138950d65615a10e9c82eb8364..1f478f62a39cdf41d0eb99034f7c29b7112cc99c 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
@@ -3,15 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Yuri Chornoivan <yurchor@ukr.net>, 2011-2012.
+# Yuri Chornoivan <yurchor@ukr.net>, 2011-2012,2014-2015
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-11-05 11:05+0000\n"
-"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
-"Language-Team: Ukrainian <translation@linux.org.ua>\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: Ukrainian (http://www.transifex.com/rpm-team/rpm/language/"
+"uk/)\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -45,517 +46,585 @@ msgstr "Цю програму можна вільно поширювати за
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "спроба створення каналу для параметра --pipe зазнала невдачі: %m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "помилка виконання exec\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
 msgstr "аргумент не є пакунком RPM\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "помилка під час спроби читання заголовка з пакунка\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "не вдалося повторно відкрити вміст: %s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "Опитування/Перевірка параметрів вибору пакунка:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "Опитати параметри (за допомогою -q або --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "Перевірити параметри (за допомогою -V або --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "Параметри встановлення/оновлення/вилучення:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "Загальні параметри для всіх режимів та виконуваних файлів rpm:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "за один раз можна виконувати лише один тип запиту або перевірки"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "неочікувані прапорці запитів"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "неочікуваний формат запитів"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "неочікуване джерело запиту"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "можна визначати лише один основний режим"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "примусово можна виконувати лише встановлення і оновлення"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "змінювати розташування файлів можна лише під час встановлення пакунка"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "не можна використовувати --prefix разом з --relocate або --excludepath"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr ""
-"--relocate і --excludepath можна використовувати лише під час встановлення "
-"нових пакунків"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr ""
-"--prefix можна використовувати, лише під час встановлення нових пакунків"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "аргументи параметра --prefix мають починатися символом /"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-"--hash (-h) можна вказувати лише під час встановлення або вилучення пакунків"
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-"--percent можна вказувати лише під час встановлення або вилучення пакунків"
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs можна вказувати лише під час встановлення пакунків"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs можна вказувати лише під час встановлення пакунків"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs можна вказувати лише під час встановлення пакунків"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr ""
-"можна вказувати лише один з параметрів, --excludedocs або --includedocs"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch можна вказувати лише під час встановлення пакунків"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos можна вказувати лише під час встановлення пакунків"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize можна вказувати лише під час встановлення пакунків"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches можна вказувати лише під час встановлення пакунків"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles можна вказувати лише під час встановлення пакунків"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr ""
-"--justdb можна вказувати лише під час встановлення або вилучення пакунків"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"параметри вимикання скриптів можна вказувати лише під час встановлення або "
-"вилучення пакунків"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr ""
-"параметри вимикання перемикачів можна вказувати лише під час встановлення "
-"або вилучення пакунків"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-"--nodeps можна вказувати лише під час встановлення, вилучення або перевірки "
-"пакунків"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-"--test можна вказувати лише під час встановлення або вилучення пакунків"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "аргументи параметра --root (-r) мають починатися символом /"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "не вказано пакунків для вилучення"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "не вказано пакунків для встановлення"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "не вказано аргументів запиту"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "не вказано аргументів перевірки"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot вже вказано, ігноруємо %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr ""
 "виконати команди аж до %prep (розпакувати коди і накласти латки) з <файла "
 "специфікації>"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<файл специфікації>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr ""
 "виконати аж до команди %build (%prep, потім збирання) з <файла специфікації>"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr ""
 "виконати аж до команди %install (%prep, %build, потім встановити) з <файла "
 "специфікації>"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "перевірити розділ %files з <файла специфікації>"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "зібрати пакунки з кодами та бінарними файлами за <файлом специфікації>"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "зібрати за <файлом специфікації> лише пакунок з бінарними файлами"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "зібрати за <файлом специфікації> лише пакунок з кодами"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+"виконати команди аж до %prep (розпакувати коди і накласти латки) з <пакунка "
+"з початковим кодом>"
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<пакунок з кодами>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+"виконати аж до команди %build (%prep, потім збирання) з <пакунка з "
+"початковим кодом>"
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"виконати аж до команди %install (%prep, %build, потім встановити) з <пакунка "
+"з кодами>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr "перевірити розділ %files з <пакунка з початковим кодом>"
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+"зібрати за <пакунком з кодами> пакунок з бінарними файлами та пакунок з "
+"початковим кодом"
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr "зібрати за <пакунком з кодами> лише пакунок з бінарними файлами"
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+"зібрати за <пакунком з початковими кодами> лише пакунок з початковими кодами"
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr ""
 "виконати команди аж до %prep (розпакувати коди і накласти латки) з <архіву "
 "tar>"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<архів tar>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "виконати аж до команди %build (%prep, потім збирання) з <архіву tar>"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr ""
 "виконати аж до команди %install (%prep, %build, потім встановити) з <архіву "
 "tar>"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "перевірити розділ %files з <архіву tar>"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "зібрати пакунки з кодами та бінарними файлами за <архівом tar>"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "зібрати за <архівом tar> лише пакунок з бінарними файлами"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "зібрати за <архівом tar> лише пакунок з кодами"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "зібрати за <пакунком з кодами> пакунок з бінарними файлами"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<пакунок з кодами>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr ""
-"виконати аж до команди %install (%prep, %build, потім встановити) з <пакунка "
-"з кодами>"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "перевизначити кореневий каталог збирання"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr "запустити збирання у поточному каталозі"
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "вилучити ієрархію каталогу збирання після завершення збирання"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "ігнорування ExcludeArch: настанови з файла специфікації"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "зневаджування кінцевого автомата файлів"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "не виконувати жодного з кроків збирання"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "не перевіряти залежності збирання"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 "створити заголовки пакунків, сумісні з (застарілим) пакуванням версій rpm 3"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr "не виконувати етапу %clean збирання"
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr "не виконувати етапу %prep збирання"
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr "не виконувати етапу %check збирання"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "не приймати рядки перекладів з файла специфікації"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "вилучити коди після збирання"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "вилучити файл специфікації після збирання"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "перейти одразу до вказаного кроку (лише для c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "перевизначити платформу призначення"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr ""
 "Параметри збирання з [ <файл spec> | <архів tar> | <пакунок з кодами> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Загальні параметри для всіх режимів та виконуваних файлів rpm:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "Не вдалося зібрати залежності:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "Не вдалося відкрити файл spec %s: %s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "Не вдалося відкрити канал tar: %m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr "У %s виявлено декілька файлів специфікації\n"
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "Не вдалося прочитати файл spec з %s\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "Не вдалося перейменувати %s на %s: %m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "не вдалося отримати дані за допомогою stat з %s: %m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "Файл %s не є звичайним файлом.\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "Здається, файл %s не є файлом spec.\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "Збирання для таких платформ: %s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "Збирання для %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "аргументи параметра --root (-r) мають починатися символом /"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "ініціалізувати базу даних"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr ""
 "перебудувати зворотні списки бази даних на основі заголовків встановлених "
 "пакунків"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "перевірити файли бази даних"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr "експортувати базу даних до списку заголовків stdout"
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr "імпортувати базу даних зі списку заголовків stdin"
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "Параметри бази даних:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "можна визначати лише один основний режим"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "перевірити підписи пакунка"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "імпортувати захищених відкритий ключ"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr "не імпортувати, але повідомити, працюватиме чи ні"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "показати список ключів зі сховища ключів RPM"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "Параметри сховища ключів:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "не вказано жодних параметрів"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Опитування/Перевірка параметрів вибору пакунка:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Опитати параметри (за допомогою -q або --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Перевірити параметри (за допомогою -V або --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Параметри встановлення/оновлення/вилучення:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "за один раз можна виконувати лише один тип запиту або перевірки"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "неочікувані прапорці запитів"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "неочікуваний формат запитів"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "неочікуване джерело запиту"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "примусово можна виконувати лише встановлення і оновлення"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "змінювати розташування файлів можна лише під час встановлення пакунка"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "не можна використовувати --prefix разом з --relocate або --excludepath"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"--relocate і --excludepath можна використовувати лише під час встановлення "
+"нових пакунків"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr ""
+"--prefix можна використовувати, лише під час встановлення нових пакунків"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "аргументи параметра --prefix мають починатися символом /"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+"--hash (-h) можна вказувати лише під час встановлення або вилучення пакунків"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+"--percent можна вказувати лише під час встановлення або вилучення пакунків"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs можна вказувати лише під час встановлення пакунків"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs можна вказувати лише під час встановлення пакунків"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs можна вказувати лише під час встановлення пакунків"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr ""
+"можна вказувати лише один з параметрів, --excludedocs або --includedocs"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch можна вказувати лише під час встановлення пакунків"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos можна вказувати лише під час встановлення пакунків"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize можна вказувати лише під час встановлення пакунків"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches можна вказувати лише під час встановлення пакунків"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles можна вказувати лише під час встановлення пакунків"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"--justdb можна вказувати лише під час встановлення або вилучення пакунків"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"параметри вимикання скриптів можна вказувати лише під час встановлення або "
+"вилучення пакунків"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"параметри вимикання перемикачів можна вказувати лише під час встановлення "
+"або вилучення пакунків"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+"--nodeps можна вказувати лише під час встановлення, вилучення або перевірки "
+"пакунків"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+"--test можна вказувати лише під час встановлення або вилучення пакунків"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "не вказано пакунків для вилучення"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "не вказано пакунків для встановлення"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "не вказано аргументів запиту"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "не вказано аргументів перевірки"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
 msgstr "підписати пакунки"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
 msgstr "підписати пакунки (тотожне до --addsign)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
 msgstr "вилучити підписи пакунка"
 
-#: rpmsign.c:35
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "Параметри підписування:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "Не вдалося виконати %s: %s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "Вам слід встановити значення \"%%_gpg_name\" у вашому файлі макросу\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "Введіть пароль: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "Пароль підтверджено.\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
-"Не вдалося пройти перевірку паролем або строк дії ключа gpg вичерпано\n"
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr "вивести оброблені дані файлів spec до stdout"
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr "опитати файли spec"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr "обробити бінарні rpm, створені на основі spec (типово)"
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr "обробити srpm, створені на основі spec"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "використовувати вказаний нижче формат запиту"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "Параметри spec:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr "не вказано аргументів обробки"
 
@@ -564,32 +633,37 @@ msgstr "не вказано аргументів обробки"
 msgid "Unable to open temp file: %s\n"
 msgstr "Не вдалося відкрити файл тимчасових даних: %s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr "Не вдалося відкрити потік даних: %s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "Виконання(%s): %s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "Не вдалося виконати %s (%s): %s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr "Помилка під час спроби виконання допоміжного скрипту %s (%s)\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "Отримано стан виходу з помилкою від %s (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -599,237 +673,317 @@ msgstr ""
 "\n"
 "Помилки збирання RPM:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "синтаксична помилка під час обробки ==\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "синтаксична помилка під час обробки &&\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "синтаксична помилка під час обробки ||\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "помилка обробки у виразі\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "незакрита дужка (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- лише для чисел\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! лише для чисел\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "типи мають збігатися\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / не підтримується для рядків\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- не підтримується для рядків\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& і || не підтримуються для рядків\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "синтаксична помилка у виразі\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "Не вистачає «(» у %s %s\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "Не вистачає «)» у %s(%s\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "Некоректний елемент %s: %s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "Не вистачає %s у %s %s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "За %s() вказано непробільне значення: %s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "Помилковий синтаксис: %s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "Помилкові права доступу: %s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "Помилкові права доступу до каталогу: %s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr "Незвичайна довжина locale: «%s» у %%lang(%s)\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr "Дублювання locale %s у %%lang(%s)\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "Некоректний мандат: %s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "Підтримку мандатів на файли не було зібрано\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "Назва файла має починатися з «/»: %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 "Невідомий алгоритм обчислення контрольної суми файла %u, буде використано "
 "MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "Файл вказано двічі: %s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "під час спроби читання символічного посилання %s сталася помилка: %s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "Символічне посилання вказує на BuildRoot: %s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "Шлях поза межами кореневої теки збирання: %s\n"
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "Не знайдено каталогу: %s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "Файл не знайдено: %s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Не є каталогом: %s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s: не вдалося завантажити невідомий теґ (%d).\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s: невдала спроба читання відкритого ключа.\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: не є захищеним відкритим ключем.\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s: не вдалося закодувати\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "не вдалося створити каталог"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "Назва файла має починатися з «/»: %s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "Не можна використовувати glob %%dev: %s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "Каталог не знайдено glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "У glob файла не виявлено: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "Не вдалося відкрити файл %%files %s: %m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "рядок: %s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr "Порожній файл %%files %s\n"
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "Помилка під час спроби читання файла %%files %s: %m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr "некоректний формат каталогу документації %s: %s\n"
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "У glob файла не виявлено: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr "Не можна змішувати спеціальний %s з іншими формами: %s\n"
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr "Декілька файлів у одному рядку: %s\n"
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "Помилковий файл: %s: %s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "Помилкові дані щодо власника/групи: %s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "Пошук незапакованих файлів: %s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -838,553 +992,612 @@ msgstr ""
 "Виявлено встановлені (але не запаковані) файли:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "Обробка файлів: %s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 "Архітектура виконуваних файлів (%d) не збігається з архітектурою пакунка "
 "(%d).\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "Виявлено залежні від архітектури бінарні файли у пакунку noarch\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr "спроба створення архіву зазнала невдачі на файлі %s: %s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr "спроба створення архіву зазнала невдачі: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr "Не вдалося відкрити файл %s: %s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: рядок: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "Не вдалося привести до канонічної форми назву вузла: %s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "Не вдалося записати вміст до %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð¿Ñ\80оÑ\87иÑ\82аÑ\82и Ð²Ð¼Ñ\96Ñ\81Ñ\82 Ð· %s: %s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð¿Ñ\80ивеÑ\81Ñ\82и Ð´Ð¾ ÐºÐ°Ð½Ð¾Ð½Ñ\96Ñ\87ноÑ\97 Ñ\84оÑ\80ми Ð½Ð°Ð·Ð²Ñ\83 Ð²Ñ\83зла: %s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr "Невідомий спосіб стиснення вмісту: %s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "Не вдалося створити незмінну область заголовка.\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "Не вдалося відкрити файл тимчасових даних.\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr "Не вдалося виконати позиціювання у файлі %s: %s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "Не вдалося записати тимчасовий заголовок\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Не вдалося прочитати файл правил: %s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "Помилкові дані CSA\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "Не вдалося перезавантажити заголовок підпису.\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
 msgstr "Не вдалося відкрити %s: %s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "Не вдалося записати пакунок: %s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "Не вдалося відкрити ціль підписування %s: %s\n"
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "Не вдалося прочитати заголовок з %s: %s\n"
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "Не вдалося записати заголовок до %s: %s\n"
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "Записано: %s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "Виконання «%s»:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "Спроба виконання «%s» зазнала невдачі.\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
 msgstr "Спроба перевірки пакунка «%s» зазнала невдачі.\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
 msgstr "Не вдалося створити назву файла виведених даних для пакунка %s: %s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "не вдалося створити %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "рядок %d: друге %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr "зайва дата у %%changelog: %s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "записи %%changelog мають починатися на *\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "неповний запис %%changelog\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "помилкова дата у %%changelog: %s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog вказано не у порядку спадання дат\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "у %%changelog не вказано імені\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "у %%changelog не вказано опису\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "рядок %d: другий запис %%changelog\n"
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "рядок %d: помилка під час обробки %%description: %s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "рядок %d: помилковий параметр %s: %s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "рядок %d: забагато назв: %s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "рядок %d: пакунка не існує: %s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "рядок %d: повторний опис\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "рядок %d: помилка під час обробки %%files: %s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr "рядок %d: помилка під час обробки %%policies: %s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr "Помилка під час спроби обробки поля теґу: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "рядок %d: помилкова кількість: %s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr "рядок %d: помилкова кількість no%s: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "рядок %d: помилкова кількість %s: %s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d визначено декілька разів\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr "Звантаження %s до %s\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr "Не вдалося звантажити %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "Виключено архітектуру: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "Не включено архітектуру: %s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "Виключено ОС: %s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "Не включено ОС: %s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
 msgstr "У пакунку має бути поле %s: %s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
 msgstr "Дублювання записів %s у пакунку: %s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "Не вдалося відкрити піктограму %s: %s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "Не вдалося прочитати піктограму %s: %s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "Невідомий тип піктограми: %s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "рядок %d: у тезі має бути лише один елемент: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "рядок %d: некоректний символ «%c» у: %s\n"
+msgid "line %d: %s in: %s\n"
+msgstr "рядок %d: %s у %s\n"
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "рядок %d: некоректний символ у: %s\n"
+msgid "%s in: %s\n"
+msgstr "%s у %s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
-msgstr "рядок %d: некоректна послідовність «..» у: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr "Некоректний символ «%c» (0x%x)"
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr "Заборонена послідовність «..»"
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "рядок %d: помилковий теґ: %s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "рядок %d: порожній теґ: %s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "рядок %d: префікси не повинні завершуватися на «/»: %s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "рядок %d: запис Docdir має починатися з «/»: %s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr "рядок %d: у полі Epoch має бути вказано ціле невід’ємне число: %s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "рядок %d: помилкове значення %s: специфікатори: %s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "рядок %d: помилковий формат BuildArchitecture: %s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr "рядок %d: передбачено підтримку лише підпакунків типу noarch: %s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "Внутрішня помилка: зайвий теґ %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr "рядок %d: %s вважається застарілим: %s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
 msgstr "Помилкова специфікація пакунка: %s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "Пакунок вже існує: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "рядок %d: невідомий теґ: %s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr "%%{buildroot} не може бути порожнім\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr "%%{buildroot} не може приймати значення «/»\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "Помилкове джерело: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "Латки з номером %u не існує\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr "%%patch без відповідного теґу \"Patch:\"\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "Джерела з номером %u не існує\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "У файлі spec немає теґу \"Source:\"\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "Помилка під час обробки %%setup: %s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "рядок %d: помилковий аргумент %%setup: %s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "рядок %d: помилковий параметр %%setup %s: %s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "Некоректний номер латки %s: %s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "рядок %d: друге %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr "записи залежностей мають починатися з букви, числа, «_» або «/»"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr "не можна використовувати версії у назвах файлів"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr "СлÑ\96д Ð²ÐºÐ°Ð·Ð°Ñ\82и Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\8e"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr "Ð\94лÑ\8f Ñ\86Ñ\8cого Ñ\82ипÑ\83 Ñ\80озÑ\88иÑ\80енÑ\96 Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñ\81Ñ\82Ñ\96 Ð·Ð°Ð±Ð¾Ñ\80онено"
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr "некоректна залежність"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "Слід вказати версію"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr "У файлових перемикачах можна використовувати лише абсолютні шляхи"
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr "Перемикач для того самого пакунка вже визначено у файлі специфікації"
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr "рядок %d: %s: %s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "рядок %d: у записах перемикачів має бути --: %s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "рядок %d: помилка під час обробки %s: %s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr ""
 "рядок %d: запис вбудованого скрипту має завершуватися символом «>»: %s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "рядок %d: програма скрипту має починатися з  символу «/»: %s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+"рядок %d: пріоритетність можна встановлювати лише для файлових перемикачів: "
+"%s\n"
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "рядок %d: друге %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "рядок %d: непідтримуваний вбудований скрипт: %s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 "рядок %d: у перемикачах не можна використовувати аргументи інтерпретатора: "
 "%s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "рядок %d: %s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr "Макрос розгорнуто у коментарі у рядку %d: %s\n"
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "Не вдалося відкрити %s: %s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr "%s:%d: мало бути вказано аргумент для %s\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr "рядок %d: незавершена команда %%if\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr "рядок %d: незавершений макрос або помилкове продовження рядка\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr "%s:%d: помилкова умова %%if\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d: вказано %%else без %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d: вказано %%endif без %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr "%s:%d: помилкове форматування інструкції %%include\n"
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr "у системі не передбачено підтримки кодування %s\n"
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr "Пакунок %s: некоректне кодування %s у %s: %s - %s\n"
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "Не знайдено сумісних архітектур для збирання\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
 msgstr "У пакунка немає поля %%description: %s\n"
@@ -1457,453 +1670,567 @@ msgstr "Забагато аргументів у рядку: %s\n"
 msgid "Processing policies: %s\n"
 msgstr "Обробка правил: %s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr "Ігноруємо некоректний формальний вираз %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "Не вдалося створити канал для %s: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "Не вдалося виконати %s: %s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "Не вдалося розгалуження %s: %s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "Помилка %s: %x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "Не вдалося записати всі дані до %s: %s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "Невдала спроба перетворення %s у формат long integer.\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr "Порожній класифікатор файла\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "Не вказано атрибутів файла\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "помилка magic_open(0x%x): %s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "помилка magic_load: %s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "Спроба розпізнавання файла «%s» зазнала невдачі: режим %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "Пошук %s: %s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "Не вдалося знайти %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr ""
 "спроба опитування файла специфікації %s зазнала невдачі, не вдалося "
 "обробити\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(помилка 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s помилка (%d), повідомлено %s: %s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "Помилкове значення magic"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s помилка (%d): %s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "Помилковий/Непридатний до читання заголовок"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "невідомий параметр db: «%s» проігноровано.\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "Розмір заголовка занадто великий"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s має некоректне числове значення, пропущено\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
-msgstr "Файл є занадто великим для архівування"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr ""
+"%s має занадто велике або занадто мале довге ціле значення, пропущено\n"
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "Невідомий тип файла"
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s має занадто велике або занадто мале ціле значення, пропущено\n"
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "Не вистачає жорсткого посилання"
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "не вдалося отримати блокування %s на %s/%s\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "Невідповідність контрольних сум"
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "спільний"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "Ð\92нÑ\83Ñ\82Ñ\80Ñ\96Ñ\88нÑ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "екÑ\81клÑ\8eзивний"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "Файла архіву не вказано у заголовку"
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "некоректний тип покажчика %x у %s/%s\n"
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " помилка - "
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "помилка(%d) отримання записів «%s» з покажчика %s: %s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "помилка (%d) під час спроби збереження запису «%s» до %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "помилка (%d) під час спроби вилучення запису «%s» з %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "помилка (%d) під час додавання запису заголовка №%d\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "помилка (%d) під час вилучення запису заголовка №%d\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "помилка (%d) розподілу нового екземпляра пакунка\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 "%s належить до типу Delta RPM, його не можна встановлювати безпосередньо\n"
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr "Непідтримуваний вміст (%s) у пакунку %s\n"
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
 msgstr "пакунок %s вже було додано, пропускаємо %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
 msgstr "пакунок %s вже було додано, замінюємо на %s\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(не є бінарним об’єктом)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(не є числом)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(не є рядком)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(некоректний тип)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(не є base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(некоректний тип)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(не є бінарним об’єктом)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(некоректний тип xml)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(не є підписом OpenPGP)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr "Некоректна дата %u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "звичайний"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "замінено"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "не встановлено"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "мережевий"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "помилковий колір"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "немає"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(невідомо)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(не є рядком)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "запису користувача %s не існує, — використовуємо root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "запису групи %s не існує, — використовуємо root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s збережено як %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s створено як %s\n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr "%s %s: спроба вилучення зазнала невдачі: %s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr "каталог"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr "файл"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr "пропущено %s %s з непридатним для перевірки підписом\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr "пропущено %s з непридатним для перевірки підписом\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr "завантаження заголовка: ПОМИЛКА"
+
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "теґ[%d]: ПОМИЛКА, теґ %d тип %d зміщення %d лічильник %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr "мітка області: BAD, мітка %d тип %d відступ %d кількість %d"
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "SHA1 заголовка: ПОМИЛКА, не є шістнадцятковою\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr "зміщення ділянки: ПОМИЛКА, теґ %d тип %d зміщення %d к-ть %d"
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "RSA заголовка: ПОМИЛКА, не є двійковою\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr "залишок ділянки: ПОМИЛКА, теґ %d тип %d зміщення %d к-ть %d"
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "DSA заголовка: ПОМИЛКА, не є двійковою\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "розмір бінарного об’єкта (%d): ПОМИЛКА, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
-msgstr "мітка області: BAD, мітка %d тип %d відступ %d кількість %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr "розмір заголовка(%d): ПОМИЛКА, read повернуто %d"
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr "magic заголовка: ПОМИЛКА"
+
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "зміщення ділянки: ПОМИЛКА, теґ %d тип %d зміщення %d лічильник %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr "теґи заголовка: ПОМИЛКА, кількість теґів(%d) перевищує максимальну"
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "залиÑ\88ок Ð´Ñ\96лÑ\8fнки: Ð\9fÐ\9eÐ\9cÐ\98Ð\9bÐ\9aÐ\90, Ñ\82еÒ\91 %d Ñ\82ип %d Ð·Ð¼Ñ\96Ñ\89еннÑ\8f %d Ð»Ñ\96Ñ\87илÑ\8cник %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr "данÑ\96 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°: Ð\9fÐ\9eÐ\9cÐ\98Ð\9bÐ\9aÐ\90, ÐºÑ\96лÑ\8cкÑ\96Ñ\81Ñ\82Ñ\8c Ð±Ð°Ð¹Ñ\82Ñ\96в(%d) Ð¿ÐµÑ\80евиÑ\89Ñ\83Ñ\94 Ð¼Ð°ÐºÑ\81ималÑ\8cнÑ\83"
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "розмір ділянки: ПОМИЛКА, ril(%d) > il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr "бінарний елемент заголовка(%zd): ПОМИЛКА, read повернуто %d"
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "розмір заголовка(%d): ПОМИЛКА, read повернуто %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr "pad sigh (%zd): ПОМИЛКА, прочитано %zd байтів"
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "magic заголовка: ПОМИЛКА\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "теґи заголовка: ПОМИЛКА, кількість теґів(%d) перевищує максимальну\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr "розмір бінарного об’єкта (%d): ПОМИЛКА, 8 + 16 * il(%d) + dl(%d)"
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "некоректна ширина поля"
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "дані заголовка: ПОМИЛКА, кількість байтів(%d) перевищує максимальну\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
-msgstr "бінарний елемент заголовка(%zd): ПОМИЛКА, read повернуто %d\n"
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "порожній формат теґу"
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "заванÑ\82аженнÑ\8f Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°: Ð\9fÐ\9eÐ\9cÐ\98Ð\9bÐ\9aÐ\90\n"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "поÑ\80ожнÑ\8f Ð½Ð°Ð·Ð²Ð° Ñ\82еÒ\91Ñ\83"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s: помилка rpmReadSignature: %s"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
-msgstr "%s: підпис недоступний\n"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "не вистачає ] у кінці запису масиву"
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s: помилка headerRead: %s"
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "неочікувана ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "неочікувана }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "не вистачає ? у виразі"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "у виразі після ? слід вказати {"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "у виразі не вистачає }"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": після ? не вистачає підвиразу"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "у виразі після : слід вказати {"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "вираз має завершуватися символом |"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "ітератор масиву використано з двома масивами різної розмірності"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s: помилка fread: %s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
+"%s: помилка: вказано декілька параметрів --pipe (несумісні альтернативні "
+"назви popt?)\n"
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "попередньо визначити для МАКРОСу значення ВИРАЗ"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "'МАКРОС ВИРАЗ'"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "визначити МАКРОС зі значенням ВИРАЗ"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
-msgstr ""
+msgstr "скасувати визначення MACRO"
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
-msgstr ""
+msgstr "MACRO"
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "вивести розгорнуте значення макросу ВИРАЗ"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "'ВИРАЗ'"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "читати <ФАЙЛ:...> замість типових файлів"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<ФАЙЛ:...>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr "не вмикати жодних додатків"
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
 msgstr "не перевіряти контрольні суми пакунків"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "не перевіряти заголовки, отримані з бази даних"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "не перевіряти підписи пакунків"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "вивести stdout у CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "використовувати КОРІНЬ як каталог найвищого рівня"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "КОРІНЬ"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr "використовувати базу даних у КАТАЛОЗІ"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "КАТАЛОГ"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "показати відомі теґи запитів"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "показати остаточний rpmrc і налаштування макросів"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "обмежити виведення даних"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "вивести докладні дані"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "вивести використану версію rpm"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "зневаджування кінцевого автомата файлів вмісту"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "зневаджування вводу-виводу rpmio"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s: помилкове налаштування таблиці параметрів (%d)\n"
@@ -1924,13 +2251,13 @@ msgstr "записи переміщень повинні містити ="
 msgid "relocations must have a / following the ="
 msgstr "у записах переміщень має бути /, за яким слід вказати ="
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr ""
 "встановити всі файли, навіть файли налаштувань, які у іншому разі можна було "
 "б пропустити"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
@@ -1938,153 +2265,163 @@ msgstr ""
 "вилучити всі пакунки, що відповідають ключу <пакунок> (зазвичай, якщо "
 "<пакунок> вказує на декілька пакунків, буде повідомлено про помилку)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
 msgstr "перемістити файли у непридатному до переміщення пакунку"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "вивести циклічні залежності у попередженні"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "вилучити пакунок"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<пакунок>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "не встановлювати файли налаштувань"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "не встановлювати документацію"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "пропустити файли, назви яких починаються на <шлях> "
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<шлях>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "скорочення для --replacepkgs --replacefiles"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "оновити пакунки, якщо їх вже встановлено"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<файл пакунка>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
 msgstr ""
 "виводити символи решіток для позначення поступу встановлення (варто "
 "використовувати разом з -v)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "не перевіряти архітектуру пакунка"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "не перевіряти операційну систему пакунка"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "не перевіряти наявність місця на диску перед встановленням"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "встановити документацію"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "встановити пакунки"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "оновити базу даних, але не вносити змін до файлової системи"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "не перевіряти залежностей пакунків"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "не перевіряти контрольних сум файлів"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "не перевіряти контрольних сум файлів (застаріле)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "не встановлювати контекстів безпеки файлів"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "не змінювати порядок пакунків для задоволення залежностей"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
 msgstr "не виконувати допоміжних скриптів пакунка"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "не виконувати допоміжного скрипту %%pre (якщо такий вказано)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "не виконувати допоміжного скрипту %%post (якщо такий вказано)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "не виконувати допоміжного скрипту %%preun (якщо такий вказано)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "не виконувати допоміжного скрипту %%postun (якщо такий вказано)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "не виконувати допоміжного скрипту %%pretrans (якщо такий вказано)"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "не виконувати допоміжного скрипту %%posttrans (якщо такий вказано)"
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
 msgstr "не виконувати жодних допоміжних скриптів, які стосуються цього пакунка"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "не виконувати жодних допоміжних скриптів %%triggerprein"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "не виконувати жодних допоміжних скриптів %%triggerin"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "не виконувати жодних допоміжних скриптів %%triggerun"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "не виконувати жодних допоміжних скриптів %%triggerpostun"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr "не виконувати жодних дій зі збірками"
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
@@ -2092,370 +2429,408 @@ msgstr ""
 "оновити до старішої версії пакунка (--force у командах оновлення виконує "
 "таку операцію автоматично)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "виводити дані щодо поступу встановлення у відсотках"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
 msgstr "перемістити пакунок до <каталогу>, якщо пакунок можна переміщувати"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<каталог>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "перемістити файли з каталогу <старий> до каталогу <новий>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<старий>=<новий>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "ігнорувати конфлікти файлів між пакунками"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "перевстановити, якщо пакунок вже встановлено"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "не встановлювати, лише повідомити, чи буде працювати"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "оновити пакунки"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "перевстановити пакунки"
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "опитати/перевірити всі пакунки"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "режим перевірки підписів"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "опитати/перевірити пакунки, до яких належить файл"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "опитати/перевірити пакунки з групи"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "опитати/перевірити файл пакунка"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
 msgstr "опитати/перевірити пакунки за ідентифікатором пакунка"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
 msgstr "опитати/перевірити пакунки за ідентифікатором заголовка"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "режим опитування rpm"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "опитати/перевірити екземпляр заголовка"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
 msgstr "опитати/перевірити пакунки з операції зі встановлення"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
 msgstr "опитати пакунки, які пов’язано з пакунком"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "режим перевірки rpm"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
 msgstr "опитати/перевірити пакунки, яким потрібні залежні пакунки"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
 msgstr "опитати/перевірити пакунки, які надають файли залежностей"
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr "опитати або перевірити пакунки, які рекомендують залежність"
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr "опитати або перевірити пакунки, які пропонують залежність"
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr "опитати/перевірити пакунки, які доповнюють залежність"
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr "опитати/перевірити пакунки, які покращують роботу залежності"
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "не збирати аргументи разом"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "не обробляти не запаковані файли як маніфести"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "показати список всіх файлів налаштувань"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "показати список всіх файлів документації"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "показати список всіх файлів документації"
+msgstr "показати список усіх файлів ліцензування"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "показати список усіх файлів ліцензування"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "створити дамп основних даних щодо файлів"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
 msgstr "показати список файлів у пакунку"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "пропускати файли %%ghost"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "пропускати файли %%ghost"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "показати стан файлів зі списку"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "не перевіряти розмірів файлів"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "не перевіряти шляхи символічних посилань на файли"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "не перевіряти власників файлів"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "не перевіряти групу власників файлів"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "не перевіряти час зміни файлів"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "не перевіряти права доступу до файлів"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "не перевіряти можливості файлів"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "не перевіряти контексти безпеки файла"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "не перевіряти можливості файлів"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "не перевіряти файли у пакунку"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "не перевіряти залежності пакунків"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "не виконувати скриптів перевірки"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr "Для %s можливості rpmlib є недостатніми:\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "слід було вказати пакунок з кодами, вказано бінарний пакунок\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "у пакунку з кодами не міститься файла .spec\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "спроба розпакування архіву завершилася невдало%s%s: %s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr " на файлі "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "помилка дії %s на файлі %s: %s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "помилка дії %s: %s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "помилковий формат: %s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(не містить файлів)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "звичайний    "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "замінено      "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "не встановлено "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "мережевий     "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "помилк. колір  "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(не має стану)"
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(невідомий %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
 msgstr "у пакунку немає списків власника/групи файлів\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
 msgstr ""
 "у пакунку немає ні списку власників файлів, ні списку ідентифікаторів\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "у групі %s не міститься жодного пакунка\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
 msgstr "жоден з пакунків не перемикає %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "помилковий формат %s: %s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
 msgstr "жодне з пакунків не відповідає ключу %s: %s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
 msgstr "жоден з пакунків не потребує %s\n"
 
-#: lib/query.c:392
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr "жоден із пакунків не рекомендує %s\n"
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr "жоден із пакунків не пропонує %s\n"
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr "жоден із пакунків не доповнює %s\n"
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr "жоден із пакунків не розширює можливості %s\n"
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
 msgstr "жоден з пакунків не надає %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "файл %s: %s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
 msgstr "файл %s не належить до жодного з пакунків\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
 msgstr "некоректний номер пакунка: %s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr "не вдалося прочитати запис %u\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "пакунок %s не встановлено\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "невідомий теґ: «%s»\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr "%s: спроба імпортування ключа %d завершилася невдало.\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr "%s: ключ %d не є захищеним відкритим ключем.\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s: помилка читання під час імпортування(%d).\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr "%s: помилка headerRead: %s\n"
+msgid "Fread failed: %s"
+msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
-"%s: не вдалося прочитати незмінну ділянку заголовка. Пакунок пошкоджено?\n"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "ПОМИЛКА"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "Гаразд"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (НЕ ВИСТАЧАЄ КЛЮЧІВ:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (НЕНАДІЙНІ КЛЮЧІ:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s: помилка відкриття: %s\n"
@@ -2480,218 +2855,450 @@ msgstr "Не вдалося змінити кореневий каталог: %m
 msgid "Unable to restore root directory: %m\n"
 msgstr "Не вдалося відновити кореневий каталог: %m\n"
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "Створення %d пропущених покажчиків, будь ласка, зачекайте…\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr "не вдалося відкрити покажчик %s за допомогою %s — %s (%d)\n"
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "не було встановлено шляху dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: пропущено"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "помилка (%d) збереження запису №%d до %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: помилка regexec: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: помилка regcomp: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: пропущено"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: отримано пошкоджений заголовок №%u — пропущено.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: не вдалося прочитати заголовок за адресою 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "не було встановлено шляху dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "не вдалося створити каталог %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "заголовок №%u у базі даних є помилковим — пропущено.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "не вдалося додати запис з початковим розташуванням у %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"не вдалося перебудувати базу даних: початкова база даних залишається на "
+"місці\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "не вдалося замінити стару базу даних новою!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "НІ "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "ТАК"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr "PreReq:, Provides: і Obsoletes: підтримка версій залежностей."
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 "назви файлів збережено як кортеж (dirName,baseName,dirIndex), а не як шлях."
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
 msgstr "вміст пакунка може бути стиснуто за допомогою bzip2."
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
 msgstr "вміст пакунка може бути стиснуто за допомогою xz."
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
-msgstr "вміст пакунка може бути стиснуто за допомогою lzma."
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr "вміст пакунка може бути стиснуто за допомогою lzma."
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "файли вмісту пакунка мають префікс «./»."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "назва-версія-випуск пакунка не надаються автоматично."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "теґи заголовка завжди впорядковуються після завантаження."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr ""
+"інтерпретатор допоміжних скриптів може використовувати аргументи з заголовка."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "підтримується часткове встановлення набору жорстких посилань пакунка."
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+"допоміжні скрипти пакунка можуть отримувати доступ до бази даних rpm під час "
+"встановлення."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "вбудована підтримка скриптів lua."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+"алгоритм обчислення контрольних сум може бути вибрано для кожного з пакунків "
+"окремо"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "підтримка мандатів файлів POSIX.1e"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr "допоміжні скрипти пакунка може бути розширено під час встановлення."
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr "порівнянням залежностей підтримується запис версій з тильдою."
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "підтримка файлів, розмір яких перевищує 4 ГБ"
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr "підтримка розширених залежностей."
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr "Невідома дія для розширеної залежності, «%.*s»"
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr "Потрібна назва"
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr "Розширена залежність не починається з «(»"
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr "Пропущено аргумент до дії із розширеною залежністю"
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr "Порожня розширена залежність"
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr "Незавершений запис розширеної залежності: %s"
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr "Не можна створювати ланцюжок із різних дій"
+
+#: lib/rpmds.c:1564
+#, fuzzy
+msgid "Can only chain and/or/with ops"
+msgstr "Ланцюжок можна створювати лише з дій AND і OR"
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr "Зайві дані після запису розширеної залежності"
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Помилкове значення magic"
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "файли вмісту пакунка мають префікс «./»."
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Помилковий/Непридатний до читання заголовок"
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "назва-веÑ\80Ñ\81Ñ\96Ñ\8f-випÑ\83Ñ\81к Ð¿Ð°ÐºÑ\83нка Ð½Ðµ Ð½Ð°Ð´Ð°Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð°Ð²Ñ\82омаÑ\82иÑ\87но."
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "РозмÑ\96Ñ\80 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Ð·Ð°Ð½Ð°Ð´Ñ\82о Ð²ÐµÐ»Ð¸ÐºÐ¸Ð¹"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "теґи заголовка завжди впорядковуються після завантаження."
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "Файл є занадто великим для архівування"
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr ""
-"інтерпретатор допоміжних скриптів може використовувати аргументи з заголовка."
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Невідомий тип файла"
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "пÑ\96дÑ\82Ñ\80имÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\87аÑ\81Ñ\82кове Ð²Ñ\81Ñ\82ановленнÑ\8f Ð½Ð°Ð±Ð¾Ñ\80Ñ\83 Ð¶Ð¾Ñ\80Ñ\81Ñ\82киÑ\85 Ð¿Ð¾Ñ\81иланÑ\8c Ð¿Ð°ÐºÑ\83нка."
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "Ð\9dе Ð²Ð¸Ñ\81Ñ\82аÑ\87аÑ\94 Ñ\84айлÑ\96в"
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr ""
-"допоміжні скрипти пакунка можуть отримувати доступ до бази даних rpm під час "
-"встановлення."
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Невідповідність контрольних сум"
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "вбÑ\83дована Ð¿Ñ\96дÑ\82Ñ\80имка Ñ\81кÑ\80ипÑ\82Ñ\96в lua."
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Ð\92нÑ\83Ñ\82Ñ\80Ñ\96Ñ\88нÑ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr ""
-"алгоритм обчислення контрольних сум може бути вибрано для кожного з пакунків "
-"окремо"
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Файла архіву не вказано у заголовку"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr "підтримка мандатів файлів POSIX.1e"
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
-msgstr "допоміжні скрипти пакунка може бути розширено під час встановлення."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " помилка - "
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
-msgstr "порівнянням залежностей підтримується запис версій з тильдою."
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: (помилка 0x%x)"
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "помилка відкриття %s: %s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr "Перевищено рівень максимальної рекурсії у маніфесті: %s\n"
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr "%s: не є пакунком rpm (або маніфестом пакунка)\n"
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr "Оновлення або встановлення…\n"
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr "Спорожнення або вилучення…\n"
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "Підготовка..."
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr "Приготування пакунків…"
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "Помилкові залежності:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
 msgstr "%s: не є пакунком rpm (або маніфестом пакунка): %s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s не можна встановити\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "Отримання %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr "пропускаємо %s — помилка отримання\n"
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
 msgstr "пакунок %s не придатний до переміщення\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "помилка читання з файла %s\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
 msgstr "«%s» задає декілька пакунків:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "не вдалося відкрити %s: %s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "Встановлення %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "не є пакунком rpm"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "некоректний тип підпису"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "непідтримувана версія пакунка RPM"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "помилка читання: %s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
 msgstr "не є пакунком rpm\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr "не вдалося створити блокування %s для %s (%s)\n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr "очікування на блокування %s на %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr "Не вдалося виконати dlopen %s %s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr "Спроба визначення символу %s завершилася невдало: %s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ñ\80озгоÑ\80нÑ\83Ñ\82и Ð¼Ð°ÐºÑ\80оÑ\81 %%__collection_%s\n"
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "Ð\94одаÑ\82ок %%__%s_%s Ð½Ðµ Ð½Ð°Ð»Ð°Ñ\88Ñ\82овано\n"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "Модуль %s не завантажено\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr "Не вдалося визначити для модуля %s символ %s: %s\n"
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "різні"
@@ -2766,641 +3373,354 @@ msgstr "%s став застарілим через %s%s"
 msgid "unknown error %d encountered while manipulating package %s"
 msgstr "сталася невідома помилка %d під час обробки пакунка %s"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "не вказано другий символ «:» у %s:%d\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "не вказано назву архітектури у %s:%d\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "Неповний рядок даних у %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "Забагато аргументів у рядку даних %s:%d\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "Помилкове число архітектури/ОС: %s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "Неповний типовий рядок у %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "Забагато аргументів у типовому рядку у %s:%d\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "не вистачає «:» (виявлено 0x%02x) у %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "не вистачає аргументу для %s у %s:%d\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr "Не вдалося відкрити %s у %s:%d: %m\n"
 
-#: lib/rpmrc.c:536
+#: lib/rpmrc.c:564
 #, c-format
 msgid "missing architecture for %s at %s:%d\n"
 msgstr "не вистачає архітектури для %s у %s:%d\n"
 
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "помилковий параметр «%s» у %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr "Не вдалося прочитати допоміжний вектор, /proc не змонтовано?\n"
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "Невідома система: %s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "Будь ласка, зв’яжіться з %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "Не вдалося відкрити %s для читання: %m.\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr "Не вдалося відновити поточний каталог: %m"
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-"підтримку допоміжних скриптів мовою <lua> не було передбачено під час "
-"збирання\n"
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr "Не вдалося створити тимчасовий файл для %s: %s\n"
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr "Не вдалося здублювати дескриптор файла: %s: %s\n"
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr "помилка допоміжного скрипту %s, очікування pid (%d) rc %d: %s\n"
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr "помилка допоміжного скрипту %s, сигнал %d\n"
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr "помилка допоміжного скрипту %s, стан виходу %d\n"
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "Невідомий формат"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "встановити"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "вилучити"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "не вдалося відкрити базу даних Packages у %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "зайвий символ «(» у мітці пакунка: %s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "не вистачає «(» у мітці пакунка: %s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "не вистачає «)» у мітці пакунка: %s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr "%s: спроба читання відкритого ключа завершилася невдало.\n"
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "операція"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "розмір sigh(%d): ПОМИЛКА, read повернуто %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic: ПОМИЛКА\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "мітки sigh: ПОМИЛКА, кількість міток (%d) перевищує максимальну\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "дані sigh: ПОМИЛКА, кількість байтів (%d) перевищує максимальну\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "бінарний об’єкт sigh (%d): ПОМИЛКА, read повернуто %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "теґ sigh[%d]: ПОМИЛКА, теґ %d тип %d зміщення %d к-ть %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "завантаження sigh: ПОМИЛКА\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr "pad sigh (%zd): ПОМИЛКА, прочитано %zd байтів\n"
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr "sigSize sigh (%zd): ПОМИЛКА, помилка fstat(2)\n"
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr "Не вдалося прочитати незмінну ділянку заголовка. Пакунок пошкоджено?\n"
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr "Підписування пакунків RPM версії 3 неможливе\n"
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "Сума MD5:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "Сума SHA1 заголовка:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "Заголовок "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr "Перевірка підпису: ПОМИЛКОВІ ПАРАМЕТРИ (%d %p %d %p %p)\n"
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "пропущено"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "невдача"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "не вистачає   %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr "Незадоволені залежності для %s:\n"
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr "некоректна ширина поля"
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "не вистачає { після %"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "не вистачає } після %{"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "порожній формат теґу"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "порожня назва теґу"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "невідома мітка"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "не вистачає ] у кінці запису масиву"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "неочікувана ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "неочікувана }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "не вистачає ? у виразі"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "у виразі після ? слід вказати {"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "у виразі не вистачає }"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": після ? не вистачає підвиразу"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "у виразі після : слід вказати {"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "вираз має завершуватися символом |"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "ітератор масиву використано з двома масивами різної розмірності"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr "Створення %d пропущених покажчиків, будь ласка, зачекайте…\n"
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "не вдалося відкрити покажчик %s за допомогою db%d — %s (%d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr "помилка(%d) отримання записів «%s» з покажчика %s: %s\n"
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "не було встановлено шляху dbpath\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader: пропущено"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "помилка (%d) збереження запису №%d до %s\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr "%s: помилка regexec: %s\n"
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr "%s: помилка regcomp: %s\n"
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator: пропущено"
-
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb: отримано пошкоджений заголовок №%u — пропущено.\n"
-
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr "помилка(%d:%s) Ð¾Ñ\82Ñ\80иманнÑ\8f Ð½Ð°Ñ\81Ñ\82Ñ\83пного ÐºÐ»Ñ\8eÑ\87а Ð· Ð¿Ð¾ÐºÐ°Ð¶Ñ\87ика %s\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "помилковий Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Â«%s» Ñ\83 %s:%d\n"
 
-#: lib/rpmdb.c:2349
-#, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr "помилка (%d) під час додавання запису заголовка №%d\n"
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr "Не вдалося прочитати допоміжний вектор, /proc не змонтовано?\n"
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr "помилка (%d) Ð¿Ñ\96д Ñ\87аÑ\81 Ð²Ð¸Ð»Ñ\83Ñ\87еннÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° â\84\96%d\n"
+msgid "Unknown system: %s\n"
+msgstr "Ð\9dевÑ\96дома Ñ\81иÑ\81Ñ\82ема: %s\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s: не вдалося прочитати заголовок за адресою 0x%x\n"
+msgid "Please contact %s\n"
+msgstr "Будь ласка, зв’яжіться з %s\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "помилка (%d) Ð²Ñ\81Ñ\82ановленнÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\96в Â«%s» Ð·Ð° Ð¿Ð¾ÐºÐ°Ð¶Ñ\87иком %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð²Ñ\96дкÑ\80иÑ\82и %s Ð´Ð»Ñ\8f Ñ\87иÑ\82аннÑ\8f: %m.\n"
 
-#: lib/rpmdb.c:2467
-#, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "помилка (%d) під час спроби збереження запису «%s» до %s\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "помилка (%d) під час спроби вилучення запису «%s» з %s\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr "У скрипті Lua не викликано exec() після fork()\n"
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "помилка (%d) розподілу нового екземпляра пакунка\n"
+msgid "Unable to restore current directory: %m"
+msgstr "Не вдалося відновити поточний каталог: %m"
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr ""
+"підтримку допоміжних скриптів мовою <lua> не було передбачено під час "
+"збирання\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "помилка(%d) Ð¾Ñ\82Ñ\80иманнÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\96в Â«%s» Ð· Ð¿Ð¾ÐºÐ°Ð¶Ñ\87ика %s\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ñ\81Ñ\82воÑ\80иÑ\82и Ñ\82имÑ\87аÑ\81овий Ñ\84айл Ð´Ð»Ñ\8f %s: %s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "помилка (%d) Ð¿Ñ\96д Ñ\87аÑ\81 Ñ\81пÑ\80оби Ð·Ð±ÐµÑ\80еженнÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83 %s Ð´Ð¾ %s\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð·Ð´Ñ\83блÑ\8eваÑ\82и Ð´ÐµÑ\81кÑ\80ипÑ\82оÑ\80 Ñ\84айла: %s: %s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "не було встановлено шляху dbpath"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr "Помилка fwrite: %s"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr "не Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ñ\81Ñ\82воÑ\80иÑ\82и ÐºÐ°Ñ\82алог %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "помилка Ð´Ð¾Ð¿Ð¾Ð¼Ñ\96жного Ñ\81кÑ\80ипÑ\82Ñ\83 %s, Ð¾Ñ\87Ñ\96кÑ\83ваннÑ\8f pid (%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "заголовок â\84\96%u Ñ\83 Ð±Ð°Ð·Ñ\96 Ð´Ð°Ð½Ð¸Ñ\85 Ñ\94 Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ð²Ð¸Ð¼ â\80\94 Ð¿Ñ\80опÑ\83Ñ\89ено.\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "помилка Ð´Ð¾Ð¿Ð¾Ð¼Ñ\96жного Ñ\81кÑ\80ипÑ\82Ñ\83 %s, Ñ\81игнал %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "не Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð´Ð¾Ð´Ð°Ñ\82и Ð·Ð°Ð¿Ð¸Ñ\81 Ð· Ð¿Ð¾Ñ\87аÑ\82ковим Ñ\80озÑ\82аÑ\88Ñ\83ваннÑ\8fм Ñ\83 %u\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "помилка Ð´Ð¾Ð¿Ð¾Ð¼Ñ\96жного Ñ\81кÑ\80ипÑ\82Ñ\83 %s, Ñ\81Ñ\82ан Ð²Ð¸Ñ\85одÑ\83 %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr ""
-"не вдалося перебудувати базу даних: початкова база даних залишається на "
-"місці\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Невідомий формат"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "не Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð·Ð°Ð¼Ñ\96ниÑ\82и Ñ\81Ñ\82аÑ\80Ñ\83 Ð±Ð°Ð·Ñ\83 Ð´Ð°Ð½Ð¸Ñ\85 Ð½Ð¾Ð²Ð¾Ñ\8e!\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "вÑ\81Ñ\82ановиÑ\82и"
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "замінити файли у %s файлами з %s для відновлення"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "вилучити"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "не вдалося вилучити каталог %s: %s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "не вдалося відкрити базу даних Packages у %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "помилка db%d (%d) Ð· %s: %s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "зайвий Ñ\81имвол Â«(» Ñ\83 Ð¼Ñ\96Ñ\82Ñ\86Ñ\96 Ð¿Ð°ÐºÑ\83нка: %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "помилка db%d (%d): %s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "не Ð²Ð¸Ñ\81Ñ\82аÑ\87аÑ\94 Â«(» Ñ\83 Ð¼Ñ\96Ñ\82Ñ\86Ñ\96 Ð¿Ð°ÐºÑ\83нка: %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "не Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð¾Ñ\82Ñ\80имаÑ\82и Ð±Ð»Ð¾ÐºÑ\83ваннÑ\8f %s Ð½Ð° %s/%s\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "не Ð²Ð¸Ñ\81Ñ\82аÑ\87аÑ\94 Â«)» Ñ\83 Ð¼Ñ\96Ñ\82Ñ\86Ñ\96 Ð¿Ð°ÐºÑ\83нка: %s\n"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "спільний"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: спроба читання відкритого ключа завершилася невдало.\n"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "екÑ\81клÑ\8eзивний"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "опеÑ\80аÑ\86Ñ\96Ñ\8f"
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
-msgstr "некоректний тип покажчика %x у %s/%s\n"
+msgid "%s tag %u: invalid type %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "невідомий параметр db: «%s» проігноровано.\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s має некоректне числове значення, пропущено\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
-"%s має занадто велике або занадто мале довге ціле значення, пропущено\n"
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s має занадто велике або занадто мале ціле значення, пропущено\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "Не вдалося розкодувати правила для %s\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "Не вдалося створити тимчасовий файл для %s: %s\n"
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "Не вдалося виконати запису правил %s до файла %s\n"
+msgid "%s%s"
+msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
-msgstr "Не вдалося створити обробник semanage\n"
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "Не вдалося встановити зв’язок з обробником правил\n"
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "Не вдалося розпочати дію над правилами: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr "Не вдалося вилучити тимчасовий файл правил %s: %s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Заголовок "
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "Не вдалося встановити модуль правил: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "Не вдалося вилучити модуль правил: %s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Не вдалося перезавантажити заголовок підпису.\n"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "Не вдалося створити відгалуження процесу: %s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "пропущено"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "Не вдалося виконати %s: %s\n"
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "невдача"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "Ð\90ваÑ\80Ñ\96йне Ð·Ð°Ð²ÐµÑ\80Ñ\88еннÑ\8f %s\n"
+msgid "Duplicate username or UID for user %s\n"
+msgstr "Ð\94Ñ\83блÑ\8eваннÑ\8f Ñ\96менÑ\96 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а Ð°Ð±Ð¾ UID Ð´Ð»Ñ\8f ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а %s\n"
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "Ð\9fомилка %s Ð· ÐºÐ¾Ð´Ð¾Ð¼ Ð·Ð°Ð²ÐµÑ\80Ñ\88еннÑ\8f %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr "Ð\94Ñ\83блÑ\8eваннÑ\8f Ð½Ð°Ð·Ð²Ð¸ Ð³Ñ\80Ñ\83пи Ð°Ð±Ð¾ GID Ð´Ð»Ñ\8f Ð³Ñ\80Ñ\83пи %s\n"
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð²Ð½ÐµÑ\81Ñ\82и Ð·Ð¼Ñ\96ни Ð´Ð¾ Ð¿Ñ\80авил\n"
+#: lib/verify.c:395
+msgid "no state"
+msgstr "немаÑ\94 Ñ\81Ñ\82анÑ\83"
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ñ\80озгоÑ\80нÑ\83Ñ\82и Ñ\88лÑ\8fÑ\85 Ð¼Ð°ÐºÑ\80оÑ\81 restorecon"
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "невÑ\96домий Ñ\81Ñ\82ан"
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
-"Не вдалося змінити мітки у файловій системі. Файли може бути позначено "
-"помилковими мітками.\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "не вистачає   %c %s"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
-"Не вдалося перезавантажити контексти файлів. Файли може бути позначено "
-"помилковими мітками.\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Незадоволені залежності для %s:\n"
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "Не вдалося видобути правила з %s\n"
+msgid "Unable to reset nice value: %s"
+msgstr "Не вдалося скинути значення пріоритетності: %s"
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "=================== активних %d порожніх %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr "Не вдалося скинути пріоритетність введення-виведення: %s"
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(порожньо)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(порожньо)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "Запис макросу %%%s не завершено\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Ð\97апиÑ\81 Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ð¼Ð°ÐºÑ\80оÑ\81Ñ\83 %%%s Ð½Ðµ Ð·Ð°Ð²ÐµÑ\80Ñ\88ено\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "Ð\9cакÑ\80оÑ\81 %%%s Ð¼Ð°Ñ\94 Ð½ÐµÐºÐ¾Ñ\80екÑ\82нÑ\83 Ð½Ð°Ð·Ð²Ñ\83 (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Ð\97апиÑ\81 Ð¼Ð°ÐºÑ\80оÑ\81Ñ\83 %%%s Ð½Ðµ Ð·Ð°Ð²ÐµÑ\80Ñ\88ено\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "Запис параметрів макросу %%%s не завершено\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "Тіло макросу %%%s є порожнім\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "У макросі %%%s мало бути використано пробіл перед текстом макросу\n"
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "Не вдалося розгорнути макрос %%%s\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "Макрос %%%s має некоректну назву (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "Макрос %%%s (%s) не було використано під рівнем %d\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr "Макрос %%%s визначено, але не використано у області видимості\n"
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "Невідомий параметр %c у %s(%s)\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
@@ -3408,166 +3728,283 @@ msgstr ""
 "Забагато рівнів вкладеності у макросі. Ймовірно, це викликано рекурсивним "
 "оголошенням макросу.\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "Не закрито %c: %s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "За %% вказано непридатний до обробки макрос\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "не вдалося завантажити файл макросу %s"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "=================== активних %d порожніх %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "помилка під час створення тимчасового файла %s: %m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "Файл %s: %s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "Розмір файла %s є меншим за %u байтів\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "не вдалося створити каталог"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[нічого]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(без помилок)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "критична помилка: "
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "помилка: "
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "попередження: "
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr "некоректний синтаксис у допоміжному скрипті lua: %s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr "некоректний синтаксис у скрипті lua: %s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "помилка скрипту lua: %s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "некоректний синтаксис у файлі lua: %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr "помилка виклику lua: %s\n"
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[нічого]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(без помилок)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "критична помилка: "
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "помилка: "
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "попередження: "
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr ""
 "у відповідь на спробу отримання області пам’яті (%u байтів) повернуто NULL.\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr "V%d %s/%s %s, ід. ключа %s"
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(нічого)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr "помилка під час створення тимчасового каталогу %s: %m\n"
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr "помилка під час створення fifo %s: %m\n"
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr "помилка під час вилучення fifo %s: %m\n"
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr "помилка під час спроби вилучення каталогу %s: %m\n"
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: помилка Fwrite: %s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: помилка fread: %s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: помилка Fflush: %s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr "Непідтримуваний підпис PGP\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr "Непідтримуваний алгоритм хешування PGP, %u\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr "Непідтримуваний алгоритм обчислення відкритого ключа PGP, %u\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Не вдалося виконати %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr "Помилка fopen\n"
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "Не вдалося виконати запис до каналу\n"
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "Не вдалося створити канал для підписування: %m"
+msgid "Could not read from file %s: %s\n"
+msgstr "Не вдалося виконати читання з файла %s: %s\n"
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "помилка виконання gpg (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "gpg не вдалося записати підпис\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "не вдалося прочитати підпис\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "помилка rpmMkTemp\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
-msgstr "%s вже містить ідентичний підпис, пропускаємо\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s: помилка writeLead: %s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: помилка rpmReadSignature: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: помилка headerRead: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "Підписування пакунків RPM версії 3 неможливе\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s вже містить ідентичний підпис, пропускаємо\n"
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s: помилка rpmWriteSignature: %s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: помилка writeLead: %s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "спроба заміни %s зазнала невдачі: %s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s: помилка читання маніфесту: %s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "не перевіряти підпис заголовка та вмісту"
diff --git a/po/vi.po b/po/vi.po
new file mode 100644 (file)
index 0000000..b1c28de
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,4014 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2015
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: RPM\n"
+"Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: Vietnamese (http://www.transifex.com/rpm-team/rpm/language/"
+"vi/)\n"
+"Language: vi\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"
+
+#: cliutils.c:21 lib/poptI.c:29
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
+
+#: cliutils.c:27 lib/poptALL.c:56
+#, c-format
+msgid "RPM version %s\n"
+msgstr "RPM phiên bản %s\n"
+
+#: cliutils.c:32
+#, c-format
+msgid "Copyright (C) 1998-2002 - Red Hat, Inc.\n"
+msgstr "Bản quyền (C) 1998-2002 - Red Hat, Inc.\n"
+
+#: cliutils.c:33
+#, c-format
+msgid ""
+"This program may be freely redistributed under the terms of the GNU GPL\n"
+msgstr ""
+"Phần mềm này được phân phối lại một cách tự do như theo các điều khoản của "
+"giấy phép Công GNU\n"
+
+#: cliutils.c:53
+#, c-format
+msgid "creating a pipe for --pipe failed: %m\n"
+msgstr "lỗi tạo một ống dẫn cho “--pipe”: %m\n"
+
+#: cliutils.c:62
+#, c-format
+msgid "exec failed\n"
+msgstr "gặp lỗi khi exec (thực thi lệnh)\n"
+
+#: rpm2archive.c:91 rpm2cpio.c:68
+#, c-format
+msgid "argument is not an RPM package\n"
+msgstr "đối số không phải là một gói RPM\n"
+
+#: rpm2archive.c:96 rpm2cpio.c:73
+#, c-format
+msgid "error reading header from package\n"
+msgstr "gặp lỗi khi đọc phần đầu từ gói\n"
+
+#: rpm2archive.c:111 rpm2cpio.c:88
+#, c-format
+msgid "cannot re-open payload: %s\n"
+msgstr "không thể mở lại phần trọng tải: %s\n"
+
+#: rpmbuild.c:114
+#, c-format
+msgid "buildroot already specified, ignoring %s\n"
+msgstr "gốc-biên-dịch đã được chỉ ra rồi, bỏ qua %s\n"
+
+#: rpmbuild.c:139
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <specfile>"
+msgstr ""
+"xây dựng qua %prep (chuẩn bị: mở gói nguồn và áp dụng những miếng vá) từ "
+"<tập_tin_đặc_tả>"
+
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
+msgid "<specfile>"
+msgstr "<tập_tin_đặc_tả>"
+
+#: rpmbuild.c:142
+msgid "build through %build (%prep, then compile) from <specfile>"
+msgstr ""
+"xây dựng qua %build (xây dựng: %prep [chuẳn bị], sau đó biên dịch) từ "
+"<tập_tin_đặc_tả>"
+
+#: rpmbuild.c:145
+msgid "build through %install (%prep, %build, then install) from <specfile>"
+msgstr ""
+"xây dựng qua %install (cài đặt: %prep [chuẩn bị], %build [xây dựng], sau đó "
+"cài đặt) từ <tập_tin_đặc_tả>"
+
+#: rpmbuild.c:148
+#, c-format
+msgid "verify %files section from <specfile>"
+msgstr "thẩm tra phần tập tin (%files) từ <tập_tin_đặc_tả>"
+
+#: rpmbuild.c:151
+msgid "build source and binary packages from <specfile>"
+msgstr "xây dựng các gói kiểu nguồn và nhị phân từ <tập_tin_đặc_tả>"
+
+#: rpmbuild.c:154
+msgid "build binary package only from <specfile>"
+msgstr "xây dựng gói chỉ gói nhị phân từ <tập_tin_đặc_tả>"
+
+#: rpmbuild.c:157
+msgid "build source package only from <specfile>"
+msgstr "xây dựng chỉ gói nguồn từ <tập_tin_đặc_tả>"
+
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+"xây dựng qua %prep (chuẩn bị: mở gói nguồn và áp dụng những miếng vá) từ "
+"<gói nguồn>"
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<gói nguồn>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+"xây dựng qua %build (xây dựng: %prep [chuẳn bị], sau đó biên dịch) từ <gói "
+"nguồn>"
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr ""
+"xây dựng qua %install (cài đặt: %prep [chuẩn bị], %build [xây dựng], sau đó "
+"cài đặt) từ <gói nguồn>"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr "thẩm tra phần %files từ <gói nguồn>"
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr "xây dựng gói nguồn và nhị phân từ <gói nguồn>"
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr "chỉ xây dựng gói nhị phân từ <gói nguồn>"
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr "chỉ xây dựng gói nguồn từ <gói nguồn>"
+
+#: rpmbuild.c:183
+#, c-format
+msgid "build through %prep (unpack sources and apply patches) from <tarball>"
+msgstr ""
+"xây dựng qua %prep (chuẩn bị: giải nén các nguồn và áp dụng các đắp vá) từ "
+"<kho_tar>"
+
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
+msgid "<tarball>"
+msgstr "<kho_tar>"
+
+#: rpmbuild.c:186
+msgid "build through %build (%prep, then compile) from <tarball>"
+msgstr ""
+"xây dựng qua %build (xây dựng: %prep [chuẩn bị], sau đó biên dịch) từ "
+"<kho_tar>"
+
+#: rpmbuild.c:189
+msgid "build through %install (%prep, %build, then install) from <tarball>"
+msgstr ""
+"xây dựng qua %install (cài đặt: %prep [chuẩn bị], %build [xây dựng], sau đó "
+"cài đặt) từ <kho_tar>"
+
+#: rpmbuild.c:192
+#, c-format
+msgid "verify %files section from <tarball>"
+msgstr "xác nhận phần tập tin (%files) từ <kho_tar>"
+
+#: rpmbuild.c:195
+msgid "build source and binary packages from <tarball>"
+msgstr "xây dựng các gói kiểu nguồn và nhị phân từ <kho_tar>"
+
+#: rpmbuild.c:198
+msgid "build binary package only from <tarball>"
+msgstr "xây dựng chỉ gói nhị phân từ <kho_tar>"
+
+#: rpmbuild.c:201
+msgid "build source package only from <tarball>"
+msgstr "xây dựng chỉ gói nguồn từ <kho_tar>"
+
+#: rpmbuild.c:205
+msgid "build binary package from <source package>"
+msgstr "xây dựng gói nhị phân từ <gói nguồn>"
+
+#: rpmbuild.c:212
+msgid "override build root"
+msgstr "đè lên gốc biên dịch"
+
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr "chạy biên dịch trong thư mục hiện tại"
+
+#: rpmbuild.c:216
+msgid "remove build tree when done"
+msgstr "làm xong thì gỡ bỏ cây xây dựng"
+
+#: rpmbuild.c:218
+msgid "ignore ExcludeArch: directives from spec file"
+msgstr "bỏ qua ExcludeArch: các chỉ thị từ tập tin spec"
+
+#: rpmbuild.c:220
+msgid "debug file state machine"
+msgstr "gõ lỗi tập tin máy trạng thái"
+
+#: rpmbuild.c:222
+msgid "do not execute any stages of the build"
+msgstr "không thực thi bất kỳ giai đoạn nào của việc xây dựng"
+
+#: rpmbuild.c:224
+msgid "do not verify build dependencies"
+msgstr "không xác nhận quan hệ phụ thuộc khi xây dựng"
+
+#: rpmbuild.c:226
+msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
+msgstr "tạo phần đầu gói tương thích với gói rmp phiên bản 3 kiểu cũ"
+
+#: rpmbuild.c:230
+#, c-format
+msgid "do not execute %clean stage of the build"
+msgstr "không thể thực thi bước %clean để biên dịch"
+
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr "không thực thi bước %prep khi biên dịch"
+
+#: rpmbuild.c:234
+#, c-format
+msgid "do not execute %check stage of the build"
+msgstr "không thể thực thi bước %check để biên dịch"
+
+#: rpmbuild.c:237
+msgid "do not accept i18N msgstr's from specfile"
+msgstr "không chấp nhận chuỗi đã dịch i18n từ tập tin đặc tả"
+
+#: rpmbuild.c:239
+msgid "remove sources when done"
+msgstr "làm xong thì cũng gỡ bỏ các nguồn"
+
+#: rpmbuild.c:241
+msgid "remove specfile when done"
+msgstr "làm xong thì cũng gỡ bỏ tập tin đặc tả"
+
+#: rpmbuild.c:243
+msgid "skip straight to specified stage (only for c,i)"
+msgstr "bỏ qua thẳng tới giai đoạn định rõ (chỉ cho c,i)"
+
+#: rpmbuild.c:245
+msgid "override target platform"
+msgstr "có quyền cao hơn nền tảng đích"
+
+#: rpmbuild.c:262
+msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
+msgstr "Tùy chọn xây dựng với [ <tập_tin_đặc_tả> | <kho_tar> | <gói nguồn> ]:"
+
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "Các tùy chọn chung với mọi chế độ và tập tin thực hiện được kiểu rpm:"
+
+#: rpmbuild.c:282
+msgid "Failed build dependencies:\n"
+msgstr "Gặp lỗi khi xây dựng các thành phần phụ thuộc:\n"
+
+#: rpmbuild.c:300
+#, c-format
+msgid "Unable to open spec file %s: %s\n"
+msgstr "Không thể mở tập tin đặc tả %s: %s\n"
+
+#: rpmbuild.c:363
+#, c-format
+msgid "Failed to open tar pipe: %m\n"
+msgstr "Gặp lỗi khi mở đường ống tar: %m\n"
+
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr "Thấy nhiều hơn một tập tin đặc tả %s\n"
+
+#: rpmbuild.c:389
+#, c-format
+msgid "Failed to read spec file from %s\n"
+msgstr "Gặp lỗi đọc tập tin đặc tả từ %s\n"
+
+#: rpmbuild.c:401
+#, c-format
+msgid "Failed to rename %s to %s: %m\n"
+msgstr "Lỗi thay đổi tên %s thành %s: %m\n"
+
+#: rpmbuild.c:479
+#, c-format
+msgid "failed to stat %s: %m\n"
+msgstr "lỗi lấy trạng thái về %s: %m\n"
+
+#: rpmbuild.c:483
+#, c-format
+msgid "File %s is not a regular file.\n"
+msgstr "Tập tin %s không phải là một tập tin thường.\n"
+
+#: rpmbuild.c:490
+#, c-format
+msgid "File %s does not appear to be a specfile.\n"
+msgstr "Tập tin %s hình như không phải là tập tin đặc tả.\n"
+
+#: rpmbuild.c:556
+#, c-format
+msgid "Building target platforms: %s\n"
+msgstr "Đang xây dựng các nền tảng đích: %s\n"
+
+#: rpmbuild.c:564
+#, c-format
+msgid "Building for target %s\n"
+msgstr "Đang xây dựng cho nền tảng đích %s\n"
+
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "đối số của “--root” (-r) phải bắt đầu với dấu sổ chéo “/”"
+
+#: rpmdb.c:21
+msgid "initialize database"
+msgstr "khởi tạo cơ sở dữ liệu"
+
+#: rpmdb.c:23
+msgid "rebuild database inverted lists from installed package headers"
+msgstr ""
+"xây dựng lại các danh sách nghịch chuyển cơ sở dữ liệu từ các phần đầu gói "
+"được cài đặt"
+
+#: rpmdb.c:26
+msgid "verify database files"
+msgstr "thẩm tra các tập tin cơ sở dữ liệu"
+
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr "xuất cơ sở dữ liệu ra danh sách phần đầu đầu ra tiêu chuẩn"
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr "nhập cơ sở dữ liệu từ danh sách phần đầu đầu vào tiêu chuẩn"
+
+#: rpmdb.c:38
+msgid "Database options:"
+msgstr "Tùy chọn cơ sở dữ liệu:"
+
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "chỉ có thể đưa ra một chế độ chính"
+
+#: rpmkeys.c:20
+msgid "verify package signature(s)"
+msgstr "thẩm tra (các) chữ ký của gói"
+
+#: rpmkeys.c:22
+msgid "import an armored public key"
+msgstr "nhập một khóa công dạng văn bản"
+
+#: rpmkeys.c:24
+msgid "don't import, but tell if it would work or not"
+msgstr "không thể nhập, nhưng hãy thông báo nó có chạy hay không"
+
+#: rpmkeys.c:27 rpmkeys.c:29
+msgid "list keys from RPM keyring"
+msgstr "liệt kê các khóa từ chùm chìa khóa RPM"
+
+#: rpmkeys.c:36
+msgid "Keyring options:"
+msgstr "Tùy chọn chùm chìa khóa:"
+
+#: rpmkeys.c:64 rpmsign.c:161
+msgid "no arguments given"
+msgstr "chưa đưa ra đối số"
+
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "Các tùy chọn Truy vấn hay Thẩm định gói chọn:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "Tùy chọn truy vấn (với -q hoặc --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "Tùy chọn kiểm tra (với -V hoặc --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "Tùy chọn cho Cài-đặt/Nâng-cấp/Xóa:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "mỗi lần chỉ có thể làm một kiểu hành vi truy vấn/xác nhận"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "gặp cờ truy vấn bất thường"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "gặp định dạng truy vấn bất thường"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "gặp nguồn truy vấn bất thường"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "chỉ có cài đặt và nâng cấp là có thể ép buộc"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "chỉ có thể tái định vị tập tin trong khi cài đặt gói"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr ""
+"không cho phép dùng tùy chọn “--prefix” (tiền tố) cùng với “--relocate” (tái "
+"định vị) hoặc “--excludepath” (loại trừ đường dẫn)"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr ""
+"tùy chọn “--relocate” (tái định vị) và --excludepath (loại trừ đường dẫn) "
+"chỉ có thể được dùng khi cài đặt gói mới"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "tùy chọn “--prefix” (tiền tố) chỉ có thể được dùng khi cài đặt gói mới"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "đối số cho “--prefix” (tiền tố) phải bắt đầu với dấu sổ chéo “/”"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+"tùy chọn --hash (-h) chỉ có thể được chỉ ra trong khi cài đặt và xóa gói"
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+"tùy chọn “--percent” (phần trăm) chỉ có thể được chỉ ra trong khi cài đặt và "
+"xóa gói"
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr ""
+"tùy chọn “--replacepkgs” (thay thế các gói) chỉ có thể được chỉ ra trong khi "
+"cài đặt gói"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr ""
+"tùy chọn “--excludedocs” (loại bỏ các tài liệu) chỉ có thể được chỉ ra trong "
+"khi cài đặt gói"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr ""
+"tùy chọn “--includedocs” (bao gồm các tài liệu) chỉ có thể được chỉ ra trong "
+"khi cài đặt gói"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr ""
+"có thể chỉ ra chỉ một trong hai tùy chọn “-excludedocs” (loại bỏ các tài "
+"liệu)  và “-includedocs” (bao gồm các tài liệu)"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr ""
+"tùy chọn “--ignorearch” (bỏ qua kiến trúc) chỉ có thể được chỉ ra trong khi "
+"cài đặt gói"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr ""
+"tùy chọn “--ignoreos” (bỏ qua hệ điều hành) chỉ có thể được chỉ ra trong khi "
+"cài đặt gói"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize chỉ được chỉ ra trong quá trình cài đặt"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr ""
+"tùy chọn “--allmatches” (mọi sự tương ứng) chỉ có thể được chỉ ra trong khi "
+"xóa gói"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr ""
+"tùy chọn “--allfiles” (mọi tập tin) chỉ có thể được chỉ ra trong khi cài đặt "
+"gói"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr ""
+"tùy chọn “--justdb” (chỉ cơ sở dữ liệu) chỉ có thể được chỉ ra trong khi cài "
+"đặt và xóa gói"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"các tùy chọn vô hiệu hóa văn lệnh chỉ có thể được chỉ ra trong khi cài đặt "
+"và xóa gói"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr ""
+"các tùy chọn vô hiệu hóa bộ gây nên chỉ có thể được chỉ ra trong khi cài đặt "
+"và xóa gói"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr "--nodeps chỉ được chỉ ra trong quá trình cài đặt, tẩy hay thẩm tra"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+"tùy chọn “--test” (kiểm tra) chỉ có thể được chỉ ra trong khi cài đặt và xóa "
+"gói"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "chưa đưa ra gói cần xóa"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "chưa đưa ra gói cần cài đặt"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "chưa đưa ra đối số để truy vấn"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "chưa đưa ra đối số để xác nhận"
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr "ký (các) gói"
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr "ký tên gói (đồng nhất tới --addsign)"
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr "xóa chữ ký của gói"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "Tùy chọn chữ ký:"
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr "Bạn phải đặt \"%%_gpg_name\" trong tập tin vĩ lệnh\n"
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr "phân tích các tập tin đặc tả ra đầu ra tiêu chuẩn"
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr "truy vấn (các) tập tin đặc tả"
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr "thao tác trên gói nhị phân rpm được tạo bởi spec (mặc định)"
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr "thao tác trên gói nguồn rpm được tạo bởi spec"
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr "dùng định dạng truy vấn theo đây"
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr "Tùy chọn đặc tả:"
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr "chưa đưa ra đối số để phân tích"
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
+msgstr "Không thể mở tập tin tạm: %s\n"
+
+#: build/build.c:125
+#, c-format
+msgid "Unable to open stream: %s\n"
+msgstr "Không thể mở luồng dữ liệu: %s\n"
+
+#: build/build.c:158
+#, c-format
+msgid "Executing(%s): %s\n"
+msgstr "Đang thực hiện (%s): %s\n"
+
+#: build/build.c:163
+#, c-format
+msgid "Exec of %s failed (%s): %s\n"
+msgstr "Gặp lỗi khi thực thi %s (%s): %s\n"
+
+#: build/build.c:172
+#, c-format
+msgid "Error executing scriptlet %s (%s)\n"
+msgstr "Gặp lỗi khi thực thi scriptlet %s (%s)\n"
+
+#: build/build.c:178
+#, c-format
+msgid "Bad exit status from %s (%s)\n"
+msgstr "Trạng thái thoát sai từ %s (%s)\n"
+
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
+msgid ""
+"\n"
+"\n"
+"RPM build errors:\n"
+msgstr ""
+"\n"
+"\n"
+"Lỗi xây dựng RPM:\n"
+
+#: build/expression.c:215
+msgid "syntax error while parsing ==\n"
+msgstr "gặp lỗi cú pháp khi phân tích ==\n"
+
+#: build/expression.c:245
+msgid "syntax error while parsing &&\n"
+msgstr "gặp lỗi cú pháp khi phân tích &&\n"
+
+#: build/expression.c:254
+msgid "syntax error while parsing ||\n"
+msgstr "gặp lỗi cú pháp khi phân tích ||\n"
+
+#: build/expression.c:304
+msgid "parse error in expression\n"
+msgstr "gặp lỗi phân tích trong biểu thức\n"
+
+#: build/expression.c:336
+msgid "unmatched (\n"
+msgstr "có dấu ngoặc mở “(” lẻ đôi\n"
+
+#: build/expression.c:368
+msgid "- only on numbers\n"
+msgstr "- chỉ với con số\n"
+
+#: build/expression.c:384
+msgid "! only on numbers\n"
+msgstr "! chỉ với con số\n"
+
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
+msgid "types must match\n"
+msgstr "các kiểu phải tương ứng\n"
+
+#: build/expression.c:439
+msgid "* / not suported for strings\n"
+msgstr "* / không được hỗ trợ cho chuỗi\n"
+
+#: build/expression.c:490
+msgid "- not suported for strings\n"
+msgstr "- không được hỗ trợ cho chuỗi\n"
+
+#: build/expression.c:637
+msgid "&& and || not suported for strings\n"
+msgstr "&& và || không được hỗ trợ cho chuỗi\n"
+
+#: build/expression.c:669
+msgid "syntax error in expression\n"
+msgstr "gặp lỗi cú pháp trong biểu thức\n"
+
+#: build/files.c:343 build/files.c:524 build/files.c:743
+#, c-format
+msgid "Missing '(' in %s %s\n"
+msgstr "Thiếu dấu ngoặc mở “(” trong %s %s\n"
+
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
+#, c-format
+msgid "Missing ')' in %s(%s\n"
+msgstr "Thiếu dấu ngoặc đóng “)” trong %s(%s\n"
+
+#: build/files.c:378 build/files.c:684
+#, c-format
+msgid "Invalid %s token: %s\n"
+msgstr "Hiệu bài %s không hợp lệ: %s\n"
+
+#: build/files.c:490
+#, c-format
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
+
+#: build/files.c:539
+#, c-format
+msgid "Non-white space follows %s(): %s\n"
+msgstr "Không có khoảng trắng theo sau %s(): %s\n"
+
+#: build/files.c:579
+#, c-format
+msgid "Bad syntax: %s(%s)\n"
+msgstr "Cú pháp sai: %s(%s)\n"
+
+#: build/files.c:588
+#, c-format
+msgid "Bad mode spec: %s(%s)\n"
+msgstr "Đặc tả chế độ sai: %s(%s)\n"
+
+#: build/files.c:600
+#, c-format
+msgid "Bad dirmode spec: %s(%s)\n"
+msgstr "Đặc tả dirmode (chế độ thư mục) sai: %s(%s)\n"
+
+#: build/files.c:705
+#, c-format
+msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
+msgstr "Chiều dài miền địa phương không bình thường “%s” trong %%lang(%s)\n"
+
+#: build/files.c:712
+#, c-format
+msgid "Duplicate locale %s in %%lang(%s)\n"
+msgstr "Miền địa phương trùng %s trong %%lang(%s)\n"
+
+#: build/files.c:827
+#, c-format
+msgid "Invalid capability: %s\n"
+msgstr "Dung lượng không hợp lệ: %s\n"
+
+#: build/files.c:837
+msgid "File capability support not built in\n"
+msgstr "Hỗ trợ dung lượng tập tin không được biên dịch sẵn\n"
+
+#: build/files.c:888
+#, c-format
+msgid "File must begin with \"/\": %s\n"
+msgstr "Tập tin phải bắt đầu bằng dấu sổ chéo “/”: %s\n"
+
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
+#, c-format
+msgid "Unknown file digest algorithm %u, falling back to MD5\n"
+msgstr "Không hiểu thuật toán băm tập tin %u, quay lại dùng MD5\n"
+
+#: build/files.c:1074
+#, c-format
+msgid "File listed twice: %s\n"
+msgstr "Tập tin được liệt kê hai lần: %s\n"
+
+#: build/files.c:1196
+#, c-format
+msgid "reading symlink %s failed: %s\n"
+msgstr "gặp lỗi khi đọc liên kết mềm “%s”: %s\n"
+
+#: build/files.c:1204
+#, c-format
+msgid "Symlink points to BuildRoot: %s -> %s\n"
+msgstr "Liên kết mềm chỉ tới BuildRoot (gốc xây dựng): %s -> %s\n"
+
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "Đường dẫn nằm ngoài buildroot (gốc xây dựng): %s\n"
+
+#: build/files.c:1386
+#, c-format
+msgid "Directory not found: %s\n"
+msgstr "Không tìm thấy thư mục: %s\n"
+
+#: build/files.c:1387 lib/rpminstall.c:449
+#, c-format
+msgid "File not found: %s\n"
+msgstr "Không tìm thấy tập tin: %s\n"
+
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "Không phải là một thư mục: %s\n"
+
+#: build/files.c:1592
+#, c-format
+msgid "%s: can't load unknown tag (%d).\n"
+msgstr "%s: không thể nạp thẻ bất thường (%d).\n"
+
+#: build/files.c:1598
+#, c-format
+msgid "%s: public key read failed.\n"
+msgstr "%s: gặp lỗi khi đọc khóa công.\n"
+
+#: build/files.c:1602
+#, c-format
+msgid "%s: not an armored public key.\n"
+msgstr "%s: không phải là khóa công dạng văn bản.\n"
+
+#: build/files.c:1611
+#, c-format
+msgid "%s: failed to encode\n"
+msgstr "%s: gặp lỗi khi giải mã\n"
+
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "gặp lỗi khi tạo thư mục"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
+#, c-format
+msgid "File needs leading \"/\": %s\n"
+msgstr "Tập tin cần có dấu sổ chéo “/” đi trước: %s\n"
+
+#: build/files.c:2122
+#, c-format
+msgid "%%dev glob not permitted: %s\n"
+msgstr "không cho phép %%dev glob: %s\n"
+
+#: build/files.c:2134
+#, c-format
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
+
+#: build/files.c:2136
+#, c-format
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
+
+#: build/files.c:2171
+#, c-format
+msgid "Could not open %%files file %s: %m\n"
+msgstr "Không thể mở tập tin %%files %s: %m\n"
+
+#: build/files.c:2182
+#, c-format
+msgid "line: %s\n"
+msgstr "dòng: %s\n"
+
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr "Tập tin %%files trống rỗng %s\n"
+
+#: build/files.c:2200
+#, c-format
+msgid "Error reading %%files file %s: %m\n"
+msgstr "Gặp lỗi khi đang đọc tập tin %%files %s: %m\n"
+
+#: build/files.c:2223
+#, c-format
+msgid "illegal _docdir_fmt %s: %s\n"
+msgstr "_docdir_fmt không hợp lệ %s: %s\n"
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "Glob (chức năng mở rộng mẫu khi tìm kiếm) không tìm thấy tập tin: %s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
+#, c-format
+msgid "Can't mix special %s with other forms: %s\n"
+msgstr "Không thể trộn lẫn %s đặc biệt với dạng khác: %s\n"
+
+#: build/files.c:2471
+#, c-format
+msgid "More than one file on a line: %s\n"
+msgstr "Nhiều hơn một tập tin mỗi dòng: %s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
+#, c-format
+msgid "Bad file: %s: %s\n"
+msgstr "Tập tin sai: %s: %s\n"
+
+#: build/files.c:2725
+#, c-format
+msgid "Checking for unpackaged file(s): %s\n"
+msgstr "Đang kiểm tra có tập tin chưa đóng gói: %s\n"
+
+#: build/files.c:2738
+#, c-format
+msgid ""
+"Installed (but unpackaged) file(s) found:\n"
+"%s"
+msgstr ""
+"Tìm thấy tập tin đã cài đặt (nhưng chưa đóng gói):\n"
+"%s"
+
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
+#, c-format
+msgid "Processing files: %s\n"
+msgstr "Đang xử lý tập tin: %s\n"
+
+#: build/files.c:3124
+#, c-format
+msgid "Binaries arch (%d) not matching the package arch (%d).\n"
+msgstr "Kiến trúc nhị phân (%d) không khớp với kiến trúc gói (%d).\n"
+
+#: build/files.c:3130
+msgid "Arch dependent binaries in noarch package\n"
+msgstr "Nhị phân phụ thuộc kiến trúc trong gói không phụ thuộc kiến trúc\n"
+
+#: build/pack.c:91
+#, c-format
+msgid "create archive failed on file %s: %s\n"
+msgstr "tiến trình tạo kho nén bị lỗi với tập tin %s: %s\n"
+
+#: build/pack.c:94
+#, c-format
+msgid "create archive failed: %s\n"
+msgstr "tiến trình tạo kho nén bị lỗi: %s\n"
+
+#: build/pack.c:121
+#, c-format
+msgid "Could not open %s file: %s\n"
+msgstr "Không thể mở tập tin %s: %s\n"
+
+#: build/pack.c:138
+#, c-format
+msgid "%s: line: %s\n"
+msgstr "%s: dòng: %s\n"
+
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
+
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
+
+#: build/pack.c:198
+#, c-format
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "Không thể làm hợp quy tắc tên máy: %s\n"
+
+#: build/pack.c:358
+#, c-format
+msgid "Unknown payload compression: %s\n"
+msgstr "Không thể nén phần trọng tải: %s\n"
+
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr "Không thể di chuyển vị trí đọc trong tập tin %s: %s\n"
+
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "Gặp lỗi khi đọc tập tin chính sách: %s\n"
+
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
+
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
+
+#: build/pack.c:520
+#, c-format
+msgid "Could not open %s: %s\n"
+msgstr "Không thể mở %s: %s\n"
+
+#: build/pack.c:527
+#, c-format
+msgid "Unable to write package: %s\n"
+msgstr "Không thể ghi gói: %s\n"
+
+#: build/pack.c:611
+#, c-format
+msgid "Wrote: %s\n"
+msgstr "Đã ghi: %s\n"
+
+#: build/pack.c:630
+#, c-format
+msgid "Executing \"%s\":\n"
+msgstr "Thực hiện %s:\n"
+
+#: build/pack.c:633
+#, c-format
+msgid "Execution of \"%s\" failed.\n"
+msgstr "Việc thực hiện %s bị lỗi\n"
+
+#: build/pack.c:637
+#, c-format
+msgid "Package check \"%s\" failed.\n"
+msgstr "Gặp lỗi khi kiểm tra “%s”.\n"
+
+#: build/pack.c:684
+#, c-format
+msgid "Could not generate output filename for package %s: %s\n"
+msgstr "Không thể tạo tên tập tin kết xuất cho gói %s: %s\n"
+
+#: build/pack.c:701
+#, c-format
+msgid "cannot create %s: %s\n"
+msgstr "không thể tạo %s: %s\n"
+
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
+#, c-format
+msgid "line %d: second %s\n"
+msgstr "dòng %d: %s thứ hai\n"
+
+#: build/parseChangelog.c:185
+#, c-format
+msgid "bogus date in %%changelog: %s\n"
+msgstr "ngày tháng sai trong bản ghi thay đổi (%%changelog): %s\n"
+
+#: build/parseChangelog.c:218
+#, c-format
+msgid "%%changelog entries must start with *\n"
+msgstr "mục nhập bản ghi thay đổi (%%changelog) phải bắt đầu với dấu sao *\n"
+
+#: build/parseChangelog.c:226
+#, c-format
+msgid "incomplete %%changelog entry\n"
+msgstr "mục nhập bản ghi thay đổi (%%changelog) chưa hoàn tất\n"
+
+#: build/parseChangelog.c:237
+#, c-format
+msgid "bad date in %%changelog: %s\n"
+msgstr "ngày tháng sai trong bản ghi thay đổi (%%changelog): %s\n"
+
+#: build/parseChangelog.c:242
+#, c-format
+msgid "%%changelog not in descending chronological order\n"
+msgstr "bản ghi thay đổi (%%changelog) không theo thứ tự thời gian giảm dần\n"
+
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
+#, c-format
+msgid "missing name in %%changelog\n"
+msgstr "thiếu tên trong bản ghi thay đổi (%%changelog)\n"
+
+#: build/parseChangelog.c:272
+#, c-format
+msgid "no description in %%changelog\n"
+msgstr "không có mô tả trong bản ghi thay đổi (%%changelog)\n"
+
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "dòng %d: %%changelog thứ hai\n"
+
+#: build/parseDescription.c:32
+#, c-format
+msgid "line %d: Error parsing %%description: %s\n"
+msgstr "dòng %d: Gặp lỗi khi phân tích mô tả (%%description): %s\n"
+
+#: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
+#: build/parseScript.c:321
+#, c-format
+msgid "line %d: Bad option %s: %s\n"
+msgstr "dòng %d: Tùy chọn sai %s: %s\n"
+
+#: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
+#: build/parseScript.c:332
+#, c-format
+msgid "line %d: Too many names: %s\n"
+msgstr "dòng %d: Quá nhiều tên: %s\n"
+
+#: build/parseFiles.c:33
+#, c-format
+msgid "line %d: Error parsing %%files: %s\n"
+msgstr "dòng %d: Gặp lỗi khi phân tích tập tin (%%files): %s\n"
+
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
+#: build/parsePolicies.c:32
+#, c-format
+msgid "line %d: Error parsing %%policies: %s\n"
+msgstr "dòng %d: Gặp lỗi khi phân tích %%policies: %s\n"
+
+#: build/parsePreamble.c:71
+#, c-format
+msgid "Error parsing tag field: %s\n"
+msgstr "Gặp lỗi khi phân tích trường thẻ: %s\n"
+
+#: build/parsePreamble.c:164
+#, c-format
+msgid "line %d: Bad number: %s\n"
+msgstr "dòng %d: Số sai: %s\n"
+
+#: build/parsePreamble.c:170
+#, c-format
+msgid "line %d: Bad no%s number: %u\n"
+msgstr "dòng %d: Số no%s sai: %u\n"
+
+#: build/parsePreamble.c:233
+#, c-format
+msgid "line %d: Bad %s number: %s\n"
+msgstr "dòng %d: Số %s sai: %s\n"
+
+#: build/parsePreamble.c:247
+#, c-format
+msgid "%s %d defined multiple times\n"
+msgstr "%s %d được xác định nhiều lần\n"
+
+#: build/parsePreamble.c:292
+#, c-format
+msgid "Downloading %s to %s\n"
+msgstr "Đang tải %s về %s\n"
+
+#: build/parsePreamble.c:295
+#, c-format
+msgid "Couldn't download %s\n"
+msgstr "Không thể tải về %s\n"
+
+#: build/parsePreamble.c:439
+#, c-format
+msgid "Architecture is excluded: %s\n"
+msgstr "Kiến trúc bị loại trừ: %s\n"
+
+#: build/parsePreamble.c:444
+#, c-format
+msgid "Architecture is not included: %s\n"
+msgstr "Kiến trúc không được bao gồm: %s\n"
+
+#: build/parsePreamble.c:449
+#, c-format
+msgid "OS is excluded: %s\n"
+msgstr "Hệ điều hành bị loại trừ: %s\n"
+
+#: build/parsePreamble.c:454
+#, c-format
+msgid "OS is not included: %s\n"
+msgstr "Hệ điều hành không được bao gồm: %s\n"
+
+#: build/parsePreamble.c:480
+#, c-format
+msgid "%s field must be present in package: %s\n"
+msgstr "Trường %s phải nằm trong gói: %s\n"
+
+#: build/parsePreamble.c:503
+#, c-format
+msgid "Duplicate %s entries in package: %s\n"
+msgstr "Mục nhập %s trùng trong gói: %s\n"
+
+#: build/parsePreamble.c:568
+#, c-format
+msgid "Unable to open icon %s: %s\n"
+msgstr "Không thể mở biểu tượng %s: %s\n"
+
+#: build/parsePreamble.c:584
+#, c-format
+msgid "Unable to read icon %s: %s\n"
+msgstr "Không thể đọc biểu tượng %s: %s\n"
+
+#: build/parsePreamble.c:594
+#, c-format
+msgid "Unknown icon type: %s\n"
+msgstr "Không hỗ trợ kiểu biểu tượng: %s\n"
+
+#: build/parsePreamble.c:608
+#, c-format
+msgid "line %d: Tag takes single token only: %s\n"
+msgstr "dòng %d: Thẻ chấp nhận chỉ một hiệu bài: %s\n"
+
+#: build/parsePreamble.c:616
+#, c-format
+msgid "line %d: %s in: %s\n"
+msgstr "dòng %d: %s trong: %s\n"
+
+#: build/parsePreamble.c:618
+#, c-format
+msgid "%s in: %s\n"
+msgstr "%s trong: %s\n"
+
+#: build/parsePreamble.c:637
+#, c-format
+msgid "Illegal char '%c' (0x%x)"
+msgstr "ký tự không hợp lệ “%c” (0x%x)"
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr "chuỗi không hợp lệ \"..\""
+
+#: build/parsePreamble.c:737
+#, c-format
+msgid "line %d: Malformed tag: %s\n"
+msgstr "dòng %d: Thẻ dạng sai: %s\n"
+
+#: build/parsePreamble.c:745
+#, c-format
+msgid "line %d: Empty tag: %s\n"
+msgstr "dòng %d: Thẻ rỗng: %s\n"
+
+#: build/parsePreamble.c:806
+#, c-format
+msgid "line %d: Prefixes must not end with \"/\": %s\n"
+msgstr "dòng %d: Tiền tố không nên kết thúc với dấu sổ chéo “/”: %s\n"
+
+#: build/parsePreamble.c:818
+#, c-format
+msgid "line %d: Docdir must begin with '/': %s\n"
+msgstr ""
+"dòng %d: Docdir (thư mục tài liệu) phải bắt đầu với dấu sổ chéo “/”: %s\n"
+
+#: build/parsePreamble.c:831
+#, c-format
+msgid "line %d: Epoch field must be an unsigned number: %s\n"
+msgstr "dòng %d: trường Epoch (Kỷ nguyên) phải là con số không dấu: %s\n"
+
+#: build/parsePreamble.c:868
+#, c-format
+msgid "line %d: Bad %s: qualifiers: %s\n"
+msgstr "dòng %d: %s sai: điều kiện: %s\n"
+
+#: build/parsePreamble.c:902
+#, c-format
+msgid "line %d: Bad BuildArchitecture format: %s\n"
+msgstr "dòng %d: định dạng BuildArchitecture (kiến trúc xây dựng) sai: %s\n"
+
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
+#, c-format
+msgid "line %d: Only noarch subpackages are supported: %s\n"
+msgstr "dòng %d: Chỉ hỗ trợ gói phụ kiểu “noarch” (không có kiến trúc): %s\n"
+
+#: build/parsePreamble.c:934
+#, c-format
+msgid "Internal error: Bogus tag %d\n"
+msgstr "Lỗi nội bộ: Thẻ giả %d\n"
+
+#: build/parsePreamble.c:1032
+#, c-format
+msgid "line %d: %s is deprecated: %s\n"
+msgstr "dòng %d: không tán thành %s: %s\n"
+
+#: build/parsePreamble.c:1093
+#, c-format
+msgid "Bad package specification: %s\n"
+msgstr "Đặc tả gói sai: %s\n"
+
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
+
+#: build/parsePreamble.c:1144
+#, c-format
+msgid "line %d: Unknown tag: %s\n"
+msgstr "dòng %d: Không rõ thẻ: %s\n"
+
+#: build/parsePreamble.c:1176
+#, c-format
+msgid "%%{buildroot} couldn't be empty\n"
+msgstr "%%{buildroot} không thể là rỗng\n"
+
+#: build/parsePreamble.c:1180
+#, c-format
+msgid "%%{buildroot} can not be \"/\"\n"
+msgstr "%%{buildroot} không thể là \"/\"\n"
+
+#: build/parsePrep.c:29
+#, c-format
+msgid "Bad source: %s: %s\n"
+msgstr "Nguồn sai: %s: %s\n"
+
+#: build/parsePrep.c:74
+#, c-format
+msgid "No patch number %u\n"
+msgstr "Không có miếng và số %u\n"
+
+#: build/parsePrep.c:76
+#, c-format
+msgid "%%patch without corresponding \"Patch:\" tag\n"
+msgstr "%%patch mà không có thẻ \"Patch:\" tương ứng\n"
+
+#: build/parsePrep.c:164
+#, c-format
+msgid "No source number %u\n"
+msgstr "Không có số nguồn %u\n"
+
+#: build/parsePrep.c:166
+msgid "No \"Source:\" tag in the spec file\n"
+msgstr "Không có thẻ \"Source:\" trong tập tin đặc tả\n"
+
+#: build/parsePrep.c:300
+#, c-format
+msgid "Error parsing %%setup: %s\n"
+msgstr "Lỗi phân tích thiết lập (%%setup): %s\n"
+
+#: build/parsePrep.c:311
+#, c-format
+msgid "line %d: Bad arg to %%setup: %s\n"
+msgstr "dòng %d: Đối số sai tới thiết lập (%%setup): %s\n"
+
+#: build/parsePrep.c:326
+#, c-format
+msgid "line %d: Bad %%setup option %s: %s\n"
+msgstr "dòng %d: Tùy chọn thiết lập (%%setup) sai %s: %s\n"
+
+#: build/parsePrep.c:495
+#, c-format
+msgid "%s: %s: %s\n"
+msgstr "%s: %s: %s\n"
+
+#: build/parsePrep.c:508
+#, c-format
+msgid "Invalid patch number %s: %s\n"
+msgstr "Miếng và sô %s không hợp lệ: %s\n"
+
+#: build/parsePrep.c:535
+#, c-format
+msgid "line %d: second %%prep\n"
+msgstr "dòng %d: chuẩn bị (%%prep) thứ hai\n"
+
+#: build/parseReqs.c:52
+msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
+msgstr ""
+"Các thẻ bài về quan hệ phụ thuộc phải bắt đầu với chữ cái, chữ số, dấu gạch "
+"dưới “_” hoặc dấu sổ chéo “/”"
+
+#: build/parseReqs.c:57
+msgid "Versioned file name not permitted"
+msgstr "Không cho phép tên tập tin đặt phiên bản"
+
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr "Không có phần phụ thuộc dồi dào cho phép với kiểu này"
+
+#: build/parseReqs.c:232 build/parseReqs.c:307
+msgid "invalid dependency"
+msgstr "phần phụ thuộc không hợp lệ"
+
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "Yêu cầu phiên bản"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr "Chỉ có đường dẫn tuyệt đối là cho phép trong bẫy tập tin"
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr "Bẫy bị kích sập bởi cùng một gói đã sẵn được định nghĩa trong tập tin "
+
+#: build/parseReqs.c:324
+#, c-format
+msgid "line %d: %s: %s\n"
+msgstr "dòng %d: %s: %s\n"
+
+#: build/parseScript.c:263
+#, c-format
+msgid "line %d: triggers must have --: %s\n"
+msgstr "dòng %d: các bẫy phải có --: %s\n"
+
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
+#, c-format
+msgid "line %d: Error parsing %s: %s\n"
+msgstr "dòng %d: Lỗi phân tích %s: %s\n"
+
+#: build/parseScript.c:293
+#, c-format
+msgid "line %d: internal script must end with '>': %s\n"
+msgstr "dòng %d: văn lệnh nội tại phải kết thúc bằng “>”: %s\n"
+
+#: build/parseScript.c:299
+#, c-format
+msgid "line %d: script program must begin with '/': %s\n"
+msgstr ""
+"dòng %d: Chương trình đặt văn lệnh phải bắt đầu với dấu sổ chéo “/”: %s\n"
+
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr "dòng %d: Ưu tiên chỉ cho phép với các bẫy tập tin: %s\n"
+
+#: build/parseScript.c:344
+#, c-format
+msgid "line %d: Second %s\n"
+msgstr "dòng %d: %s thứ hai\n"
+
+#: build/parseScript.c:386
+#, c-format
+msgid "line %d: unsupported internal script: %s\n"
+msgstr "dòng %d: văn lệnh nội bộ không được hỗ trợ: %s\n"
+
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
+#, c-format
+msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
+msgstr "dòng %d: phiên dịch tham số không được phép trong bẫy: %s\n"
+
+#: build/parseSpec.c:190
+#, c-format
+msgid "line %d: %s\n"
+msgstr "dòng %d: %s\n"
+
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr "Vĩ lệnh được khai triển trong phần ghi chú trên dòng %d: %s\n"
+
+#: build/parseSpec.c:317
+#, c-format
+msgid "Unable to open %s: %s\n"
+msgstr "Không thể mở %s: %s\n"
+
+#: build/parseSpec.c:351
+#, c-format
+msgid "%s:%d: Argument expected for %s\n"
+msgstr "%s:%d: Cần đối số cho %s\n"
+
+#: build/parseSpec.c:373
+#, c-format
+msgid "line %d: Unclosed %%if\n"
+msgstr "dòng %d: Chưa đóng %%if\n"
+
+#: build/parseSpec.c:378
+#, c-format
+msgid "line %d: unclosed macro or bad line continuation\n"
+msgstr "dòng %d: chưa đóng vĩ lệnh hoặc dòng kéo dài sai\n"
+
+#: build/parseSpec.c:420
+#, c-format
+msgid "%s:%d: bad %%if condition\n"
+msgstr "%s:%d: điều kiện %%if sai\n"
+
+#: build/parseSpec.c:428
+#, c-format
+msgid "%s:%d: Got a %%else with no %%if\n"
+msgstr "%s:%d: Có một toán tử %%else (nếu không) mà không có %%if (nếu)\n"
+
+#: build/parseSpec.c:439
+#, c-format
+msgid "%s:%d: Got a %%endif with no %%if\n"
+msgstr "%s:%d: Có một toán tử %%endif (kết thúc nếu) mà không có %%if (nếu)\n"
+
+#: build/parseSpec.c:460
+#, c-format
+msgid "%s:%d: malformed %%include statement\n"
+msgstr "%s:%d: câu lệnh bao gồm (%%include) sai dạng\n"
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr "bảng mã %s không được hệ thống hỗ trợ\n"
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr "Gói %s: bảng mã %s không hợp lệ trong %s: %s - %s\n"
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr "Không tìm thấy kiến trúc tương thích để xây dựng\n"
+
+#: build/parseSpec.c:912
+#, c-format
+msgid "Package has no %%description: %s\n"
+msgstr "Gói không có mô tả (%%description): %s\n"
+
+#: build/policies.c:87
+#, c-format
+msgid "Policy module '%s' duplicated with overlapping types\n"
+msgstr "Mô-đun chính sách bị trùng “%s” với kiểu đè lên nhau\n"
+
+#: build/policies.c:93
+#, c-format
+msgid "Base modules '%s' and '%s' have overlapping types\n"
+msgstr "Các mô-đun cơ sở “%s” và “%s” có kiểu đè lên nhau\n"
+
+#: build/policies.c:101
+msgid "Failed to get policies from header\n"
+msgstr "Gặp lỗi khi lấy chính sách từ phần đầu\n"
+
+#: build/policies.c:154
+#, c-format
+msgid "%%semodule requires a file path\n"
+msgstr "%%semodule cần đường dẫn tập tin\n"
+
+#: build/policies.c:163
+#, c-format
+msgid "Failed to read  policy file: %s\n"
+msgstr "Gặp lỗi khi đọc tập tin chính sách: %s\n"
+
+#: build/policies.c:170
+#, c-format
+msgid "Failed to encode policy file: %s\n"
+msgstr "Gặp lỗi khi giải mã tập tin chính sách: %s\n"
+
+#: build/policies.c:187
+#, c-format
+msgid "Failed to determine a policy name: %s\n"
+msgstr "Gặp lỗi khi dò tìm tên chính sách: %s\n"
+
+#: build/policies.c:199
+#, c-format
+msgid ""
+"'%s' type given with other types in %%semodule %s. Compacting types to "
+"'%s'.\n"
+msgstr ""
+"kiểu “%s” đưa ra với kiểu khác trong %%semodule %s. Tóm lược các kiểu thành "
+"“%s”.\n"
+
+#: build/policies.c:246
+#, c-format
+msgid "Error parsing %s: %s\n"
+msgstr "Lỗi phân tích cú pháp %s: %s\n"
+
+#: build/policies.c:252
+#, c-format
+msgid "Expecting %%semodule tag: %s\n"
+msgstr "Cần thẻ %%semodule: %s\n"
+
+#: build/policies.c:262
+#, c-format
+msgid "Missing module path in line: %s\n"
+msgstr "Thiếu đường dẫn mô-đun trong dòng: %s\n"
+
+#: build/policies.c:268
+#, c-format
+msgid "Too many arguments in line: %s\n"
+msgstr "Quá nhiều đối số trong dòng: %s\n"
+
+#: build/policies.c:307
+#, c-format
+msgid "Processing policies: %s\n"
+msgstr "Thực hiện các chính sách: %s\n"
+
+#: build/rpmfc.c:160
+#, c-format
+msgid "Ignoring invalid regex %s\n"
+msgstr "Bỏ qua biểu thức chính quy không hợp lệ %s\n"
+
+#: build/rpmfc.c:266
+#, c-format
+msgid "Couldn't create pipe for %s: %m\n"
+msgstr "Không thể tạo ống dẫn cho %s: %m\n"
+
+#: build/rpmfc.c:289
+#, c-format
+msgid "Couldn't exec %s: %s\n"
+msgstr "Không thể thực hiện %s: %s\n"
+
+#: build/rpmfc.c:294 lib/rpmscript.c:320
+#, c-format
+msgid "Couldn't fork %s: %s\n"
+msgstr "Không thể tạo tiến trình con %s: %s\n"
+
+#: build/rpmfc.c:377
+#, c-format
+msgid "%s failed: %x\n"
+msgstr "%s bị lỗi: %x\n"
+
+#: build/rpmfc.c:381
+#, c-format
+msgid "failed to write all data to %s: %s\n"
+msgstr "gặp lỗi khi toàn bộ dữ liệu vào %s: %s\n"
+
+#: build/rpmfc.c:1032
+msgid "Empty file classifier\n"
+msgstr "Phân loại tập tin trống rỗng\n"
+
+#: build/rpmfc.c:1041
+msgid "No file attributes configured\n"
+msgstr "Chưa có các thuộc tính tập tin được cấu hình\n"
+
+#: build/rpmfc.c:1060
+#, c-format
+msgid "magic_open(0x%x) failed: %s\n"
+msgstr "magic_open(0x%x) bị lỗi: %s\n"
+
+#: build/rpmfc.c:1066
+#, c-format
+msgid "magic_load failed: %s\n"
+msgstr "magic_load gặp lỗi: %s\n"
+
+#: build/rpmfc.c:1108
+#, c-format
+msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
+msgstr "Gặp lỗi khi chấp nhận tập tin \"%s\": chế độ %06o %s\n"
+
+#: build/rpmfc.c:1309
+#, c-format
+msgid "Finding  %s: %s\n"
+msgstr "Đang tìm  %s: %s\n"
+
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
+#, c-format
+msgid "Failed to find %s:\n"
+msgstr "Gặp lỗi khi tìm %s:\n"
+
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
+#, c-format
+msgid "query of specfile %s failed, can't parse\n"
+msgstr "lỗi truy vấn tập tin đặc tả %s nên không phân tích được\n"
+
+#: lib/backend/db3.c:97
+#, c-format
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s lỗi(%d) từ %s: %s\n"
+
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s lỗi(%d): %s\n"
+
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "không nhận ra tùy chọn cơ sở dữ liệu “%s” nên bỏ qua.\n"
+
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s có giá trị thuộc số không hợp lệ nên bỏ qua\n"
+
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s có giá trị dài quá lớn hoặc quá nhỏ nên bỏ qua\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s có giá trị nguyên quá lớn hoặc quá nhỏ nên bỏ qua\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "không thể lấy khóa %s ở %s/%s\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "chung"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "độc quyền"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "kiểu bảng mục mục không hợp lệ %x trên %s/%s\n"
+
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr "gặp lỗi (%d) khi lấy bản ghi \"%s\" từ chỉ mục %s: %s\n"
+
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "gặp lỗi (%d) khi ghi bản ghi %s vào %s\n"
+
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "Gặp lỗi (%d) khi gỡ bỏ bản ghi “%s” ra khỏi %s\n"
+
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr "lỗi (%d) khi thêm bản ghi phần đầu #%d\n"
+
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "lỗi (%d) khi gỡ bỏ bản ghi phần đầu #%d\n"
+
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "lỗi (%d) phân bỏ minh dụ gói mới\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
+
+#: lib/depends.c:93
+#, c-format
+msgid "%s is a Delta RPM and cannot be directly installed\n"
+msgstr "%s là một Delta RPM và không thể được cài đặt trực tiếp\n"
+
+#: lib/depends.c:97
+#, c-format
+msgid "Unsupported payload (%s) in package %s\n"
+msgstr "Không hỗ trợ phần tải (%s) trong gói %s\n"
+
+#: lib/depends.c:377
+#, c-format
+msgid "package %s was already added, skipping %s\n"
+msgstr "gói %s đã được thêm vào nên bỏ qua %s\n"
+
+#: lib/depends.c:378
+#, c-format
+msgid "package %s was already added, replacing with %s\n"
+msgstr "gói %s đã được thêm vào nên thay thế bằng %s\n"
+
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(không phải blob)"
+
+#: lib/formats.c:43
+msgid "(not a number)"
+msgstr "(không phải con số)"
+
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(không phải chuỗi)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(kiểu không hợp lệ)"
+
+#: lib/formats.c:116
+#, c-format
+msgid "%c"
+msgstr "%c"
+
+#: lib/formats.c:122
+msgid "%a %b %d %Y"
+msgstr "%a %d %b %Y"
+
+#: lib/formats.c:253
+msgid "(not base64)"
+msgstr "(không phải base64)"
+
+#: lib/formats.c:313
+msgid "(invalid xml type)"
+msgstr "(kiểu XML không hợp lệ)"
+
+#: lib/formats.c:358
+msgid "(not an OpenPGP signature)"
+msgstr "(không phải chữ ký OpenPGP)"
+
+#: lib/formats.c:369
+#, c-format
+msgid "Invalid date %u"
+msgstr "Ngày không hợp lệ %u"
+
+#: lib/formats.c:417
+msgid "normal"
+msgstr "thông thường"
+
+#: lib/formats.c:420 lib/verify.c:393
+msgid "replaced"
+msgstr "đã thay thế"
+
+#: lib/formats.c:423 lib/verify.c:387
+msgid "not installed"
+msgstr "chưa cài đặt"
+
+#: lib/formats.c:426 lib/verify.c:389
+msgid "net shared"
+msgstr "chia sẻ qua mạng"
+
+#: lib/formats.c:429 lib/verify.c:391
+msgid "wrong color"
+msgstr "màu sai"
+
+#: lib/formats.c:432
+msgid "missing"
+msgstr "thiếu"
+
+#: lib/formats.c:435
+msgid "(unknown)"
+msgstr "(không hiểu)"
+
+#: lib/fsm.c:745
+#, c-format
+msgid "%s saved as %s\n"
+msgstr "%s được lưu dạng %s\n"
+
+#: lib/fsm.c:798
+#, c-format
+msgid "%s created as %s\n"
+msgstr "%s được tạo dạng %s\n"
+
+#: lib/fsm.c:1082
+#, c-format
+msgid "%s %s: remove failed: %s\n"
+msgstr "%s %s: gặp lỗi khi gỡ bỏ: %s\n"
+
+#: lib/fsm.c:1083
+msgid "directory"
+msgstr "thư mục"
+
+#: lib/fsm.c:1083
+msgid "file"
+msgstr "tập tin"
+
+#: lib/header.c:285
+#, c-format
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
+
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr "tải hdr: SAI"
+
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
+
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr "thẻ vùng: SAI, thẻ %d kiểu %d bù %d số lượng %d"
+
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr "bù vùng: SAI, thẻ %d kiểu %d bù %d số lượng %d"
+
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr "vùng theo đuôi: SAI, thẻ %d kiểu %d bù %d số lượng %d"
+
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
+
+#: lib/header.c:1841
+#, c-format
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
+
+#: lib/header.c:1876
+#, c-format
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr "kích cỡ hdr (%d): SAI, hàm đọc đã trả về %d"
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr "ma thuật hdr: SAI"
+
+#: lib/header.c:1885
+#, c-format
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr "thẻ hdr: SAI, tổng số thẻ (%d) ở ngoài phạm vi"
+
+#: lib/header.c:1890
+#, c-format
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr "dữ liệu hdr: SAI, tổng số byte (%d) ở ngoài phạm vi"
+
+#: lib/header.c:1900
+#, c-format
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr "hdr blob(%zd): SAI, việc đọc trả về %d"
+
+#: lib/header.c:1909
+#, c-format
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr "đệm sigh(%zd): SAI, đọc %zd byte"
+
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
+
+#: lib/header.c:1949
+#, c-format
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr "kích cỡ blob (%d): SAI, 8 + 16 * il(%d) + dl(%d)"
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "sai chiều rộng trường"
+
+#: lib/headerfmt.c:362
+#, c-format
+msgid "missing { after %%"
+msgstr ""
+
+#: lib/headerfmt.c:384
+#, c-format
+msgid "missing } after %%{"
+msgstr ""
+
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "định dạng thẻ trống"
+
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "tên thẻ trống"
+
+#: lib/headerfmt.c:413
+#, c-format
+msgid "unknown tag: \"%s\""
+msgstr ""
+
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "cần dấu ngoặc vuông đóng “]” ở kết thúc của mảng"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "gặp dấu ngoặc vuông đóng “]” bất thường"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "gặp dấu ngoặc móc đóng “}” bất thường"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "cần dấu hỏi “?” trong biểu thức"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "cần dấu ngoặc móc mở “{” sau dấu hỏi “?” trong biểu thức"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "cần dấu ngoặc móc đóng “}” trong biểu thức"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr "cần dấu hai chấm “:” theo sau biểu thức phụ dấu hỏi “?”"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "cần dấu ngoặc móc mở “{” sau dấu hai chấm “:” trong biểu thức"
+
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "cần ký hiệu ống dẫn “|” ở kết thúc của biểu thức"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "đồ lặp lại mảng được sử dụng với các mảng có kích cỡ khác nhau"
+
+#: lib/poptALL.c:154
+#, c-format
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
+"%s: lỗi: đã cho nhiều hơn một --pipe (bí danh popt không tương thích?)\n"
+
+#: lib/poptALL.c:188
+msgid "predefine MACRO with value EXPR"
+msgstr "VĨ_LỆNH định nghĩa sẵn với giá trị B_THỨC"
+
+#: lib/poptALL.c:189 lib/poptALL.c:192
+msgid "'MACRO EXPR'"
+msgstr "“VĨ_LỆNH B_THỨC”"
+
+#: lib/poptALL.c:191
+msgid "define MACRO with value EXPR"
+msgstr "VĨ_LỆNH định nghĩa với giá trị B_THỨC"
+
+#: lib/poptALL.c:194
+msgid "undefine MACRO"
+msgstr "Hủy định nghĩa VĨ_LỆNH"
+
+#: lib/poptALL.c:195
+msgid "MACRO"
+msgstr "VĨ LỆNH"
+
+#: lib/poptALL.c:197
+msgid "print macro expansion of EXPR"
+msgstr "in phần mở rộng vĩ lệnh của B_THỨC"
+
+#: lib/poptALL.c:198
+msgid "'EXPR'"
+msgstr "“B_THỨC”"
+
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
+msgid "read <FILE:...> instead of default file(s)"
+msgstr "đọc <TẬP TIN:…> thay cho (những) tập tin mặc định"
+
+#: lib/poptALL.c:203 lib/poptALL.c:222
+msgid "<FILE:...>"
+msgstr "<TẬP-TIN:…>"
+
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr "không thể bật bất kỳ phần bổ xung nào"
+
+#: lib/poptALL.c:211
+msgid "don't verify package digest(s)"
+msgstr "không thẩm tra mã băm của gói"
+
+#: lib/poptALL.c:213
+msgid "don't verify database header(s) when retrieved"
+msgstr "không thẩm tra phần đầu cơ sở dữ liệu khi tìm được"
+
+#: lib/poptALL.c:215
+msgid "don't verify package signature(s)"
+msgstr "không xác minh chữ ký gói"
+
+#: lib/poptALL.c:218
+msgid "send stdout to CMD"
+msgstr "gửi đầu ra tiêu chuẩn tới câu LỆNH"
+
+#: lib/poptALL.c:219
+msgid "CMD"
+msgstr "LỆNH"
+
+#: lib/poptALL.c:224
+msgid "use ROOT as top level directory"
+msgstr "dùng GỐC là thư mục cấp cao nhất"
+
+#: lib/poptALL.c:225
+msgid "ROOT"
+msgstr "GỐC"
+
+#: lib/poptALL.c:227
+msgid "use database in DIRECTORY"
+msgstr "dùng cơ sở dữ liệu trong THƯ-MỤC"
+
+#: lib/poptALL.c:228
+msgid "DIRECTORY"
+msgstr "THƯ-MỤC"
+
+#: lib/poptALL.c:231
+msgid "display known query tags"
+msgstr "hiển thị các thẻ truy vấn đã biết"
+
+#: lib/poptALL.c:233
+msgid "display final rpmrc and macro configuration"
+msgstr "hiển thị toàn thể rpmrc và cấu hình vĩ lệnh"
+
+#: lib/poptALL.c:235
+msgid "provide less detailed output"
+msgstr "cung cấp kết xuất ít chi tiết hơn"
+
+#: lib/poptALL.c:237
+msgid "provide more detailed output"
+msgstr "cung cấp kết xuất nhiều chi tiết hơn"
+
+#: lib/poptALL.c:239
+msgid "print the version of rpm being used"
+msgstr "hiển thị phiên bản rpm đang dùng"
+
+#: lib/poptALL.c:245
+msgid "debug payload file state machine"
+msgstr "cỡ lỗi Cơ chế Tình trạng Tập tin trọng tải"
+
+#: lib/poptALL.c:251
+msgid "debug rpmio I/O"
+msgstr "gỡ lỗi V/R rpmio"
+
+#: lib/poptALL.c:310
+#, c-format
+msgid "%s: option table misconfigured (%d)\n"
+msgstr "%s: sai cấu hình bảng tùy chọn (%d)\n"
+
+#: lib/poptI.c:52
+msgid "exclude paths must begin with a /"
+msgstr "đường dẫn loại trừ phải bắt đầu với dấu sổ chéo “/”"
+
+#: lib/poptI.c:64
+msgid "relocations must begin with a /"
+msgstr "sự tái định vị phải bắt đầu với dấu sổ chéo “/”"
+
+#: lib/poptI.c:67
+msgid "relocations must contain a ="
+msgstr "sự tái định vị phải chứa một dấu bằng “=”"
+
+#: lib/poptI.c:70
+msgid "relocations must have a / following the ="
+msgstr "sự tái định vị phải có một dấu sổ chéo “/” theo sau dấu bằng “=”"
+
+#: lib/poptI.c:118
+msgid "install all files, even configurations which might otherwise be skipped"
+msgstr ""
+"cài đặt tất cả các tập tin, ngay cả cấu hình mà có thể bị bỏ qua bằng cách "
+"khác"
+
+#: lib/poptI.c:122
+msgid ""
+"remove all packages which match <package> (normally an error is generated if "
+"<package> specified multiple packages)"
+msgstr ""
+"gỡ bỏ tất cả các gói tương ứng với <gói> (thường thì một lỗi phát sinh nếu "
+"<gói> định rõ nhiều gói)"
+
+#: lib/poptI.c:127
+msgid "relocate files in non-relocatable package"
+msgstr "tái định vị các tập tin trong gói không thể tái định vị"
+
+#: lib/poptI.c:131
+msgid "print dependency loops as warning"
+msgstr "in dạng cảnh báo các vòng lặp của quan hệ phụ thuộc"
+
+#: lib/poptI.c:135
+msgid "erase (uninstall) package"
+msgstr "xóa (gỡ bỏ) gói"
+
+#: lib/poptI.c:135
+msgid "<package>+"
+msgstr "<gói>+"
+
+#: lib/poptI.c:138 lib/poptI.c:175
+msgid "do not install configuration files"
+msgstr "không cài đặt tập tin cấu hình"
+
+#: lib/poptI.c:141 lib/poptI.c:180
+msgid "do not install documentation"
+msgstr "không cài đặt tài liệu hướng dẫn"
+
+#: lib/poptI.c:143
+msgid "skip files with leading component <path> "
+msgstr "bỏ qua các tập tin với bộ phận hướng dẫn <đường_dẫn>"
+
+#: lib/poptI.c:144
+msgid "<path>"
+msgstr "<đường_dẫn>"
+
+#: lib/poptI.c:147
+msgid "short hand for --replacepkgs --replacefiles"
+msgstr "kiểu viết tắt cho --replacepkgs --replacefiles"
+
+#: lib/poptI.c:151
+msgid "upgrade package(s) if already installed"
+msgstr "nâng cấp gói đã cài đặt"
+
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
+msgid "<packagefile>+"
+msgstr "<tập_tin_gói>+"
+
+#: lib/poptI.c:154
+msgid "print hash marks as package installs (good with -v)"
+msgstr "in những ký hiệu lộn xộn khi cài đặt gói (rất tốt với -v)"
+
+#: lib/poptI.c:157
+msgid "don't verify package architecture"
+msgstr "không thẩm tra kiến trúc của gói"
+
+#: lib/poptI.c:160
+msgid "don't verify package operating system"
+msgstr "không thẩm tra hệ điều hành của gói"
+
+#: lib/poptI.c:163
+msgid "don't check disk space before installing"
+msgstr "không kiểm tra khoảng trống trên đĩa trước khi cài đặt"
+
+#: lib/poptI.c:165
+msgid "install documentation"
+msgstr "cài đặt tài liệu hướng dẫn"
+
+#: lib/poptI.c:168
+msgid "install package(s)"
+msgstr "cài đặt gói"
+
+#: lib/poptI.c:171
+msgid "update the database, but do not modify the filesystem"
+msgstr "cập nhật cơ sở dữ liệu, mà không sửa đổi hệ thống tập tin"
+
+#: lib/poptI.c:177
+msgid "do not verify package dependencies"
+msgstr "không thẩm tra quan hệ phụ thuộc giữa các gói"
+
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
+msgid "don't verify digest of files"
+msgstr "không thẩm tra mã băm của tập tin"
+
+#: lib/poptI.c:185
+msgid "don't verify digest of files (obsolete)"
+msgstr "không thẩm tra mã băm của tập tin (không dùng nữa)"
+
+#: lib/poptI.c:187
+msgid "don't install file security contexts"
+msgstr "không cài đặt ngữ cảnh bảo mật tập tin"
+
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
+msgid "do not reorder package installation to satisfy dependencies"
+msgstr "không sắp xếp lại gói cần cài đặt để thỏa quan hệ phụ thuộc"
+
+#: lib/poptI.c:197
+msgid "do not execute package scriptlet(s)"
+msgstr "không thực hiện văn lệnh nhỏ của gói"
+
+#: lib/poptI.c:201
+#, c-format
+msgid "do not execute %%pre scriptlet (if any)"
+msgstr "không thực hiện văn lệnh nhỏ %%pre (nếu có)"
+
+#: lib/poptI.c:204
+#, c-format
+msgid "do not execute %%post scriptlet (if any)"
+msgstr "không thực hiện văn lệnh nhỏ %%post (nếu có)"
+
+#: lib/poptI.c:207
+#, c-format
+msgid "do not execute %%preun scriptlet (if any)"
+msgstr "không thực hiện văn lệnh nhỏ %%preun (nếu có)"
+
+#: lib/poptI.c:210
+#, c-format
+msgid "do not execute %%postun scriptlet (if any)"
+msgstr "không thực hiện văn lệnh nhỏ %%postun (nếu có)"
+
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "không thực hiện văn lệnh nhỏ %%pretrans (nếu có)"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "không thực hiện văn lệnh nhỏ %%postrans (nếu có)"
+
+#: lib/poptI.c:219
+msgid "do not execute any scriptlet(s) triggered by this package"
+msgstr "không chạy bất kỳ văn lệnh nhỏ nào được gói này kích hoạt"
+
+#: lib/poptI.c:222
+#, c-format
+msgid "do not execute any %%triggerprein scriptlet(s)"
+msgstr ""
+"không chạy bất kỳ văn lệnh nhỏ cài đặt sẵn đã kích hoạt (%%triggerprein)"
+
+#: lib/poptI.c:225
+#, c-format
+msgid "do not execute any %%triggerin scriptlet(s)"
+msgstr "không chạy bất kỳ văn lệnh nhỏ cài đặt đã kích hoạt (%%triggerin)"
+
+#: lib/poptI.c:228
+#, c-format
+msgid "do not execute any %%triggerun scriptlet(s)"
+msgstr "không chạy bất kỳ văn lệnh nhỏ xóa đã kích hoạt (%%triggerun)"
+
+#: lib/poptI.c:231
+#, c-format
+msgid "do not execute any %%triggerpostun scriptlet(s)"
+msgstr "không chạy bất kỳ vi văn lệnh xóa cuối đã kích hoạt (%%triggerpostun)"
+
+#: lib/poptI.c:235
+msgid ""
+"upgrade to an old version of the package (--force on upgrades does this "
+"automatically)"
+msgstr ""
+"hạ cấp xuống một phiên bản cũ của gói (tùy chọn “--force” khi nâng cấp thì "
+"tự động làm)"
+
+#: lib/poptI.c:239
+msgid "print percentages as package installs"
+msgstr "in ra phần trăm trong khi cài đặt gói"
+
+#: lib/poptI.c:241
+msgid "relocate the package to <dir>, if relocatable"
+msgstr "có thể tái định vị thì chuyển gói vào <thư_mục>"
+
+#: lib/poptI.c:242
+msgid "<dir>"
+msgstr "<th.mục>"
+
+#: lib/poptI.c:244
+msgid "relocate files from path <old> to <new>"
+msgstr "tái định vị các tập tin từ đường dẫn <cũ> tới <mới>"
+
+#: lib/poptI.c:245
+msgid "<old>=<new>"
+msgstr "<cũ>=<mới>"
+
+#: lib/poptI.c:248
+msgid "ignore file conflicts between packages"
+msgstr "bỏ qua tập tin xung đột giữa các gói"
+
+#: lib/poptI.c:251
+msgid "reinstall if the package is already present"
+msgstr "gói đã có thì cài đặt lại "
+
+#: lib/poptI.c:253
+msgid "don't install, but tell if it would work or not"
+msgstr "không cài đặt, nhưng cho biết nó có thể hoạt động hay không"
+
+#: lib/poptI.c:256
+msgid "upgrade package(s)"
+msgstr "nâng cấp gói"
+
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "cài đặt lại (các) gói"
+
+#: lib/poptQV.c:75
+msgid "query/verify all packages"
+msgstr "truy vấn/thẩm tra mọi gói"
+
+#: lib/poptQV.c:77
+msgid "rpm checksig mode"
+msgstr "chế độ kiểm tra chữ ký RPM"
+
+#: lib/poptQV.c:79
+msgid "query/verify package(s) owning file"
+msgstr "truy vấn/thẩm tra (những) gói nào sở hữu tập tin"
+
+#: lib/poptQV.c:81
+msgid "query/verify package(s) in group"
+msgstr "truy vấn/thẩm tra (các) gói trong nhóm"
+
+#: lib/poptQV.c:83
+msgid "query/verify a package file"
+msgstr "truy vấn/thẩm tra một tập tin gói"
+
+#: lib/poptQV.c:86
+msgid "query/verify package(s) with package identifier"
+msgstr "truy vấn/thẩm tra (các) gói với định danh gói"
+
+#: lib/poptQV.c:88
+msgid "query/verify package(s) with header identifier"
+msgstr "truy vấn/thẩm tra (các) gói với định danh phần đầu"
+
+#: lib/poptQV.c:91
+msgid "rpm query mode"
+msgstr "chế độ truy vấn RPM"
+
+#: lib/poptQV.c:93
+msgid "query/verify a header instance"
+msgstr "truy vấn/thẩm tra một phần đầu cụ thể"
+
+#: lib/poptQV.c:95
+msgid "query/verify package(s) from install transaction"
+msgstr "truy vấn/thẩm tra (các) gói từ giao dịch cài đặt"
+
+#: lib/poptQV.c:97
+msgid "query the package(s) triggered by the package"
+msgstr "truy vấn (các) gói được gói kích hoạt"
+
+#: lib/poptQV.c:99
+msgid "rpm verify mode"
+msgstr "chế độ thẩm tra RPM"
+
+#: lib/poptQV.c:101
+msgid "query/verify the package(s) which require a dependency"
+msgstr "truy vấn/thẩm tra (các) gói mà cần thiết quan hệ phụ thuộc"
+
+#: lib/poptQV.c:103
+msgid "query/verify the package(s) which provide a dependency"
+msgstr "truy vấn/thẩm tra (các) gói mà thỏa một quan hệ phụ thuộc"
+
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr "truy vấn hay thẩm tra (các) gói cái mà khuyến nghị một phần phụ thuộc"
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr "truy vấn hay thẩm tra (các) gói cái mà gợi một phần phụ thuộc"
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr "truy vấn hay thẩm tra (các) gói cái mà bổ xung một phần phụ thuộc"
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr "truy vấn hay thẩm tra (các) gói cái mà tăng cường một phần phụ thuộc"
+
+#: lib/poptQV.c:114
+msgid "do not glob arguments"
+msgstr "không glob đối số"
+
+#: lib/poptQV.c:116
+msgid "do not process non-package files as manifests"
+msgstr "không xử lý dạng bản kê tập tin không phải gói "
+
+#: lib/poptQV.c:193
+msgid "list all configuration files"
+msgstr "liệt kê mọi tập tin cấu hình"
+
+#: lib/poptQV.c:195
+msgid "list all documentation files"
+msgstr "liệt kê mọi tập tin tài liệu hướng dẫn"
+
+#: lib/poptQV.c:197
+msgid "list all license files"
+msgstr "liệt kê mọi tập tin giấy phép"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "liệt kê mọi tập tin giấy phép"
+
+#: lib/poptQV.c:201
+msgid "dump basic file information"
+msgstr "đổ thông tin tập tin cơ bản"
+
+#: lib/poptQV.c:205
+msgid "list files in package"
+msgstr "liệt kê các tập tin trong gói"
+
+#: lib/poptQV.c:210
+#, c-format
+msgid "skip %%ghost files"
+msgstr "bỏ qua các tập tin ma (%%ghost)"
+
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "bỏ qua các tập tin ma (%%ghost)"
+
+#: lib/poptQV.c:223
+msgid "display the states of the listed files"
+msgstr "hiển thị các tình trạng của những tập tin đã liệt kê"
+
+#: lib/poptQV.c:241
+msgid "don't verify size of files"
+msgstr "không thẩm tra kích cỡ của tập tin"
+
+#: lib/poptQV.c:244
+msgid "don't verify symlink path of files"
+msgstr "không thẩm tra đường dẫn liên kết mềm của tập tin"
+
+#: lib/poptQV.c:247
+msgid "don't verify owner of files"
+msgstr "không thẩm tra người sở hữu tập tin"
+
+#: lib/poptQV.c:250
+msgid "don't verify group of files"
+msgstr "không thẩm tra nhóm của tập tin"
+
+#: lib/poptQV.c:253
+msgid "don't verify modification time of files"
+msgstr "không thẩm tra thời gian sửa đổi của tập tin"
+
+#: lib/poptQV.c:256 lib/poptQV.c:259
+msgid "don't verify mode of files"
+msgstr "không thẩm tra chế độ của tập tin"
+
+#: lib/poptQV.c:262
+msgid "don't verify file security contexts"
+msgstr "không thẩm tra ngữ cảnh bảo mật của tập tin"
+
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "không thể thẩm tra kích cỡ của các tập tin"
+
+#: lib/poptQV.c:266
+msgid "don't verify files in package"
+msgstr "không thẩm tra các tập tin trong gói"
+
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
+msgid "don't verify package dependencies"
+msgstr "không thẩm tra các quan hệ phụ thuộc của gói"
+
+#: lib/poptQV.c:271 lib/poptQV.c:274
+msgid "don't execute verify script(s)"
+msgstr "không chạy văn lệnh thẩm tra"
+
+#: lib/psm.c:146
+#, c-format
+msgid "Missing rpmlib features for %s:\n"
+msgstr "Thiếu tính năng rpmlib cho %s:\n"
+
+#: lib/psm.c:183
+msgid "source package expected, binary found\n"
+msgstr "cần gói nguồn còn tìm thấy gói nhị phân\n"
+
+#: lib/psm.c:194
+msgid "source package contains no .spec file\n"
+msgstr "gói nguồn không chứa tập tin đặc tả\n"
+
+#: lib/psm.c:606
+#, c-format
+msgid "unpacking of archive failed%s%s: %s\n"
+msgstr "lỗi giải nén kho %s%s: %s\n"
+
+#: lib/psm.c:607
+msgid " on file "
+msgstr " ở tập tin"
+
+#: lib/query.c:108
+#, c-format
+msgid "incorrect format: %s\n"
+msgstr "định dạng không đúng: %s\n"
+
+#: lib/query.c:120
+msgid "(contains no files)\n"
+msgstr "(không chứa tập tin nào)\n"
+
+#: lib/query.c:161
+msgid "normal        "
+msgstr "chuẩn          "
+
+#: lib/query.c:164
+msgid "replaced      "
+msgstr "bị thay thế    "
+
+#: lib/query.c:167
+msgid "not installed "
+msgstr "chưa cài đặt   "
+
+#: lib/query.c:170
+msgid "net shared    "
+msgstr "chia sẻ qua mạng"
+
+#: lib/query.c:173
+msgid "wrong color   "
+msgstr "màu không đúng "
+
+#: lib/query.c:176
+msgid "(no state)    "
+msgstr "(không có tình trạng)"
+
+#: lib/query.c:179
+#, c-format
+msgid "(unknown %3d) "
+msgstr "(không rõ %3d) "
+
+#: lib/query.c:199
+msgid "package has not file owner/group lists\n"
+msgstr "gói không có danh sách nhóm/chủ tập tin\n"
+
+#: lib/query.c:233
+msgid "package has neither file owner or id lists\n"
+msgstr "gói không có người sở hữu tập tin cũng không có danh sách mã số\n"
+
+#: lib/query.c:321
+#, c-format
+msgid "group %s does not contain any packages\n"
+msgstr "nhóm %s không chứa gói\n"
+
+#: lib/query.c:328
+#, c-format
+msgid "no package triggers %s\n"
+msgstr "không có bộ gây nên gói %s\n"
+
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
+#, c-format
+msgid "malformed %s: %s\n"
+msgstr "dạng sai %s: %s\n"
+
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
+#, c-format
+msgid "no package matches %s: %s\n"
+msgstr "không có gói tương ứng với %s: %s\n"
+
+#: lib/query.c:387
+#, c-format
+msgid "no package requires %s\n"
+msgstr "không có gói cần thiết %s\n"
+
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr "không có gói nào khuyến nghị %s\n"
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr "không gói nào gợi ý %s\n"
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr "không có gói nào cung  %s\n"
+
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr "không có gói nào tăng cường %s\n"
+
+#: lib/query.c:423
+#, c-format
+msgid "no package provides %s\n"
+msgstr "không có gói cung cấp %s\n"
+
+#: lib/query.c:455
+#, c-format
+msgid "file %s: %s\n"
+msgstr "tập tin %s: %s\n"
+
+#: lib/query.c:458
+#, c-format
+msgid "file %s is not owned by any package\n"
+msgstr "tập tin %s không được bất kỳ gói sở hưu\n"
+
+#: lib/query.c:469
+#, c-format
+msgid "invalid package number: %s\n"
+msgstr "số thứ tự gói không hợp lệ: %s\n"
+
+#: lib/query.c:476
+#, c-format
+msgid "record %u could not be read\n"
+msgstr "không thể đọc mục ghi %u\n"
+
+#: lib/query.c:491 lib/rpminstall.c:690
+#, c-format
+msgid "package %s is not installed\n"
+msgstr "chưa cài đặt gói %s\n"
+
+#: lib/query.c:525
+#, c-format
+msgid "unknown tag: \"%s\"\n"
+msgstr "không hiểu thẻ: “%s”\n"
+
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
+#, c-format
+msgid "%s: key %d import failed.\n"
+msgstr "%s: gặp lỗi khi nhập khóa %d.\n"
+
+#: lib/rpmchecksig.c:66
+#, c-format
+msgid "%s: key %d not an armored public key.\n"
+msgstr "%s: khóa %d không phải là khóa công dạng văn bản.\n"
+
+#: lib/rpmchecksig.c:111
+#, c-format
+msgid "%s: import read failed(%d).\n"
+msgstr "%s: lỗi đọc khi nhập (%d).\n"
+
+#: lib/rpmchecksig.c:131
+#, c-format
+msgid "Fread failed: %s"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
+msgstr ""
+
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
+msgstr "KHÔNG_ĐƯỢC"
+
+#: lib/rpmchecksig.c:268
+msgid "OK"
+msgstr "OK"
+
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
+#, c-format
+msgid "%s: open failed: %s\n"
+msgstr "%s: gặp lỗi khi mở: %s\n"
+
+#: lib/rpmchroot.c:43
+#, c-format
+msgid "Unable to open current directory: %m\n"
+msgstr "Không thể mở thư mục làm việc hiện thời: %m\n"
+
+#: lib/rpmchroot.c:59 lib/rpmchroot.c:84
+#, c-format
+msgid "%s: chroot directory not set\n"
+msgstr "%s: thư mục đổi gốc chưa đặt\n"
+
+#: lib/rpmchroot.c:70
+#, c-format
+msgid "Unable to change root directory: %m\n"
+msgstr "Không thể chuyển đổi thư mục gốc: %m\n"
+
+#: lib/rpmchroot.c:95
+#, c-format
+msgid "Unable to restore root directory: %m\n"
+msgstr "Không thể phục hồi thư mục gốc: %m\n"
+
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr "Đang tạo %d thiếu mục lục, vui lòng chờ…\n"
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr "không thể mở bảng mục lục %s dùng %s - %s (%d)\n"
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "chưa đặt đường dẫn cơ sở dữ liệu (dbpath)\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader: bỏ qua"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "gặp lỗi (%d) khi lưu bản ghi #%d vào %s\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec (thực hiện biểu thức chính quy) bị lỗi: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp bị lỗi: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator: bỏ qua"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb: nhận được phần đầu bị hỏng #%u -- bỏ qua.\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s: không thể đọc phần đầu ở 0x%x\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "chưa đặt đường dẫn cơ sở dữ liệu (dbpath)"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "gặp lỗi khi tạo thư mục %s: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "phần đầu #%u trong cơ sở dữ liệu là sai -- bỏ qua.\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "không thể thêm bản ghi nguyên gốc tại %u\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr ""
+"gặp lỗi khi xây dựng lại cơ sở dữ liệu: cơ sỏ dữ liệu nguyên gốc được giữ "
+"lại để thay thế\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "gặp lỗi khi thay thế cơ sở dữ liệu cũ bằng cái mới!\n"
+
+#: lib/rpmds.c:744
+msgid "NO "
+msgstr "KHÔNG "
+
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "CÓ"
+
+#: lib/rpmds.c:1221
+msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
+msgstr ""
+"Cả kiểu quan hệ phụ thuộc PreReq: (điều kiện tiên quyết), Provides: (cung "
+"cấp) và Obsoletes: (làm cũ) đều hỗ trợ phiên bản."
+
+#: lib/rpmds.c:1224
+msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
+msgstr ""
+"tên tập tin được cất giữ dạng một đối tượng dữ liệu đa thành phần (dirName,"
+"baseName,dirIndex), không phải dạng đường dẫn."
+
+#: lib/rpmds.c:1228
+msgid "package payload can be compressed using bzip2."
+msgstr "trọng tải của gói có thể được nén bằng bzip2."
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr "trọng tải gói cũng có thể được nén bằng xz."
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr "trọng tải gói cũng có thể được nén bằng lzma."
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "tập tin trọng tải gói có tiền tố “./”."
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "không cung cấp dứt khoát tên-phiên_bản-bản_phát_hành của gói."
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "các thẻ của phần đầu luôn được sắp xếp sau khi được nạp."
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "bộ phiên dịch vi văn lệnh có thể sử dụng các đối số từ phần đầu."
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr ""
+"một bộ tập tin đường liên kết cứng chưa hoàn toàn cũng có thể được cài đặt"
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr ""
+"vi văn lệnh của gói cũng có thể truy cập cơ sở dữ liệu RPM trong khi cài đặt."
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "bản thân có hỗ trợ văn lệnh lua."
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr "thuật toán băm tập tin là có phụ thuộc vào cấu hình từng gói"
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr "hỗ trợ cho dung lượng tập tin POSIX.1e"
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr "scriptlets gói có thể được khai triển lúc cài đặt."
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr "hỗ trợ so sánh phiên bản phụ thuộc với dấu sóng ~."
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "Hỗ trợ các tập tin lớn hơn 4GB"
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr "hỗ trợ cho các phần phục thuộc dồi dào"
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr "Không hiểu toán tử phụ thuộc dồi dào '%.*s'"
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr "Cần có tên"
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr "Phụ thuộc dồi dào không bắt đầu bằng “(”"
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr "Thiếu tham số cho toán tử phụ thuộc dồi dào"
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr "Phần phụ thuộc dồi dào trống rỗng"
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr "Phần phụ thuộc dồi dào chưa chấm dứt: %s"
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr "Không thể móc xích các toán tử khác nhau"
+
+#: lib/rpmds.c:1564
+#, fuzzy
+msgid "Can only chain and/or/with ops"
+msgstr "Chỉ có thể móc xích toán tử AND và OR"
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr "Gặp rác ở cuối phần phụ thuộc dồi dào"
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Ma thuật sai"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "Phần đầu sai hoặc không đọc được"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "Kích cỡ phần đầu quá lớn "
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "Tập tin quá lớn để nén"
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "Không rõ kiểu tập tin"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "Thiếu các tập tin"
+
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "Mã băm tập tin không khớp"
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "Lỗi nội bộ"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "Tập tin kho lưu không phải trong phần đầu"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
+
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " bị lỗi — "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s: (lỗi 0x%x)"
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
+#, c-format
+msgid "open of %s failed: %s\n"
+msgstr "lỗi mở %s: %s\n"
+
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr "Đã vượt quá mức đệ quy tối đa manifest:  %s\n"
+
+#: lib/rpmgi.c:155
+#, c-format
+msgid "%s: not an rpm package (or package manifest)\n"
+msgstr "%s: không phải là gói rpm (hoặc manifest gói)\n"
+
+#: lib/rpminstall.c:142
+#, c-format
+msgid "Updating / installing...\n"
+msgstr "Đang cài đặt hay nâng cấp…\n"
+
+#: lib/rpminstall.c:144
+#, c-format
+msgid "Cleaning up / removing...\n"
+msgstr "Đang dọn dẹp hoặc gỡ bỏ…\n"
+
+#: lib/rpminstall.c:193
+msgid "Preparing..."
+msgstr "Đang chuẩn bị…"
+
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
+msgstr "Đang chuẩn bị các gói…"
+
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
+msgstr "Quan hệ phụ thuộc bị lỗi:\n"
+
+#: lib/rpminstall.c:323
+#, c-format
+msgid "%s: not an rpm package (or package manifest): %s\n"
+msgstr "%s: không phải là gói rpm (hoặc manifest gói): %s\n"
+
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
+#, c-format
+msgid "%s cannot be installed\n"
+msgstr "%s không thể được cài đặt\n"
+
+#: lib/rpminstall.c:490
+#, c-format
+msgid "Retrieving %s\n"
+msgstr "Đang lấy %s\n"
+
+#: lib/rpminstall.c:502
+#, c-format
+msgid "skipping %s - transfer failed\n"
+msgstr "bỏ qua %s - bộ truyền gặp lỗi\n"
+
+#: lib/rpminstall.c:572
+#, c-format
+msgid "package %s is not relocatable\n"
+msgstr "không thể tái định vị gói %s\n"
+
+#: lib/rpminstall.c:603
+#, c-format
+msgid "error reading from file %s\n"
+msgstr "gặp lỗi khi đọc từ tập tin %s\n"
+
+#: lib/rpminstall.c:697
+#, c-format
+msgid "\"%s\" specifies multiple packages:\n"
+msgstr "“%s” chỉ định nhiều gói:\n"
+
+#: lib/rpminstall.c:736
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "không thể mở %s: %s\n"
+
+#: lib/rpminstall.c:742
+#, c-format
+msgid "Installing %s\n"
+msgstr "Đang cài đặt %s\n"
+
+#: lib/rpmlead.c:95
+msgid "not an rpm package"
+msgstr "không phải là một gói rpm"
+
+#: lib/rpmlead.c:99
+msgid "illegal signature type"
+msgstr "kiểu chữ kí không hợp lệ"
+
+#: lib/rpmlead.c:103
+msgid "unsupported RPM package version"
+msgstr "phiên bản gói RPM không được hỗ trợ"
+
+#: lib/rpmlead.c:118
+#, c-format
+msgid "read failed: %s (%d)\n"
+msgstr "gặp lỗi khi đọc: %s (%d)\n"
+
+#: lib/rpmlead.c:121
+msgid "not an rpm package\n"
+msgstr "không phải là gói rpm\n"
+
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
+#, c-format
+msgid "can't create %s lock on %s (%s)\n"
+msgstr "không thể tạo khóa %s trên %s (%s)\n"
+
+#: lib/rpmlock.c:133
+#, c-format
+msgid "waiting for %s lock on %s\n"
+msgstr "đang đợi %s khóa %s\n"
+
+#: lib/rpmplugins.c:65
+#, c-format
+msgid "Failed to dlopen %s %s\n"
+msgstr "Gặp lỗi khi dlopen %s %s\n"
+
+#: lib/rpmplugins.c:73
+#, c-format
+msgid "Failed to resolve symbol %s: %s\n"
+msgstr "Gặp lỗi khi phân giải ký hiệu %s: %s\n"
+
+#: lib/rpmplugins.c:154
+#, c-format
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "Chưa cấu hình phần bổ xung %%__%s_%s\n"
+
+#: lib/rpmplugins.c:199
+#, c-format
+msgid "Plugin %s not loaded\n"
+msgstr "Phần bổ xung %s chưa được tải\n"
+
+#: lib/rpmprob.c:109
+msgid "different"
+msgstr "khác"
+
+#: lib/rpmprob.c:114
+#, c-format
+msgid "package %s is intended for a %s architecture"
+msgstr "gói %s có mục đích là dành cho kiến trúc %s"
+
+#: lib/rpmprob.c:118
+#, c-format
+msgid "package %s is intended for a %s operating system"
+msgstr "gói %s có mục đích là dành cho hệ điều hành %s"
+
+#: lib/rpmprob.c:122
+#, c-format
+msgid "package %s is already installed"
+msgstr "gói %s đã được cài đặt"
+
+#: lib/rpmprob.c:125
+#, c-format
+msgid "path %s in package %s is not relocatable"
+msgstr "không thể tái định vị đường dẫn %s trong gói %s"
+
+#: lib/rpmprob.c:130
+#, c-format
+msgid "file %s conflicts between attempted installs of %s and %s"
+msgstr "tập tin %s xung đột giữa các sự cài đặt đã thử %s và %s"
+
+#: lib/rpmprob.c:135
+#, c-format
+msgid "file %s from install of %s conflicts with file from package %s"
+msgstr "tập tin %s của bản cài đặt %s có xung đột với tập tin của gói %s"
+
+#: lib/rpmprob.c:140
+#, c-format
+msgid "package %s (which is newer than %s) is already installed"
+msgstr "gói %s (mới hơn %s) đã được cài đặt"
+
+#: lib/rpmprob.c:145
+#, c-format
+msgid "installing package %s needs %<PRIu64>%cB on the %s filesystem"
+msgstr "việc cài đặt %s cần %<PRIu64>%cB trên hệ thống tập tin %s"
+
+#: lib/rpmprob.c:155
+#, c-format
+msgid "installing package %s needs %<PRIu64> inodes on the %s filesystem"
+msgstr "việc cài đặt %s cần %<PRIu64> nút trên hệ thống tập tin %s"
+
+#: lib/rpmprob.c:159
+#, c-format
+msgid "%s is needed by %s%s"
+msgstr "%s được %s%s yêu cầu"
+
+#: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
+msgid "(installed) "
+msgstr "(đã cài đặt) "
+
+#: lib/rpmprob.c:163
+#, c-format
+msgid "%s conflicts with %s%s"
+msgstr "%s xung đột với %s%s"
+
+#: lib/rpmprob.c:167
+#, c-format
+msgid "%s is obsoleted by %s%s"
+msgstr "%s đã lạc hậu do %s%s"
+
+#: lib/rpmprob.c:172
+#, c-format
+msgid "unknown error %d encountered while manipulating package %s"
+msgstr "gặp lỗi không rõ %d trong khi thao tác gói %s"
+
+#: lib/rpmrc.c:222
+#, c-format
+msgid "missing second ':' at %s:%d\n"
+msgstr "thiếu “:” thứ hai tại %s:%d\n"
+
+#: lib/rpmrc.c:225
+#, c-format
+msgid "missing architecture name at %s:%d\n"
+msgstr "thiếu tên kiến trúc tại %s:%d\n"
+
+#: lib/rpmrc.c:370
+#, c-format
+msgid "Incomplete data line at %s:%d\n"
+msgstr "Dòng dữ liệu chưa hoàn tất tại %s:%d\n"
+
+#: lib/rpmrc.c:375
+#, c-format
+msgid "Too many args in data line at %s:%d\n"
+msgstr "Quá nhiều đối số trong dòng dữ liệu tại %s:%d\n"
+
+#: lib/rpmrc.c:382
+#, c-format
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr "Sai số kiến_trúc/hệ_điều_hành: %s (%s:%d)\n"
+
+#: lib/rpmrc.c:413
+#, c-format
+msgid "Incomplete default line at %s:%d\n"
+msgstr "Dòng mặc định chưa hoàn tất tại %s:%d\n"
+
+#: lib/rpmrc.c:418
+#, c-format
+msgid "Too many args in default line at %s:%d\n"
+msgstr "Quá nhiều đối số trong dòng mặc định tại %s:%d\n"
+
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "thiếu “:” (thấy 0x%02x) tại %s:%d\n"
+
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
+#, c-format
+msgid "missing argument for %s at %s:%d\n"
+msgstr "thiếu đối số cho %s tại %s:%d\n"
+
+#: lib/rpmrc.c:551
+#, c-format
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "không thể mở %s tại %s:%d: %m\n"
+
+#: lib/rpmrc.c:564
+#, c-format
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "thiếu kiến trúc cho %s tại %s:%d\n"
+
+#: lib/rpmrc.c:632
+#, c-format
+msgid "bad option '%s' at %s:%d\n"
+msgstr "tùy chọn sai “%s” tại %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr "Gặp lỗi khi đọc véc tơ bổ trợ, /proc đã gắn chưa?\n"
+
+#: lib/rpmrc.c:1469
+#, c-format
+msgid "Unknown system: %s\n"
+msgstr "Không hiểu hệ thống: %s\n"
+
+#: lib/rpmrc.c:1471
+#, c-format
+msgid "Please contact %s\n"
+msgstr "Hãy liên lạc %s\n"
+
+#: lib/rpmrc.c:1604
+#, c-format
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "Không thể mở %s để đọc: %m.\n"
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr "Không có lệnh gọi exec() sau fork() trong lua scriptlet\n"
+
+#: lib/rpmscript.c:138
+#, c-format
+msgid "Unable to restore current directory: %m"
+msgstr "Không thể phục hồi thư mục hiện tại: %m"
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "chưa hỗ trợ <lua> scriptlet dựng sẵn\n"
+
+#: lib/rpmscript.c:278
+#, c-format
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "Không thể tạo tập tin tạm cho %s: %s\n"
+
+#: lib/rpmscript.c:313
+#, c-format
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "Không thể nhân bản bộ mô tả tập tin: %s: %s\n"
+
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr "Fwrite gặp lỗi: %s"
+
+#: lib/rpmscript.c:371
+#, c-format
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s scriptlet gặp lỗi, waitpid(%d) rc %d: %s\n"
+
+#: lib/rpmscript.c:375
+#, c-format
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s scriptlet gặp lỗi, tín hiệu %d\n"
+
+#: lib/rpmscript.c:378
+#, c-format
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s scriptlet gặp lỗi, trạng thái thoát %d\n"
+
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "Không hiểu định dạng"
+
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "cài đặt"
+
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "tẩy"
+
+#: lib/rpmts.c:100
+#, c-format
+msgid "cannot open Packages database in %s\n"
+msgstr "không thể mở cơ sở dữ liệu Gói trong %s\n"
+
+#: lib/rpmts.c:199
+#, c-format
+msgid "extra '(' in package label: %s\n"
+msgstr "thừa “(” trong nhãn gói: %s\n"
+
+#: lib/rpmts.c:217
+#, c-format
+msgid "missing '(' in package label: %s\n"
+msgstr "thiếu “(” trong nhãn gói: %s\n"
+
+#: lib/rpmts.c:225
+#, c-format
+msgid "missing ')' in package label: %s\n"
+msgstr "thiếu “)” trong nhãn gói: %s\n"
+
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr "%s: gặp lỗi khi đọc khóa công khai.\n"
+
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "giao dịch"
+
+#: lib/rpmvs.c:152
+#, c-format
+msgid "%s tag %u: invalid type %u"
+msgstr ""
+
+#: lib/rpmvs.c:158
+#, c-format
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
+
+#: lib/rpmvs.c:178
+#, c-format
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
+
+#: lib/rpmvs.c:188
+#, c-format
+msgid "%s tag %u: invalid size %u"
+msgstr ""
+
+#: lib/rpmvs.c:195
+#, c-format
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
+
+#: lib/rpmvs.c:206
+#, c-format
+msgid "%s: tag %u: invalid hex"
+msgstr ""
+
+#: lib/rpmvs.c:261
+#, c-format
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
+
+#: lib/rpmvs.c:268
+#, c-format
+msgid "%s%s"
+msgstr ""
+
+#: lib/rpmvs.c:269
+msgid "signature"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
+
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
+
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "Phần đầu"
+
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
+
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "Không thể nạp lại phần đầu chữ ký.\n"
+
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "bị bỏ qua"
+
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "gặp lỗi"
+
+#: lib/verify.c:263
+#, c-format
+msgid "Duplicate username or UID for user %s\n"
+msgstr "Trùng tài khoản hoặc mã số người dùng cho tài khoản %s\n"
+
+#: lib/verify.c:284
+#, c-format
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr "Trùng tên nhóm hoặc mã số nhóm cho nhóm %s\n"
+
+#: lib/verify.c:395
+msgid "no state"
+msgstr "không có tình trạng"
+
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "trạng thái không rõ"
+
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "thiếu   %c %s"
+
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "Quan hệ phụ thuộc chưa thỏa đối với %s:\n"
+
+#: plugins/prioreset.c:29
+#, c-format
+msgid "Unable to reset nice value: %s"
+msgstr "Không thể đặt lại giá trị nice: %s"
+
+#: plugins/prioreset.c:40
+#, c-format
+msgid "Unable to reset I/O priority: %s"
+msgstr "Không thể đặt lại mức ưu tiên I/O: %s"
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
+
+#: rpmio/digest_nss.c:79
+#, c-format
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
+msgstr "%3d>%*s (trống)"
+
+#: rpmio/macro.c:316
+#, c-format
+msgid "%3d<%*s(empty)\n"
+msgstr "%3d<%*s (trống)\n"
+
+#: rpmio/macro.c:483
+#, c-format
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "Vĩ lệnh %%%s có tùy chọn chưa chấm dứt\n"
+
+#: rpmio/macro.c:495 rpmio/macro.c:533
+#, c-format
+msgid "Macro %%%s has unterminated body\n"
+msgstr "Vĩ lệnh %%%s có thân chưa chấm dứt\n"
+
+#: rpmio/macro.c:551
+#, c-format
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
+
+#: rpmio/macro.c:557
+#, c-format
+msgid "Macro %%%s has empty body\n"
+msgstr "Vĩ lệnh %%%s có thân rỗng\n"
+
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "Vĩ lệnh %%%s cần có dấu cách trước phần thân\n"
+
+#: rpmio/macro.c:566
+#, c-format
+msgid "Macro %%%s failed to expand\n"
+msgstr "Vĩ lệnh %%%s không mở rộng được\n"
+
+#: rpmio/macro.c:607
+#, c-format
+msgid "Macro %%%s has illegal name (%%undefine)\n"
+msgstr "Vĩ lệnh %%%s có tên không hợp lệ (%%undefine)\n"
+
+#: rpmio/macro.c:637
+#, c-format
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
+"Vĩ lệnh %%%s được định nghĩa nhưng lại không được dùng trong phạm vi của nó\n"
+
+#: rpmio/macro.c:761
+#, c-format
+msgid "Unknown option %c in %s(%s)\n"
+msgstr "Không hiểu tùy chọn %c trong %s(%s)\n"
+
+#: rpmio/macro.c:1055
+msgid ""
+"Too many levels of recursion in macro expansion. It is likely caused by "
+"recursive macro declaration.\n"
+msgstr ""
+"Quá nhiều mức đệ quy trong khai triển vĩ lệnh. Nó giống như là có nguyên "
+"nhân bởi khai báo vĩ lệnh đệ quy.\n"
+
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
+#, c-format
+msgid "Unterminated %c: %s\n"
+msgstr "%c chưa chấm dứt: %s\n"
+
+#: rpmio/macro.c:1182
+#, c-format
+msgid "A %% is followed by an unparseable macro\n"
+msgstr "Một dấu %% đi trước một vĩ lệnh không thể phân tích được\n"
+
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "gặp lỗi khi tải tập tin vĩ lệnh %s"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== hoạt động %d trống %d\n"
+
+#: rpmio/rpmfileutil.c:258
+#, c-format
+msgid "error creating temporary file %s: %m\n"
+msgstr "gặp lỗi khi đang tạo tập tin tạm thời %s: %m\n"
+
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
+#, c-format
+msgid "File %s: %s\n"
+msgstr "Tập tin %s: %s\n"
+
+#: rpmio/rpmfileutil.c:332
+#, c-format
+msgid "File %s is smaller than %u bytes\n"
+msgstr "Tập tin %s nhỏ hơn %u byte\n"
+
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[không có]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(không có lỗi)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "lỗi nghiêm trọng:"
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "lỗi: "
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "cảnh báo: "
+
+#: rpmio/rpmlua.c:523
+#, c-format
+msgid "invalid syntax in lua scriptlet: %s\n"
+msgstr "có lỗi cú pháp trong lua scriptlet: %s\n"
+
+#: rpmio/rpmlua.c:541
+#, c-format
+msgid "invalid syntax in lua script: %s\n"
+msgstr "cú pháp không hợp lệ trong văn lệnh lua: %s\n"
+
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
+#, c-format
+msgid "lua script failed: %s\n"
+msgstr "gặp lỗi khi thực thi văn lệnh lua: %s\n"
+
+#: rpmio/rpmlua.c:560
+#, c-format
+msgid "invalid syntax in lua file: %s\n"
+msgstr "cú pháp không hợp lệ trong tập tin Lua: %s\n"
+
+#: rpmio/rpmlua.c:756
+#, c-format
+msgid "lua hook failed: %s\n"
+msgstr "Lỗi kích hoạt khả năng Lua: %s\n"
+
+#: rpmio/rpmmalloc.c:25
+#, c-format
+msgid "memory alloc (%u bytes) returned NULL.\n"
+msgstr "cấp phát bộ nhớ (%u byte) trở về VÔ GIÁ TRỊ.\n"
+
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr "V%d %s/%s %s, Mã số khóa %s"
+
+#: rpmio/rpmpgp.c:1135
+msgid "(none)"
+msgstr "(không có)"
+
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr "gặp lỗi khi đang tạo tập tin tạm thời %s: %m\n"
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr "lỗi tạo fifo %s: %m\n"
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr "lỗi xóa fifo %s: %m\n"
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr "lỗi xóa thư  %s: %m\n"
+
+#: sign/rpmgensig.c:167
+#, c-format
+msgid "%s: Fwrite failed: %s\n"
+msgstr "%s: Fwrite bị lỗi: %s\n"
+
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s: Fread bị lỗi: %s\n"
+
+#: sign/rpmgensig.c:177
+#, c-format
+msgid "%s: Fflush failed: %s\n"
+msgstr "%s: Fflush bị lỗi: %s\n"
+
+#: sign/rpmgensig.c:202
+msgid "Unsupported PGP signature\n"
+msgstr "Không hỗ trợ ký bằng GPG\n"
+
+#: sign/rpmgensig.c:208
+#, c-format
+msgid "Unsupported PGP hash algorithm %u\n"
+msgstr "Không hỗ trợ thuật toán băm PGP %u\n"
+
+#: sign/rpmgensig.c:221
+#, c-format
+msgid "Unsupported PGP pubkey algorithm %u\n"
+msgstr "Không hỗ trợ thuật toán khóa công PGP %u\n"
+
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "Không thể thực hiện %s: %s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+"Fopen gặp lỗi\n"
+"\n"
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "Không thể ghi ra đường ống\n"
+
+#: sign/rpmgensig.c:302
+#, c-format
+msgid "Could not read from file %s: %s\n"
+msgstr "Không thể đọc từ tập tin %s: %s\n"
+
+#: sign/rpmgensig.c:312
+#, c-format
+msgid "gpg exec failed (%d)\n"
+msgstr "lỗi thực hiện gpg (%d)\n"
+
+#: sign/rpmgensig.c:354
+msgid "gpg failed to write signature\n"
+msgstr "gpg không ghi được chữ ký\n"
+
+#: sign/rpmgensig.c:371
+msgid "unable to read the signature\n"
+msgstr "không thể đọc chữ ký\n"
+
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
+msgid "rpmMkTemp failed\n"
+msgstr "gặp lỗi khi rpmMkTemp\n"
+
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
+#, c-format
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
+
+#: sign/rpmgensig.c:682
+#, c-format
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s: rpmReadSignature gặp lỗi: %s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s: gặp lỗi khi headerRead: %s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "Không thể ký gói RPM v3\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s đã sẵn chứa chữ ký định danh nên bỏ qua\n"
+
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
+#, c-format
+msgid "%s: rpmWriteSignature failed: %s\n"
+msgstr "%s: gặp lỗi khi rpmWriteSignature: %s\n"
+
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s: Gặp lỗi khi writeLead: %s\n"
+
+#: sign/rpmgensig.c:812
+#, c-format
+msgid "replacing %s failed: %s\n"
+msgstr "gặp lỗi khi thay thế %s: %s\n"
+
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
+#, c-format
+msgid "%s: read manifest failed: %s\n"
+msgstr "%s: gặp lỗi khi đọc manifest: %s\n"
+
+#: tools/rpmgraph.c:219
+msgid "don't verify header+payload signature"
+msgstr "không nên thẩm tra chữ ký phần_đầu+trọng_tải"
index 0fdfb9537c2f121901252292c0b6ef26cdc959cd..41dd4587d5472a0ab4a3d783417c86b6afa7106a 100644 (file)
@@ -3,19 +3,32 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Christopher Meng <cickumqt@gmail.com>, 2012.
-#   <dongfengweixiao@gmail.com>, 2012.
-#   <lovenemesis@gmail.com>, 2012.
-# Mike Ma <zhtx10@gmail.com>, 2011.
-#   <qinghao1@foxmail.com>, 2012.
+# Christopher Meng <i@cicku.me>, 2012-2013,2015
+# Christopher Meng <i@cicku.me>, 2015
+# dongfengweixia88616b04c28344fa <dongfengweixiao@gmail.com>, 2012
+# dongfengweixia88616b04c28344fa <dongfengweixiao@gmail.com>, 2012
+# dongfengweixiao <dongfengweixiao@gmail.com>, 2013-2014
+# dongfengweixiao <dongfengweixiao@gmail.com>, 2012
+# Tommy He <lovenemesis@gmail.com>, 2012
+# Ma Kai <crtmike@gmail.com>, 2011
+# Mike Manilone <zhtx10@gmail.com>, 2011
+# Ma Kai <crtmike@gmail.com>, 2011
+# Mingye Wang <arthur200126@gmail.com>, 2015
+# qingxianhao <qinghao1@foxmail.com>, 2012
+# qingxianhao <qinghao1@foxmail.com>, 2012
+# Tiansworld <tiansworld@fedoraproject.org>, 2013
+# Tommy He <lovenemesis@gmail.com>, 2012
+# zwpwjwtz <zwpwjwtz@126.com>, 2016
+# Mingcong Bai <jeffbai@aosc.xyz>, 2015
+# Mingcong Bai <jeffbai@aosc.xyz>, 2015
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2012-12-19 11:06+0000\n"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
 "Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
-"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/rpm/"
+"Language-Team: Chinese (China) (http://www.transifex.com/rpm-team/rpm/"
 "language/zh_CN/)\n"
 "Language: zh_CN\n"
 "MIME-Version: 1.0\n"
@@ -49,521 +62,588 @@ msgstr "该程序可以在 GNU GPL 条款下自由分发\n"
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr "--pipe 创建一个管道失败:%m\n"
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
-msgstr "exec 失败\n"
+msgstr "执行失败\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
-msgstr "参数不是一个 RPM 包\n"
+msgstr "参数不是一个 RPM 软件包\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
 msgstr "读取软件包头部错误\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "不能重新打开荷载:%s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "查询/验证软件包选项:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "查询选项(用 -q 或 --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "验证选项(用 -V 或 --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "安装/升级/擦除选项:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "所有 rpm 模式和可执行文件的通用选项:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "单次仅能执行一种类型的查询/检验"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "意外查询标志"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "意外的查询格式"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "意外的查询源"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "仅能指定一个主模式"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "只有安装和升级可以强制执行"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "文件仅能在软件包安装过程中重新分配"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "--prefix 不能和 --relocate 或 --excludepath 共同使用"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr "--relocate 和 --excludepath 只能在安装软件包时使用"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix 只能在安装新软件包时使用"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "--prefix 参数必须用 / 开始"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr "--hash (-h) 选项只能在软件包安装和擦除时指定"
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr "--percent 选项只能在软件包安装和擦除时指定"
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs 只能在软件包安装时指定"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs 只能在软件包安装时指定"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs 只能在软件包安装时指定"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "只能指定 --excludedocs 和 --includedocs 两者之一"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch 只能在软件包安装时指定"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos 只能在软件包安装时指定"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize 只能在软件包安装时指定"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches 只能在软件包擦除时指定"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles 只能在软件包安装时指定"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb 只能在软件包安装和擦除时指定"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr "禁用脚本选项只能在软件包安装和擦除时指定"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr "禁用触发器选项只能在软件包安装和擦除时指定"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr "--nodeps 只能在软件包安装、擦除和检验时指定"
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr "--test 只能在软件包安装和擦除时指定"
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "--root (-r) 的参数必须以 / 开头"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "未给出要擦除的软件包"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "未给出要安装的软件包"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "未给出要查询的参数"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "未给出要检验的参数"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot 已经指定,忽略 %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr "依据 <specfile> 从 %prep (解压缩源代码并应用补丁) 开始构建"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specfile>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "依据 <specfile> 从 %build (%prep 之后编译) 开始构建"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr "依据 <specfile> 从 %install (%prep、%build 后安装) 开始构建"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
-msgstr "ä¾\9dæ\8d® <specfile> æ£\80éª\8c %files å\8cºå\9f\9f"
+msgstr "ä¾\9dæ\8d® <specfile> æ ¡éª\8c %files é\83¨å\88\86"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
 msgstr "依据 <specfile> 构建源代码和二进制软件包"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
 msgstr "依据 <specfile> 构建二进制软件包"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
 msgstr "依据 <specfile> 构建源代码软件包"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr "仅执行 <source package> 的 %prep 部分(解压缩源代码并应用补丁) "
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<source package>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr "仅执行 <source package> 的 %build 部分(先执行 %prep,然后 %build)"
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr "依据 <source package> 从 %install (%prep、%build 然后安装)开始构建"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr "依据 <source package> 校验 %files 部分"
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr "从 <source package> 中构建二进制和源代码 RPM 包"
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr "仅从 <source package> 中构建二进制 RPM 包"
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr "仅从 <source package> 中构建源代码 RPM 包"
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr "依据 <tarball> 从 %prep (解压源代码并应用补丁)开始构建"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "依据 <tarball> 从 %build (%prep,之后编译)开始构建"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "依据 <tarball> 从 %install (%prep、%build 然后安装)开始构建"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
-msgstr "ä¾\9dæ\8d® <tarball> æ£\80éª\8c %files å\8cºå\9f\9f"
+msgstr "ä¾\9dæ\8d® <tarball> æ ¡éª\8c %files é\83¨å\88\86"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
 msgstr "依据 <tarball> 构建源代码和二进制软件包"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
 msgstr "依据 <tarball> 构建二进制软件包"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
 msgstr "依据 <tarball> 构建源代码软件包"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
 msgstr "依据 <source package> 构建二进制软件包"
 
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<source package>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr "依据 <source package> 从 %install (%prep、%build 然后安装)开始构建"
-
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "重载构建根路径"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr "在当前目录中构建"
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "完成后移除构建树"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "忽略 spec 文件中的 ExcludeArch 规则"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "除错文件状态机"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "不执行任何构建步骤 "
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "不检验构建依赖"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr "生成和 rpm v3 包管理(旧版本)兼容的软件包头"
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
-msgstr ""
+msgstr "构建过程中不执行 %clean 步骤"
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr "不执行构建的 %prep 阶段"
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
-msgstr ""
+msgstr "构建过程中不执行 %check 步骤"
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "不接受来自 specfile 的 i18N 字符串信息"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "完成时移除源代码"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "完成时移除 specfile"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "直接跳转到指定步骤 (仅限 c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "重载目标平台"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "适用于 [ <specfile> | <tarball> | <source package> ] 的构建选项:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "所有 rpm 模式和可执行文件的通用选项:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "构建依赖失败:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
-msgstr "无法打开 spec 文件 %s%s\n"
+msgstr "无法打开 spec 文件 %s%s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
-msgstr "打开 tar 管道失败: %m\n"
+msgstr "打开 tar 管道失败:%m\n"
+
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr "在 %s 中发现多个 spec 规格文件\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "从 %s 读取 spec 文件失败\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "重命名 %s 为 %s 时失败:%m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "stat %s 失败:%m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "文件 %s 不是常规文件。\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "文件 %s 不像是 spec 文件。\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "构建目标平台:%s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "为目标%s构建\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "--root (-r) 的参数必须以 / 开头"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "初始化数据库"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
 msgstr "从已安装软件包包头重建数据库反向列表"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "校验数据库文件"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr "将数据库导出到标准输出头列表"
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr "从标准输入头列表导入数据库"
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "数据库选项:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "仅能指定一个主模式"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
 msgstr "校验软件包签名"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "导入带装甲的(armored)公钥"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr "不导入,但判断下是否能用"
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "列出RPM密钥环中的密钥"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "密钥环选项:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "没有指定参数"
 
-#: rpmsign.c:25
-msgid "sign package(s)"
-msgstr "签名包"
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "查询/验证软件包选项:"
 
-#: rpmsign.c:27
-msgid "sign package(s) (identical to --addsign)"
-msgstr "签名包(同--addsign)"
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "查询选项(用 -q 或 --query):"
 
-#: rpmsign.c:29
-msgid "delete package signatures"
-msgstr "删除软件包签名"
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "验证选项(用 -V 或 --verify):"
 
-#: rpmsign.c:35
-msgid "Signature options:"
-msgstr "签名选项:"
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "安装/升级/擦除选项:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "无法exec %s: %s\n"
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "每次仅能执行一种类型的查询/检验"
 
-#: rpmsign.c:108
-#, c-format
-msgid "You must set \"%%_gpg_name\" in your macro file\n"
-msgstr "你必须在你的宏文件中设置 \"%%_gpg_name\" \n"
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "意外查询标志"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "输入密码:"
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "意外的查询格式"
 
-#: rpmsign.c:117
-#, c-format
-msgid "Pass phrase is good.\n"
-msgstr "密码正确。\n"
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "意外的查询源"
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
-msgstr "密码检查失败或者 gpg 密钥过期\n"
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "只有安装和升级可以强制执行"
 
-#: rpmspec.c:26
-msgid "parse spec file(s) to stdout"
-msgstr "解析 spec 文件到标准输出"
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "文件仅能在软件包安装过程中重新分配"
 
-#: rpmspec.c:28
-msgid "query spec file(s)"
-msgstr "查询 spec 文件"
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "--prefix 不能和 --relocate 或 --excludepath 共同使用"
 
-#: rpmspec.c:30
-msgid "operate on binary rpms generated by spec (default)"
-msgstr "操纵 spec 生成的二进制 rpm 包(缺省值)"
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr "--relocate 和 --excludepath 只能在安装软件包时使用"
 
-#: rpmspec.c:32
-msgid "operate on source rpm generated by spec"
-msgstr "操纵 spec 生成的源 rpm 包"
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix 只能在安装新软件包时使用"
 
-#: rpmspec.c:36 lib/poptQV.c:192
-msgid "use the following query format"
-msgstr "使用这种格式打印信息"
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "--prefix 参数必须用 / 开始"
 
-#: rpmspec.c:45
-msgid "Spec options:"
-msgstr "Spec 选项:"
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr "--hash (-h) 选项只能在软件包安装和擦除时指定"
 
-#: rpmspec.c:90
-msgid "no arguments given for parse"
-msgstr "没有给出参数用于分析"
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr "--percent 选项只能在软件包安装和擦除时指定"
 
-#: build/build.c:120
-#, c-format
-msgid "Unable to open temp file: %s\n"
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs 只能在软件包安装时指定"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs 只能在软件包安装时指定"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs 只能在软件包安装时指定"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "只能指定 --excludedocs 和 --includedocs 两者之一"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch 只能在软件包安装时指定"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos 只能在软件包安装时指定"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize 只能在软件包安装时指定"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches 只能在软件包擦除时指定"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles 只能在软件包安装时指定"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb 只能在软件包安装和擦除时指定"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr "禁用脚本选项只能在软件包安装和擦除时指定"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr "禁用触发器选项只能在软件包安装和擦除时指定"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr "--nodeps 只能在软件包安装、擦除和检验时指定"
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr "--test 只能在软件包安装和擦除时指定"
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "未给出要擦除的软件包"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "未给出要安装的软件包"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "未给出要查询的参数"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "未给出要检验的参数"
+
+#: rpmsign.c:30
+msgid "sign package(s)"
+msgstr "签名包"
+
+#: rpmsign.c:32
+msgid "sign package(s) (identical to --addsign)"
+msgstr "签名包(同--addsign)"
+
+#: rpmsign.c:34
+msgid "delete package signatures"
+msgstr "删除软件包签名"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
+
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
+msgid "Signature options:"
+msgstr "签名选项:"
+
+#: rpmsign.c:101
+#, c-format
+msgid "You must set \"%%_gpg_name\" in your macro file\n"
+msgstr "你必须在你的宏文件中设置 \"%%_gpg_name\" \n"
+
+#: rpmsign.c:114
+#, c-format
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
+
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
+msgstr ""
+
+#: rpmspec.c:25
+msgid "parse spec file(s) to stdout"
+msgstr "解析 spec 文件到标准输出"
+
+#: rpmspec.c:27
+msgid "query spec file(s)"
+msgstr "查询 spec 文件"
+
+#: rpmspec.c:29
+msgid "operate on binary rpms generated by spec (default)"
+msgstr "操纵 spec 生成的二进制 rpm 包(缺省值)"
+
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
+msgid "operate on source rpm generated by spec"
+msgstr "操纵 spec 生成的源 rpm 包"
+
+#: rpmspec.c:35 lib/poptQV.c:221
+msgid "use the following query format"
+msgstr "使用这种格式打印信息"
+
+#: rpmspec.c:44
+msgid "Spec options:"
+msgstr "Spec 选项:"
+
+#: rpmspec.c:91
+msgid "no arguments given for parse"
+msgstr "没有给出参数用于分析"
+
+#: build/build.c:120
+#, c-format
+msgid "Unable to open temp file: %s\n"
 msgstr "无法打开临时文件:%s\n"
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr "无法打开流:%s\n"
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
-msgstr "æ\89§è¡\8c(%s): %s\n"
+msgstr "æ­£å\9c¨æ\89§è¡\8c(%s)ï¼\9a%s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
-msgstr "执行 %s 失败(%s)%s\n"
+msgstr "执行 %s 失败(%s)%s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr "执行脚本 %s (%s)失败\n"
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "%s (%s) 退出状态不好\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -573,235 +653,315 @@ msgstr ""
 "\n"
 "RPM 构建错误:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "== 语法解析错误\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "&& 语法解析错误\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
-msgstr "|| 语法解析错误\n"
+msgstr "解析 || 时有语法错误\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "表达式解析错误\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "不匹配的 (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- 只用于数字\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! 只用于数字\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "类型必须匹配\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "* / 不支持字符串\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "- 不支持字符串\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "&& 和 || 不支持字符串\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "表达式语法错误\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "%s %s 中丢失 '(' \n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "%s(%s 中丢失 ')'\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "无效的 %s 令牌:%s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "%2$s %3$s 中丢失 %1$s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "%s() 后有非空白字符:%s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "语法错误:%s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "spec 文件权限不好:%s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "spec 目录权限不好:%s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr "异常的 locale 长度:\"%s\" 在%%lang(%s) 中\n"
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr "重复的 locale %s 在%%lang(%s) 中\n"
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "无效的 capability:%s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "无内建文件capability 支持\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "文件必须以 \"/\" 开头: %s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr "未知的文件摘要算法 %u, 回退到MD5\n"
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "被列出两次的文件:%s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr "读取符号连接 %s 失败:%s\n"
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "符号链接指向了 BuildRoot:%s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr "路径在 buildroot 之外:%s\n"
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr "没有找到目录:%s\n"
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "没有找到文件:%s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr "此路径不是一个目录:%s\n"
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
-msgstr "%s无法加载未知标签(%d)。\n"
+msgstr "%s无法加载未知标签(%d)。\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
-msgstr "%s公钥读取失败。\n"
+msgstr "%s公钥读取失败。\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s: 不是带装甲的(armored)公钥。\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s:编码失败\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "创建目录失败"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "文件需要 \"/\" 开头:%s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr "%%dev glob 不被允许:%s\n"
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
-msgstr "目录未找到,所用 glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "文件未找到,所用 glob: %s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
-msgstr "无法打开 %%files 文件 %s%m\n"
+msgstr "无法打开 %%files 文件 %s%m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "行:%s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr "空 %%file 文件 %s\n"
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr "读取 %%files 文件 %s 失败:%m\n"
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
+msgstr "illegal _docdir_fmt %s: %s\n"
+
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "无法通过通配符查找文件:%s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
-msgstr ""
+msgstr "特殊 %s 与其他形式不能混合使用: %s\n"
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
+msgstr "一行中有多个文件: %s\n"
+
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
-msgstr "坏文件:%s: %s\n"
-
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "坏的属主/群组:%s\n"
+msgstr "损坏的文件:%s:%s\n"
 
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "检查未打包文件:%s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -810,585 +970,642 @@ msgstr ""
 "发现已安装(但未打包的)文件:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "处理文件:%s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
-msgstr ""
+msgstr "二进制架构 (%d) 和软件包构架 (%d)不匹配。\n"
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
 msgstr "noarch 软件包中有架构相关的二进制文件\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
-msgstr ""
+msgstr "对此文件创建归档失败 %s:%s\n"
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
-msgstr ""
+msgstr "创建归档失败: %s\n"
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
-msgstr ""
+msgstr "不能打开文件 %s:%s\n"
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: 行: %s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "无法正规化主机名:%s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
 msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr ""
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "无法正规化主机名:%s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
-msgstr ""
+msgstr "未知的净负荷压缩:%s\n"
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr ""
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "无法打开临时文件。\n"
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
+#, c-format
+msgid "Could not seek in file %s: %s\n"
+msgstr "无法 seek 文件 %s:%s\n"
 
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "无法写入临时头\n"
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "无法读取策略文件:%s\n"
 
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "不合法的CSA数据\n"
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
 
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "无法重载签名头。\n"
+#: build/pack.c:453
+#, c-format
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:440
+#: build/pack.c:520
 #, c-format
 msgid "Could not open %s: %s\n"
-msgstr "无法打开%s: %s\n"
+msgstr "无法打开 %s:%s\n"
 
-#: build/pack.c:452
+#: build/pack.c:527
 #, c-format
 msgid "Unable to write package: %s\n"
 msgstr "无法写入软件包:%s\n"
 
-#: build/pack.c:468
-#, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr ""
-
-#: build/pack.c:479
-#, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr ""
-
-#: build/pack.c:489
-#, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr ""
-
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
-msgstr "å\86\99é\81\93:%s\n"
+msgstr "å·²å\86\99è\87³ï¼\9a%s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "正在执行 \"%s\":\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr " \"%s\" 执行失败。\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
-msgstr ""
+msgstr "软件包检查 \"%s\" 失败。\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
-msgstr "无法为软件包 %s 生成输出文件名%s\n"
+msgstr "无法为软件包 %s 生成输出文件名%s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "无法创建 %s: %s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
-msgstr ""
+msgstr "行 %d:第二个 %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
-msgstr ""
+msgstr "%%changelog (更新日志)中存在虚假的日期:%s\n"
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
-msgstr ""
+msgstr "%%changelog 各条内容需要以 * 符号开头\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
-msgstr ""
+msgstr "不完整的 %%changelog 条目\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
-msgstr ""
+msgstr "%%changelog 中存在错误的日期:%s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
-msgstr ""
+msgstr "%%changelog 没有按照时间顺序降序排列\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
-msgstr ""
+msgstr "%%changelog 中没有名称\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
-msgstr ""
+msgstr "%%changelog 中没有描述\n"
+
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr "行 %d: 第二个 %%changelog\n"
 
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
-msgstr ""
+msgstr "行 %d:解析 %%description 时发生错误:%s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
-msgstr ""
+msgstr "行 %d:错误的选项 %s:%s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr ""
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr ""
+msgstr "列 %d:过多的名称:%s\n"
 
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
+msgstr "行 %d:解析 %%files 时发生错误:%s\n"
+
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
 msgstr ""
 
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
-msgstr ""
+msgstr "列 %d:解析 %%policies 时发生错误:%s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
-msgstr ""
+msgstr "解析标记字段错误: %s\n"
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
-msgstr ""
+msgstr "列 %d:错误的编号:%s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
-msgstr ""
+msgstr "行 %d: Bad no%s number: %u\n"
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
-msgstr ""
+msgstr "行 %d:错误的 %s 数字:%s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
-msgstr ""
+msgstr "%s %d 定义了许多次\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
-msgstr ""
+msgstr "下载 %s 到 %s 中\n"
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
-msgstr ""
+msgstr "无法下载 %s\n"
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "系统结构被排除了: %s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "不包含体系统结构:%s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
-msgstr ""
+msgstr "被排除的操作系統:%s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
-msgstr ""
+msgstr "操作系统未包含:%s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
-msgstr ""
+msgstr "%s 字段必须在软件包中存在:%s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
-msgstr ""
+msgstr "%s 條目在软件包中重复:%s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "无法打开图标 %s:%s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
-msgstr "无法读取图标 %s%s\n"
+msgstr "无法读取图标 %s%s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "未知的图标格式:%s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
-msgstr ""
+msgstr "行 %d:标签只需要一个令牌: %s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
-msgstr "行 %d:非法的字符 '%c' 在: %s 中\n"
+msgid "line %d: %s in: %s\n"
+msgstr "行 %d:%s 位于:%s\n"
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
-msgstr "行 %d:非法的字符在: %s 中\n"
+msgid "%s in: %s\n"
+msgstr "%s 位于:%s\n"
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
+msgstr "无效字符 '%c' (0x%x)"
+
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr "非法序列“..”"
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
-msgstr ""
+msgstr "行 %d:有缺陷的标签:%s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
-msgstr ""
+msgstr "行 %d:空的标签:%s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
-msgstr ""
+msgstr "行 %d:前缀不能以 “/” 结尾:%s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
-msgstr ""
+msgstr "行 %d:Docdir 必须以 “/\" 開頭:%s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
-msgstr ""
+msgstr "行 %d:Epoch 标签必须是无符号数:%s\n"
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
-msgstr ""
+msgstr "行 %d:错误的 %s:限定符:%s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
+msgstr "行 %d:错误的 BuildArchitecture 格式:%s\n"
+
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
-msgstr ""
+msgstr "行 %d:只能支持noarch的子包:%s\n"
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
-msgstr ""
+msgstr "内部错误:虚假标签 %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
-msgstr ""
+msgstr "行 %d: %s 不建议使用:%s\n"
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
-msgstr ""
+msgstr "有问题的软件包规范:%s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
 msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
-msgstr ""
+msgstr "行 %d:未知标签:%s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
-msgstr ""
+msgstr "%%{buildroot} 不能为空\n"
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
-msgstr ""
+msgstr "%%{buildroot} 不能为 \"/\"\n"
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
-msgstr ""
+msgstr "问题来源: %s: %s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
-msgstr ""
+msgstr "没有 %u 补丁\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
-msgstr ""
+msgstr "%%patch 没有对应的 \"Patch:\" 标签\n"
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
-msgstr ""
+msgstr "没有 %u 源码\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
-msgstr ""
+msgstr "spec 文件内没有 \"Source:\" 标签\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
-msgstr ""
+msgstr "解析 %%setup 时发生错误:%s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
-msgstr ""
+msgstr "行 %d:%%setup 中存在坏的参数:%s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
-msgstr ""
+msgstr "行 %d:错误的 %%setup 选项 %s:%s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
-msgstr ""
+msgstr "%s:%s:%s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
-msgstr ""
+msgstr "无效的补丁编号 %s:%s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
-msgstr ""
+msgstr "行 %d:第二个 %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
-msgstr ""
+msgstr "依赖项标记必须以字母、数字,_ 或 '/' 开头"
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
-msgstr ""
+msgstr "不允许的版本控制命名"
 
-#: build/parseReqs.c:154
-msgid "Version required"
-msgstr ""
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
+msgstr "此类型不允许富依赖关系"
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
-msgstr ""
+msgstr "无效的依赖"
+
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr "版本要求"
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr "文件触发器中仅允许使用绝对路径"
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr "同一个软件包的触发器已在 spec 文件中定义"
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
-msgstr ""
+msgstr "行 %d:%s:%s\n"
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
+msgstr "列 %d:触发器必须包含有 --:%s\n"
+
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
 msgstr ""
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
-msgstr ""
+msgstr "列 %d:解析 %s 时发生错误:%s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
-msgstr ""
+msgstr "行 %d:内部脚本必須以 “>” 結尾:%s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
-msgstr ""
+msgstr "行 %d:脚本程序必须以 “/” 开头:%s\n"
+
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr "行 %d:仅文件触发器中允许使用优先级:%s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
-msgstr ""
+msgstr "列 %d:第二个 %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
+msgstr "行 %d:不支持的内部脚本:%s\n"
+
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
 msgstr ""
 
-#: build/parseScript.c:318
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
-msgstr ""
+msgstr "行 %d:触发器中不允许使用解释器参数:%s\n"
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
-msgstr ""
+msgstr "行 %d:%s\n"
+
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr "展开行 %d 注释中的宏:%s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
-msgstr ""
+msgstr "不能打开 %s:%s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
-msgstr ""
+msgstr "%s:%d:%s 需要参数\n"
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
-msgstr ""
+msgstr "行 %d:未结束的 %%if\n"
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
-msgstr ""
+msgstr "行 %d:宏未闭合,或换行文本出错\n"
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
-msgstr ""
+msgstr "%s:%d:%%if 条件句有误\n"
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
-msgstr ""
+msgstr "%s:%d:有一个 %%else 没有对应的 %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
-msgstr ""
+msgstr "%s:%d:有一个 %%endif 没有对应的 %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
+msgstr "%s:%d:%%include 语句格式错误\n"
+
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr "系统不支持编码 %s\n"
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr "软件包 %s:无效的 %s 编码于 %s:%s - %s\n"
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:669
-msgid "No compatible architectures found for build\n"
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:733
 #, c-format
-msgid "Package has no %%description: %s\n"
+msgid "line %d doesn't belong to any section: %s\n"
 msgstr ""
 
+#: build/parseSpec.c:878
+msgid "No compatible architectures found for build\n"
+msgstr "没有找到可供构建的兼容构架\n"
+
+#: build/parseSpec.c:912
+#, c-format
+msgid "Package has no %%description: %s\n"
+msgstr "软件包没有 %%description:%s\n"
+
 #: build/policies.c:87
 #, c-format
 msgid "Policy module '%s' duplicated with overlapping types\n"
-msgstr ""
+msgstr "策略模块 '%s' 重复与重叠的类型\n"
 
 #: build/policies.c:93
 #, c-format
 msgid "Base modules '%s' and '%s' have overlapping types\n"
-msgstr ""
+msgstr "基础模块 '%s' 和 '%s' 有重叠的类型\n"
 
 #: build/policies.c:101
 msgid "Failed to get policies from header\n"
-msgstr ""
+msgstr "从头获取策略失败\n"
 
 #: build/policies.c:154
 #, c-format
 msgid "%%semodule requires a file path\n"
-msgstr ""
+msgstr "%%se 模块需要文件路径\n"
 
 #: build/policies.c:163
 #, c-format
 msgid "Failed to read  policy file: %s\n"
-msgstr ""
+msgstr "无法读取策略文件:%s\n"
 
 #: build/policies.c:170
 #, c-format
 msgid "Failed to encode policy file: %s\n"
-msgstr ""
+msgstr "无法对策略文件编码: %s\n"
 
 #: build/policies.c:187
 #, c-format
 msgid "Failed to determine a policy name: %s\n"
-msgstr ""
+msgstr "确定策略名称失败:%s\n"
 
 #: build/policies.c:199
 #, c-format
@@ -1400,7 +1617,7 @@ msgstr ""
 #: build/policies.c:246
 #, c-format
 msgid "Error parsing %s: %s\n"
-msgstr ""
+msgstr "解析 %s 发生错误:%s\n"
 
 #: build/policies.c:252
 #, c-format
@@ -1410,1252 +1627,1645 @@ msgstr ""
 #: build/policies.c:262
 #, c-format
 msgid "Missing module path in line: %s\n"
-msgstr ""
+msgstr "缺少的模块路径存在于: %s \n"
 
 #: build/policies.c:268
 #, c-format
 msgid "Too many arguments in line: %s\n"
-msgstr ""
+msgstr "此行存在过多参数:%s\n"
 
 #: build/policies.c:307
 #, c-format
 msgid "Processing policies: %s\n"
-msgstr ""
+msgstr "处理策略:%s\n"
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
-msgstr ""
+msgstr "忽略无效的正则表达式 %s\n"
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
-msgstr ""
+msgstr "无法为 %s建立管道: %m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
-msgstr ""
+msgstr "无法执行%s:%s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
-msgstr ""
+msgstr "无法抽取分支 %s:%s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
-msgstr ""
+msgstr "%s 失败:%x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
-msgstr ""
-
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr ""
+msgstr "无法写入所有的数据到 %s:%s\n"
 
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
-msgstr ""
+msgstr "空文件分类\n"
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
-msgstr ""
+msgstr "没有配置文件属性\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
-msgstr ""
+msgstr "magic_open(0x%x) 失败:%s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
-msgstr ""
+msgstr "magic_load 失败:%s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
-msgstr ""
+msgstr "文件 \"%s\" 辨识失败:模式 %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
-msgstr ""
+msgstr "正在查找 %s:%s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
+msgstr "查找 %s 失败:\n"
+
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
 msgstr ""
 
-#: build/spec.c:404
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "查询 spec 文件 %s 失败,无法解析\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(错误代码 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr "%s 错误(%d) 源自 %s:%s\n"
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr ""
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr "%s 错误(%d):%s\n"
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "错误/不可读的  头部"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "无法识别的数据库选项:\"%s\" 已忽略。\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "头部太大"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s 有无效的数值,忽略\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s 有过大或者是过小的 long 数值,忽略\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s 有过大或者是过小的整数值,忽略\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "无法取得 %s 位于 %s/%s 的锁定\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "已共享"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "排他"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
+msgstr "无效的索引类型 %x 于 %s/%s\n"
+
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "未知文件类型"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
 msgstr ""
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "摘要不匹配"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
+"添加表头 #%d 记录时出错 (%d)\n"
+"\n"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "内部错误"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr "移除表头 #%d 记录时出错 (%d)\n"
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "在分配新软件包进程时出错 (%d)\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
 msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
 msgstr ""
 
-#: lib/depends.c:68
+#: lib/backend/dbi.c:81
 #, c-format
-msgid "%s is a Delta RPM and cannot be directly installed\n"
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:93
+#, c-format
+msgid "%s is a Delta RPM and cannot be directly installed\n"
+msgstr "%s 是一个 Delta RPM 并且无法直接被安装。\n"
+
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
-msgstr ""
+msgstr "软件包 %s 已被加入,跳过 %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
-msgstr ""
+msgstr "软件包 %s 已被加入,以 %s 替换\n"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(非blob)"
+
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(不是数字)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(不是字符串)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(无效类型)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%a %b %d %Y"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(非base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(无效类型)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(非blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(无效的xml 类型)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(不是OpenPGP 签名)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr "无效日期%u"
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "正常"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "已被替换"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "未安装"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "网络共享"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "错误颜色"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "丢失"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(未知)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(不是字符串)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "用户%s 不存在 - 使用root\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "群组%s 不存在 - 使用root\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
-msgstr ""
+msgstr "%s 已另存为 %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
-msgstr ""
+msgstr "%s 已建立为 %s \n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
-msgstr ""
+msgstr "%s %s:移除失败:%s\n"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
-msgstr ""
+msgstr "目录"
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
-msgstr ""
+msgstr "文件"
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
-msgstr "跳过 %s %s,签名无法验证\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
+msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
-msgstr "跳过 %s,签名无法验证\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
+msgstr "头部载入:不当"
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
-#, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
+#: lib/header.c:1775
+msgid "region: no tags"
 msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1: 错误,非十六进制\n"
+#: lib/header.c:1797
+#, c-format
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr "区域标签:不当,标记 %d 类型 %d 偏移 %d 计数 %d"
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA: 错误,非二进制\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr "区域偏移:不当,标记 %d 类型 %d 偏移 %d 计数 %d"
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA: 错误,非二进制\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr "区域结尾:不当,标记 %d 类型 %d 偏移 %d 计数 %d"
 
-#: lib/package.c:296
+#: lib/header.c:1833
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
 msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1841
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1876
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr "头部大小(%d):不当,读取返回 %d"
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
+msgstr "头部幻数:不当"
+
+#: lib/header.c:1885
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr "头部标记:不当,标记(%d)的号码超出范围"
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1890
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr ""
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr "头部数据:不当,字节(%d)的号码超出范围"
 
-#: lib/package.c:427
+#: lib/header.c:1900
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr ""
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr "头部 blob(%zd):不当,读取返回 %d"
+
+#: lib/header.c:1909
+#, c-format
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr "sigh 填充(%zd):不当,读取 %zd 字节"
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
+#: lib/header.c:1922
+msgid "signature "
 msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr "blob 大小(%d):不当,8 + 16 * il(%d) + dl(%d)"
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr "无效的字段宽度"
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
+msgid "missing { after %%"
 msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr ""
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "空白标签格式"
+
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "空白标签名称"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: rpmReadSignature failed: %s"
+msgid "unknown tag: \"%s\""
 msgstr ""
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
-#, c-format
-msgid "%s: No signature available\n"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] 预期于数组结尾"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "未预期的 ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "未预期的 }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? 预期于表达式中"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
 msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} 预期在表达式中"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
 msgstr ""
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
-#, c-format
-msgid "%s: Fread failed: %s\n"
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
 msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| 预期于表达式结尾"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "使用不同大小数组的数组的迭代器"
+
+#: lib/poptALL.c:154
+#, c-format
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr "%s:错误:指定了多次 --pipe (可能是不兼容的 popt 别名?)\n"
+
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
-msgstr ""
+msgstr "预先以值 EXPR 定义 MACRO"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
-msgstr ""
+msgstr "“MACRO EXPR”"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "定义值为 EXPR 的 MACRO"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
-msgstr ""
+msgstr "未定义的 MACRO"
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
-msgstr ""
+msgstr "MACRO"
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "打印 EXPR 的宏展开"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
+msgstr "“EXPR”"
+
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
 msgstr ""
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "从文件 <FILE:...> 读取宏,不使用默认文件"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
-msgstr ""
+msgstr "<FILE:…>"
+
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr "不要启用任何插件"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
-msgstr ""
+msgstr "不校验软件包的摘要"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
-msgstr ""
+msgstr "检索时,不验证数据库头"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
 msgstr "不验证软件包签名"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
-msgstr ""
+msgstr "发送 stdout 到 CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
-msgstr ""
+msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "使用 ROOT 作为顶级目录"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr "使用 DIRECTORY 目录中的数据库"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "DIRECTORY"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "显示已知的查询标签"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "显示最终的 rpmrc 和宏配置"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "提供更少的详细信息输出"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "提供更多的详细信息输出"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "打印使用的 rpm 版本号"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
-msgstr ""
+msgstr "调试净负荷文件状态机"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
-msgstr ""
+msgstr "debug rpmio I/O"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
-msgstr ""
+msgstr "%s:选项表配置不正确 (%d)\n"
 
 #: lib/poptI.c:52
 msgid "exclude paths must begin with a /"
-msgstr ""
+msgstr "被排除的路径必须以 / 开头"
 
 #: lib/poptI.c:64
 msgid "relocations must begin with a /"
-msgstr ""
+msgstr "重定位必须以 / 开头"
 
 #: lib/poptI.c:67
 msgid "relocations must contain a ="
-msgstr ""
+msgstr "重定位必须包含有一个 ="
 
 #: lib/poptI.c:70
 msgid "relocations must have a / following the ="
-msgstr ""
+msgstr "重定位必须有 / 跟在 = 之后"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr "安装全部文件,包含配置文件,否则配置文件会被跳过。"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
+"移除所有符合 <package> 的软件包(如果 <package> 被指定未多个软件包,常常会导致"
+"错误出现)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
-msgstr ""
+msgstr "对不可重定位的软件包重新分配文件位置"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
-msgstr ""
+msgstr "打印依赖循环作为警告"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
 msgstr "清除 (卸载) 软件包"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
-msgstr ""
+msgstr "<package>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "不安装配置文件"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "不安装程序文档"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
-msgstr ""
+msgstr "略过以 <path> 开头的文件"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
-msgstr ""
+msgstr "<path>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "--replacepkgs --replacefiles 的缩写"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
 msgstr "如果软件包已经安装,升级软件包"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
-msgstr ""
+msgstr "<packagefile>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
-msgstr ""
+msgstr "软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
 msgstr "不验证软件包架构"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "不验证软件包操作系统"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "在安装前不检查磁盘空间"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "安装程序文档"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
 msgstr "安装软件包"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "更新数据库,但不修改文件系统"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
 msgstr "不验证软件包依赖"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "不验证文件摘要"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "不验证文件摘要(已过时)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "不安装文件的安全上下文"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
 msgstr "不对软件包安装重新排序以满足依赖关系"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
-msgstr "不执行软件包脚本"
+msgstr "不执行软件包脚本"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
-msgstr "不执行%%pre 脚本(如果有的话)"
+msgstr "不执行 %%pre 小脚本(若存在)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
-msgstr "不执行%%post 脚本(如果有的话)"
+msgstr "不执行 %%post 小脚本(若存在)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
-msgstr "不执行%%preun 脚本(如果有的话)"
+msgstr "不执行 %%preun 小脚本(若存在)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
-msgstr "不执行%%postun 脚本(如果有的话)"
+msgstr "不执行 %%postun 小脚本(若存在)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr "不执行 %%pretrans 事务前的小脚本 (若存在)"
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr "不执行 %%posttrans 短脚本 (若存在)"
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
-msgstr "不执行本软件包触发的任何脚本"
+msgstr "不执行本软件包触发的任何脚本"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
-msgstr "不执行任何%%triggerprein 脚本"
+msgstr "不执行任何 %%triggerprein 脚本"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
-msgstr "不执行任何%%triggerin 脚本"
+msgstr "不执行任何 %%triggerin 脚本"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
-msgstr "不执行任何%%triggerun 脚本"
+msgstr "不执行任何 %%triggerun 脚本"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
-msgstr "不执行任何%%triggerpostun 脚本"
-
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
+msgstr "不执行任何 %%triggerpostun 脚本"
 
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
 msgstr "更新到软件包的旧版本(带 --force 自动完成这一功能)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
 msgstr "安装软件包时打印百分比"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
-msgstr ""
+msgstr "如果可重定位,便把软件包重定位到 <dir>"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
-msgstr ""
+msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
-msgstr ""
+msgstr "将文件从 <old> 重定位到 <new>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
-msgstr ""
+msgstr "<old>=<new>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
 msgstr "忽略软件包之间的冲突的文件"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
 msgstr "如果软件包已经有了,重新安装软件包"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "不真正安装,只是判断下是否能安装"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
 msgstr "升级软件包"
 
-#: lib/poptQV.c:67
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr "重新安装软件包"
+
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
 msgstr "查询/验证所有软件包"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
-msgstr ""
+msgstr "rpm 检查签名模式"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
 msgstr "查询/验证文件属于的软件包"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
 msgstr "查询/验证组中的软件包"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
 msgstr "查询/验证一个软件包"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
-msgstr ""
+msgstr "根据软件包标识符查找/校验软件包"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
-msgstr ""
+msgstr "根据头部标识符查找/校验软件包"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
-msgstr ""
+msgstr "rpm 查询模式"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
-msgstr ""
+msgstr "查询/验证头的实例"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
-msgstr ""
+msgstr "从安装事务查找/验证软件包"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
-msgstr ""
+msgstr "查找由软件包所触发的软件包"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
-msgstr ""
+msgstr "rpm 校验模式"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
-msgstr ""
+msgstr "查找/校验需要某个依赖对象的软件包"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
+msgstr "查询/验证提供相关依赖的软件包"
+
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
 msgstr ""
 
-#: lib/poptQV.c:98
-msgid "do not glob arguments"
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
+
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
 msgstr ""
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:114
+msgid "do not glob arguments"
+msgstr "不使用 glob 参数"
+
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
 msgstr "不把非软件包文件作为清单处理"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "列出所有配置文件"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "列出所有程序文档"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "列出所有程序文档"
+msgstr "列出所有许可证文件"
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "列出所有许可证文件"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "转储基本文件信息"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
-msgstr "列出包中的文件"
+msgstr "列出软件包中的文件"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "跳过%%ghost 文件"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "跳过%%ghost 文件"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "显示列出文件的状态"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "不验证文件大小"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "不验证符号连接路径"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "不验证文件所有者"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "不验证文件组信息"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "不验证文件修改时间"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "不验证文件模式"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr "不验证文件兼容性"
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "不验证文件安全上下文"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr "不验证文件兼容性"
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
 msgstr "不验证软件包中文件"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
 msgstr "不验证包依赖"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "不执行验证脚本"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
-msgstr ""
+msgstr " %s 缺失rpmlib的特性\n"
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
 msgstr "期望源代码包,但找到二进制包\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
 msgstr "源代码包中没有找到 .spec 文件\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
-msgstr ""
+msgstr "解压压缩文件 %s%s 失败:%s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
-msgstr ""
-
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr ""
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr ""
+msgstr "  在文件"
 
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "不正确的格式:%s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(没有包含文件)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "正常"
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "替换"
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "未安装"
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "网络共享"
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "不对的颜色"
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(无状态)    "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(未知 %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
-msgstr ""
+msgstr "软件包中没有文件的所有者/群组列表\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
-msgstr ""
+msgstr "软件包中也不没有文件的所有者或者是 id 列表\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
 msgstr "没有找到属于 %s 组的软件包\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
-msgstr ""
+msgstr "没有软件包触发器 %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "格式不对 %s:%s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
-msgstr ""
+msgstr "没有软件包和 %s 匹配:%s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
-msgstr ""
+msgstr "没有软件包需要 %s\n"
+
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr "没有推荐安装 %s 的软件包\n"
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr "没有建议安装 %s 的软件包\n"
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr "没有提供 %s 的软件包\n"
 
-#: lib/query.c:392
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr "没有用于增强 %s 的软件包\n"
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
-msgstr "没有包提供 %s\n"
+msgstr "没有软件包提供 %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "文件 %s:%s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
-msgstr "文件 %s 不属于任何包\n"
+msgstr "文件 %s 不属于任何软件包\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
-msgstr ""
+msgstr "无效的软件包编号:%s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
-msgstr ""
+msgstr "记录 %u 不能读取\n"
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
 msgstr "未安装软件包 %s \n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
-msgstr ""
+msgstr "未知标签:\"%s\"\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
-msgstr ""
+msgstr "%s:导入密钥 %d 失败。\n"
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
-msgstr ""
+msgstr "%s:公钥 %d  不受到保护。\n"
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
-msgstr ""
+msgstr "%s:导入读取时失败(%d)。\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
-msgstr ""
-
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "NOT OK"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
-msgid "OK"
+#: lib/rpmchecksig.c:262
+msgid "digests"
 msgstr ""
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
 msgstr ""
 
-#: lib/rpmchecksig.c:390
-msgid ""
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr ""
+#: lib/rpmchecksig.c:268
+msgid "NOT OK"
+msgstr "不正确"
 
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ""
+#: lib/rpmchecksig.c:268
+msgid "OK"
+msgstr "确定"
 
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
-msgstr ""
+msgstr "%s:打开失败:%s\n"
 
 #: lib/rpmchroot.c:43
 #, c-format
 msgid "Unable to open current directory: %m\n"
-msgstr ""
+msgstr "无法打开当前目录:%m\n"
 
 #: lib/rpmchroot.c:59 lib/rpmchroot.c:84
 #, c-format
 msgid "%s: chroot directory not set\n"
-msgstr ""
+msgstr "%s:没有设置 chroot 目录\n"
 
 #: lib/rpmchroot.c:70
 #, c-format
 msgid "Unable to change root directory: %m\n"
-msgstr ""
+msgstr "无法更改根目录: %m\n"
 
 #: lib/rpmchroot.c:95
 #, c-format
 msgid "Unable to restore root directory: %m\n"
+msgstr "无法恢复根目录:%m\n"
+
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "NO "
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
 msgstr ""
 
-#: lib/rpmds.c:489
-msgid "YES"
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "没有设置 dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader:跳过"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr "%s: regexec 函数执行失败: %s\n"
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr "%s: regcomp 函数执行失败: %s\n"
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator:跳过"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb:获取到损坏表头 #%u -- 跳过此项。\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s:无法读取位于 0x%x 的表头\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "没有设置 dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr "無法建立 %s 目录: %s\n"
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
 msgstr ""
 
-#: lib/rpmds.c:933
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "无法加入原本位于 %u 的记录\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "重建数据库失败:原始数据库仍保持原状\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "用新的数据库取代旧的数据库失败!\n"
+
+#: lib/rpmds.c:744
+msgid "NO "
+msgstr "否"
+
+#: lib/rpmds.c:744
+msgid "YES"
+msgstr "是"
+
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr ""
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr ""
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
-msgstr ""
+msgstr "软件包净负荷可以使用 bzip2 压缩。"
 
-#: lib/rpmds.c:945
+#: lib/rpmds.c:1233
 msgid "package payload can be compressed using xz."
-msgstr ""
+msgstr "软件包净负荷可以使用 xz 压缩。"
 
-#: lib/rpmds.c:948
+#: lib/rpmds.c:1236
 msgid "package payload can be compressed using lzma."
-msgstr ""
+msgstr "软件包净负荷可以使用 lzma 压缩。"
 
-#: lib/rpmds.c:952
+#: lib/rpmds.c:1240
 msgid "package payload file(s) have \"./\" prefix."
-msgstr ""
+msgstr "软件包净负荷有\"./\" 前缀。"
 
-#: lib/rpmds.c:955
+#: lib/rpmds.c:1243
 msgid "package name-version-release is not implicitly provided."
-msgstr ""
+msgstr "软件包 name-version-release 没有隐含地提供。"
 
-#: lib/rpmds.c:958
+#: lib/rpmds.c:1246
 msgid "header tags are always sorted after being loaded."
-msgstr ""
+msgstr "头标签总是排序后被加载。"
 
-#: lib/rpmds.c:961
+#: lib/rpmds.c:1249
 msgid "the scriptlet interpreter can use arguments from header."
 msgstr ""
 
-#: lib/rpmds.c:964
+#: lib/rpmds.c:1252
 msgid "a hardlink file set may be installed without being complete."
-msgstr ""
+msgstr "硬链接文件集没有被完整的安装。"
 
-#: lib/rpmds.c:967
+#: lib/rpmds.c:1255
 msgid "package scriptlets may access the rpm database while installing."
-msgstr ""
+msgstr "软件包脚本在安装过程中允许访问 rpm 数据库。"
 
-#: lib/rpmds.c:971
+#: lib/rpmds.c:1259
 msgid "internal support for lua scripts."
-msgstr ""
+msgstr "lua 脚本的内部支持"
 
-#: lib/rpmds.c:975
+#: lib/rpmds.c:1263
 msgid "file digest algorithm is per package configurable"
 msgstr ""
 
-#: lib/rpmds.c:979
+#: lib/rpmds.c:1267
 msgid "support for POSIX.1e file capabilities"
 msgstr ""
 
-#: lib/rpmds.c:983
+#: lib/rpmds.c:1271
 msgid "package scriptlets can be expanded at install time."
 msgstr ""
 
-#: lib/rpmds.c:986
+#: lib/rpmds.c:1274
 msgid "dependency comparison supports versions with tilde."
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
-#, c-format
-msgid "open of %s failed: %s\n"
-msgstr "打开 %s 失败: %s\n"
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr "支持超过 4G 的文件"
 
-#: lib/rpmgi.c:136
-#, c-format
-msgid "%s: not an rpm package (or package manifest)\n"
-msgstr "%s: 不是 rpm 软件包 (或者没有 manifest 文件)\n"
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr "富依赖关系支持"
 
-#: lib/rpminstall.c:141
-#, c-format
-msgid "Updating / installing...\n"
-msgstr "正在升级/安装...\n"
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpmds.c:1410
 #, c-format
-msgid "Cleaning up / removing...\n"
-msgstr "æ­£å\9c¨æ¸\85ç\90\86\88 é\99¤...\n"
+msgid "Unknown rich dependency op '%.*s'"
+msgstr "æ\9cªç\9f¥ç\9a\84å¯\8cä¾\9dèµ\96å\85³ç³»æ\93\8dä½\9c符â\80\9c%.*sâ\80\9d"
 
-#: lib/rpminstall.c:192
-msgid "Preparing..."
-msgstr "å\87\86å¤\87中..."
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr "å\90\8dç§°æ\98¯å¿\85填项"
 
-#: lib/rpminstall.c:194
-msgid "Preparing packages..."
-msgstr "软件包准备中..."
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
-msgid "Failed dependencies:\n"
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
 msgstr ""
 
-#: lib/rpminstall.c:321
-#, c-format
-msgid "%s: not an rpm package (or package manifest): %s\n"
-msgstr "%s: 不是 rpm 软件包 (或者没有manifest):%s\n"
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
-#, c-format
-msgid "%s cannot be installed\n"
-msgstr "不能安装 %s \n"
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr "富依赖关系未以“(”开头"
 
-#: lib/rpminstall.c:464
-#, c-format
-msgid "Retrieving %s\n"
-msgstr "获取%s\n"
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr "富依赖关系操作符缺少参数"
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr "富依赖关系为空"
 
-#: lib/rpminstall.c:476
+#: lib/rpmds.c:1544
 #, c-format
-msgid "skipping %s - transfer failed\n"
+msgid "Unterminated rich dependency: %s"
+msgstr "富依赖关系缺少结尾:%s"
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr "富依赖关系后有多余内容"
+
+#: lib/rpmfi.c:810
 #, c-format
-msgid "package %s is not relocatable\n"
+msgid "user %s does not exist - using %s\n"
 msgstr ""
 
-#: lib/rpminstall.c:570
+#: lib/rpmfi.c:817
 #, c-format
-msgid "error reading from file %s\n"
-msgstr "文件 %s 读取错误\n"
+msgid "group %s does not exist - using %s\n"
+msgstr ""
 
-#: lib/rpminstall.c:661
+#: lib/rpmfi.c:1374
 #, c-format
-msgid "\"%s\" specifies multiple packages:\n"
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpminstall.c:700
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
+msgstr ""
+
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "Bad magic"
+
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "错误/不可读的  头部"
+
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "头部太大"
+
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr "对于压缩文件来说文件太大了"
+
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "未知文件类型"
+
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr "丢失文件"
+
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "摘要不匹配"
+
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "内部错误"
+
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "在头中不存在归档"
+
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
+msgstr ""
+
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " 失败 - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
+msgstr "%s:(错误 0x%x)"
+
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
+#, c-format
+msgid "open of %s failed: %s\n"
+msgstr "打开 %s 失败: %s\n"
+
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
+#, c-format
+msgid "%s: not an rpm package (or package manifest)\n"
+msgstr "%s:不是 rpm 软件包 (或者没有 manifest 文件)\n"
+
+#: lib/rpminstall.c:142
+#, c-format
+msgid "Updating / installing...\n"
+msgstr "正在升级/安装...\n"
+
+#: lib/rpminstall.c:144
+#, c-format
+msgid "Cleaning up / removing...\n"
+msgstr "正在清理/删除...\n"
+
+#: lib/rpminstall.c:193
+msgid "Preparing..."
+msgstr "准备中..."
+
+#: lib/rpminstall.c:195
+msgid "Preparing packages..."
+msgstr "软件包准备中..."
+
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
+msgid "Failed dependencies:\n"
+msgstr "依赖检测失败:\n"
+
+#: lib/rpminstall.c:323
+#, c-format
+msgid "%s: not an rpm package (or package manifest): %s\n"
+msgstr "%s:不是 rpm 软件包 (或者没有 manifest):%s\n"
+
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
+#, c-format
+msgid "%s cannot be installed\n"
+msgstr "不能安装 %s \n"
+
+#: lib/rpminstall.c:490
+#, c-format
+msgid "Retrieving %s\n"
+msgstr "获取%s\n"
+
+#: lib/rpminstall.c:502
+#, c-format
+msgid "skipping %s - transfer failed\n"
+msgstr "跳过 %s - 传输失败\n"
+
+#: lib/rpminstall.c:572
+#, c-format
+msgid "package %s is not relocatable\n"
+msgstr "软件包 %s 不能重定位\n"
+
+#: lib/rpminstall.c:603
+#, c-format
+msgid "error reading from file %s\n"
+msgstr "文件 %s 读取错误\n"
+
+#: lib/rpminstall.c:697
+#, c-format
+msgid "\"%s\" specifies multiple packages:\n"
+msgstr "\"%s\" 指定多个软件包:\n"
+
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "无法打开 %s:%s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "正在安装 %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
 msgstr "不是一个 rpm 软件包"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "非法的签名类型"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
 msgstr "不支持的 RPM 软件包版本"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "读取失败:%s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
-msgstr "是不一个 rpm 包\n"
+msgstr "不是一个 rpm 软件包\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
-msgstr ""
+msgstr "无法创建 %s 锁定于 %s (%s) \n"
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
-msgstr ""
+msgstr "正在等候 %s 锁定 %s\n"
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
-msgstr ""
+msgstr "dlopen 失败 %s %s\n"
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
-msgstr ""
+msgstr "解析符号 %s 失败:%s\n"
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
-msgstr ""
+msgid "Plugin %%__%s_%s not configured\n"
+msgstr "插件 %%__%s_%s 未配置\n"
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
-msgstr ""
-
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
+msgstr "%s 插件未载入\n"
 
 #: lib/rpmprob.c:109
 msgid "different"
-msgstr ""
+msgstr "不同"
 
 #: lib/rpmprob.c:114
 #, c-format
 msgid "package %s is intended for a %s architecture"
-msgstr ""
+msgstr "软件包 %s 是针对 %s 构架的"
 
 #: lib/rpmprob.c:118
 #, c-format
 msgid "package %s is intended for a %s operating system"
-msgstr ""
+msgstr "软件包 %s 是针对 %s 操作系统的"
 
 #: lib/rpmprob.c:122
 #, c-format
 msgid "package %s is already installed"
-msgstr ""
+msgstr "软件包 %s 已经安装"
 
 #: lib/rpmprob.c:125
 #, c-format
@@ -2665,7 +3275,7 @@ msgstr ""
 #: lib/rpmprob.c:130
 #, c-format
 msgid "file %s conflicts between attempted installs of %s and %s"
-msgstr ""
+msgstr "试图安装 %2$s 和 %3$s 会导致文件 %1$s 冲突"
 
 #: lib/rpmprob.c:135
 #, c-format
@@ -2675,7 +3285,7 @@ msgstr ""
 #: lib/rpmprob.c:140
 #, c-format
 msgid "package %s (which is newer than %s) is already installed"
-msgstr ""
+msgstr "软件包 %s (比 %s 还要新) 已经安装"
 
 #: lib/rpmprob.c:145
 #, c-format
@@ -2690,817 +3300,654 @@ msgstr ""
 #: lib/rpmprob.c:159
 #, c-format
 msgid "%s is needed by %s%s"
-msgstr ""
+msgstr "%s 被 %s%s 需要"
 
 #: lib/rpmprob.c:160 lib/rpmprob.c:164 lib/rpmprob.c:168
 msgid "(installed) "
-msgstr ""
+msgstr "(已安裝) "
 
 #: lib/rpmprob.c:163
 #, c-format
 msgid "%s conflicts with %s%s"
-msgstr ""
+msgstr "%s 与 %s%s 冲突"
 
 #: lib/rpmprob.c:167
 #, c-format
 msgid "%s is obsoleted by %s%s"
-msgstr ""
+msgstr "%s 被 %s%s 取代"
 
 #: lib/rpmprob.c:172
 #, c-format
-msgid "unknown error %d encountered while manipulating package %s"
-msgstr ""
-
-#: lib/rpmrc.c:194
-#, c-format
-msgid "missing second ':' at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:197
-#, c-format
-msgid "missing architecture name at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:342
-#, c-format
-msgid "Incomplete data line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:347
-#, c-format
-msgid "Too many args in data line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:354
-#, c-format
-msgid "Bad arch/os number: %s (%s:%d)\n"
-msgstr ""
-
-#: lib/rpmrc.c:385
-#, c-format
-msgid "Incomplete default line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:390
-#, c-format
-msgid "Too many args in default line at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:495
-#, c-format
-msgid "missing ':' (found 0x%02x) at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
-#, c-format
-msgid "missing argument for %s at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:523
-#, c-format
-msgid "cannot open %s at %s:%d: %m\n"
-msgstr ""
-
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr ""
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr ""
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr ""
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr ""
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr ""
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr ""
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr ""
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr ""
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr ""
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr ""
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr ""
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr ""
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr ""
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr ""
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr ""
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr ""
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr ""
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr ""
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr ""
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr ""
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr ""
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr ""
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr ""
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr ""
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr ""
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr ""
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr ""
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr ""
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr ""
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr ""
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ""
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr ""
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr ""
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr ""
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
+msgid "unknown error %d encountered while manipulating package %s"
+msgstr "遇到未知错误 %d 在处理包 %s 时"
 
-#: lib/rpmdb.c:191
+#: lib/rpmrc.c:222
 #, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr ""
+msgid "missing second ':' at %s:%d\n"
+msgstr "在 %s:%d 中遗漏第二个 “:”\n"
 
-#: lib/rpmdb.c:516
+#: lib/rpmrc.c:225
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
+msgid "missing architecture name at %s:%d\n"
+msgstr "在 %s:%d 处丢失构架名称\n"
 
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr ""
+#: lib/rpmrc.c:370
+#, c-format
+msgid "Incomplete data line at %s:%d\n"
+msgstr "不完整的资料行于 %s:%d\n"
 
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr ""
+#: lib/rpmrc.c:375
+#, c-format
+msgid "Too many args in data line at %s:%d\n"
+msgstr "在此数据行中存在过多的的指定参数 %s:%d\n"
 
-#: lib/rpmdb.c:1318
+#: lib/rpmrc.c:382
 #, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr ""
+msgid "Bad arch/os number: %s (%s:%d)\n"
+msgstr "坏的构架/操作系统编号:%s (%s:%d)\n"
 
-#: lib/rpmdb.c:1415
+#: lib/rpmrc.c:413
 #, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr ""
+msgid "Incomplete default line at %s:%d\n"
+msgstr "不完整的预设行在 %s:%d\n"
 
-#: lib/rpmdb.c:1596
+#: lib/rpmrc.c:418
 #, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr ""
+msgid "Too many args in default line at %s:%d\n"
+msgstr "预设行 %s:%d 中存在过多参数\n"
 
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr ""
+#: lib/rpmrc.c:523
+#, c-format
+msgid "missing ':' (found 0x%02x) at %s:%d\n"
+msgstr "丢失 ':' (找到 0x%02x) 在 %s:%d\n"
 
-#: lib/rpmdb.c:1897
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgid "missing argument for %s at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2250
+#: lib/rpmrc.c:551
 #, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
+msgid "cannot open %s at %s:%d: %m\n"
+msgstr "不能打开 %s 在 %s:%d: %m\n"
 
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) adding header #%d record\n"
+msgid "missing architecture for %s at %s:%d\n"
 msgstr ""
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) removing header #%d record\n"
-msgstr ""
+msgid "bad option '%s' at %s:%d\n"
+msgstr "坏的选项 “%s” 位于 %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
+msgstr "读取辅助载体失败, 是 /proc 没有挂载么?\n"
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr ""
+msgid "Unknown system: %s\n"
+msgstr "未知系统:%s\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr ""
+msgid "Please contact %s\n"
+msgstr "请联系 %s\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "不能打开 %s 供读取:%m。\n"
+
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
 msgstr ""
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
 msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr ""
+msgid "Unable to restore current directory: %m"
+msgstr "无法恢复当前目录:%m"
+
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr "<lua> 脚本支持未内建\n"
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr ""
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr "无法建立临时文件赖存储%s:%s\n"
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr ""
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr "无法复制文件描述:%s:%s\n"
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr ""
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr "fwrite 失败:%s"
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
-msgstr ""
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
+msgstr "%s 脚本执行失败,waitpid(%d) rc %d: %s\n"
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr ""
+msgid "%s scriptlet failed, signal %d\n"
+msgstr "%s 脚本执行失败,捕捉到信号: %d\n"
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr ""
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr "%s 脚本执行失败,退出状态码为 %d\n"
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr ""
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "未知格式"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr ""
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "安裝"
+
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "删除"
 
-#: lib/rpmdb.c:2949
+#: lib/rpmts.c:100
 #, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr ""
+msgid "cannot open Packages database in %s\n"
+msgstr "无法从 %s 打开软件包数据库\n"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:199
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr ""
+msgid "extra '(' in package label: %s\n"
+msgstr "額外的“(”存在于软件包标签中:%s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr ""
+msgid "missing '(' in package label: %s\n"
+msgstr "丢失“(”在软件包标签 %s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:225
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr ""
+msgid "missing ')' in package label: %s\n"
+msgstr "丢失“)”在软件包标签 %s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:284
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr ""
+msgid "%s: reading of public key failed.\n"
+msgstr "读出公钥失败:%s\n"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr ""
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "事务"
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
+#: lib/rpmvs.c:152
+#, c-format
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:158
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s: tag %u: invalid count %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:178
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
+msgid "%s tag %u: invalid data %p (%u)"
 msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
+msgid "%s tag %u: invalid size %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
+msgid "%s tag %u: invalid OpenPGP signature"
 msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:206
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
+msgid "%s: tag %u: invalid hex"
 msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to decode policy for %s\n"
+msgid "%s%s %s"
 msgstr ""
 
-#: plugins/sepolicy.c:225
-#, c-format
-msgid "Failed to create temporary file for %s: %s\n"
+#: lib/rpmvs.c:264
+msgid "digest"
 msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
+msgid "%s%s"
 msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
+#: lib/rpmvs.c:295
+msgid "header"
 msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
+#: lib/rpmvs.c:295
+msgid "package"
 msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr ""
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "头"
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
 msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr ""
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "无法重载签名头。\n"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr ""
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "已跳过"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr ""
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "已失败"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr ""
+msgid "Duplicate username or UID for user %s\n"
+msgstr "用户 %s 存在重复的用户名或 UID\n"
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr ""
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr "用户组 %s 存在重复的组名或 GID\n"
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr ""
+#: lib/verify.c:395
+msgid "no state"
+msgstr "没有状态"
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr ""
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr "未知状态"
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr ""
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "遗漏   %c %s"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr ""
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr "未满足的依赖关系 %s:\n"
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
+msgid "Unable to reset nice value: %s"
 msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
 msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
 msgstr ""
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
+msgstr "%3d>%*s(清空)"
+
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
-msgstr ""
+msgstr "%3d<%*s(清空)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr ""
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "宏 %%%s 具有未结束的选项\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr ""
+msgid "Macro %%%s has unterminated body\n"
+msgstr "宏 %%%s 主体未结束\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
+msgid "Macro %%%s has illegal name (%s)\n"
 msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
-msgstr ""
+msgstr "宏 %%%s 中存在空内容\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr "宏 %%%s 在结构之前需要空格\n"
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
-msgstr ""
+msgstr "宏 %%%s 展开失败\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
-msgstr ""
+msgstr "宏 %%%s 中存在无效的名称 (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr ""
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr "宏 %%%s 已经定义但是没有使用\n"
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
-msgstr ""
+msgstr "在 %2$s(%3$s) 中存在未知的选项 %1$c\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
-msgstr ""
+msgstr "宏扩展中存在太多层的递归。这有可能是由宏的递归声明引起的。\n"
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
-msgstr ""
+msgstr "未结束的 %c:%s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
-msgstr ""
+msgstr "在一个不可解析的宏之之后跟着 %%\n"
+
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr "载入宏文件 %s 失败"
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== 作用中 %d 清空 %d\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr "临时文件创建失败 %s:%m\n"
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "文件 %s:%s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "文件 %s 小于 %u 字节\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "创建目录失败"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr "[无]"
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(没有错误)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "致命错误:"
+
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "错误:"
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "警告:"
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
-msgstr ""
+msgstr "lua 脚本中存在无效的语法:%s\n"
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
-msgstr ""
+msgstr "Lua 脚本中存在无效的语法:%s\n"
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
-msgstr ""
+msgstr "lua 脚本执行失败:%s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
-msgstr ""
+msgstr "lua文件中存在无效的语法 %s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
-msgstr ""
-
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr "[无]"
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(没有错误)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "致命错误:"
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "错误:"
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "警告:"
+msgstr "lua hook 执行失败:%s\n"
 
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "内在分配 (%u 字节) 返回 NULL。\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
 #, c-format
-msgid "V%d %s/%s %s, key ID %s"
+msgid "Unsupported version of key: V%d\n"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1127
+#, c-format
+msgid "V%d %s/%s %s, key ID %s"
+msgstr "V%d %s/%s %s, 密钥 ID %s"
+
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(无)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr "创建临时目录 %s 时出错:%m\n"
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr "创建队列 %s 时出错:%m\n"
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr "删除队列 %s 时出错:%m\n"
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr "删除目录 %s 时发生错误:%m\n"
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
-msgstr "%s: Fwrite 失败: %s\n"
+msgstr "%s:Fwrite 失败:%s\n"
+
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s:Fread 函数执行失败:%s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr "%s: Fflush 失败:%s\n"
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr "不支持的 PGP 签名\n"
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr "不支持的 PGP hash 算法 %u\n"
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr "不支持的 PGP 公钥算法 %u\n"
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr ""
+msgid "Could not exec %s: %s\n"
+msgstr "无法exec %s:%s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr "fopen 失败\n"
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr "无法写入到管道\n"
+
+#: sign/rpmgensig.c:302
+#, c-format
+msgid "Could not read from file %s: %s\n"
+msgstr "无法从文件 %s 读取:%s\n"
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
-msgstr ""
+msgstr "gpg 执行失败 (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
-msgstr ""
+msgstr "写入签名时 gpg 验证失败\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "无法读取签名\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
+msgstr "rpmMkTemp 失败\n"
+
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:501
-#, c-format
-msgid "%s already contains identical signature, skipping\n"
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s: writeLead failed: %s\n"
+msgid "%s already contains identical file signatures\n"
 msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
+msgstr ""
+
+#: sign/rpmgensig.c:682
+#, c-format
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s:rpmReadSignature 函数执行失败:%s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr "%s:headerRead 函数执行失败:%s\n"
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr "无法对 RPM v3 版本的软件包签名\n"
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr "%s 已经包含了相同的签名,跳过\n"
+
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
-msgstr ""
+msgstr "%s:rpmWriteSignature 失败:%s\n"
+
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s:writeLead 失败:%s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr "替换 %s 失败:%s\n"
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s:读取 manifest 文件失败:%s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
-msgstr ""
+msgstr "不验证报头+净负荷签名"
index c04973d601f8d8c1a8580fbe24d95c75954f8b9b..caac85cc43102b2e0cb243e26346c979a57b2da3 100644 (file)
@@ -3,16 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Translators:
-# Cheng-Chia Tseng <pswo10680@gmail.com>, 2011-2012.
-# You-Cheng Hsieh <yochenhsieh@gmail.com>, 2012-2013.
+# Cheng-Chia Tseng <pswo10680@gmail.com>, 2011-2012
+# You-Cheng Hsieh <yochenhsieh@gmail.com>, 2012-2013
 msgid ""
 msgstr ""
 "Project-Id-Version: RPM\n"
 "Report-Msgid-Bugs-To: rpm-maint@lists.rpm.org\n"
-"POT-Creation-Date: 2013-01-31 08:28+0200\n"
-"PO-Revision-Date: 2013-01-24 07:09+0000\n"
-"Last-Translator: You-Cheng Hsieh <yochenhsieh@gmail.com>\n"
-"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/rpm/"
+"POT-Creation-Date: 2018-01-16 11:32+0200\n"
+"PO-Revision-Date: 2017-08-10 07:39+0000\n"
+"Last-Translator: pmatilai <pmatilai@laiskiainen.org>\n"
+"Language-Team: Chinese (Taiwan) (http://www.transifex.com/rpm-team/rpm/"
 "language/zh_TW/)\n"
 "Language: zh_TW\n"
 "MIME-Version: 1.0\n"
@@ -46,487 +46,549 @@ msgstr "此程式允許在遵守 GNU GPL 條款的前提下自由散布\n"
 msgid "creating a pipe for --pipe failed: %m\n"
 msgstr ""
 
-#: cliutils.c:63
+#: cliutils.c:62
 #, c-format
 msgid "exec failed\n"
 msgstr "執行失敗\n"
 
-#: rpm2cpio.c:63
+#: rpm2archive.c:91 rpm2cpio.c:68
 #, c-format
 msgid "argument is not an RPM package\n"
-msgstr "引數不是 RPM 套件\n"
+msgstr "引數不是 RPM 軟體包\n"
 
-#: rpm2cpio.c:68
+#: rpm2archive.c:96 rpm2cpio.c:73
 #, c-format
 msgid "error reading header from package\n"
-msgstr "讀取套件的表頭資訊時發生錯誤\n"
+msgstr "讀取軟體包的表頭資訊時發生錯誤\n"
 
-#: rpm2cpio.c:83
+#: rpm2archive.c:111 rpm2cpio.c:88
 #, c-format
 msgid "cannot re-open payload: %s\n"
 msgstr "無法重新開啟酬載:%s\n"
 
-#: rpmqv.c:41
-msgid "Query/Verify package selection options:"
-msgstr "查詢/驗證所選套件的選項:"
-
-#: rpmqv.c:46
-msgid "Query options (with -q or --query):"
-msgstr "查詢選項 (使用 -q 或 --query):"
-
-#: rpmqv.c:51
-msgid "Verify options (with -V or --verify):"
-msgstr "校驗選項 (使用 -V 或 --verify):"
-
-#: rpmqv.c:57
-msgid "Install/Upgrade/Erase options:"
-msgstr "安裝/升級/抹除選項:"
-
-#: rpmqv.c:64 rpmbuild.c:223 rpmdb.c:35 rpmkeys.c:42 rpmsign.c:37 rpmspec.c:48
-#: tools/rpmdeps.c:32 tools/rpmgraph.c:222
-msgid "Common options for all rpm modes and executables:"
-msgstr "用於所有 rpm 模式和可執行檔案的共同選項:"
-
-#: rpmqv.c:121
-msgid "one type of query/verify may be performed at a time"
-msgstr "只有查詢/校驗兩種工作模式能被同時選用"
-
-#: rpmqv.c:125
-msgid "unexpected query flags"
-msgstr "未預期的查詢旗標"
-
-#: rpmqv.c:128
-msgid "unexpected query format"
-msgstr "不可預料的查詢格式"
-
-#: rpmqv.c:131
-msgid "unexpected query source"
-msgstr "不可預料的查詢來源"
-
-#: rpmqv.c:142 rpmdb.c:70 rpmkeys.c:82 rpmsign.c:159
-msgid "only one major mode may be specified"
-msgstr "只能指定一個主要工作模式"
-
-#: rpmqv.c:153
-msgid "only installation and upgrading may be forced"
-msgstr "只有安裝與升級可以強迫執行"
-
-#: rpmqv.c:155
-msgid "files may only be relocated during package installation"
-msgstr "檔案只能在套件安裝時重新分配位置"
-
-#: rpmqv.c:158
-msgid "cannot use --prefix with --relocate or --excludepath"
-msgstr "--prefix 不能和 --relocate 或 --excludepath 同時使用"
-
-#: rpmqv.c:161
-msgid ""
-"--relocate and --excludepath may only be used when installing new packages"
-msgstr "--relocate 和 --excludepath 只能在安裝新軟體時使用"
-
-#: rpmqv.c:164
-msgid "--prefix may only be used when installing new packages"
-msgstr "--prefix 只能在安裝新軟體時使用"
-
-#: rpmqv.c:167
-msgid "arguments to --prefix must begin with a /"
-msgstr "--prefix 的引數必須以「/」開頭"
-
-#: rpmqv.c:170
-msgid ""
-"--hash (-h) may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:174
-msgid "--percent may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:178
-msgid "--replacepkgs may only be specified during package installation"
-msgstr "--replacepkgs 或許只能在套件安裝時指定"
-
-#: rpmqv.c:182
-msgid "--excludedocs may only be specified during package installation"
-msgstr "--excludedocs 只能在套件安裝時指定"
-
-#: rpmqv.c:186
-msgid "--includedocs may only be specified during package installation"
-msgstr "--includedocs 只能在套件安裝時指定"
-
-#: rpmqv.c:190
-msgid "only one of --excludedocs and --includedocs may be specified"
-msgstr "--excludedocs 和 --includedocs 兩個選項中只能指定一個"
-
-#: rpmqv.c:194
-msgid "--ignorearch may only be specified during package installation"
-msgstr "--ignorearch 只能在套件安裝時指定"
-
-#: rpmqv.c:198
-msgid "--ignoreos may only be specified during package installation"
-msgstr "--ignoreos 只能在套件安裝時指定"
-
-#: rpmqv.c:203
-msgid "--ignoresize may only be specified during package installation"
-msgstr "--ignoresize 只能在套件安裝時指定"
-
-#: rpmqv.c:207
-msgid "--allmatches may only be specified during package erasure"
-msgstr "--allmatches 只能在套件抹除時指定"
-
-#: rpmqv.c:211
-msgid "--allfiles may only be specified during package installation"
-msgstr "--allfiles 只能在套件安裝時指定"
-
-#: rpmqv.c:216
-msgid "--justdb may only be specified during package installation and erasure"
-msgstr "--justdb 只能在套件安裝和抹除時指定"
-
-#: rpmqv.c:221
-msgid ""
-"script disabling options may only be specified during package installation "
-"and erasure"
-msgstr "與指令稿停用有關的選項只能在套件安裝和抹除時指定"
-
-#: rpmqv.c:226
-msgid ""
-"trigger disabling options may only be specified during package installation "
-"and erasure"
-msgstr "與觸發停用有關的選項只能在套件安裝和抹除時指定"
-
-#: rpmqv.c:230
-msgid ""
-"--nodeps may only be specified during package installation, erasure, and "
-"verification"
-msgstr ""
-
-#: rpmqv.c:234
-msgid "--test may only be specified during package installation and erasure"
-msgstr ""
-
-#: rpmqv.c:239 rpmbuild.c:549
-msgid "arguments to --root (-r) must begin with a /"
-msgstr "--root (-r) 的引數必須以「/」開頭"
-
-#: rpmqv.c:256
-msgid "no packages given for erase"
-msgstr "沒有指定要抹除的套件名稱"
-
-#: rpmqv.c:290
-msgid "no packages given for install"
-msgstr "沒有指定要安裝的套件名稱"
-
-#: rpmqv.c:302 rpmspec.c:79
-msgid "no arguments given for query"
-msgstr "沒有給定查詢引數"
-
-#: rpmqv.c:314
-msgid "no arguments given for verify"
-msgstr "沒有給定校驗引數"
-
-#: rpmbuild.c:99
+#: rpmbuild.c:114
 #, c-format
 msgid "buildroot already specified, ignoring %s\n"
 msgstr "buildroot 已被指定,忽略 %s\n"
 
-#: rpmbuild.c:120
+#: rpmbuild.c:139
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <specfile>"
 msgstr "從 <specfile> 透過 %prep (解包源碼並套用修補程式) 來建置"
 
-#: rpmbuild.c:121 rpmbuild.c:124 rpmbuild.c:127 rpmbuild.c:130 rpmbuild.c:133
-#: rpmbuild.c:136 rpmbuild.c:139
+#: rpmbuild.c:140 rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152
+#: rpmbuild.c:155 rpmbuild.c:158
 msgid "<specfile>"
 msgstr "<specfile>"
 
-#: rpmbuild.c:123
+#: rpmbuild.c:142
 msgid "build through %build (%prep, then compile) from <specfile>"
 msgstr "從 <specfile> 透過 %build (%prep,然後編譯) 來建置"
 
-#: rpmbuild.c:126
+#: rpmbuild.c:145
 msgid "build through %install (%prep, %build, then install) from <specfile>"
 msgstr "從 <specfile> 透過 %install (%prep,%build,然後安裝) 來建置"
 
-#: rpmbuild.c:129
+#: rpmbuild.c:148
 #, c-format
 msgid "verify %files section from <specfile>"
 msgstr "從 <specfile> 驗證 %files 區段"
 
-#: rpmbuild.c:132
+#: rpmbuild.c:151
 msgid "build source and binary packages from <specfile>"
-msgstr "根據 <specfile> 建置源碼套件與二進位套件"
+msgstr "根據 <specfile> 建置源碼軟體包與二進位軟體包"
 
-#: rpmbuild.c:135
+#: rpmbuild.c:154
 msgid "build binary package only from <specfile>"
-msgstr "根據 <specfile> 只建置二進位套件"
+msgstr "根據 <specfile> 只建置二進位軟體包"
 
-#: rpmbuild.c:138
+#: rpmbuild.c:157
 msgid "build source package only from <specfile>"
-msgstr "根據 <specfile> 只建置源碼套件"
+msgstr "根據 <specfile> 只建置源碼軟體包"
 
-#: rpmbuild.c:142
+#: rpmbuild.c:161
+#, c-format
+msgid ""
+"build through %prep (unpack sources and apply patches) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:162 rpmbuild.c:165 rpmbuild.c:168 rpmbuild.c:171 rpmbuild.c:174
+#: rpmbuild.c:177 rpmbuild.c:180 rpmbuild.c:206 rpmbuild.c:209
+msgid "<source package>"
+msgstr "<source package>"
+
+#: rpmbuild.c:164
+msgid "build through %build (%prep, then compile) from <source package>"
+msgstr ""
+
+#: rpmbuild.c:167 rpmbuild.c:208
+msgid ""
+"build through %install (%prep, %build, then install) from <source package>"
+msgstr "從 <source package> 透過 %install (%prep,%build,然後安裝) 來建置"
+
+#: rpmbuild.c:170
+#, c-format
+msgid "verify %files section from <source package>"
+msgstr ""
+
+#: rpmbuild.c:173
+msgid "build source and binary packages from <source package>"
+msgstr ""
+
+#: rpmbuild.c:176
+msgid "build binary package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:179
+msgid "build source package only from <source package>"
+msgstr ""
+
+#: rpmbuild.c:183
 #, c-format
 msgid "build through %prep (unpack sources and apply patches) from <tarball>"
 msgstr "從 <tarball> 透過 %prep (解包源碼和套用修補檔) 來建置"
 
-#: rpmbuild.c:143 rpmbuild.c:146 rpmbuild.c:149 rpmbuild.c:152 rpmbuild.c:155
-#: rpmbuild.c:158 rpmbuild.c:161
+#: rpmbuild.c:184 rpmbuild.c:187 rpmbuild.c:190 rpmbuild.c:193 rpmbuild.c:196
+#: rpmbuild.c:199 rpmbuild.c:202
 msgid "<tarball>"
 msgstr "<tarball>"
 
-#: rpmbuild.c:145
+#: rpmbuild.c:186
 msgid "build through %build (%prep, then compile) from <tarball>"
 msgstr "從 <tarball> 透過 %build (%prep,然後編譯) 來建置"
 
-#: rpmbuild.c:148
+#: rpmbuild.c:189
 msgid "build through %install (%prep, %build, then install) from <tarball>"
 msgstr "從 <tarball> 透過 %install (%prep,%build,然後安裝) 來建置"
 
-#: rpmbuild.c:151
+#: rpmbuild.c:192
 #, c-format
 msgid "verify %files section from <tarball>"
 msgstr "從 <tarball> 驗證 %files 區段"
 
-#: rpmbuild.c:154
+#: rpmbuild.c:195
 msgid "build source and binary packages from <tarball>"
-msgstr "從 <tarball> 中建置源碼套件與二進位套件"
+msgstr "從 <tarball> 中建置源碼軟體包與二進位軟體包"
 
-#: rpmbuild.c:157
+#: rpmbuild.c:198
 msgid "build binary package only from <tarball>"
-msgstr "從 <tarball> 中只建置二進位套件"
+msgstr "從 <tarball> 中只建置二進位軟體包"
 
-#: rpmbuild.c:160
+#: rpmbuild.c:201
 msgid "build source package only from <tarball>"
-msgstr "從 <tarball> 中只建置源碼套件"
+msgstr "從 <tarball> 中只建置源碼軟體包"
 
-#: rpmbuild.c:164
+#: rpmbuild.c:205
 msgid "build binary package from <source package>"
-msgstr "從 <source package> 中建置二進位套件"
-
-#: rpmbuild.c:165 rpmbuild.c:168
-msgid "<source package>"
-msgstr "<source package>"
-
-#: rpmbuild.c:167
-msgid ""
-"build through %install (%prep, %build, then install) from <source package>"
-msgstr "從 <source package> 透過 %install (%prep,%build,然後安裝) 來建置"
+msgstr "從 <source package> 中建置二進位軟體包"
 
-#: rpmbuild.c:171
+#: rpmbuild.c:212
 msgid "override build root"
 msgstr "強制覆寫建置根目錄"
 
-#: rpmbuild.c:173
+#: rpmbuild.c:214
+msgid "run build in current directory"
+msgstr ""
+
+#: rpmbuild.c:216
 msgid "remove build tree when done"
 msgstr "完成後移除建置樹"
 
-#: rpmbuild.c:175
+#: rpmbuild.c:218
 msgid "ignore ExcludeArch: directives from spec file"
 msgstr "忽略 ExcludeArch:根據規格檔的指示"
 
-#: rpmbuild.c:177
+#: rpmbuild.c:220
 msgid "debug file state machine"
 msgstr "除錯檔案狀態機器"
 
-#: rpmbuild.c:179
+#: rpmbuild.c:222
 msgid "do not execute any stages of the build"
 msgstr "不執行建置程序裡的任何步驟"
 
-#: rpmbuild.c:181
+#: rpmbuild.c:224
 msgid "do not verify build dependencies"
 msgstr "不校驗建置相依關係"
 
-#: rpmbuild.c:183
+#: rpmbuild.c:226
 msgid "generate package header(s) compatible with (legacy) rpm v3 packaging"
 msgstr ""
 
-#: rpmbuild.c:187
+#: rpmbuild.c:230
 #, c-format
 msgid "do not execute %clean stage of the build"
 msgstr ""
 
-#: rpmbuild.c:189
+#: rpmbuild.c:232
+#, c-format
+msgid "do not execute %prep stage of the build"
+msgstr ""
+
+#: rpmbuild.c:234
 #, c-format
 msgid "do not execute %check stage of the build"
 msgstr ""
 
-#: rpmbuild.c:192
+#: rpmbuild.c:237
 msgid "do not accept i18N msgstr's from specfile"
 msgstr "不接受來自規格檔的 i18N msgstr"
 
-#: rpmbuild.c:194
+#: rpmbuild.c:239
 msgid "remove sources when done"
 msgstr "完成後移除源碼檔案"
 
-#: rpmbuild.c:196
+#: rpmbuild.c:241
 msgid "remove specfile when done"
 msgstr "完成後移除規格檔"
 
-#: rpmbuild.c:198
+#: rpmbuild.c:243
 msgid "skip straight to specified stage (only for c,i)"
 msgstr "直接跳到指定的階段 (只有用於 c,i)"
 
-#: rpmbuild.c:200 rpmspec.c:34
+#: rpmbuild.c:245
 msgid "override target platform"
 msgstr "無視目標平臺"
 
-#: rpmbuild.c:217
+#: rpmbuild.c:262
 msgid "Build options with [ <specfile> | <tarball> | <source package> ]:"
 msgstr "組建選項中使用 [ <specfile> | <tarball> | <source package> ]:"
 
-#: rpmbuild.c:237
+#: rpmbuild.c:268 rpmdb.c:40 rpmkeys.c:38 rpmqv.c:63 rpmsign.c:51 rpmspec.c:47
+#: tools/rpmdeps.c:43 tools/rpmgraph.c:221
+msgid "Common options for all rpm modes and executables:"
+msgstr "用於所有 rpm 模式和可執行檔案的共同選項:"
+
+#: rpmbuild.c:282
 msgid "Failed build dependencies:\n"
 msgstr "相依性建置失敗:\n"
 
-#: rpmbuild.c:255
+#: rpmbuild.c:300
 #, c-format
 msgid "Unable to open spec file %s: %s\n"
 msgstr "無法開啟 %s 規格檔:%s\n"
 
-#: rpmbuild.c:317
+#: rpmbuild.c:363
 #, c-format
 msgid "Failed to open tar pipe: %m\n"
 msgstr "無法開啟 tar 導管:%m\n"
 
-#: rpmbuild.c:336
+#: rpmbuild.c:378
+#, c-format
+msgid "Found more than one spec file in %s\n"
+msgstr ""
+
+#: rpmbuild.c:389
 #, c-format
 msgid "Failed to read spec file from %s\n"
 msgstr "無法從 %s 讀取規格檔\n"
 
-#: rpmbuild.c:348
+#: rpmbuild.c:401
 #, c-format
 msgid "Failed to rename %s to %s: %m\n"
 msgstr "無法將 %s 重新命名為 %s:%m\n"
 
-#: rpmbuild.c:419
+#: rpmbuild.c:479
 #, c-format
 msgid "failed to stat %s: %m\n"
 msgstr "無法檢視 %s 的狀態:%m\n"
 
-#: rpmbuild.c:423
+#: rpmbuild.c:483
 #, c-format
 msgid "File %s is not a regular file.\n"
 msgstr "%s 不是通常的檔案。\n"
 
-#: rpmbuild.c:430
+#: rpmbuild.c:490
 #, c-format
 msgid "File %s does not appear to be a specfile.\n"
 msgstr "%s 似乎不是規格檔。\n"
 
-#: rpmbuild.c:496
+#: rpmbuild.c:556
 #, c-format
 msgid "Building target platforms: %s\n"
 msgstr "建置目標平台:%s\n"
 
-#: rpmbuild.c:504
+#: rpmbuild.c:564
 #, c-format
 msgid "Building for target %s\n"
 msgstr "建置目標 %s\n"
 
-#: rpmdb.c:22
+#: rpmbuild.c:619 rpmqv.c:241
+msgid "arguments to --root (-r) must begin with a /"
+msgstr "--root (-r) 的引數必須以「/」開頭"
+
+#: rpmdb.c:21
 msgid "initialize database"
 msgstr "初始化資料庫"
 
-#: rpmdb.c:24
+#: rpmdb.c:23
 msgid "rebuild database inverted lists from installed package headers"
-msgstr "從安裝的套件表頭重建資料庫的反相清單"
+msgstr "從安裝的軟體包表頭重建資料庫的反相清單"
 
-#: rpmdb.c:27
+#: rpmdb.c:26
 msgid "verify database files"
 msgstr "驗證資料庫檔案"
 
-#: rpmdb.c:33
+#: rpmdb.c:28
+msgid "export database to stdout header list"
+msgstr ""
+
+#: rpmdb.c:31
+msgid "import database from stdin header list"
+msgstr ""
+
+#: rpmdb.c:38
 msgid "Database options:"
 msgstr "資料庫選項:"
 
-#: rpmkeys.c:24
+#: rpmdb.c:126 rpmkeys.c:82 rpmqv.c:144 rpmsign.c:185
+msgid "only one major mode may be specified"
+msgstr "只能指定一個主要工作模式"
+
+#: rpmkeys.c:20
 msgid "verify package signature(s)"
-msgstr "校驗套件簽署"
+msgstr "校驗軟體包簽署"
 
-#: rpmkeys.c:26
+#: rpmkeys.c:22
 msgid "import an armored public key"
 msgstr "匯入一個受保護的公鑰"
 
-#: rpmkeys.c:28
+#: rpmkeys.c:24
 msgid "don't import, but tell if it would work or not"
 msgstr ""
 
-#: rpmkeys.c:31 rpmkeys.c:33
+#: rpmkeys.c:27 rpmkeys.c:29
 msgid "list keys from RPM keyring"
 msgstr "列出 RPM 鑰匙圈的金鑰"
 
-#: rpmkeys.c:40
+#: rpmkeys.c:36
 msgid "Keyring options:"
 msgstr "鑰匙圈選項:"
 
-#: rpmkeys.c:64 rpmsign.c:144
+#: rpmkeys.c:64 rpmsign.c:161
 msgid "no arguments given"
 msgstr "沒有指定引數"
 
-#: rpmsign.c:25
+#: rpmqv.c:40
+msgid "Query/Verify package selection options:"
+msgstr "查詢/驗證所選軟體包的選項:"
+
+#: rpmqv.c:45
+msgid "Query options (with -q or --query):"
+msgstr "查詢選項 (使用 -q 或 --query):"
+
+#: rpmqv.c:50
+msgid "Verify options (with -V or --verify):"
+msgstr "校驗選項 (使用 -V 或 --verify):"
+
+#: rpmqv.c:56
+msgid "Install/Upgrade/Erase options:"
+msgstr "安裝/升級/抹除選項:"
+
+#: rpmqv.c:122
+msgid "one type of query/verify may be performed at a time"
+msgstr "只有查詢/校驗兩種工作模式能被同時選用"
+
+#: rpmqv.c:126
+msgid "unexpected query flags"
+msgstr "未預期的查詢旗標"
+
+#: rpmqv.c:129
+msgid "unexpected query format"
+msgstr "不可預料的查詢格式"
+
+#: rpmqv.c:132
+msgid "unexpected query source"
+msgstr "不可預料的查詢來源"
+
+#: rpmqv.c:155
+msgid "only installation and upgrading may be forced"
+msgstr "只有安裝與升級可以強迫執行"
+
+#: rpmqv.c:157
+msgid "files may only be relocated during package installation"
+msgstr "檔案只能在軟體包安裝時重新分配位置"
+
+#: rpmqv.c:160
+msgid "cannot use --prefix with --relocate or --excludepath"
+msgstr "--prefix 不能和 --relocate 或 --excludepath 同時使用"
+
+#: rpmqv.c:163
+msgid ""
+"--relocate and --excludepath may only be used when installing new packages"
+msgstr "--relocate 和 --excludepath 只能在安裝新軟體時使用"
+
+#: rpmqv.c:166
+msgid "--prefix may only be used when installing new packages"
+msgstr "--prefix 只能在安裝新軟體時使用"
+
+#: rpmqv.c:169
+msgid "arguments to --prefix must begin with a /"
+msgstr "--prefix 的引數必須以「/」開頭"
+
+#: rpmqv.c:172
+msgid ""
+"--hash (-h) may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:176
+msgid "--percent may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:180
+msgid "--replacepkgs may only be specified during package installation"
+msgstr "--replacepkgs 或許只能在軟體包安裝時指定"
+
+#: rpmqv.c:184
+msgid "--excludedocs may only be specified during package installation"
+msgstr "--excludedocs 只能在軟體包安裝時指定"
+
+#: rpmqv.c:188
+msgid "--includedocs may only be specified during package installation"
+msgstr "--includedocs 只能在軟體包安裝時指定"
+
+#: rpmqv.c:192
+msgid "only one of --excludedocs and --includedocs may be specified"
+msgstr "--excludedocs 和 --includedocs 兩個選項中只能指定一個"
+
+#: rpmqv.c:196
+msgid "--ignorearch may only be specified during package installation"
+msgstr "--ignorearch 只能在軟體包安裝時指定"
+
+#: rpmqv.c:200
+msgid "--ignoreos may only be specified during package installation"
+msgstr "--ignoreos 只能在軟體包安裝時指定"
+
+#: rpmqv.c:205
+msgid "--ignoresize may only be specified during package installation"
+msgstr "--ignoresize 只能在軟體包安裝時指定"
+
+#: rpmqv.c:209
+msgid "--allmatches may only be specified during package erasure"
+msgstr "--allmatches 只能在軟體包抹除時指定"
+
+#: rpmqv.c:213
+msgid "--allfiles may only be specified during package installation"
+msgstr "--allfiles 只能在軟體包安裝時指定"
+
+#: rpmqv.c:218
+msgid "--justdb may only be specified during package installation and erasure"
+msgstr "--justdb 只能在軟體包安裝和抹除時指定"
+
+#: rpmqv.c:223
+msgid ""
+"script disabling options may only be specified during package installation "
+"and erasure"
+msgstr "與指令稿停用有關的選項只能在軟體包安裝和抹除時指定"
+
+#: rpmqv.c:228
+msgid ""
+"trigger disabling options may only be specified during package installation "
+"and erasure"
+msgstr "與觸發停用有關的選項只能在軟體包安裝和抹除時指定"
+
+#: rpmqv.c:232
+msgid ""
+"--nodeps may only be specified during package installation, erasure, and "
+"verification"
+msgstr ""
+
+#: rpmqv.c:236
+msgid "--test may only be specified during package installation and erasure"
+msgstr ""
+
+#: rpmqv.c:258
+msgid "no packages given for erase"
+msgstr "沒有指定要抹除的軟體包名稱"
+
+#: rpmqv.c:292
+msgid "no packages given for install"
+msgstr "沒有指定要安裝的軟體包名稱"
+
+#: rpmqv.c:304 rpmspec.c:80
+msgid "no arguments given for query"
+msgstr "沒有給定查詢引數"
+
+#: rpmqv.c:318
+msgid "no arguments given for verify"
+msgstr "沒有給定校驗引數"
+
+#: rpmsign.c:30
 msgid "sign package(s)"
-msgstr "簽署套件"
+msgstr "簽署軟體包"
 
-#: rpmsign.c:27
+#: rpmsign.c:32
 msgid "sign package(s) (identical to --addsign)"
-msgstr "簽署套件 (與 --addsign 含義相同)"
+msgstr "簽署軟體包 (與 --addsign 含義相同)"
 
-#: rpmsign.c:29
+#: rpmsign.c:34
 msgid "delete package signatures"
-msgstr "刪除套件簽署"
+msgstr "刪除軟體包簽署"
+
+#: rpmsign.c:37
+msgid "sign package(s) files"
+msgstr ""
+
+#: rpmsign.c:39
+msgid "use file signing key <key>"
+msgstr ""
 
-#: rpmsign.c:35
+#: rpmsign.c:40
+msgid "<key>"
+msgstr ""
+
+#: rpmsign.c:42
+msgid "prompt for file signing key password"
+msgstr ""
+
+#: rpmsign.c:49
 msgid "Signature options:"
 msgstr "簽署選項:"
 
-#: rpmsign.c:85 sign/rpmgensig.c:199
-#, c-format
-msgid "Could not exec %s: %s\n"
-msgstr "無法執行 %s:%s\n"
-
-#: rpmsign.c:108
+#: rpmsign.c:101
 #, c-format
 msgid "You must set \"%%_gpg_name\" in your macro file\n"
 msgstr "您必須在您的巨集檔案中設定「%%_gpg_name」\n"
 
-#: rpmsign.c:113
-msgid "Enter pass phrase: "
-msgstr "輸入通關密語: "
-
-#: rpmsign.c:117
+#: rpmsign.c:114
 #, c-format
-msgid "Pass phrase is good.\n"
-msgstr "通關密語良好。\n"
+msgid ""
+"You must set \"%%_file_signing_key\" in your macro file or on the command "
+"line with --fskpath\n"
+msgstr ""
 
-#: rpmsign.c:123
-#, c-format
-msgid "Pass phrase check failed or gpg key expired\n"
+#: rpmsign.c:166
+msgid "--fskpath may only be specified when signing files"
 msgstr ""
 
-#: rpmspec.c:26
+#: rpmspec.c:25
 msgid "parse spec file(s) to stdout"
 msgstr ""
 
-#: rpmspec.c:28
+#: rpmspec.c:27
 msgid "query spec file(s)"
 msgstr "查詢規格檔"
 
-#: rpmspec.c:30
+#: rpmspec.c:29
 msgid "operate on binary rpms generated by spec (default)"
 msgstr "操作透過規格所建立的二進位 rpm (預設)"
 
-#: rpmspec.c:32
+#: rpmspec.c:31
+msgid "operate on binary rpms that would be built from spec"
+msgstr ""
+
+#: rpmspec.c:33
 msgid "operate on source rpm generated by spec"
 msgstr "操作透過規格所建立的源碼 rpm"
 
-#: rpmspec.c:36 lib/poptQV.c:192
+#: rpmspec.c:35 lib/poptQV.c:221
 msgid "use the following query format"
 msgstr "使用以下的查詢格式"
 
-#: rpmspec.c:45
+#: rpmspec.c:44
 msgid "Spec options:"
 msgstr "規格選項:"
 
-#: rpmspec.c:90
+#: rpmspec.c:91
 msgid "no arguments given for parse"
 msgstr ""
 
@@ -535,32 +597,37 @@ msgstr ""
 msgid "Unable to open temp file: %s\n"
 msgstr ""
 
-#: build/build.c:126
+#: build/build.c:125
 #, c-format
 msgid "Unable to open stream: %s\n"
 msgstr ""
 
-#: build/build.c:161
+#: build/build.c:158
 #, c-format
 msgid "Executing(%s): %s\n"
 msgstr "正在執行(%s):%s\n"
 
-#: build/build.c:168
+#: build/build.c:163
 #, c-format
 msgid "Exec of %s failed (%s): %s\n"
 msgstr "執行 %s 失敗 (%s):%s\n"
 
-#: build/build.c:177
+#: build/build.c:172
 #, c-format
 msgid "Error executing scriptlet %s (%s)\n"
 msgstr ""
 
-#: build/build.c:184
+#: build/build.c:178
 #, c-format
 msgid "Bad exit status from %s (%s)\n"
 msgstr "來自 %s 不良的離開狀態 (%s)\n"
 
-#: build/build.c:291
+#: build/build.c:214
+#, c-format
+msgid "setting %s=%s\n"
+msgstr ""
+
+#: build/build.c:299
 msgid ""
 "\n"
 "\n"
@@ -570,235 +637,315 @@ msgstr ""
 "\n"
 "RPM 建置錯誤:\n"
 
-#: build/expression.c:216
+#: build/expression.c:215
 msgid "syntax error while parsing ==\n"
 msgstr "解析 == 時有語法錯誤\n"
 
-#: build/expression.c:246
+#: build/expression.c:245
 msgid "syntax error while parsing &&\n"
 msgstr "解析 && 時有語法錯誤\n"
 
-#: build/expression.c:255
+#: build/expression.c:254
 msgid "syntax error while parsing ||\n"
 msgstr "解析 || 時有語法錯誤\n"
 
-#: build/expression.c:305
+#: build/expression.c:304
 msgid "parse error in expression\n"
 msgstr "表述式解析錯誤\n"
 
-#: build/expression.c:337
+#: build/expression.c:336
 msgid "unmatched (\n"
 msgstr "不符合的 (\n"
 
-#: build/expression.c:369
+#: build/expression.c:368
 msgid "- only on numbers\n"
 msgstr "- 只能用於數字\n"
 
-#: build/expression.c:385
+#: build/expression.c:384
 msgid "! only on numbers\n"
 msgstr "! 只能用於數字\n"
 
-#: build/expression.c:427 build/expression.c:475 build/expression.c:533
-#: build/expression.c:625
+#: build/expression.c:426 build/expression.c:474 build/expression.c:532
+#: build/expression.c:624
 msgid "types must match\n"
 msgstr "類型必須符合\n"
 
-#: build/expression.c:440
+#: build/expression.c:439
 msgid "* / not suported for strings\n"
 msgstr "字串不支援 *、/\n"
 
-#: build/expression.c:491
+#: build/expression.c:490
 msgid "- not suported for strings\n"
 msgstr "字串不支援 -\n"
 
-#: build/expression.c:638
+#: build/expression.c:637
 msgid "&& and || not suported for strings\n"
 msgstr "字串不支援 && 和 ||\n"
 
-#: build/expression.c:671
+#: build/expression.c:669
 msgid "syntax error in expression\n"
 msgstr "表述式中有語法錯誤\n"
 
-#: build/files.c:326 build/files.c:495 build/files.c:709
+#: build/files.c:343 build/files.c:524 build/files.c:743
 #, c-format
 msgid "Missing '(' in %s %s\n"
 msgstr "在 %s %s 中有遺漏的「(」\n"
 
-#: build/files.c:336 build/files.c:631 build/files.c:719 build/files.c:778
+#: build/files.c:353 build/files.c:665 build/files.c:753 build/files.c:812
 #, c-format
 msgid "Missing ')' in %s(%s\n"
 msgstr "在 %s(%s 中有遺漏的「)」\n"
 
-#: build/files.c:361 build/files.c:650
+#: build/files.c:378 build/files.c:684
 #, c-format
 msgid "Invalid %s token: %s\n"
 msgstr "無效的 %s 符記:%s\n"
 
-#: build/files.c:464
+#: build/files.c:490
 #, c-format
-msgid "Missing %s in %s %s\n"
-msgstr "在 %2$s %3$s 中有缺失的 %1$s\n"
+msgid "Missing %s in %s(%s)\n"
+msgstr ""
 
-#: build/files.c:510
+#: build/files.c:539
 #, c-format
 msgid "Non-white space follows %s(): %s\n"
 msgstr "%s() 之後有非空白空格:%s\n"
 
-#: build/files.c:546
+#: build/files.c:579
 #, c-format
 msgid "Bad syntax: %s(%s)\n"
 msgstr "不良語法:%s(%s)\n"
 
-#: build/files.c:555
+#: build/files.c:588
 #, c-format
 msgid "Bad mode spec: %s(%s)\n"
 msgstr "不良模式規格:%s(%s)\n"
 
-#: build/files.c:567
+#: build/files.c:600
 #, c-format
 msgid "Bad dirmode spec: %s(%s)\n"
 msgstr "不良 dirmode 規格:%s(%s)\n"
 
-#: build/files.c:671
+#: build/files.c:705
 #, c-format
 msgid "Unusual locale length: \"%s\" in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:678
+#: build/files.c:712
 #, c-format
 msgid "Duplicate locale %s in %%lang(%s)\n"
 msgstr ""
 
-#: build/files.c:793
+#: build/files.c:827
 #, c-format
 msgid "Invalid capability: %s\n"
 msgstr "無效的功能:%s\n"
 
-#: build/files.c:803
+#: build/files.c:837
 msgid "File capability support not built in\n"
 msgstr "檔案功能支援未內建於\n"
 
-#: build/files.c:852
+#: build/files.c:888
 #, c-format
 msgid "File must begin with \"/\": %s\n"
 msgstr "檔案必須以「/」開頭:%s\n"
 
-#: build/files.c:973
+#: build/files.c:1004
+#, c-format
+msgid "unable to parse %s=%s\n"
+msgstr ""
+
+#: build/files.c:1022
 #, c-format
 msgid "Unknown file digest algorithm %u, falling back to MD5\n"
 msgstr ""
 
-#: build/files.c:1001
+#: build/files.c:1074
 #, c-format
 msgid "File listed twice: %s\n"
 msgstr "曾列出兩次的檔案:%s\n"
 
-#: build/files.c:1123
+#: build/files.c:1196
 #, c-format
 msgid "reading symlink %s failed: %s\n"
 msgstr ""
 
-#: build/files.c:1131
+#: build/files.c:1204
 #, c-format
 msgid "Symlink points to BuildRoot: %s -> %s\n"
 msgstr "指向 BuildRoot 的符號連結:%s -> %s\n"
 
-#: build/files.c:1345
+#: build/files.c:1346
+#, c-format
+msgid "Path is outside buildroot: %s\n"
+msgstr ""
+
+#: build/files.c:1386
 #, c-format
 msgid "Directory not found: %s\n"
 msgstr ""
 
-#: build/files.c:1346
+#: build/files.c:1387 lib/rpminstall.c:449
 #, c-format
 msgid "File not found: %s\n"
 msgstr "找不到檔案:%s\n"
 
-#: build/files.c:1537
+#: build/files.c:1399
+#, c-format
+msgid "Not a directory: %s\n"
+msgstr ""
+
+#: build/files.c:1592
 #, c-format
 msgid "%s: can't load unknown tag (%d).\n"
 msgstr "%s:無法呼叫不明的標籤 (%d)。\n"
 
-#: build/files.c:1543
+#: build/files.c:1598
 #, c-format
 msgid "%s: public key read failed.\n"
 msgstr "%s:公鑰讀入失敗。\n"
 
-#: build/files.c:1547
+#: build/files.c:1602
 #, c-format
 msgid "%s: not an armored public key.\n"
 msgstr "%s:不是一個受保護的公鑰。\n"
 
-#: build/files.c:1556
+#: build/files.c:1611
 #, c-format
 msgid "%s: failed to encode\n"
 msgstr "%s:編碼失敗\n"
 
-#: build/files.c:1601
+#: build/files.c:1657
+msgid "failed symlink"
+msgstr ""
+
+#: build/files.c:1713 build/files.c:1716
+#, c-format
+msgid "Duplicate build-id, stat %s: %m\n"
+msgstr ""
+
+#: build/files.c:1723
+#, c-format
+msgid "Duplicate build-ids %s and %s\n"
+msgstr ""
+
+#: build/files.c:1755
+msgid "_build_id_links macro not set, assuming 'compat'\n"
+msgstr ""
+
+#: build/files.c:1768
+#, c-format
+msgid "_build_id_links macro set to unknown value '%s'\n"
+msgstr ""
+
+#: build/files.c:1854
+#, c-format
+msgid "error reading build-id in %s: %s\n"
+msgstr ""
+
+#: build/files.c:1858
+#, c-format
+msgid "Missing build-id in %s\n"
+msgstr ""
+
+#: build/files.c:1863
+#, c-format
+msgid "build-id found in %s too small\n"
+msgstr ""
+
+#: build/files.c:1864
+#, c-format
+msgid "build-id found in %s too large\n"
+msgstr ""
+
+#: build/files.c:1879 rpmio/rpmfileutil.c:606
+msgid "failed to create directory"
+msgstr "無法建立目錄"
+
+#: build/files.c:1897
+msgid "Mixing main ELF and debug files in package"
+msgstr ""
+
+#: build/files.c:2098
 #, c-format
 msgid "File needs leading \"/\": %s\n"
 msgstr "檔案需要以「/」開頭:%s\n"
 
-#: build/files.c:1625
+#: build/files.c:2122
 #, c-format
 msgid "%%dev glob not permitted: %s\n"
 msgstr ""
 
-#: build/files.c:1638
+#: build/files.c:2134
 #, c-format
-msgid "Directory not found by glob: %s\n"
+msgid "Directory not found by glob: %s. Trying without globbing.\n"
 msgstr ""
 
-#: build/files.c:1639 lib/rpminstall.c:426
+#: build/files.c:2136
 #, c-format
-msgid "File not found by glob: %s\n"
-msgstr "透過 glob 解析找不到檔案:%s\n"
+msgid "File not found by glob: %s. Trying without globbing.\n"
+msgstr ""
 
-#: build/files.c:1675
+#: build/files.c:2171
 #, c-format
 msgid "Could not open %%files file %s: %m\n"
 msgstr "無法開啟 %%files 檔案 %s:%m\n"
 
-#: build/files.c:1682
+#: build/files.c:2182
 #, c-format
 msgid "line: %s\n"
 msgstr "列:%s\n"
 
-#: build/files.c:1689
+#: build/files.c:2194
+#, c-format
+msgid "Empty %%files file %s\n"
+msgstr ""
+
+#: build/files.c:2200
 #, c-format
 msgid "Error reading %%files file %s: %m\n"
 msgstr ""
 
-#: build/files.c:1711
+#: build/files.c:2223
 #, c-format
 msgid "illegal _docdir_fmt %s: %s\n"
 msgstr ""
 
-#: build/files.c:1869
+#: build/files.c:2345 lib/rpminstall.c:451
+#, c-format
+msgid "File not found by glob: %s\n"
+msgstr "透過 glob 解析找不到檔案:%s\n"
+
+#: build/files.c:2431
+#, c-format
+msgid "Special file in generated file list: %s\n"
+msgstr ""
+
+#: build/files.c:2455
 #, c-format
 msgid "Can't mix special %s with other forms: %s\n"
 msgstr ""
 
-#: build/files.c:1886
+#: build/files.c:2471
 #, c-format
 msgid "More than one file on a line: %s\n"
 msgstr ""
 
-#: build/files.c:2014
+#: build/files.c:2540
+msgid "Generating build-id links failed\n"
+msgstr ""
+
+#: build/files.c:2657
 #, c-format
 msgid "Bad file: %s: %s\n"
 msgstr "不良檔案:%s:%s\n"
 
-#: build/files.c:2039 build/parsePrep.c:33
-#, c-format
-msgid "Bad owner/group: %s\n"
-msgstr "不良擁有者/群組:%s\n"
-
-#: build/files.c:2073
+#: build/files.c:2725
 #, c-format
 msgid "Checking for unpackaged file(s): %s\n"
 msgstr "正在檢查未打包的檔案:%s\n"
 
-#: build/files.c:2086
+#: build/files.c:2738
 #, c-format
 msgid ""
 "Installed (but unpackaged) file(s) found:\n"
@@ -807,551 +954,608 @@ msgstr ""
 "找到已安裝 (但未打包) 的檔案:\n"
 "%s"
 
-#: build/files.c:2117
+#: build/files.c:2853
+#, c-format
+msgid "%s was mapped to multiple filenames"
+msgstr ""
+
+#: build/files.c:3102
 #, c-format
 msgid "Processing files: %s\n"
 msgstr "正在處理檔案:%s\n"
 
-#: build/files.c:2131
+#: build/files.c:3124
 #, c-format
 msgid "Binaries arch (%d) not matching the package arch (%d).\n"
 msgstr ""
 
-#: build/files.c:2137
+#: build/files.c:3130
 msgid "Arch dependent binaries in noarch package\n"
-msgstr "noarch 套件中有架構依賴二進位檔\n"
+msgstr "noarch 軟體包中有架構依賴二進位檔\n"
 
-#: build/pack.c:50
+#: build/pack.c:91
 #, c-format
 msgid "create archive failed on file %s: %s\n"
 msgstr ""
 
-#: build/pack.c:53
+#: build/pack.c:94
 #, c-format
 msgid "create archive failed: %s\n"
 msgstr ""
 
-#: build/pack.c:80
+#: build/pack.c:121
 #, c-format
 msgid "Could not open %s file: %s\n"
 msgstr ""
 
-#: build/pack.c:96
+#: build/pack.c:138
 #, c-format
 msgid "%s: line: %s\n"
 msgstr "%s: 列:%s\n"
 
-#: build/pack.c:134
-#, c-format
-msgid "Could not canonicalize hostname: %s\n"
-msgstr "無法標準化主機名稱:%s\n"
+#: build/pack.c:168
+msgid "unable to parse SOURCE_DATE_EPOCH\n"
+msgstr ""
 
-#: build/pack.c:198
-#, c-format
-msgid "Unable to write payload to %s: %s\n"
-msgstr "無法寫入酬載到 %s:%s\n"
+#: build/pack.c:191
+msgid "The _buildhost macro is too long\n"
+msgstr ""
 
-#: build/pack.c:206
+#: build/pack.c:198
 #, c-format
-msgid "Unable to read payload from %s: %s\n"
-msgstr "無法從 %s 讀取酬載:%s\n"
+msgid "Could not canonicalize hostname: %s\n"
+msgstr "無法標準化主機名稱:%s\n"
 
-#: build/pack.c:310
+#: build/pack.c:358
 #, c-format
 msgid "Unknown payload compression: %s\n"
 msgstr ""
 
-#: build/pack.c:338
-msgid "Unable to create immutable header region.\n"
-msgstr "無法建立不可變的表頭區域。\n"
-
-#: build/pack.c:351
-msgid "Unable to open temp file.\n"
-msgstr "無法開啟暫時檔案。\n"
-
-#: build/pack.c:358
-msgid "Unable to write temp header\n"
-msgstr "無法寫入臨時表頭\n"
-
-#: build/pack.c:366
-msgid "Bad CSA data\n"
-msgstr "不良 CSA 資料\n"
-
-#: build/pack.c:432
-msgid "Unable to reload signature header.\n"
-msgstr "無法重新載入簽署表頭。\n"
-
-#: build/pack.c:440
-#, c-format
-msgid "Could not open %s: %s\n"
-msgstr "無法開啟 %s:%s\n"
-
-#: build/pack.c:452
+#: build/pack.c:408 sign/rpmgensig.c:285 sign/rpmgensig.c:482
+#: sign/rpmgensig.c:505 sign/rpmgensig.c:577 sign/rpmgensig.c:601
+#: sign/rpmgensig.c:764 sign/rpmgensig.c:799
 #, c-format
-msgid "Unable to write package: %s\n"
-msgstr "無法寫入套件:%s\n"
+msgid "Could not seek in file %s: %s\n"
+msgstr ""
+
+#: build/pack.c:434
+#, fuzzy, c-format
+msgid "Failed to read %jd bytes in file %s: %s\n"
+msgstr "無法從 %s 讀取規格檔\n"
 
-#: build/pack.c:468
+#: build/pack.c:448
+msgid "Unable to create immutable header region\n"
+msgstr ""
+
+#: build/pack.c:453
 #, c-format
-msgid "Unable to open sigtarget %s: %s\n"
-msgstr "無法開啟簽署目標 %s:%s\n"
+msgid "Unable to write header to %s: %s\n"
+msgstr ""
 
-#: build/pack.c:479
+#: build/pack.c:520
 #, c-format
-msgid "Unable to read header from %s: %s\n"
-msgstr "無法讀取 %s 的表頭:%s\n"
+msgid "Could not open %s: %s\n"
+msgstr "無法開啟 %s:%s\n"
 
-#: build/pack.c:489
+#: build/pack.c:527
 #, c-format
-msgid "Unable to write header to %s: %s\n"
-msgstr "無法寫入 %s 的表頭:%s\n"
+msgid "Unable to write package: %s\n"
+msgstr "無法寫入軟體包:%s\n"
 
-#: build/pack.c:523
+#: build/pack.c:611
 #, c-format
 msgid "Wrote: %s\n"
 msgstr "已寫入:%s\n"
 
-#: build/pack.c:542
+#: build/pack.c:630
 #, c-format
 msgid "Executing \"%s\":\n"
 msgstr "正在執行「%s」:\n"
 
-#: build/pack.c:545
+#: build/pack.c:633
 #, c-format
 msgid "Execution of \"%s\" failed.\n"
 msgstr "「%s」執行失敗。\n"
 
-#: build/pack.c:549
+#: build/pack.c:637
 #, c-format
 msgid "Package check \"%s\" failed.\n"
-msgstr "套件檢查「%s」失敗。\n"
+msgstr "軟體包檢查「%s」失敗。\n"
 
-#: build/pack.c:598
+#: build/pack.c:684
 #, c-format
 msgid "Could not generate output filename for package %s: %s\n"
-msgstr "無法產生套件 %s 的檔案名稱輸出:%s\n"
+msgstr "無法產生軟體包 %s 的檔案名稱輸出:%s\n"
 
-#: build/pack.c:615
+#: build/pack.c:701
 #, c-format
 msgid "cannot create %s: %s\n"
 msgstr "無法建立 %s:%s\n"
 
-#: build/parseBuildInstallClean.c:35
+#: build/parseBuildInstallClean.c:35 build/parsePreamble.c:705
 #, c-format
 msgid "line %d: second %s\n"
 msgstr "列 %d:第二個 %s\n"
 
-#: build/parseChangelog.c:114
+#: build/parseChangelog.c:185
 #, c-format
 msgid "bogus date in %%changelog: %s\n"
 msgstr ""
 
-#: build/parseChangelog.c:146
+#: build/parseChangelog.c:218
 #, c-format
 msgid "%%changelog entries must start with *\n"
 msgstr "%%changelog 條目必須以 * 符號開頭\n"
 
-#: build/parseChangelog.c:154
+#: build/parseChangelog.c:226
 #, c-format
 msgid "incomplete %%changelog entry\n"
 msgstr "不完整的 %%changelog 條目\n"
 
-#: build/parseChangelog.c:169
+#: build/parseChangelog.c:237
 #, c-format
 msgid "bad date in %%changelog: %s\n"
 msgstr "%%changelog 中含有不良日期:%s\n"
 
-#: build/parseChangelog.c:174
+#: build/parseChangelog.c:242
 #, c-format
 msgid "%%changelog not in descending chronological order\n"
 msgstr "%%changelog 並非遞減編年順序\n"
 
-#: build/parseChangelog.c:182 build/parseChangelog.c:193
+#: build/parseChangelog.c:254 build/parseChangelog.c:265
 #, c-format
 msgid "missing name in %%changelog\n"
 msgstr "%%changelog 中遺漏名稱\n"
 
-#: build/parseChangelog.c:200
+#: build/parseChangelog.c:272
 #, c-format
 msgid "no description in %%changelog\n"
 msgstr "%%changelog 中沒有描述\n"
 
+#: build/parseChangelog.c:309
+#, c-format
+msgid "line %d: second %%changelog\n"
+msgstr ""
+
 #: build/parseDescription.c:32
 #, c-format
 msgid "line %d: Error parsing %%description: %s\n"
 msgstr "列 %d:解析 %%description 時發生錯誤:%s\n"
 
 #: build/parseDescription.c:45 build/parseFiles.c:46 build/parsePolicies.c:45
-#: build/parseScript.c:232
+#: build/parseScript.c:321
 #, c-format
 msgid "line %d: Bad option %s: %s\n"
 msgstr "列 %d:不良選項 %s:%s\n"
 
 #: build/parseDescription.c:56 build/parseFiles.c:57 build/parsePolicies.c:55
-#: build/parseScript.c:243
+#: build/parseScript.c:332
 #, c-format
 msgid "line %d: Too many names: %s\n"
 msgstr "列 %d:過多名稱:%s\n"
 
-#: build/parseDescription.c:64 build/parseFiles.c:65 build/parsePolicies.c:62
-#: build/parseScript.c:251
-#, c-format
-msgid "line %d: Package does not exist: %s\n"
-msgstr "列 %d:套件不存在:%s\n"
-
-#: build/parseDescription.c:74
-#, c-format
-msgid "line %d: Second description\n"
-msgstr "列 %d:第二個描述\n"
-
 #: build/parseFiles.c:33
 #, c-format
 msgid "line %d: Error parsing %%files: %s\n"
 msgstr "列 %d:解析 %%files 時發生錯誤:%s\n"
 
+#: build/parseFiles.c:73
+#, c-format
+msgid "line %d: multiple %%files for package '%s'\n"
+msgstr ""
+
 #: build/parsePolicies.c:32
 #, c-format
 msgid "line %d: Error parsing %%policies: %s\n"
 msgstr "列 %d:解析 %%policies 發生錯誤:%s\n"
 
-#: build/parsePreamble.c:69
+#: build/parsePreamble.c:71
 #, c-format
 msgid "Error parsing tag field: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:162
+#: build/parsePreamble.c:164
 #, c-format
 msgid "line %d: Bad number: %s\n"
 msgstr "列 %d:錯誤的編號:%s\n"
 
-#: build/parsePreamble.c:168
+#: build/parsePreamble.c:170
 #, c-format
 msgid "line %d: Bad no%s number: %u\n"
 msgstr ""
 
-#: build/parsePreamble.c:231
+#: build/parsePreamble.c:233
 #, c-format
 msgid "line %d: Bad %s number: %s\n"
 msgstr "列 %d:不良的 %s 數字:%s\n"
 
-#: build/parsePreamble.c:245
+#: build/parsePreamble.c:247
 #, c-format
 msgid "%s %d defined multiple times\n"
 msgstr "%s %d 被定義許多次\n"
 
-#: build/parsePreamble.c:290
+#: build/parsePreamble.c:292
 #, c-format
 msgid "Downloading %s to %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:293
+#: build/parsePreamble.c:295
 #, c-format
 msgid "Couldn't download %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:432
+#: build/parsePreamble.c:439
 #, c-format
 msgid "Architecture is excluded: %s\n"
 msgstr "被排除的架構:%s\n"
 
-#: build/parsePreamble.c:437
+#: build/parsePreamble.c:444
 #, c-format
 msgid "Architecture is not included: %s\n"
 msgstr "未包含的架構:%s\n"
 
-#: build/parsePreamble.c:442
+#: build/parsePreamble.c:449
 #, c-format
 msgid "OS is excluded: %s\n"
 msgstr "被排除的作業系統:%s\n"
 
-#: build/parsePreamble.c:447
+#: build/parsePreamble.c:454
 #, c-format
 msgid "OS is not included: %s\n"
 msgstr "未包含的作業系統:%s\n"
 
-#: build/parsePreamble.c:473
+#: build/parsePreamble.c:480
 #, c-format
 msgid "%s field must be present in package: %s\n"
-msgstr "%s 欄位必須出現於套件中:%s\n"
+msgstr "%s 欄位必須出現於軟體包中:%s\n"
 
-#: build/parsePreamble.c:496
+#: build/parsePreamble.c:503
 #, c-format
 msgid "Duplicate %s entries in package: %s\n"
-msgstr "套件中有重複的 %s 條目:%s\n"
+msgstr "軟體包中有重複的 %s 條目:%s\n"
 
-#: build/parsePreamble.c:554
+#: build/parsePreamble.c:568
 #, c-format
 msgid "Unable to open icon %s: %s\n"
 msgstr "無法開啟圖示 %s:%s\n"
 
-#: build/parsePreamble.c:570
+#: build/parsePreamble.c:584
 #, c-format
 msgid "Unable to read icon %s: %s\n"
 msgstr "無法讀取圖示 %s:%s\n"
 
-#: build/parsePreamble.c:580
+#: build/parsePreamble.c:594
 #, c-format
 msgid "Unknown icon type: %s\n"
 msgstr "不明的圖示類型:%s\n"
 
-#: build/parsePreamble.c:594
+#: build/parsePreamble.c:608
 #, c-format
 msgid "line %d: Tag takes single token only: %s\n"
 msgstr "列 %d:標籤只需單一符記:%s\n"
 
-#: build/parsePreamble.c:614
+#: build/parsePreamble.c:616
 #, c-format
-msgid "line %d: Illegal char '%c' in: %s\n"
+msgid "line %d: %s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:617
+#: build/parsePreamble.c:618
 #, c-format
-msgid "line %d: Illegal char in: %s\n"
+msgid "%s in: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:623
+#: build/parsePreamble.c:637
 #, c-format
-msgid "line %d: Illegal sequence \"..\" in: %s\n"
+msgid "Illegal char '%c' (0x%x)"
 msgstr ""
 
-#: build/parsePreamble.c:646
+#: build/parsePreamble.c:643
+msgid "Possible unexpanded macro"
+msgstr ""
+
+#: build/parsePreamble.c:649
+msgid "Illegal sequence \"..\""
+msgstr ""
+
+#: build/parsePreamble.c:737
 #, c-format
 msgid "line %d: Malformed tag: %s\n"
 msgstr "列 %d:格式不良的標籤:%s\n"
 
-#: build/parsePreamble.c:654
+#: build/parsePreamble.c:745
 #, c-format
 msgid "line %d: Empty tag: %s\n"
 msgstr "列 %d:空的標籤:%s\n"
 
-#: build/parsePreamble.c:715
+#: build/parsePreamble.c:806
 #, c-format
 msgid "line %d: Prefixes must not end with \"/\": %s\n"
 msgstr "列 %d:前綴不能以「/」結尾:%s\n"
 
-#: build/parsePreamble.c:727
+#: build/parsePreamble.c:818
 #, c-format
 msgid "line %d: Docdir must begin with '/': %s\n"
 msgstr "列 %d:Docdir 必須以「/」開頭:%s\n"
 
-#: build/parsePreamble.c:740
+#: build/parsePreamble.c:831
 #, c-format
 msgid "line %d: Epoch field must be an unsigned number: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:777
+#: build/parsePreamble.c:868
 #, c-format
 msgid "line %d: Bad %s: qualifiers: %s\n"
 msgstr "列 %d:不良 %s:修飾詞:%s\n"
 
-#: build/parsePreamble.c:804
+#: build/parsePreamble.c:902
 #, c-format
 msgid "line %d: Bad BuildArchitecture format: %s\n"
 msgstr "列 %d:不良 BuildArchitecture 格式:%s\n"
 
-#: build/parsePreamble.c:814
+#: build/parsePreamble.c:909
+#, c-format
+msgid "line %d: Duplicate BuildArch entry: %s\n"
+msgstr ""
+
+#: build/parsePreamble.c:919
 #, c-format
 msgid "line %d: Only noarch subpackages are supported: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:830
+#: build/parsePreamble.c:934
 #, c-format
 msgid "Internal error: Bogus tag %d\n"
 msgstr "內部錯誤:假造的標籤 %d\n"
 
-#: build/parsePreamble.c:915
+#: build/parsePreamble.c:1032
 #, c-format
 msgid "line %d: %s is deprecated: %s\n"
 msgstr ""
 
-#: build/parsePreamble.c:978
+#: build/parsePreamble.c:1093
 #, c-format
 msgid "Bad package specification: %s\n"
-msgstr "不良套件規格:%s\n"
+msgstr "不良軟體包規格:%s\n"
 
-#: build/parsePreamble.c:984
-#, c-format
-msgid "Package already exists: %s\n"
-msgstr "套件已經存在:%s\n"
+#: build/parsePreamble.c:1141
+msgid "Binary rpm package found. Expected spec file!\n"
+msgstr ""
 
-#: build/parsePreamble.c:1015
+#: build/parsePreamble.c:1144
 #, c-format
 msgid "line %d: Unknown tag: %s\n"
 msgstr "列 %d:未知標籤:%s\n"
 
-#: build/parsePreamble.c:1047
+#: build/parsePreamble.c:1176
 #, c-format
 msgid "%%{buildroot} couldn't be empty\n"
 msgstr ""
 
-#: build/parsePreamble.c:1051
+#: build/parsePreamble.c:1180
 #, c-format
 msgid "%%{buildroot} can not be \"/\"\n"
 msgstr ""
 
-#: build/parsePrep.c:28
+#: build/parsePrep.c:29
 #, c-format
 msgid "Bad source: %s: %s\n"
 msgstr "不良源碼:%s:%s\n"
 
-#: build/parsePrep.c:73
+#: build/parsePrep.c:74
 #, c-format
 msgid "No patch number %u\n"
 msgstr "沒有修補編號 %u\n"
 
-#: build/parsePrep.c:75
+#: build/parsePrep.c:76
 #, c-format
 msgid "%%patch without corresponding \"Patch:\" tag\n"
 msgstr ""
 
-#: build/parsePrep.c:152
+#: build/parsePrep.c:164
 #, c-format
 msgid "No source number %u\n"
 msgstr "沒有源碼編號 %u\n"
 
-#: build/parsePrep.c:154
+#: build/parsePrep.c:166
 msgid "No \"Source:\" tag in the spec file\n"
 msgstr "規格檔內無「Source:」標籤\n"
 
-#: build/parsePrep.c:261
+#: build/parsePrep.c:300
 #, c-format
 msgid "Error parsing %%setup: %s\n"
 msgstr "解析 %%setup 時發生錯誤:%s\n"
 
-#: build/parsePrep.c:272
+#: build/parsePrep.c:311
 #, c-format
 msgid "line %d: Bad arg to %%setup: %s\n"
 msgstr "列 %d:%%setup 中出現不良引數:%s\n"
 
-#: build/parsePrep.c:287
+#: build/parsePrep.c:326
 #, c-format
 msgid "line %d: Bad %%setup option %s: %s\n"
 msgstr "列 %d:不良 %%setup 選項 %s:%s\n"
 
-#: build/parsePrep.c:446
+#: build/parsePrep.c:495
 #, c-format
 msgid "%s: %s: %s\n"
 msgstr "%s: %s: %s\n"
 
-#: build/parsePrep.c:459
+#: build/parsePrep.c:508
 #, c-format
 msgid "Invalid patch number %s: %s\n"
 msgstr "無效的修補編號 %s:%s\n"
 
-#: build/parsePrep.c:486
+#: build/parsePrep.c:535
 #, c-format
 msgid "line %d: second %%prep\n"
 msgstr "列 %d:第二個 %%prep\n"
 
-#: build/parseReqs.c:112
+#: build/parseReqs.c:52
 msgid "Dependency tokens must begin with alpha-numeric, '_' or '/'"
 msgstr ""
 
-#: build/parseReqs.c:137
+#: build/parseReqs.c:57
 msgid "Versioned file name not permitted"
 msgstr ""
 
-#: build/parseReqs.c:154
-msgid "Version required"
+#: build/parseReqs.c:222
+msgid "No rich dependencies allowed for this type"
 msgstr ""
 
-#: build/parseReqs.c:165
+#: build/parseReqs.c:232 build/parseReqs.c:307
 msgid "invalid dependency"
 msgstr ""
 
-#: build/parseReqs.c:181
+#: build/parseReqs.c:267 lib/rpmds.c:1470
+msgid "Version required"
+msgstr ""
+
+#: build/parseReqs.c:283
+msgid "Only absolute paths are allowed in file triggers"
+msgstr ""
+
+#: build/parseReqs.c:296
+msgid "Trigger fired by the same package is already defined in spec file"
+msgstr ""
+
+#: build/parseReqs.c:324
 #, c-format
 msgid "line %d: %s: %s\n"
 msgstr ""
 
-#: build/parseScript.c:192
+#: build/parseScript.c:263
 #, c-format
 msgid "line %d: triggers must have --: %s\n"
 msgstr "列 %d:觸發器必須包含 --:%s\n"
 
-#: build/parseScript.c:202 build/parseScript.c:265
+#: build/parseScript.c:271
+#, c-format
+msgid "line %d: missing trigger condition: %s\n"
+msgstr ""
+
+#: build/parseScript.c:281 build/parseScript.c:351
 #, c-format
 msgid "line %d: Error parsing %s: %s\n"
 msgstr "列 %d:解析 %s 時發生錯誤:%s\n"
 
-#: build/parseScript.c:214
+#: build/parseScript.c:293
 #, c-format
 msgid "line %d: internal script must end with '>': %s\n"
 msgstr "列 %d:內部指令稿必須以「>」結尾:%s\n"
 
-#: build/parseScript.c:220
+#: build/parseScript.c:299
 #, c-format
 msgid "line %d: script program must begin with '/': %s\n"
 msgstr "列 %d:指令稿程式必須以「/」開頭:%s\n"
 
-#: build/parseScript.c:258
+#: build/parseScript.c:313
+#, c-format
+msgid "line %d: Priorities are allowed only for file triggers : %s\n"
+msgstr ""
+
+#: build/parseScript.c:344
 #, c-format
 msgid "line %d: Second %s\n"
 msgstr "列 %d:第二個 %s\n"
 
-#: build/parseScript.c:301
+#: build/parseScript.c:386
 #, c-format
 msgid "line %d: unsupported internal script: %s\n"
 msgstr "列 %d:不支援的內部指令稿:%s\n"
 
-#: build/parseScript.c:318
+#: build/parseScript.c:404
+#, c-format
+msgid "line %d: file trigger condition must begin with '/': %s"
+msgstr ""
+
+#: build/parseScript.c:410
 #, c-format
 msgid "line %d: interpreter arguments not allowed in triggers: %s\n"
 msgstr ""
 
-#: build/parseSpec.c:209
+#: build/parseSpec.c:190
 #, c-format
 msgid "line %d: %s\n"
 msgstr "列 %d:%s\n"
 
-#: build/parseSpec.c:252
+#: build/parseSpec.c:212
+#, c-format
+msgid "Macro expanded in comment on line %d: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:317
 #, c-format
 msgid "Unable to open %s: %s\n"
 msgstr "無法開啟 %s:%s\n"
 
-#: build/parseSpec.c:286
+#: build/parseSpec.c:351
 #, c-format
 msgid "%s:%d: Argument expected for %s\n"
 msgstr ""
 
-#: build/parseSpec.c:308
+#: build/parseSpec.c:373
 #, c-format
 msgid "line %d: Unclosed %%if\n"
 msgstr ""
 
-#: build/parseSpec.c:313
+#: build/parseSpec.c:378
 #, c-format
 msgid "line %d: unclosed macro or bad line continuation\n"
 msgstr ""
 
-#: build/parseSpec.c:355
+#: build/parseSpec.c:420
 #, c-format
 msgid "%s:%d: bad %%if condition\n"
 msgstr ""
 
-#: build/parseSpec.c:363
+#: build/parseSpec.c:428
 #, c-format
 msgid "%s:%d: Got a %%else with no %%if\n"
 msgstr "%s:%d:有個 %%else 沒有對應 %%if\n"
 
-#: build/parseSpec.c:374
+#: build/parseSpec.c:439
 #, c-format
 msgid "%s:%d: Got a %%endif with no %%if\n"
 msgstr "%s:%d:有個 %%endif 沒有對應 %%if\n"
 
-#: build/parseSpec.c:392
+#: build/parseSpec.c:460
 #, c-format
 msgid "%s:%d: malformed %%include statement\n"
 msgstr ""
 
-#: build/parseSpec.c:669
+#: build/parseSpec.c:645
+#, c-format
+msgid "encoding %s not supported by system\n"
+msgstr ""
+
+#: build/parseSpec.c:674
+#, c-format
+msgid "Package %s: invalid %s encoding in %s: %s - %s\n"
+msgstr ""
+
+#: build/parseSpec.c:710
+#, c-format
+msgid "line %d: %%end doesn't take any arguments: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:717
+#, c-format
+msgid "line %d: %%end not expected here, no section to close: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:733
+#, c-format
+msgid "line %d doesn't belong to any section: %s\n"
+msgstr ""
+
+#: build/parseSpec.c:878
 msgid "No compatible architectures found for build\n"
 msgstr "找不到可供建置的相容架構\n"
 
-#: build/parseSpec.c:703
+#: build/parseSpec.c:912
 #, c-format
 msgid "Package has no %%description: %s\n"
-msgstr "套件沒有 %%description:%s\n"
+msgstr "軟體包沒有 %%description:%s\n"
 
 #: build/policies.c:87
 #, c-format
@@ -1419,450 +1623,561 @@ msgstr ""
 msgid "Processing policies: %s\n"
 msgstr ""
 
-#: build/rpmfc.c:108
+#: build/rpmfc.c:160
 #, c-format
 msgid "Ignoring invalid regex %s\n"
 msgstr ""
 
-#: build/rpmfc.c:204
+#: build/rpmfc.c:266
 #, c-format
 msgid "Couldn't create pipe for %s: %m\n"
 msgstr "無法為 %s 建立導管:%m\n"
 
-#: build/rpmfc.c:229
+#: build/rpmfc.c:289
 #, c-format
 msgid "Couldn't exec %s: %s\n"
 msgstr "無法執行 %s:%s\n"
 
-#: build/rpmfc.c:234 lib/rpmscript.c:255
+#: build/rpmfc.c:294 lib/rpmscript.c:320
 #, c-format
 msgid "Couldn't fork %s: %s\n"
 msgstr "無法分支 %s:%s\n"
 
-#: build/rpmfc.c:317
+#: build/rpmfc.c:377
 #, c-format
 msgid "%s failed: %x\n"
 msgstr "%s 失敗:%x\n"
 
-#: build/rpmfc.c:321
+#: build/rpmfc.c:381
 #, c-format
 msgid "failed to write all data to %s: %s\n"
 msgstr "無法寫入所有資料至 %s:%s\n"
 
-#: build/rpmfc.c:831
-#, c-format
-msgid "Conversion of %s to long integer failed.\n"
-msgstr "%s 轉換至 long integer 失敗。\n"
-
-#: build/rpmfc.c:909
+#: build/rpmfc.c:1032
 msgid "Empty file classifier\n"
 msgstr ""
 
-#: build/rpmfc.c:918
+#: build/rpmfc.c:1041
 msgid "No file attributes configured\n"
 msgstr "無設定檔案特性\n"
 
-#: build/rpmfc.c:938
+#: build/rpmfc.c:1060
 #, c-format
 msgid "magic_open(0x%x) failed: %s\n"
 msgstr "magic_open(0x%x) 失敗:%s\n"
 
-#: build/rpmfc.c:944
+#: build/rpmfc.c:1066
 #, c-format
 msgid "magic_load failed: %s\n"
 msgstr "magic_load 失敗:%s\n"
 
-#: build/rpmfc.c:986
+#: build/rpmfc.c:1108
 #, c-format
 msgid "Recognition of file \"%s\" failed: mode %06o %s\n"
 msgstr "檔案「%s」辨識失敗:模式 %06o %s\n"
 
-#: build/rpmfc.c:1166
+#: build/rpmfc.c:1309
 #, c-format
 msgid "Finding  %s: %s\n"
 msgstr "正在尋找 %s:%s\n"
 
-#: build/rpmfc.c:1175 build/rpmfc.c:1184
+#: build/rpmfc.c:1318 build/rpmfc.c:1327
 #, c-format
 msgid "Failed to find %s:\n"
 msgstr "找不到 %s:\n"
 
-#: build/spec.c:404
+#: build/rpmfc.c:1344
+msgid "Deprecated external dependency generator is used!\n"
+msgstr ""
+
+#: build/spec.c:92
+#, c-format
+msgid "line %d: %s: package %s does not exist\n"
+msgstr ""
+
+#: build/spec.c:95
+#, c-format
+msgid "line %d: %s: package %s already exists\n"
+msgstr ""
+
+#: build/spec.c:466
 #, c-format
 msgid "query of specfile %s failed, can't parse\n"
 msgstr "%s 規格檔查詢失敗,無法剖析\n"
 
-#: lib/cpio.c:364
+#: lib/backend/db3.c:97
 #, c-format
-msgid "(error 0x%x)"
-msgstr "(error 0x%x)"
+msgid "%s error(%d) from %s: %s\n"
+msgstr ""
 
-#: lib/cpio.c:368
-msgid "Bad magic"
-msgstr "不良魔法數字"
+#: lib/backend/db3.c:100
+#, c-format
+msgid "%s error(%d): %s\n"
+msgstr ""
 
-#: lib/cpio.c:369
-msgid "Bad/unreadable  header"
-msgstr "不良或無法讀取的表頭"
+#: lib/backend/db3.c:288
+#, c-format
+msgid "unrecognized db option: \"%s\" ignored.\n"
+msgstr "無法辨識的資料庫選項:「%s」 已忽略。\n"
 
-#: lib/cpio.c:392
-msgid "Header size too big"
-msgstr "表頭大小過大"
+#: lib/backend/db3.c:325
+#, c-format
+msgid "%s has invalid numeric value, skipped\n"
+msgstr "%s 有無效的數值,略過\n"
 
-#: lib/cpio.c:393
-msgid "File too large for archive"
+#: lib/backend/db3.c:334
+#, c-format
+msgid "%s has too large or too small long value, skipped\n"
+msgstr "%s 有過大或過小的 long 數值,略過\n"
+
+#: lib/backend/db3.c:343
+#, c-format
+msgid "%s has too large or too small integer value, skipped\n"
+msgstr "%s 有過大或過小的整數值,略過\n"
+
+#: lib/backend/db3.c:808
+#, c-format
+msgid "cannot get %s lock on %s/%s\n"
+msgstr "無法取得 %s 於 %s/%s 的鎖定\n"
+
+#: lib/backend/db3.c:810
+msgid "shared"
+msgstr "已共享"
+
+#: lib/backend/db3.c:810
+msgid "exclusive"
+msgstr "排他"
+
+#: lib/backend/db3.c:892
+#, c-format
+msgid "invalid index type %x on %s/%s\n"
 msgstr ""
 
-#: lib/cpio.c:394
-msgid "Unknown file type"
-msgstr "未知檔案類型"
+#: lib/backend/db3.c:1068
+#, c-format
+msgid "error(%d) getting \"%s\" records from %s index: %s\n"
+msgstr ""
 
-#: lib/cpio.c:395
-msgid "Missing hard link(s)"
-msgstr "遺失硬鏈結"
+#: lib/backend/db3.c:1098
+#, c-format
+msgid "error(%d) storing record \"%s\" into %s\n"
+msgstr "儲存記錄「%2$s」到 %3$s 時發生錯誤(%1$d)\n"
 
-#: lib/cpio.c:396
-msgid "Digest mismatch"
-msgstr "摘要不符"
+#: lib/backend/db3.c:1106
+#, c-format
+msgid "error(%d) removing record \"%s\" from %s\n"
+msgstr "從 %3$s 移除記錄「%2$s」時發生錯誤(%1$d)\n"
 
-#: lib/cpio.c:397
-msgid "Internal error"
-msgstr "內部錯誤"
+#: lib/backend/db3.c:1208
+#, c-format
+msgid "error(%d) adding header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:398
-msgid "Archive file not in header"
-msgstr "在表頭中沒有封存檔"
+#: lib/backend/db3.c:1217
+#, c-format
+msgid "error(%d) removing header #%d record\n"
+msgstr ""
 
-#: lib/cpio.c:409
-msgid " failed - "
-msgstr " 失敗 - "
+#: lib/backend/db3.c:1272
+#, c-format
+msgid "error(%d) allocating new package instance\n"
+msgstr "分配新軟體包實體時發生錯誤(%d)\n"
+
+#: lib/backend/dbi.c:64
+#, c-format
+msgid ""
+"Found LMDB data.mdb database while attempting %s backend: using lmdb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:73
+#, c-format
+msgid ""
+"Found NDB Packages.db database while attempting %s backend: using ndb "
+"backend.\n"
+msgstr ""
+
+#: lib/backend/dbi.c:81
+#, c-format
+msgid ""
+"Found BDB Packages database while attempting %s backend: using bdb backend.\n"
+msgstr ""
 
-#: lib/depends.c:68
+#: lib/depends.c:93
 #, c-format
 msgid "%s is a Delta RPM and cannot be directly installed\n"
 msgstr ""
 
-#: lib/depends.c:72
+#: lib/depends.c:97
 #, c-format
 msgid "Unsupported payload (%s) in package %s\n"
 msgstr ""
 
-#: lib/depends.c:344
+#: lib/depends.c:377
 #, c-format
 msgid "package %s was already added, skipping %s\n"
-msgstr "套件 %s 已被加入,跳過 %s\n"
+msgstr "軟體包 %s 已被加入,跳過 %s\n"
 
-#: lib/depends.c:345
+#: lib/depends.c:378
 #, c-format
 msgid "package %s was already added, replacing with %s\n"
-msgstr "套件 %s 已被加入,以 %s 替換\n"
+msgstr "軟體包 %s 已被加入,以 %s 替換\n"
+
+#: lib/formats.c:42
+msgid "(not a blob)"
+msgstr "(不是 blob)"
 
-#: lib/formats.c:65 lib/formats.c:101 lib/formats.c:183 lib/formats.c:209
-#: lib/formats.c:262 lib/formats.c:280 lib/formats.c:473 lib/formats.c:506
-#: lib/formats.c:544
+#: lib/formats.c:43
 msgid "(not a number)"
 msgstr "(不是數字)"
 
-#: lib/formats.c:125
+#: lib/formats.c:44
+msgid "(not a string)"
+msgstr "(不是字串)"
+
+#: lib/formats.c:47 lib/formats.c:151 lib/formats.c:267
+msgid "(invalid type)"
+msgstr "(無效型態)"
+
+#: lib/formats.c:116
 #, c-format
 msgid "%c"
 msgstr "%c"
 
-#: lib/formats.c:135
+#: lib/formats.c:122
 msgid "%a %b %d %Y"
 msgstr "%Y %b %d %a"
 
-#: lib/formats.c:314
+#: lib/formats.c:253
 msgid "(not base64)"
 msgstr "(不是 base64)"
 
-#: lib/formats.c:326
-msgid "(invalid type)"
-msgstr "(無效型態)"
-
-#: lib/formats.c:349 lib/formats.c:429
-msgid "(not a blob)"
-msgstr "(不是 blob)"
-
-#: lib/formats.c:384
+#: lib/formats.c:313
 msgid "(invalid xml type)"
 msgstr "(無效 xml 類型)"
 
-#: lib/formats.c:434
+#: lib/formats.c:358
 msgid "(not an OpenPGP signature)"
 msgstr "(不是個 OpenPGP 簽署)"
 
-#: lib/formats.c:446
+#: lib/formats.c:369
 #, c-format
 msgid "Invalid date %u"
 msgstr ""
 
-#: lib/formats.c:512
+#: lib/formats.c:417
 msgid "normal"
 msgstr "一般"
 
-#: lib/formats.c:515
+#: lib/formats.c:420 lib/verify.c:393
 msgid "replaced"
 msgstr "已替換"
 
-#: lib/formats.c:518
+#: lib/formats.c:423 lib/verify.c:387
 msgid "not installed"
 msgstr "未安裝"
 
-#: lib/formats.c:521
+#: lib/formats.c:426 lib/verify.c:389
 msgid "net shared"
 msgstr "已網路分享"
 
-#: lib/formats.c:524
+#: lib/formats.c:429 lib/verify.c:391
 msgid "wrong color"
 msgstr "錯誤色彩"
 
-#: lib/formats.c:527
+#: lib/formats.c:432
 msgid "missing"
 msgstr "遺失"
 
-#: lib/formats.c:530
+#: lib/formats.c:435
 msgid "(unknown)"
 msgstr "(未知)"
 
-#: lib/formats.c:565
-msgid "(not a string)"
-msgstr "(不是字串)"
-
-#: lib/fsm.c:689
-#, c-format
-msgid "user %s does not exist - using root\n"
-msgstr "使用者 %s 不存在 - 現使用 root 代替\n"
-
-#: lib/fsm.c:696
-#, c-format
-msgid "group %s does not exist - using root\n"
-msgstr "群組 %s 不存在 - 現使用 root 代替\n"
-
-#: lib/fsm.c:1518
+#: lib/fsm.c:745
 #, c-format
 msgid "%s saved as %s\n"
 msgstr "%s 已被另存為 %s\n"
 
-#: lib/fsm.c:1543
+#: lib/fsm.c:798
 #, c-format
 msgid "%s created as %s\n"
 msgstr "%s 已建立為 %s \n"
 
-#: lib/fsm.c:1845
+#: lib/fsm.c:1082
 #, c-format
 msgid "%s %s: remove failed: %s\n"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "directory"
 msgstr ""
 
-#: lib/fsm.c:1846
+#: lib/fsm.c:1083
 msgid "file"
 msgstr ""
 
-#: lib/package.c:146
+#: lib/header.c:285
 #, c-format
-msgid "skipping %s %s with unverifiable signature\n"
+msgid "tag[%d]: BAD, tag %d type %d offset %d count %d len %d"
 msgstr ""
 
-#: lib/package.c:149
-#, c-format
-msgid "skipping %s with unverifiable signature\n"
+#: lib/header.c:952
+msgid "hdr load: BAD"
 msgstr ""
 
-#: lib/package.c:179 lib/package.c:306 lib/package.c:373 lib/signature.c:130
+#: lib/header.c:1775
+msgid "region: no tags"
+msgstr ""
+
+#: lib/header.c:1797
 #, c-format
-msgid "tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "標籤[%d]:不良,標籤 %d 類型 %d 偏移 %d 計數 %d\n"
+msgid "region tag: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:198
-msgid "hdr SHA1: BAD, not hex\n"
-msgstr "hdr SHA1:不良,不是十六進位\n"
+#: lib/header.c:1805
+#, c-format
+msgid "region offset: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:210
-msgid "hdr RSA: BAD, not binary\n"
-msgstr "hdr RSA:不良,不是二進位\n"
+#: lib/header.c:1824
+#, c-format
+msgid "region trailer: BAD, tag %d type %d offset %d count %d"
+msgstr ""
 
-#: lib/package.c:220
-msgid "hdr DSA: BAD, not binary\n"
-msgstr "hdr DSA:不良,不是二進位\n"
+#: lib/header.c:1833
+#, c-format
+msgid "region %d size: BAD, ril %d il %d rdl %d dl %d"
+msgstr ""
 
-#: lib/package.c:296
+#: lib/header.c:1841
 #, c-format
-msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"
-msgstr "blob 大小(%d):不良,8 + 16 * il(%d) + dl(%d)\n"
+msgid "region %d: tag number mismatch il %d ril %d dl %d rdl %d\n"
+msgstr ""
 
-#: lib/package.c:322 lib/signature.c:142
+#: lib/header.c:1876
 #, c-format
-msgid "region tag: BAD, tag %d type %d offset %d count %d\n"
+msgid "hdr size(%d): BAD, read returned %d"
+msgstr ""
+
+#: lib/header.c:1880
+msgid "hdr magic: BAD"
 msgstr ""
 
-#: lib/package.c:331 lib/signature.c:151
+#: lib/header.c:1885
 #, c-format
-msgid "region offset: BAD, tag %d type %d offset %d count %d\n"
-msgstr "區域偏移:不良,標籤 %d 類型 %d 偏移 %d 計數 %d\n"
+msgid "hdr tags: BAD, no. of tags(%d) out of range"
+msgstr ""
 
-#: lib/package.c:348 lib/signature.c:175
+#: lib/header.c:1890
 #, c-format
-msgid "region trailer: BAD, tag %d type %d offset %d count %d\n"
-msgstr "區域結尾:不良,標籤 %d 類型 %d 偏移 %d 計數 %d\n"
+msgid "hdr data: BAD, no. of bytes(%d) out of range"
+msgstr ""
 
-#: lib/package.c:358 lib/signature.c:185
+#: lib/header.c:1900
 #, c-format
-msgid "region size: BAD, ril(%d) > il(%d)\n"
-msgstr "區域大小:不良, ril(%d)> il(%d)\n"
+msgid "hdr blob(%zd): BAD, read returned %d"
+msgstr ""
 
-#: lib/package.c:427
+#: lib/header.c:1909
 #, c-format
-msgid "hdr size(%d): BAD, read returned %d\n"
-msgstr "hdr 大小(%d):不良,讀取回傳的 %d\n"
+msgid "sigh pad(%zd): BAD, read %zd bytes"
+msgstr ""
 
-#: lib/package.c:431
-msgid "hdr magic: BAD\n"
-msgstr "hdr magic:不良\n"
+#: lib/header.c:1922
+msgid "signature "
+msgstr ""
 
-#: lib/package.c:436
+#: lib/header.c:1949
 #, c-format
-msgid "hdr tags: BAD, no. of tags(%d) out of range\n"
-msgstr "hdr 標籤:不良,標籤(%d) 的號碼超出範圍\n"
+msgid "blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)"
+msgstr ""
+
+#: lib/headerfmt.c:356
+msgid "invalid field width"
+msgstr ""
 
-#: lib/package.c:442
+#: lib/headerfmt.c:362
 #, c-format
-msgid "hdr data: BAD, no. of bytes(%d) out of range\n"
-msgstr "hdr 資料:不良,位元組(%d) 的號碼超出範圍\n"
+msgid "missing { after %%"
+msgstr ""
 
-#: lib/package.c:452
+#: lib/headerfmt.c:384
 #, c-format
-msgid "hdr blob(%zd): BAD, read returned %d\n"
+msgid "missing } after %%{"
 msgstr ""
 
-#: lib/package.c:465
-msgid "hdr load: BAD\n"
-msgstr "hdr 載入:不良\n"
+#: lib/headerfmt.c:395
+msgid "empty tag format"
+msgstr "空白標籤格式"
 
-#: lib/package.c:532 lib/rpmchecksig.c:275 sign/rpmgensig.c:433
-#, c-format
-msgid "%s: rpmReadSignature failed: %s"
-msgstr "%s:rpmReadSignature 失敗:%s"
+#: lib/headerfmt.c:406
+msgid "empty tag name"
+msgstr "空白標籤名稱"
 
-#: lib/package.c:539 lib/rpmchecksig.c:282 sign/rpmgensig.c:440
+#: lib/headerfmt.c:413
 #, c-format
-msgid "%s: No signature available\n"
-msgstr "%s:未發現簽署\n"
+msgid "unknown tag: \"%s\""
+msgstr ""
 
-#: lib/package.c:581
-#, c-format
-msgid "%s: headerRead failed: %s"
-msgstr "%s:headerRead 失敗:%s"
+#: lib/headerfmt.c:433
+msgid "] expected at end of array"
+msgstr "] 預期在陣列的結尾"
+
+#: lib/headerfmt.c:445
+msgid "unexpected ]"
+msgstr "未預期的 ]"
+
+#: lib/headerfmt.c:455
+msgid "unexpected }"
+msgstr "未預期的 }"
+
+#: lib/headerfmt.c:511
+msgid "? expected in expression"
+msgstr "? 預期於表述式中"
+
+#: lib/headerfmt.c:518
+msgid "{ expected after ? in expression"
+msgstr "{ 預期於表述式中的 ? 之後"
+
+#: lib/headerfmt.c:530 lib/headerfmt.c:570
+msgid "} expected in expression"
+msgstr "} 預期於表述式中"
+
+#: lib/headerfmt.c:538
+msgid ": expected following ? subexpression"
+msgstr ": 預期跟著 ? 子表述式"
+
+#: lib/headerfmt.c:556
+msgid "{ expected after : in expression"
+msgstr "{ 預期於表述式中 : 之後"
 
-#: lib/package.c:633 lib/rpmchecksig.c:140 sign/rpmgensig.c:93
+#: lib/headerfmt.c:578
+msgid "| expected at end of expression"
+msgstr "| 預期於表述式的結尾"
+
+#: lib/headerfmt.c:753
+msgid "array iterator used with different sized arrays"
+msgstr "用於不同大小陣列的陣列迭代器"
+
+#: lib/poptALL.c:154
 #, c-format
-msgid "%s: Fread failed: %s\n"
-msgstr "%s:Fread 失敗:%s\n"
+msgid ""
+"%s: error: more than one --pipe specified (incompatible popt aliases?)\n"
+msgstr ""
 
-#: lib/poptALL.c:164
+#: lib/poptALL.c:188
 msgid "predefine MACRO with value EXPR"
 msgstr "預先以值 EXPR 定義 MACRO"
 
-#: lib/poptALL.c:165 lib/poptALL.c:168
+#: lib/poptALL.c:189 lib/poptALL.c:192
 msgid "'MACRO EXPR'"
 msgstr "「MACRO EXPR」"
 
-#: lib/poptALL.c:167
+#: lib/poptALL.c:191
 msgid "define MACRO with value EXPR"
 msgstr "定義 MACRO 值為 EXPR"
 
-#: lib/poptALL.c:170
+#: lib/poptALL.c:194
 msgid "undefine MACRO"
 msgstr ""
 
-#: lib/poptALL.c:171
+#: lib/poptALL.c:195
 msgid "MACRO"
 msgstr ""
 
-#: lib/poptALL.c:173
+#: lib/poptALL.c:197
 msgid "print macro expansion of EXPR"
 msgstr "列印 EXPR 的巨集展開"
 
-#: lib/poptALL.c:174
+#: lib/poptALL.c:198
 msgid "'EXPR'"
 msgstr "「EXPR」"
 
-#: lib/poptALL.c:176 lib/poptALL.c:190
+#: lib/poptALL.c:200
+msgid "Specify target platform"
+msgstr ""
+
+#: lib/poptALL.c:200
+msgid "CPU-VENDOR-OS"
+msgstr ""
+
+#: lib/poptALL.c:202 lib/poptALL.c:221
 msgid "read <FILE:...> instead of default file(s)"
 msgstr "讀取 <FILE:…> 以代替預設檔案"
 
-#: lib/poptALL.c:177 lib/poptALL.c:191
+#: lib/poptALL.c:203 lib/poptALL.c:222
 msgid "<FILE:...>"
 msgstr "<FILE:…>"
 
-#: lib/poptALL.c:180
+#: lib/poptALL.c:208
+msgid "don't enable any plugins"
+msgstr ""
+
+#: lib/poptALL.c:211
 msgid "don't verify package digest(s)"
-msgstr "不校驗套件摘要"
+msgstr "不校驗軟體包摘要"
 
-#: lib/poptALL.c:182
+#: lib/poptALL.c:213
 msgid "don't verify database header(s) when retrieved"
 msgstr "擷取時不校驗資料庫表頭"
 
-#: lib/poptALL.c:184
+#: lib/poptALL.c:215
 msgid "don't verify package signature(s)"
-msgstr "不校驗套件簽署"
+msgstr "不校驗軟體包簽署"
 
-#: lib/poptALL.c:187
+#: lib/poptALL.c:218
 msgid "send stdout to CMD"
 msgstr "發送 stdout 至 CMD"
 
-#: lib/poptALL.c:188
+#: lib/poptALL.c:219
 msgid "CMD"
 msgstr "CMD"
 
-#: lib/poptALL.c:193
+#: lib/poptALL.c:224
 msgid "use ROOT as top level directory"
 msgstr "使用 ROOT 做為最頂層目錄"
 
-#: lib/poptALL.c:194
+#: lib/poptALL.c:225
 msgid "ROOT"
 msgstr "ROOT"
 
-#: lib/poptALL.c:196
+#: lib/poptALL.c:227
 msgid "use database in DIRECTORY"
 msgstr "使用「DIRECTORY」內的資料庫"
 
-#: lib/poptALL.c:197
+#: lib/poptALL.c:228
 msgid "DIRECTORY"
 msgstr "DIRECTORY"
 
-#: lib/poptALL.c:200
+#: lib/poptALL.c:231
 msgid "display known query tags"
 msgstr "顯示已知的查詢標籤"
 
-#: lib/poptALL.c:202
+#: lib/poptALL.c:233
 msgid "display final rpmrc and macro configuration"
 msgstr "顯示完整的 rpmrc 與巨集組態"
 
-#: lib/poptALL.c:204
+#: lib/poptALL.c:235
 msgid "provide less detailed output"
 msgstr "提供較少細節的輸出"
 
-#: lib/poptALL.c:206
+#: lib/poptALL.c:237
 msgid "provide more detailed output"
 msgstr "提供較多細節的輸出"
 
-#: lib/poptALL.c:208
+#: lib/poptALL.c:239
 msgid "print the version of rpm being used"
 msgstr "列印正使用的 rpm 版本資訊"
 
-#: lib/poptALL.c:214
+#: lib/poptALL.c:245
 msgid "debug payload file state machine"
 msgstr "對酬載檔案狀態機器除錯"
 
-#: lib/poptALL.c:220
+#: lib/poptALL.c:251
 msgid "debug rpmio I/O"
 msgstr "除錯 rpmio I/O"
 
-#: lib/poptALL.c:287
+#: lib/poptALL.c:310
 #, c-format
 msgid "%s: option table misconfigured (%d)\n"
 msgstr "%s:選項表格設定不良 (%d)\n"
@@ -1883,530 +2198,579 @@ msgstr "重新分配位置必須包含一個 ="
 msgid "relocations must have a / following the ="
 msgstr "重新分配位置必須有個 / 跟在 = 之後"
 
-#: lib/poptI.c:114
+#: lib/poptI.c:118
 msgid "install all files, even configurations which might otherwise be skipped"
 msgstr "安裝所有檔案,即使組態可能被略過"
 
-#: lib/poptI.c:118
+#: lib/poptI.c:122
 msgid ""
 "remove all packages which match <package> (normally an error is generated if "
 "<package> specified multiple packages)"
 msgstr ""
-"移除所有符合 <package> 的套件 (如果 <package> 被指定為多個套件,常會導致錯誤"
-"出現)"
+"移除所有符合 <package> 的軟體包 (如果 <package> 被指定為多個軟體包,常會導致"
+"錯誤出現)"
 
-#: lib/poptI.c:123
+#: lib/poptI.c:127
 msgid "relocate files in non-relocatable package"
-msgstr "對不可重新分配位置的套件重新分配檔案位置"
+msgstr "對不可重新分配位置的軟體包重新分配檔案位置"
 
-#: lib/poptI.c:127
+#: lib/poptI.c:131
 msgid "print dependency loops as warning"
 msgstr "列印相依關係迴圈做為警告"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "erase (uninstall) package"
-msgstr "抹除 (解除安裝) 套件"
+msgstr "抹除 (解除安裝) 軟體包"
 
-#: lib/poptI.c:131
+#: lib/poptI.c:135
 msgid "<package>+"
 msgstr "<package>+"
 
-#: lib/poptI.c:134 lib/poptI.c:171
+#: lib/poptI.c:138 lib/poptI.c:175
 msgid "do not install configuration files"
 msgstr "不安裝組態檔案"
 
-#: lib/poptI.c:137 lib/poptI.c:176
+#: lib/poptI.c:141 lib/poptI.c:180
 msgid "do not install documentation"
 msgstr "不安裝文件"
 
-#: lib/poptI.c:139
+#: lib/poptI.c:143
 msgid "skip files with leading component <path> "
 msgstr "略過以 <path> 部件開頭的檔案"
 
-#: lib/poptI.c:140
+#: lib/poptI.c:144
 msgid "<path>"
 msgstr "<path>"
 
-#: lib/poptI.c:143
+#: lib/poptI.c:147
 msgid "short hand for --replacepkgs --replacefiles"
 msgstr "--replacepkgs 與 --replacefiles 的速寫"
 
-#: lib/poptI.c:147
+#: lib/poptI.c:151
 msgid "upgrade package(s) if already installed"
-msgstr "如果套件已安裝,便升級套件"
+msgstr "如果軟體包已安裝,便升級軟體包"
 
-#: lib/poptI.c:148 lib/poptI.c:164 lib/poptI.c:249
+#: lib/poptI.c:152 lib/poptI.c:168 lib/poptI.c:257 lib/poptI.c:261
 msgid "<packagefile>+"
 msgstr "<packagefile>+"
 
-#: lib/poptI.c:150
+#: lib/poptI.c:154
 msgid "print hash marks as package installs (good with -v)"
-msgstr "套件安裝時列印 Hash 標記 (和 -v 一起用會更好)"
+msgstr "軟體包安裝時列印 Hash 標記 (和 -v 一起用會更好)"
 
-#: lib/poptI.c:153
+#: lib/poptI.c:157
 msgid "don't verify package architecture"
-msgstr "不要校驗套件架構"
+msgstr "不要校驗軟體包架構"
 
-#: lib/poptI.c:156
+#: lib/poptI.c:160
 msgid "don't verify package operating system"
 msgstr "不要校驗套間作葉系統"
 
-#: lib/poptI.c:159
+#: lib/poptI.c:163
 msgid "don't check disk space before installing"
 msgstr "安裝前不檢查磁碟空間"
 
-#: lib/poptI.c:161
+#: lib/poptI.c:165
 msgid "install documentation"
 msgstr "安裝文件"
 
-#: lib/poptI.c:164
+#: lib/poptI.c:168
 msgid "install package(s)"
-msgstr "安裝套件"
+msgstr "安裝軟體包"
 
-#: lib/poptI.c:167
+#: lib/poptI.c:171
 msgid "update the database, but do not modify the filesystem"
 msgstr "更新資料庫,但不修改檔案系統"
 
-#: lib/poptI.c:173
+#: lib/poptI.c:177
 msgid "do not verify package dependencies"
-msgstr "不校驗套件相依性"
+msgstr "不校驗軟體包相依性"
 
-#: lib/poptI.c:179 lib/poptQV.c:207 lib/poptQV.c:209
+#: lib/poptI.c:183 lib/poptQV.c:236 lib/poptQV.c:238
 msgid "don't verify digest of files"
 msgstr "不要校驗檔案的摘要"
 
-#: lib/poptI.c:181
+#: lib/poptI.c:185
 msgid "don't verify digest of files (obsolete)"
 msgstr "不要驗證檔案的摘要 (棄用)"
 
-#: lib/poptI.c:183
+#: lib/poptI.c:187
 msgid "don't install file security contexts"
 msgstr "不安裝檔案安全情境資料"
 
-#: lib/poptI.c:187
+#: lib/poptI.c:189
+msgid "don't install file capabilities"
+msgstr ""
+
+#: lib/poptI.c:193
 msgid "do not reorder package installation to satisfy dependencies"
-msgstr "不重新排列套件安裝順序以滿足相依關係"
+msgstr "不重新排列軟體包安裝順序以滿足相依關係"
 
-#: lib/poptI.c:191
+#: lib/poptI.c:197
 msgid "do not execute package scriptlet(s)"
-msgstr "不執行套件指令稿片段"
+msgstr "不執行軟體包指令稿片段"
 
-#: lib/poptI.c:195
+#: lib/poptI.c:201
 #, c-format
 msgid "do not execute %%pre scriptlet (if any)"
 msgstr "不執行 %%pre 指令稿稿片段 (如果有)"
 
-#: lib/poptI.c:198
+#: lib/poptI.c:204
 #, c-format
 msgid "do not execute %%post scriptlet (if any)"
 msgstr "不執行 %%post 指令稿片段 (如果有)"
 
-#: lib/poptI.c:201
+#: lib/poptI.c:207
 #, c-format
 msgid "do not execute %%preun scriptlet (if any)"
 msgstr "不執行 %%preun 指令稿片段 (如果有)"
 
-#: lib/poptI.c:204
+#: lib/poptI.c:210
 #, c-format
 msgid "do not execute %%postun scriptlet (if any)"
 msgstr "不執行%%postun 指令稿片段 (如果有)"
 
-#: lib/poptI.c:207
+#: lib/poptI.c:213
+#, c-format
+msgid "do not execute %%pretrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:216
+#, c-format
+msgid "do not execute %%posttrans scriptlet (if any)"
+msgstr ""
+
+#: lib/poptI.c:219
 msgid "do not execute any scriptlet(s) triggered by this package"
-msgstr "不執行任何此套件觸發的指令稿片段"
+msgstr "不執行任何此軟體包觸發的指令稿片段"
 
-#: lib/poptI.c:210
+#: lib/poptI.c:222
 #, c-format
 msgid "do not execute any %%triggerprein scriptlet(s)"
 msgstr "不執行任何 %%triggerprein 指令稿片段"
 
-#: lib/poptI.c:213
+#: lib/poptI.c:225
 #, c-format
 msgid "do not execute any %%triggerin scriptlet(s)"
 msgstr "不執行任何 %%triggerin 指令稿片段"
 
-#: lib/poptI.c:216
+#: lib/poptI.c:228
 #, c-format
 msgid "do not execute any %%triggerun scriptlet(s)"
 msgstr "不執行任何 %%triggerun 指令稿片段"
 
-#: lib/poptI.c:219
+#: lib/poptI.c:231
 #, c-format
 msgid "do not execute any %%triggerpostun scriptlet(s)"
 msgstr "不執行任何 %%triggerpostun 指令稿片段"
 
-#: lib/poptI.c:223
-msgid "do not perform any collection actions"
-msgstr ""
-
-#: lib/poptI.c:227
+#: lib/poptI.c:235
 msgid ""
 "upgrade to an old version of the package (--force on upgrades does this "
 "automatically)"
-msgstr "升級到套件的舊版本 (在升級作業中加入 --force 會自動進行)"
+msgstr "升級到軟體包的舊版本 (在升級作業中加入 --force 會自動進行)"
 
-#: lib/poptI.c:231
+#: lib/poptI.c:239
 msgid "print percentages as package installs"
-msgstr "當套件安裝時列印進度百分比"
+msgstr "當軟體包安裝時列印進度百分比"
 
-#: lib/poptI.c:233
+#: lib/poptI.c:241
 msgid "relocate the package to <dir>, if relocatable"
-msgstr "如果可以重新分配位置,便把套件重新分配至 <dir>"
+msgstr "如果可以重新分配位置,便把軟體包重新分配至 <dir>"
 
-#: lib/poptI.c:234
+#: lib/poptI.c:242
 msgid "<dir>"
 msgstr "<dir>"
 
-#: lib/poptI.c:236
+#: lib/poptI.c:244
 msgid "relocate files from path <old> to <new>"
 msgstr "將檔案從路徑 <old> 重新配置到 <new>"
 
-#: lib/poptI.c:237
+#: lib/poptI.c:245
 msgid "<old>=<new>"
 msgstr "<old>=<new>"
 
-#: lib/poptI.c:240
+#: lib/poptI.c:248
 msgid "ignore file conflicts between packages"
-msgstr "忽略套件之間的檔案衝突"
+msgstr "忽略軟體包之間的檔案衝突"
 
-#: lib/poptI.c:243
+#: lib/poptI.c:251
 msgid "reinstall if the package is already present"
-msgstr "如果套件已經存在則重新安裝"
+msgstr "如果軟體包已經存在則重新安裝"
 
-#: lib/poptI.c:245
+#: lib/poptI.c:253
 msgid "don't install, but tell if it would work or not"
 msgstr "不安裝,只回報作業是否能運作"
 
-#: lib/poptI.c:248
+#: lib/poptI.c:256
 msgid "upgrade package(s)"
-msgstr "升級套件"
+msgstr "升級軟體包"
+
+#: lib/poptI.c:260
+msgid "reinstall package(s)"
+msgstr ""
 
-#: lib/poptQV.c:67
+#: lib/poptQV.c:75
 msgid "query/verify all packages"
-msgstr "查詢/校驗所有套件"
+msgstr "查詢/校驗所有軟體包"
 
-#: lib/poptQV.c:69
+#: lib/poptQV.c:77
 msgid "rpm checksig mode"
 msgstr "rpm 檢查簽署模式"
 
-#: lib/poptQV.c:71
+#: lib/poptQV.c:79
 msgid "query/verify package(s) owning file"
-msgstr "查詢/校驗套件擁有的檔案"
+msgstr "查詢/校驗軟體包擁有的檔案"
 
-#: lib/poptQV.c:73
+#: lib/poptQV.c:81
 msgid "query/verify package(s) in group"
-msgstr "查詢/校驗套件所屬的群組"
+msgstr "查詢/校驗軟體包所屬的群組"
 
-#: lib/poptQV.c:75
+#: lib/poptQV.c:83
 msgid "query/verify a package file"
-msgstr "查詢/校驗一個套件檔案"
+msgstr "查詢/校驗一個軟體包檔案"
 
-#: lib/poptQV.c:78
+#: lib/poptQV.c:86
 msgid "query/verify package(s) with package identifier"
-msgstr "以套件的識別符查詢/校驗套件"
+msgstr "以軟體包的識別符查詢/校驗軟體包"
 
-#: lib/poptQV.c:80
+#: lib/poptQV.c:88
 msgid "query/verify package(s) with header identifier"
-msgstr "以表頭識別符查詢/校驗套件"
+msgstr "以表頭識別符查詢/校驗軟體包"
 
-#: lib/poptQV.c:83
+#: lib/poptQV.c:91
 msgid "rpm query mode"
 msgstr "rpm 查詢模式"
 
-#: lib/poptQV.c:85
+#: lib/poptQV.c:93
 msgid "query/verify a header instance"
 msgstr "查詢/驗證表頭實體"
 
-#: lib/poptQV.c:87
+#: lib/poptQV.c:95
 msgid "query/verify package(s) from install transaction"
-msgstr "從安裝處理事項查詢/驗證套件"
+msgstr "從安裝處理事項查詢/驗證軟體包"
 
-#: lib/poptQV.c:89
+#: lib/poptQV.c:97
 msgid "query the package(s) triggered by the package"
-msgstr "查詢套件所觸發的套件"
+msgstr "查詢軟體包所觸發的軟體包"
 
-#: lib/poptQV.c:91
+#: lib/poptQV.c:99
 msgid "rpm verify mode"
 msgstr "rpm 校驗模式"
 
-#: lib/poptQV.c:93
+#: lib/poptQV.c:101
 msgid "query/verify the package(s) which require a dependency"
-msgstr "查詢/校驗需要某些相依套件的套件"
+msgstr "查詢/校驗需要某些相依軟體包的軟體包"
 
-#: lib/poptQV.c:95
+#: lib/poptQV.c:103
 msgid "query/verify the package(s) which provide a dependency"
-msgstr "查詢/校驗提供某些相依套件的套件"
+msgstr "查詢/校驗提供某些相依軟體包的軟體包"
+
+#: lib/poptQV.c:105
+msgid "query/verify the package(s) which recommends a dependency"
+msgstr ""
+
+#: lib/poptQV.c:107
+msgid "query/verify the package(s) which suggests a dependency"
+msgstr ""
+
+#: lib/poptQV.c:109
+msgid "query/verify the package(s) which supplements a dependency"
+msgstr ""
 
-#: lib/poptQV.c:98
+#: lib/poptQV.c:111
+msgid "query/verify the package(s) which enhances a dependency"
+msgstr ""
+
+#: lib/poptQV.c:114
 msgid "do not glob arguments"
 msgstr "不以 glob 解析引數"
 
-#: lib/poptQV.c:100
+#: lib/poptQV.c:116
 msgid "do not process non-package files as manifests"
-msgstr "不以 manifest 處理非套件檔案"
+msgstr "不以 manifest 處理非軟體包檔案"
 
-#: lib/poptQV.c:172
+#: lib/poptQV.c:193
 msgid "list all configuration files"
 msgstr "列出所有組態檔案"
 
-#: lib/poptQV.c:174
+#: lib/poptQV.c:195
 msgid "list all documentation files"
 msgstr "列出所有文件檔案"
 
-#: lib/poptQV.c:176
-#, fuzzy
+#: lib/poptQV.c:197
 msgid "list all license files"
-msgstr "列出所有文件檔案"
+msgstr ""
+
+#: lib/poptQV.c:199
+#, fuzzy
+msgid "list all artifact files"
+msgstr "列出所有組態檔案"
 
-#: lib/poptQV.c:178
+#: lib/poptQV.c:201
 msgid "dump basic file information"
 msgstr "傾印基本檔案資訊"
 
-#: lib/poptQV.c:182
+#: lib/poptQV.c:205
 msgid "list files in package"
-msgstr "列出套件內的檔案"
+msgstr "列出軟體包內的檔案"
 
-#: lib/poptQV.c:187
+#: lib/poptQV.c:210
 #, c-format
 msgid "skip %%ghost files"
 msgstr "略過 %%ghost 檔案"
 
-#: lib/poptQV.c:194
+#: lib/poptQV.c:213
+#, c-format
+msgid "skip %%config files"
+msgstr ""
+
+#: lib/poptQV.c:216
+#, fuzzy, c-format
+msgid "skip %%artifact files"
+msgstr "略過 %%ghost 檔案"
+
+#: lib/poptQV.c:223
 msgid "display the states of the listed files"
 msgstr "顯示列出的檔案的狀態"
 
-#: lib/poptQV.c:212
+#: lib/poptQV.c:241
 msgid "don't verify size of files"
 msgstr "不校驗檔案大小"
 
-#: lib/poptQV.c:215
+#: lib/poptQV.c:244
 msgid "don't verify symlink path of files"
 msgstr "不校驗檔案的符號連結路徑"
 
-#: lib/poptQV.c:218
+#: lib/poptQV.c:247
 msgid "don't verify owner of files"
 msgstr "不校驗檔案的擁有者"
 
-#: lib/poptQV.c:221
+#: lib/poptQV.c:250
 msgid "don't verify group of files"
 msgstr "不校驗檔案的群組"
 
-#: lib/poptQV.c:224
+#: lib/poptQV.c:253
 msgid "don't verify modification time of files"
 msgstr "不校驗檔案的修改時間"
 
-#: lib/poptQV.c:227 lib/poptQV.c:230
+#: lib/poptQV.c:256 lib/poptQV.c:259
 msgid "don't verify mode of files"
 msgstr "不校驗檔案的模式"
 
-#: lib/poptQV.c:233
-msgid "don't verify capabilities of files"
-msgstr ""
-
-#: lib/poptQV.c:236
+#: lib/poptQV.c:262
 msgid "don't verify file security contexts"
 msgstr "不校驗檔案的安全情境"
 
-#: lib/poptQV.c:238
+#: lib/poptQV.c:264
+msgid "don't verify capabilities of files"
+msgstr ""
+
+#: lib/poptQV.c:266
 msgid "don't verify files in package"
-msgstr "不校驗套件內的檔案"
+msgstr "不校驗軟體包內的檔案"
 
-#: lib/poptQV.c:240 tools/rpmgraph.c:218
+#: lib/poptQV.c:268 tools/rpmgraph.c:217
 msgid "don't verify package dependencies"
-msgstr "不校驗套件的相依關係"
+msgstr "不校驗軟體包的相依關係"
 
-#: lib/poptQV.c:243 lib/poptQV.c:246
+#: lib/poptQV.c:271 lib/poptQV.c:274
 msgid "don't execute verify script(s)"
 msgstr "不執行校驗指令稿"
 
-#: lib/psm.c:212
+#: lib/psm.c:146
 #, c-format
 msgid "Missing rpmlib features for %s:\n"
 msgstr ""
 
-#: lib/psm.c:254
+#: lib/psm.c:183
 msgid "source package expected, binary found\n"
-msgstr "預期是源碼套件,但卻找到二進位套件\n"
+msgstr "預期是源碼軟體包,但卻找到二進位軟體包\n"
 
-#: lib/psm.c:307
+#: lib/psm.c:194
 msgid "source package contains no .spec file\n"
-msgstr "源碼套件內未包含 .spec 檔案\n"
+msgstr "源碼軟體包內未包含 .spec 檔案\n"
 
-#: lib/psm.c:836
+#: lib/psm.c:606
 #, c-format
 msgid "unpacking of archive failed%s%s: %s\n"
 msgstr "解包封存檔失敗 %s%s:%s\n"
 
-#: lib/psm.c:837
+#: lib/psm.c:607
 msgid " on file "
 msgstr "  於檔案 "
 
-#: lib/psm.c:941
-#, c-format
-msgid "%s failed on file %s: %s\n"
-msgstr "%2$s 檔案 %1$s 失敗:%3$s\n"
-
-#: lib/psm.c:944
-#, c-format
-msgid "%s failed: %s\n"
-msgstr "%s 失敗:%s\n"
-
-#: lib/query.c:111
+#: lib/query.c:108
 #, c-format
 msgid "incorrect format: %s\n"
 msgstr "格式不正確:%s\n"
 
-#: lib/query.c:123
+#: lib/query.c:120
 msgid "(contains no files)\n"
 msgstr "(未包含檔案)\n"
 
-#: lib/query.c:160
+#: lib/query.c:161
 msgid "normal        "
 msgstr "正常        "
 
-#: lib/query.c:163
+#: lib/query.c:164
 msgid "replaced      "
 msgstr "被替換      "
 
-#: lib/query.c:166
+#: lib/query.c:167
 msgid "not installed "
 msgstr "未安裝 "
 
-#: lib/query.c:169
+#: lib/query.c:170
 msgid "net shared    "
 msgstr "已網路共享    "
 
-#: lib/query.c:172
+#: lib/query.c:173
 msgid "wrong color   "
 msgstr "錯誤色彩   "
 
-#: lib/query.c:175
+#: lib/query.c:176
 msgid "(no state)    "
 msgstr "(無狀態)    "
 
-#: lib/query.c:178
+#: lib/query.c:179
 #, c-format
 msgid "(unknown %3d) "
 msgstr "(未知的 %3d) "
 
-#: lib/query.c:198
+#: lib/query.c:199
 msgid "package has not file owner/group lists\n"
-msgstr "套件內沒有檔案擁有者/群組記錄\n"
+msgstr "軟體包內沒有檔案擁有者/群組記錄\n"
 
-#: lib/query.c:229
+#: lib/query.c:233
 msgid "package has neither file owner or id lists\n"
-msgstr "套件內沒有檔案擁有者及 ID 清單\n"
+msgstr "軟體包內沒有檔案擁有者及 ID 清單\n"
 
-#: lib/query.c:318
+#: lib/query.c:321
 #, c-format
 msgid "group %s does not contain any packages\n"
-msgstr "群組 %s 內不包含任何套件\n"
+msgstr "群組 %s 內不包含任何軟體包\n"
 
-#: lib/query.c:325
+#: lib/query.c:328
 #, c-format
 msgid "no package triggers %s\n"
-msgstr "沒有套件會觸發 %s\n"
+msgstr "沒有軟體包會觸發 %s\n"
 
-#: lib/query.c:336 lib/query.c:355 lib/query.c:371
+#: lib/query.c:339 lib/query.c:358 lib/query.c:374
 #, c-format
 msgid "malformed %s: %s\n"
 msgstr "格式不良的 %s:%s\n"
 
-#: lib/query.c:346 lib/query.c:361 lib/query.c:376
+#: lib/query.c:349 lib/query.c:364 lib/query.c:379
 #, c-format
 msgid "no package matches %s: %s\n"
-msgstr "沒有套件符合 %s:%s\n"
+msgstr "沒有軟體包符合 %s:%s\n"
 
-#: lib/query.c:384
+#: lib/query.c:387
 #, c-format
 msgid "no package requires %s\n"
-msgstr "沒有套件需要 %s\n"
+msgstr "沒有軟體包需要 %s\n"
+
+#: lib/query.c:394
+#, c-format
+msgid "no package recommends %s\n"
+msgstr ""
+
+#: lib/query.c:401
+#, c-format
+msgid "no package suggests %s\n"
+msgstr ""
+
+#: lib/query.c:408
+#, c-format
+msgid "no package supplements %s\n"
+msgstr ""
 
-#: lib/query.c:392
+#: lib/query.c:415
+#, c-format
+msgid "no package enhances %s\n"
+msgstr ""
+
+#: lib/query.c:423
 #, c-format
 msgid "no package provides %s\n"
-msgstr "沒有套件提供 %s\n"
+msgstr "沒有軟體包提供 %s\n"
 
-#: lib/query.c:424
+#: lib/query.c:455
 #, c-format
 msgid "file %s: %s\n"
 msgstr "檔案 %s:%s\n"
 
-#: lib/query.c:427
+#: lib/query.c:458
 #, c-format
 msgid "file %s is not owned by any package\n"
-msgstr "檔案 %s 不被任何套件擁有\n"
+msgstr "檔案 %s 不被任何軟體包擁有\n"
 
-#: lib/query.c:438
+#: lib/query.c:469
 #, c-format
 msgid "invalid package number: %s\n"
-msgstr "無效的套件編號:%s\n"
+msgstr "無效的軟體包編號:%s\n"
 
-#: lib/query.c:445
+#: lib/query.c:476
 #, c-format
 msgid "record %u could not be read\n"
 msgstr ""
 
-#: lib/query.c:458 lib/rpminstall.c:654
+#: lib/query.c:491 lib/rpminstall.c:690
 #, c-format
 msgid "package %s is not installed\n"
-msgstr "套件 %s 尚未安裝\n"
+msgstr "軟體包 %s 尚未安裝\n"
 
-#: lib/query.c:492
+#: lib/query.c:525
 #, c-format
 msgid "unknown tag: \"%s\"\n"
 msgstr "未知的標籤:「%s」\n"
 
-#: lib/rpmchecksig.c:44
+#: lib/rpmchecksig.c:50 lib/rpmchecksig.c:58
 #, c-format
 msgid "%s: key %d import failed.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:48
+#: lib/rpmchecksig.c:66
 #, c-format
 msgid "%s: key %d not an armored public key.\n"
 msgstr ""
 
-#: lib/rpmchecksig.c:93
+#: lib/rpmchecksig.c:111
 #, c-format
 msgid "%s: import read failed(%d).\n"
 msgstr "%s:匯入時讀取失敗(%d)。\n"
 
-#: lib/rpmchecksig.c:119
+#: lib/rpmchecksig.c:131
 #, c-format
-msgid "%s: headerRead failed: %s\n"
+msgid "Fread failed: %s"
 msgstr ""
 
-#: lib/rpmchecksig.c:128
-#, c-format
-msgid "%s: Immutable header region could not be read. Corrupted package?\n"
+#: lib/rpmchecksig.c:262
+msgid "DIGESTS"
+msgstr ""
+
+#: lib/rpmchecksig.c:262
+msgid "digests"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "SIGNATURES"
+msgstr ""
+
+#: lib/rpmchecksig.c:266
+msgid "signatures"
 msgstr ""
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "NOT OK"
 msgstr "不正確"
 
-#: lib/rpmchecksig.c:386
+#: lib/rpmchecksig.c:268
 msgid "OK"
 msgstr "正確"
 
-#: lib/rpmchecksig.c:388
-msgid " (MISSING KEYS:"
-msgstr " (遺失的金鑰:"
-
-#: lib/rpmchecksig.c:390
-msgid ") "
-msgstr ") "
-
-#: lib/rpmchecksig.c:391
-msgid " (UNTRUSTED KEYS:"
-msgstr " (未受信任的金鑰:"
-
-#: lib/rpmchecksig.c:393
-msgid ")"
-msgstr ")"
-
-#: lib/rpmchecksig.c:433 sign/rpmgensig.c:53
+#: lib/rpmchecksig.c:300 sign/rpmgensig.c:134
 #, c-format
 msgid "%s: open failed: %s\n"
 msgstr "%s:開啟失敗:%s\n"
@@ -2431,212 +2795,441 @@ msgstr ""
 msgid "Unable to restore root directory: %m\n"
 msgstr ""
 
-#: lib/rpmds.c:489
+#: lib/rpmdb.c:72
+#, c-format
+msgid "Generating %d missing index(es), please wait...\n"
+msgstr ""
+
+#: lib/rpmdb.c:167 lib/rpmdb.c:213
+#, c-format
+msgid "cannot open %s index using %s - %s (%d)\n"
+msgstr ""
+
+#: lib/rpmdb.c:462
+msgid "no dbpath has been set\n"
+msgstr "尚未設定 dbpath\n"
+
+#: lib/rpmdb.c:972
+msgid "miFreeHeader: skipping"
+msgstr "miFreeHeader:跳過"
+
+#: lib/rpmdb.c:988
+#, c-format
+msgid "error(%d) storing record #%d into %s\n"
+msgstr "儲存記錄 #%2$d 到 %3$s 時發生錯誤(%1$d)\n"
+
+#: lib/rpmdb.c:1100
+#, c-format
+msgid "%s: regexec failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1281
+#, c-format
+msgid "%s: regcomp failed: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:1444
+msgid "rpmdbNextIterator: skipping"
+msgstr "rpmdbNextIterator:跳過"
+
+#: lib/rpmdb.c:1531
+#, c-format
+msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
+msgstr "rpmdb:已擷取損壞的表頭 #%u -- 跳過。\n"
+
+#: lib/rpmdb.c:2061
+#, c-format
+msgid "%s: cannot read header at 0x%x\n"
+msgstr "%s:無法讀取位於 0x%x 的表頭\n"
+
+#: lib/rpmdb.c:2412
+msgid "could not move new database in place\n"
+msgstr ""
+
+#: lib/rpmdb.c:2415
+#, c-format
+msgid "could also not restore old database from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2417 lib/rpmdb.c:2603
+#, c-format
+msgid "replace files in %s with files from %s to recover\n"
+msgstr ""
+
+#: lib/rpmdb.c:2426
+#, c-format
+msgid "Could not get public keys from %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2433
+#, c-format
+msgid "could not delete old database at %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2502
+msgid "no dbpath has been set"
+msgstr "尚未設定 dbpath"
+
+#: lib/rpmdb.c:2520
+#, c-format
+msgid "failed to create directory %s: %s\n"
+msgstr ""
+
+#: lib/rpmdb.c:2557
+#, c-format
+msgid "header #%u in the database is bad -- skipping.\n"
+msgstr "在資料庫中有不良的表頭 #%u -- 跳過。\n"
+
+#: lib/rpmdb.c:2572
+#, c-format
+msgid "cannot add record originally at %u\n"
+msgstr "無法加入原本位於 %u 的記錄\n"
+
+#: lib/rpmdb.c:2588
+msgid "failed to rebuild database: original database remains in place\n"
+msgstr "重建資料庫時失敗:原來的資料庫保持原狀\n"
+
+#: lib/rpmdb.c:2601
+msgid "failed to replace old database with new database!\n"
+msgstr "以新的資料庫取代舊的資料庫時失敗!\n"
+
+#: lib/rpmds.c:744
 msgid "NO "
 msgstr "否 "
 
-#: lib/rpmds.c:489
+#: lib/rpmds.c:744
 msgid "YES"
 msgstr "是"
 
-#: lib/rpmds.c:933
+#: lib/rpmds.c:1221
 msgid "PreReq:, Provides:, and Obsoletes: dependencies support versions."
 msgstr "PreReq:、Provides:、以及 Obsoletes: 相依性支援版本。"
 
-#: lib/rpmds.c:936
+#: lib/rpmds.c:1224
 msgid "file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path."
 msgstr "檔案名稱儲存為 (dirName、baseName、dirIndex) 字組,而非路徑。"
 
-#: lib/rpmds.c:940
+#: lib/rpmds.c:1228
 msgid "package payload can be compressed using bzip2."
-msgstr "套件酬載可以使用 bzip2 壓縮。"
+msgstr "軟體包酬載可以使用 bzip2 壓縮。"
+
+#: lib/rpmds.c:1233
+msgid "package payload can be compressed using xz."
+msgstr ""
+
+#: lib/rpmds.c:1236
+msgid "package payload can be compressed using lzma."
+msgstr ""
+
+#: lib/rpmds.c:1240
+msgid "package payload file(s) have \"./\" prefix."
+msgstr "軟體包酬載檔案有「./」前綴。"
+
+#: lib/rpmds.c:1243
+msgid "package name-version-release is not implicitly provided."
+msgstr "軟體包的「名稱-版本-發行編號」沒有隱含性地提供。"
+
+#: lib/rpmds.c:1246
+msgid "header tags are always sorted after being loaded."
+msgstr "表頭標籤總在載入之後排序。"
+
+#: lib/rpmds.c:1249
+msgid "the scriptlet interpreter can use arguments from header."
+msgstr "指令稿片段解譯器可以使用來自表頭的引數。"
+
+#: lib/rpmds.c:1252
+msgid "a hardlink file set may be installed without being complete."
+msgstr "硬鏈結檔案組也許沒有被完整安裝。"
+
+#: lib/rpmds.c:1255
+msgid "package scriptlets may access the rpm database while installing."
+msgstr "軟體包指令稿片段在安裝過程中可以存取 rpm 資料庫。"
+
+#: lib/rpmds.c:1259
+msgid "internal support for lua scripts."
+msgstr "lua 指令稿的內部支援。"
+
+#: lib/rpmds.c:1263
+msgid "file digest algorithm is per package configurable"
+msgstr ""
+
+#: lib/rpmds.c:1267
+msgid "support for POSIX.1e file capabilities"
+msgstr ""
+
+#: lib/rpmds.c:1271
+msgid "package scriptlets can be expanded at install time."
+msgstr ""
+
+#: lib/rpmds.c:1274
+msgid "dependency comparison supports versions with tilde."
+msgstr ""
+
+#: lib/rpmds.c:1277
+msgid "support files larger than 4GB"
+msgstr ""
+
+#: lib/rpmds.c:1280
+msgid "support for rich dependencies."
+msgstr ""
+
+#: lib/rpmds.c:1284
+msgid "package payload can be compressed using zstd."
+msgstr ""
+
+#: lib/rpmds.c:1410
+#, c-format
+msgid "Unknown rich dependency op '%.*s'"
+msgstr ""
+
+#: lib/rpmds.c:1451
+msgid "Name required"
+msgstr ""
+
+#: lib/rpmds.c:1488
+msgid "Illegal ops in with/without"
+msgstr ""
+
+#: lib/rpmds.c:1495
+msgid "Illegal context for 'unless', please use 'or' instead"
+msgstr ""
+
+#: lib/rpmds.c:1500
+msgid "Illegal context for 'if', please use 'and' instead"
+msgstr ""
+
+#: lib/rpmds.c:1516
+msgid "Rich dependency does not start with '('"
+msgstr ""
+
+#: lib/rpmds.c:1524
+msgid "Missing argument to rich dependency op"
+msgstr ""
+
+#: lib/rpmds.c:1526
+msgid "Empty rich dependency"
+msgstr ""
+
+#: lib/rpmds.c:1544
+#, c-format
+msgid "Unterminated rich dependency: %s"
+msgstr ""
+
+#: lib/rpmds.c:1559
+msgid "Cannot chain different ops"
+msgstr ""
+
+#: lib/rpmds.c:1564
+msgid "Can only chain and/or/with ops"
+msgstr ""
+
+#: lib/rpmds.c:1695
+msgid "Junk after rich dependency"
+msgstr ""
+
+#: lib/rpmfi.c:810
+#, c-format
+msgid "user %s does not exist - using %s\n"
+msgstr ""
+
+#: lib/rpmfi.c:817
+#, c-format
+msgid "group %s does not exist - using %s\n"
+msgstr ""
 
-#: lib/rpmds.c:945
-msgid "package payload can be compressed using xz."
+#: lib/rpmfi.c:1374
+#, c-format
+msgid "Wrong number of entries for tag %s: %u found but %u expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:948
-msgid "package payload can be compressed using lzma."
+#: lib/rpmfi.c:1379
+#, c-format
+msgid "Malformed data for tag %s: %u bytes found but %lu expected.\n"
 msgstr ""
 
-#: lib/rpmds.c:952
-msgid "package payload file(s) have \"./\" prefix."
-msgstr "套件酬載檔案有「./」前綴。"
+#: lib/rpmfi.c:2348
+msgid "Bad magic"
+msgstr "不良魔法數字"
 
-#: lib/rpmds.c:955
-msgid "package name-version-release is not implicitly provided."
-msgstr "套件的「名稱-版本-發行編號」沒有隱含性地提供。"
+#: lib/rpmfi.c:2349
+msgid "Bad/unreadable  header"
+msgstr "不良或無法讀取的表頭"
 
-#: lib/rpmds.c:958
-msgid "header tags are always sorted after being loaded."
-msgstr "表頭標籤總在載入之後排序。"
+#: lib/rpmfi.c:2372
+msgid "Header size too big"
+msgstr "表頭大小過大"
 
-#: lib/rpmds.c:961
-msgid "the scriptlet interpreter can use arguments from header."
-msgstr "指令稿片段解譯器可以使用來自表頭的引數。"
+#: lib/rpmfi.c:2373
+msgid "File too large for archive"
+msgstr ""
 
-#: lib/rpmds.c:964
-msgid "a hardlink file set may be installed without being complete."
-msgstr "硬鏈結檔案組也許沒有被完整安裝。"
+#: lib/rpmfi.c:2374
+msgid "Unknown file type"
+msgstr "未知檔案類型"
 
-#: lib/rpmds.c:967
-msgid "package scriptlets may access the rpm database while installing."
-msgstr "套件指令稿片段在安裝過程中可以存取 rpm 資料庫。"
+#: lib/rpmfi.c:2375
+msgid "Missing file(s)"
+msgstr ""
 
-#: lib/rpmds.c:971
-msgid "internal support for lua scripts."
-msgstr "lua 指令稿的內部支援。"
+#: lib/rpmfi.c:2376
+msgid "Digest mismatch"
+msgstr "摘要不符"
 
-#: lib/rpmds.c:975
-msgid "file digest algorithm is per package configurable"
-msgstr ""
+#: lib/rpmfi.c:2377
+msgid "Internal error"
+msgstr "內部錯誤"
 
-#: lib/rpmds.c:979
-msgid "support for POSIX.1e file capabilities"
-msgstr ""
+#: lib/rpmfi.c:2378
+msgid "Archive file not in header"
+msgstr "在表頭中沒有封存檔"
 
-#: lib/rpmds.c:983
-msgid "package scriptlets can be expanded at install time."
+#: lib/rpmfi.c:2382
+msgid "File from package already exists as a directory in system"
 msgstr ""
 
-#: lib/rpmds.c:986
-msgid "dependency comparison supports versions with tilde."
+#: lib/rpmfi.c:2389
+msgid " failed - "
+msgstr " 失敗 - "
+
+#: lib/rpmfi.c:2392
+#, c-format
+msgid "%s: (error 0x%x)"
 msgstr ""
 
-#: lib/rpmgi.c:49 lib/rpminstall.c:115 lib/rpminstall.c:308
-#: lib/rpminstall.c:337 tools/rpmgraph.c:92 tools/rpmgraph.c:129
+#: lib/rpmgi.c:55 lib/rpminstall.c:116 lib/rpminstall.c:309
+#: lib/rpminstall.c:341 tools/rpmgraph.c:91 tools/rpmgraph.c:128
 #, c-format
 msgid "open of %s failed: %s\n"
 msgstr "開啟 %s 失敗:%s\n"
 
-#: lib/rpmgi.c:136
+#: lib/rpmgi.c:144
+#, c-format
+msgid "Max level of manifest recursion exceeded: %s\n"
+msgstr ""
+
+#: lib/rpmgi.c:155
 #, c-format
 msgid "%s: not an rpm package (or package manifest)\n"
 msgstr ""
 
-#: lib/rpminstall.c:141
+#: lib/rpminstall.c:142
 #, c-format
 msgid "Updating / installing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:143
+#: lib/rpminstall.c:144
 #, c-format
 msgid "Cleaning up / removing...\n"
 msgstr ""
 
-#: lib/rpminstall.c:192
+#: lib/rpminstall.c:193
 msgid "Preparing..."
 msgstr "正在準備…"
 
-#: lib/rpminstall.c:194
+#: lib/rpminstall.c:195
 msgid "Preparing packages..."
 msgstr ""
 
-#: lib/rpminstall.c:270 tools/rpmgraph.c:168
+#: lib/rpminstall.c:271 tools/rpmgraph.c:167
 msgid "Failed dependencies:\n"
 msgstr "相依關係失敗:\n"
 
-#: lib/rpminstall.c:321
+#: lib/rpminstall.c:323
 #, c-format
 msgid "%s: not an rpm package (or package manifest): %s\n"
-msgstr "%s:不是 rpm 套件 (或套件 manifest):%s\n"
+msgstr "%s:不是 rpm 軟體包 (或軟體包 manifest):%s\n"
 
-#: lib/rpminstall.c:357 lib/rpminstall.c:716 tools/rpmgraph.c:112
+#: lib/rpminstall.c:362 lib/rpminstall.c:752 tools/rpmgraph.c:111
 #, c-format
 msgid "%s cannot be installed\n"
 msgstr "%s 無法安裝\n"
 
-#: lib/rpminstall.c:464
+#: lib/rpminstall.c:490
 #, c-format
 msgid "Retrieving %s\n"
 msgstr "正在擷取 %s\n"
 
-#: lib/rpminstall.c:476
+#: lib/rpminstall.c:502
 #, c-format
 msgid "skipping %s - transfer failed\n"
 msgstr ""
 
-#: lib/rpminstall.c:542
+#: lib/rpminstall.c:572
 #, c-format
 msgid "package %s is not relocatable\n"
-msgstr "套件 %s 不能重新分配位置\n"
+msgstr "軟體包 %s 不能重新分配位置\n"
 
-#: lib/rpminstall.c:570
+#: lib/rpminstall.c:603
 #, c-format
 msgid "error reading from file %s\n"
 msgstr "讀取檔案 %s 時發生錯誤\n"
 
-#: lib/rpminstall.c:661
+#: lib/rpminstall.c:697
 #, c-format
 msgid "\"%s\" specifies multiple packages:\n"
-msgstr "「%s」指定多個套件:\n"
+msgstr "「%s」指定多個軟體包:\n"
 
-#: lib/rpminstall.c:700
+#: lib/rpminstall.c:736
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "無法開啟 %s:%s\n"
 
-#: lib/rpminstall.c:706
+#: lib/rpminstall.c:742
 #, c-format
 msgid "Installing %s\n"
 msgstr "正在安裝 %s\n"
 
-#: lib/rpmlead.c:100
+#: lib/rpmlead.c:95
 msgid "not an rpm package"
-msgstr "並非 rpm 套件"
+msgstr "並非 rpm 軟體包"
 
-#: lib/rpmlead.c:104
+#: lib/rpmlead.c:99
 msgid "illegal signature type"
 msgstr "無效的簽署類型"
 
-#: lib/rpmlead.c:108
+#: lib/rpmlead.c:103
 msgid "unsupported RPM package version"
-msgstr "未支援的 RPM 套件版本"
+msgstr "未支援的 RPM 軟體包版本"
 
-#: lib/rpmlead.c:123
+#: lib/rpmlead.c:118
 #, c-format
 msgid "read failed: %s (%d)\n"
 msgstr "讀取失敗:%s (%d)\n"
 
-#: lib/rpmlead.c:126
+#: lib/rpmlead.c:121
 msgid "not an rpm package\n"
-msgstr "並非 rpm 套件\n"
+msgstr "並非 rpm 軟體包\n"
 
-#: lib/rpmlock.c:102 lib/rpmlock.c:109
+#: lib/rpmlock.c:119 lib/rpmlock.c:138
 #, c-format
 msgid "can't create %s lock on %s (%s)\n"
 msgstr ""
 
-#: lib/rpmlock.c:106
+#: lib/rpmlock.c:133
 #, c-format
 msgid "waiting for %s lock on %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:59
+#: lib/rpmplugins.c:65
 #, c-format
 msgid "Failed to dlopen %s %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:66
+#: lib/rpmplugins.c:73
 #, c-format
 msgid "Failed to resolve symbol %s: %s\n"
 msgstr ""
 
-#: lib/rpmplugins.c:87
+#: lib/rpmplugins.c:154
 #, c-format
-msgid "Failed to expand %%__collection_%s macro\n"
+msgid "Plugin %%__%s_%s not configured\n"
 msgstr ""
 
-#: lib/rpmplugins.c:136 lib/rpmplugins.c:141
+#: lib/rpmplugins.c:199
 #, c-format
 msgid "Plugin %s not loaded\n"
 msgstr "%s 插件未載入\n"
 
-#: lib/rpmplugins.c:149
-#, c-format
-msgid "Failed to resolve %s plugin symbol %s: %s\n"
-msgstr ""
-
 #: lib/rpmprob.c:109
 msgid "different"
 msgstr "不同"
@@ -2644,22 +3237,22 @@ msgstr "不同"
 #: lib/rpmprob.c:114
 #, c-format
 msgid "package %s is intended for a %s architecture"
-msgstr "套件 %s 是針對 %s 架構"
+msgstr "軟體包 %s 是針對 %s 架構"
 
 #: lib/rpmprob.c:118
 #, c-format
 msgid "package %s is intended for a %s operating system"
-msgstr "套件 %s 是針對 %s 作業系統"
+msgstr "軟體包 %s 是針對 %s 作業系統"
 
 #: lib/rpmprob.c:122
 #, c-format
 msgid "package %s is already installed"
-msgstr "套件 %s 已經安裝"
+msgstr "軟體包 %s 已經安裝"
 
 #: lib/rpmprob.c:125
 #, c-format
 msgid "path %s in package %s is not relocatable"
-msgstr "在套件 %2$s 中的路徑 %1$s 無法重新分配位置"
+msgstr "在軟體包 %2$s 中的路徑 %1$s 無法重新分配位置"
 
 #: lib/rpmprob.c:130
 #, c-format
@@ -2669,12 +3262,12 @@ msgstr "在試圖安裝 %2$s 和 %3$s 之間產生檔案 %1$s 衝突"
 #: lib/rpmprob.c:135
 #, c-format
 msgid "file %s from install of %s conflicts with file from package %s"
-msgstr "從 %2$s 安裝的檔案 %1$s 與來自套件 %3$s 的檔案產生衝突"
+msgstr "從 %2$s 安裝的檔案 %1$s 與來自軟體包 %3$s 的檔案產生衝突"
 
 #: lib/rpmprob.c:140
 #, c-format
 msgid "package %s (which is newer than %s) is already installed"
-msgstr "套件 %s (比 %s 還新) 已經安裝"
+msgstr "軟體包 %s (比 %s 還新) 已經安裝"
 
 #: lib/rpmprob.c:145
 #, c-format
@@ -2708,798 +3301,635 @@ msgstr ""
 #: lib/rpmprob.c:172
 #, c-format
 msgid "unknown error %d encountered while manipulating package %s"
-msgstr "遭遇未知錯誤 %d 於處理套件 %s 之時"
+msgstr "遭遇未知錯誤 %d 於處理軟體包 %s 之時"
 
-#: lib/rpmrc.c:194
+#: lib/rpmrc.c:222
 #, c-format
 msgid "missing second ':' at %s:%d\n"
 msgstr "在 %s:%d 處遺漏第二個「:」\n"
 
-#: lib/rpmrc.c:197
+#: lib/rpmrc.c:225
 #, c-format
 msgid "missing architecture name at %s:%d\n"
 msgstr "在 %s:%d 處遺漏架構名稱\n"
 
-#: lib/rpmrc.c:342
+#: lib/rpmrc.c:370
 #, c-format
 msgid "Incomplete data line at %s:%d\n"
 msgstr "不完整資料列位於 %s:%d\n"
 
-#: lib/rpmrc.c:347
+#: lib/rpmrc.c:375
 #, c-format
 msgid "Too many args in data line at %s:%d\n"
 msgstr "在資料列的 %s:%d 中有過多引數\n"
 
-#: lib/rpmrc.c:354
+#: lib/rpmrc.c:382
 #, c-format
 msgid "Bad arch/os number: %s (%s:%d)\n"
 msgstr "不良架構/作業系統編號:%s (%s:%d)\n"
 
-#: lib/rpmrc.c:385
+#: lib/rpmrc.c:413
 #, c-format
 msgid "Incomplete default line at %s:%d\n"
 msgstr "不完整預設列位於 %s:%d\n"
 
-#: lib/rpmrc.c:390
+#: lib/rpmrc.c:418
 #, c-format
 msgid "Too many args in default line at %s:%d\n"
 msgstr "在預設列的 %s:%d 中有過多引數\n"
 
-#: lib/rpmrc.c:495
+#: lib/rpmrc.c:523
 #, c-format
 msgid "missing ':' (found 0x%02x) at %s:%d\n"
 msgstr "遺漏「:」(找到 0x%02x) 位於 %s:%d\n"
 
-#: lib/rpmrc.c:512 lib/rpmrc.c:544
+#: lib/rpmrc.c:540 lib/rpmrc.c:572
 #, c-format
 msgid "missing argument for %s at %s:%d\n"
 msgstr "%s 遺漏引數位於 %s:%d\n"
 
-#: lib/rpmrc.c:523
+#: lib/rpmrc.c:551
 #, c-format
 msgid "cannot open %s at %s:%d: %m\n"
 msgstr ""
 
-#: lib/rpmrc.c:536
-#, c-format
-msgid "missing architecture for %s at %s:%d\n"
-msgstr "%s 遺漏架構位於 %s:%d\n"
-
-#: lib/rpmrc.c:603
-#, c-format
-msgid "bad option '%s' at %s:%d\n"
-msgstr "不良選項「%s」位於 %s:%d\n"
-
-#: lib/rpmrc.c:927
-msgid "Failed to read auxiliary vector, /proc not mounted?\n"
-msgstr ""
-
-#: lib/rpmrc.c:1349
-#, c-format
-msgid "Unknown system: %s\n"
-msgstr "未知系統:%s\n"
-
-#: lib/rpmrc.c:1350
-#, c-format
-msgid "Please contact %s\n"
-msgstr "請聯絡 %s\n"
-
-#: lib/rpmrc.c:1591
-#, c-format
-msgid "Unable to open %s for reading: %m.\n"
-msgstr "無法開啟 %s 以供讀取:%m。\n"
-
-#: lib/rpmscript.c:75
-#, c-format
-msgid "Unable to restore current directory: %m"
-msgstr ""
-
-#: lib/rpmscript.c:86
-msgid "<lua> scriptlet support not built in\n"
-msgstr ""
-
-#: lib/rpmscript.c:221
-#, c-format
-msgid "Couldn't create temporary file for %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:248
-#, c-format
-msgid "Couldn't duplicate file descriptor: %s: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:272
-#, c-format
-msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
-msgstr ""
-
-#: lib/rpmscript.c:276
-#, c-format
-msgid "%s scriptlet failed, signal %d\n"
-msgstr ""
-
-#: lib/rpmscript.c:279
-#, c-format
-msgid "%s scriptlet failed, exit status %d\n"
-msgstr ""
-
-#: lib/rpmtd.c:258
-msgid "Unknown format"
-msgstr "未知格式"
-
-#: lib/rpmte.c:868
-msgid "install"
-msgstr "安裝"
-
-#: lib/rpmte.c:869
-msgid "erase"
-msgstr "抹除"
-
-#: lib/rpmts.c:92
-#, c-format
-msgid "cannot open Packages database in %s\n"
-msgstr "無法開啟套件資料庫 %s\n"
-
-#: lib/rpmts.c:191
-#, c-format
-msgid "extra '(' in package label: %s\n"
-msgstr "額外的「(」存在於套件標籤中:%s\n"
-
-#: lib/rpmts.c:209
-#, c-format
-msgid "missing '(' in package label: %s\n"
-msgstr "套件標籤遺漏「(」:%s\n"
-
-#: lib/rpmts.c:217
-#, c-format
-msgid "missing ')' in package label: %s\n"
-msgstr "套件標籤遺漏「)」:%s\n"
-
-#: lib/rpmts.c:273
-#, c-format
-msgid "%s: reading of public key failed.\n"
-msgstr ""
-
-#: lib/rpmts.c:1087
-msgid "transaction"
-msgstr "處理事項"
-
-#: lib/signature.c:90
-#, c-format
-msgid "sigh size(%d): BAD, read returned %d\n"
-msgstr "sigh 大小(%d):不良,讀取回傳的 %d\n"
-
-#: lib/signature.c:95
-msgid "sigh magic: BAD\n"
-msgstr "sigh magic:不良\n"
-
-#: lib/signature.c:101
-#, c-format
-msgid "sigh tags: BAD, no. of tags(%d) out of range\n"
-msgstr "sigh 標籤:不良,標籤(%d) 的編號超出範圍\n"
-
-#: lib/signature.c:107
-#, c-format
-msgid "sigh data: BAD, no. of  bytes(%d) out of range\n"
-msgstr "sigh 資料:不良,位元組(%d) 的編號超出範圍\n"
-
-#: lib/signature.c:123
-#, c-format
-msgid "sigh blob(%d): BAD, read returned %d\n"
-msgstr "sigh blob(%d):不良,讀取回傳的 %d\n"
-
-#: lib/signature.c:196
-#, c-format
-msgid "sigh tag[%d]: BAD, tag %d type %d offset %d count %d\n"
-msgstr "sigh 標籤[%d]:不良,標籤 %d 類型 %d 偏移 %d 計數 %d\n"
-
-#: lib/signature.c:206
-msgid "sigh load: BAD\n"
-msgstr "sigh 載入:不良\n"
-
-#: lib/signature.c:219
-#, c-format
-msgid "sigh pad(%zd): BAD, read %zd bytes\n"
-msgstr ""
-
-#: lib/signature.c:235
-#, c-format
-msgid "sigh sigSize(%zd): BAD, fstat(2) failed\n"
-msgstr ""
-
-#: lib/signature.c:311
-msgid "Immutable header region could not be read. Corrupted package?\n"
-msgstr ""
-
-#: lib/signature.c:321
-msgid "Cannot sign RPM v3 packages\n"
-msgstr ""
-
-#: lib/signature.c:408
-msgid "MD5 digest:"
-msgstr "MD5 摘要:"
-
-#: lib/signature.c:447
-msgid "Header SHA1 digest:"
-msgstr "表頭 SHA1 摘要:"
-
-#: lib/signature.c:489
-msgid "Header "
-msgstr "表頭 "
-
-#: lib/signature.c:530
-#, c-format
-msgid "Verify signature: BAD PARAMETERS (%d %p %d %p %p)\n"
-msgstr ""
-
-#: lib/transaction.c:1426
-msgid "skipped"
-msgstr "已跳過"
-
-#: lib/transaction.c:1426
-msgid "failed"
-msgstr "已失敗"
-
-#: lib/verify.c:372
-#, c-format
-msgid "missing   %c %s"
-msgstr "遺漏      %c %s"
-
-#: lib/verify.c:422
-#, c-format
-msgid "Unsatisfied dependencies for %s:\n"
-msgstr ""
-
-#: lib/headerfmt.c:336
-msgid "invalid field width"
-msgstr ""
-
-#: lib/headerfmt.c:342
-msgid "missing { after %"
-msgstr "% 之後遺漏 {"
-
-#: lib/headerfmt.c:364
-msgid "missing } after %{"
-msgstr "%{ 之後遺漏 }"
-
-#: lib/headerfmt.c:375
-msgid "empty tag format"
-msgstr "空白標籤格式"
-
-#: lib/headerfmt.c:386
-msgid "empty tag name"
-msgstr "空白標籤名稱"
-
-#: lib/headerfmt.c:393
-msgid "unknown tag"
-msgstr "未知標籤"
-
-#: lib/headerfmt.c:413
-msgid "] expected at end of array"
-msgstr "] 預期在陣列的結尾"
-
-#: lib/headerfmt.c:425
-msgid "unexpected ]"
-msgstr "未預期的 ]"
-
-#: lib/headerfmt.c:435
-msgid "unexpected }"
-msgstr "未預期的 }"
-
-#: lib/headerfmt.c:491
-msgid "? expected in expression"
-msgstr "? 預期於表述式中"
-
-#: lib/headerfmt.c:498
-msgid "{ expected after ? in expression"
-msgstr "{ 預期於表述式中的 ? 之後"
-
-#: lib/headerfmt.c:510 lib/headerfmt.c:550
-msgid "} expected in expression"
-msgstr "} 預期於表述式中"
-
-#: lib/headerfmt.c:518
-msgid ": expected following ? subexpression"
-msgstr ": 預期跟著 ? 子表述式"
-
-#: lib/headerfmt.c:536
-msgid "{ expected after : in expression"
-msgstr "{ 預期於表述式中 : 之後"
-
-#: lib/headerfmt.c:558
-msgid "| expected at end of expression"
-msgstr "| 預期於表述式的結尾"
-
-#: lib/headerfmt.c:735
-msgid "array iterator used with different sized arrays"
-msgstr "用於不同大小陣列的陣列迭代器"
-
-#: lib/rpmdb.c:97
-#, c-format
-msgid "Generating %d missing index(es), please wait...\n"
-msgstr ""
-
-#: lib/rpmdb.c:191
-#, c-format
-msgid "cannot open %s index using db%d - %s (%d)\n"
-msgstr "無法使用 db%2$d 開啟 %1$s 索引 - %3$s (%4$d)\n"
-
-#: lib/rpmdb.c:516
-#, c-format
-msgid "error(%d) getting \"%s\" records from %s index: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:789
-msgid "no dbpath has been set\n"
-msgstr "尚未設定 dbpath\n"
-
-#: lib/rpmdb.c:1308
-msgid "miFreeHeader: skipping"
-msgstr "miFreeHeader:跳過"
-
-#: lib/rpmdb.c:1318
-#, c-format
-msgid "error(%d) storing record #%d into %s\n"
-msgstr "儲存記錄 #%2$d 到 %3$s 時發生錯誤(%1$d)\n"
-
-#: lib/rpmdb.c:1415
-#, c-format
-msgid "%s: regexec failed: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1596
-#, c-format
-msgid "%s: regcomp failed: %s\n"
-msgstr ""
-
-#: lib/rpmdb.c:1759
-msgid "rpmdbNextIterator: skipping"
-msgstr "rpmdbNextIterator:跳過"
-
-#: lib/rpmdb.c:1897
-#, c-format
-msgid "rpmdb: damaged header #%u retrieved -- skipping.\n"
-msgstr "rpmdb:已擷取損壞的表頭 #%u -- 跳過。\n"
-
-#: lib/rpmdb.c:2250
-#, c-format
-msgid "error(%d:%s) getting next key from %s index\n"
-msgstr ""
-
-#: lib/rpmdb.c:2349
+#: lib/rpmrc.c:564
 #, c-format
-msgid "error(%d) adding header #%d record\n"
-msgstr ""
+msgid "missing architecture for %s at %s:%d\n"
+msgstr "%s 遺漏架構位於 %s:%d\n"
 
-#: lib/rpmdb.c:2358
+#: lib/rpmrc.c:632
 #, c-format
-msgid "error(%d) removing header #%d record\n"
+msgid "bad option '%s' at %s:%d\n"
+msgstr "不良選項「%s」位於 %s:%d\n"
+
+#: lib/rpmrc.c:972
+msgid "Failed to read auxiliary vector, /proc not mounted?\n"
 msgstr ""
 
-#: lib/rpmdb.c:2382
+#: lib/rpmrc.c:1469
 #, c-format
-msgid "%s: cannot read header at 0x%x\n"
-msgstr "%s:無法讀取位於 0x%x 的表頭\n"
+msgid "Unknown system: %s\n"
+msgstr "未知系統:%s\n"
 
-#: lib/rpmdb.c:2448
+#: lib/rpmrc.c:1471
 #, c-format
-msgid "error(%d) setting \"%s\" records from %s index\n"
-msgstr "從 %3$s 索引設定「%2$s」記錄時產生錯誤(%1$d)\n"
+msgid "Please contact %s\n"
+msgstr "請聯絡 %s\n"
 
-#: lib/rpmdb.c:2467
+#: lib/rpmrc.c:1604
 #, c-format
-msgid "error(%d) storing record \"%s\" into %s\n"
-msgstr "儲存記錄「%2$s」到 %3$s 時發生錯誤(%1$d)\n"
+msgid "Unable to open %s for reading: %m.\n"
+msgstr "無法開啟 %s 以供讀取:%m。\n"
 
-#: lib/rpmdb.c:2477
-#, c-format
-msgid "error(%d) removing record \"%s\" from %s\n"
-msgstr "從 %3$s 移除記錄「%2$s」時發生錯誤(%1$d)\n"
+#: lib/rpmrc.c:1622
+msgid "failed to register exit handler"
+msgstr ""
+
+#: lib/rpmscript.c:133
+msgid "No exec() called after fork() in lua scriptlet\n"
+msgstr ""
 
-#: lib/rpmdb.c:2551
+#: lib/rpmscript.c:138
 #, c-format
-msgid "error(%d) allocating new package instance\n"
-msgstr "分配新套件實體時發生錯誤(%d)\n"
+msgid "Unable to restore current directory: %m"
+msgstr ""
 
-#: lib/rpmdb.c:2644
+#: lib/rpmscript.c:149 rpmio/macro.c:855
+msgid "<lua> scriptlet support not built in\n"
+msgstr ""
+
+#: lib/rpmscript.c:278
 #, c-format
-msgid "error(%d) getting \"%s\" records from %s index\n"
-msgstr "從 %3$s 索引取得「%2$s」記錄時發生錯誤(%1$d)\n"
+msgid "Couldn't create temporary file for %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2660
+#: lib/rpmscript.c:313
 #, c-format
-msgid "error(%d) storing record %s into %s\n"
-msgstr "儲存記錄 %2$s 於 %3$s 時發生錯誤(%1$d)\n"
+msgid "Couldn't duplicate file descriptor: %s: %s\n"
+msgstr ""
 
-#: lib/rpmdb.c:2857
-msgid "no dbpath has been set"
-msgstr "尚未設定 dbpath"
+#: lib/rpmscript.c:353
+#, c-format
+msgid "Fwrite failed: %s"
+msgstr ""
 
-#: lib/rpmdb.c:2875
+#: lib/rpmscript.c:371
 #, c-format
-msgid "failed to create directory %s: %s\n"
+msgid "%s scriptlet failed, waitpid(%d) rc %d: %s\n"
 msgstr ""
 
-#: lib/rpmdb.c:2910
+#: lib/rpmscript.c:375
 #, c-format
-msgid "header #%u in the database is bad -- skipping.\n"
-msgstr "在資料庫中有不良的表頭 #%u -- 跳過。\n"
+msgid "%s scriptlet failed, signal %d\n"
+msgstr ""
 
-#: lib/rpmdb.c:2924
+#: lib/rpmscript.c:378
 #, c-format
-msgid "cannot add record originally at %u\n"
-msgstr "無法加入原本位於 %u 的記錄\n"
+msgid "%s scriptlet failed, exit status %d\n"
+msgstr ""
 
-#: lib/rpmdb.c:2939
-msgid "failed to rebuild database: original database remains in place\n"
-msgstr "重建資料庫時失敗:原來的資料庫保持原狀\n"
+#: lib/rpmtd.c:248
+msgid "Unknown format"
+msgstr "未知格式"
 
-#: lib/rpmdb.c:2947
-msgid "failed to replace old database with new database!\n"
-msgstr "以新的資料庫取代舊的資料庫時失敗!\n"
+#: lib/rpmte.c:729
+msgid "install"
+msgstr "安裝"
 
-#: lib/rpmdb.c:2949
-#, c-format
-msgid "replace files in %s with files from %s to recover"
-msgstr "以 %2$s 的檔案取代 %1$s 的檔案來復原"
+#: lib/rpmte.c:730
+msgid "erase"
+msgstr "抹除"
 
-#: lib/rpmdb.c:2960
+#: lib/rpmts.c:100
 #, c-format
-msgid "failed to remove directory %s: %s\n"
-msgstr "ç§»é\99¤ç\9b®é\8c\84æ\99\82失æ\95\97 %sï¼\9a%s\n"
+msgid "cannot open Packages database in %s\n"
+msgstr "ç\84¡æ³\95é\96\8bå\95\9fè»\9fé«\94å\8c\85è³\87æ\96\99庫 %s\n"
 
-#: lib/backend/db3.c:33
+#: lib/rpmts.c:199
 #, c-format
-msgid "db%d error(%d) from %s: %s\n"
-msgstr "db%d 錯誤(%d) 來自 %s:%s\n"
+msgid "extra '(' in package label: %s\n"
+msgstr "額外的「(」存在於軟體包標籤中:%s\n"
 
-#: lib/backend/db3.c:36
+#: lib/rpmts.c:217
 #, c-format
-msgid "db%d error(%d): %s\n"
-msgstr "db%d 錯誤(%d):%s\n"
+msgid "missing '(' in package label: %s\n"
+msgstr "軟體包標籤遺漏「(」:%s\n"
 
-#: lib/backend/db3.c:500
+#: lib/rpmts.c:225
 #, c-format
-msgid "cannot get %s lock on %s/%s\n"
-msgstr "無法取得 %s 於 %s/%s 的鎖定\n"
+msgid "missing ')' in package label: %s\n"
+msgstr "軟體包標籤遺漏「)」:%s\n"
 
-#: lib/backend/db3.c:502
-msgid "shared"
-msgstr "已共享"
+#: lib/rpmts.c:284
+#, c-format
+msgid "%s: reading of public key failed.\n"
+msgstr ""
 
-#: lib/backend/db3.c:502
-msgid "exclusive"
-msgstr "排他"
+#: lib/rpmts.c:1142
+msgid "transaction"
+msgstr "處理事項"
 
-#: lib/backend/db3.c:582
+#: lib/rpmvs.c:152
 #, c-format
-msgid "invalid index type %x on %s/%s\n"
+msgid "%s tag %u: invalid type %u"
 msgstr ""
 
-#: lib/backend/dbconfig.c:144
+#: lib/rpmvs.c:158
 #, c-format
-msgid "unrecognized db option: \"%s\" ignored.\n"
-msgstr "無法辨識的資料庫選項:「%s」 已忽略。\n"
+msgid "%s: tag %u: invalid count %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:181
+#: lib/rpmvs.c:178
 #, c-format
-msgid "%s has invalid numeric value, skipped\n"
-msgstr "%s 有無效的數值,略過\n"
+msgid "%s tag %u: invalid data %p (%u)"
+msgstr ""
 
-#: lib/backend/dbconfig.c:190
+#: lib/rpmvs.c:188
 #, c-format
-msgid "%s has too large or too small long value, skipped\n"
-msgstr "%s 有過大或過小的 long 數值,略過\n"
+msgid "%s tag %u: invalid size %u"
+msgstr ""
 
-#: lib/backend/dbconfig.c:199
+#: lib/rpmvs.c:195
 #, c-format
-msgid "%s has too large or too small integer value, skipped\n"
-msgstr "%s 有過大或過小的整數值,略過\n"
+msgid "%s tag %u: invalid OpenPGP signature"
+msgstr ""
 
-#: plugins/sepolicy.c:218
+#: lib/rpmvs.c:206
 #, c-format
-msgid "Failed to decode policy for %s\n"
-msgstr "無法解碼 %s 的方針\n"
+msgid "%s: tag %u: invalid hex"
+msgstr ""
 
-#: plugins/sepolicy.c:225
+#: lib/rpmvs.c:261
 #, c-format
-msgid "Failed to create temporary file for %s: %s\n"
-msgstr "無法為 %s 建立暫存檔:%s\n"
+msgid "%s%s %s"
+msgstr ""
+
+#: lib/rpmvs.c:264
+msgid "digest"
+msgstr ""
 
-#: plugins/sepolicy.c:231
+#: lib/rpmvs.c:268
 #, c-format
-msgid "Failed to write %s policy to file %s\n"
-msgstr "無法寫入 %s 方針至檔案 %s\n"
+msgid "%s%s"
+msgstr ""
 
-#: plugins/sepolicy.c:296
-msgid "Failed to create semanage handle\n"
+#: lib/rpmvs.c:269
+msgid "signature"
 msgstr ""
 
-#: plugins/sepolicy.c:302
-msgid "Failed to connect to policy handler\n"
-msgstr "無法連接至方針處理器\n"
+#: lib/rpmvs.c:295
+msgid "header"
+msgstr ""
 
-#: plugins/sepolicy.c:306
-#, c-format
-msgid "Failed to begin policy transaction: %s\n"
-msgstr "無法開始方針處理事項:%s\n"
+#: lib/rpmvs.c:295
+msgid "package"
+msgstr ""
 
-#: plugins/sepolicy.c:337
-#, c-format
-msgid "Failed to remove temporary policy file %s: %s\n"
-msgstr "無法移除暫存方針檔 %s:%s\n"
+#: lib/rpmvs.c:396
+msgid "Header "
+msgstr "表頭 "
 
-#: plugins/sepolicy.c:386
-#, c-format
-msgid "Failed to install policy module: %s (%s)\n"
-msgstr "無法安裝方針模組:%s (%s)\n"
+#: lib/rpmvs.c:397
+msgid "Payload "
+msgstr ""
 
-#: plugins/sepolicy.c:416
-#, c-format
-msgid "Failed to remove policy module: %s\n"
-msgstr "無法移除方針模組:%s\n"
+#: lib/signature.c:213
+msgid "Unable to reload signature header.\n"
+msgstr "無法重新載入簽署表頭。\n"
 
-#: plugins/sepolicy.c:440 plugins/sepolicy.c:492
-#, c-format
-msgid "Failed to fork process: %s\n"
-msgstr "無法分支程序:%s\n"
+#: lib/transaction.c:1397
+msgid "skipped"
+msgstr "已跳過"
 
-#: plugins/sepolicy.c:450 plugins/sepolicy.c:502
-#, c-format
-msgid "Failed to execute %s: %s\n"
-msgstr "無法執行 %s:%s\n"
+#: lib/transaction.c:1397
+msgid "failed"
+msgstr "已失敗"
 
-#: plugins/sepolicy.c:456 plugins/sepolicy.c:508
+#: lib/verify.c:263
 #, c-format
-msgid "%s terminated abnormally\n"
-msgstr "%s 已異常終止\n"
+msgid "Duplicate username or UID for user %s\n"
+msgstr ""
 
-#: plugins/sepolicy.c:460 plugins/sepolicy.c:512
+#: lib/verify.c:284
 #, c-format
-msgid "%s failed with exit code %i\n"
-msgstr "%s 已失敗並伴隨代碼 %i\n"
+msgid "Duplicate groupname or GID for group %s\n"
+msgstr ""
 
-#: plugins/sepolicy.c:467
-msgid "Failed to commit policy changes\n"
-msgstr "無法提交方針變更\n"
+#: lib/verify.c:395
+msgid "no state"
+msgstr ""
 
-#: plugins/sepolicy.c:484
-msgid "Failed to expand restorecon path"
-msgstr "無法擴展 restorecon 路徑"
+#: lib/verify.c:397
+msgid "unknown state"
+msgstr ""
 
-#: plugins/sepolicy.c:563
-msgid "Failed to relabel filesystem. Files may be mislabeled\n"
-msgstr "無法將檔案系統重新標籤。檔案可能標籤有誤\n"
+#: lib/verify.c:448
+#, c-format
+msgid "missing   %c %s"
+msgstr "遺漏      %c %s"
 
-#: plugins/sepolicy.c:567
-msgid "Failed to reload file contexts. Files may be mislabeled\n"
-msgstr "無法重新載入檔案情境。檔案可能標籤有誤\n"
+#: lib/verify.c:503
+#, c-format
+msgid "Unsatisfied dependencies for %s:\n"
+msgstr ""
 
-#: plugins/sepolicy.c:594
+#: plugins/prioreset.c:29
 #, c-format
-msgid "Failed to extract policy from %s\n"
-msgstr "無法從 %s 抽出方針\n"
+msgid "Unable to reset nice value: %s"
+msgstr ""
 
-#: rpmio/macro.c:185
+#: plugins/prioreset.c:40
 #, c-format
-msgid "======================== active %d empty %d\n"
-msgstr "======================== 作用中 %d 清空 %d\n"
+msgid "Unable to reset I/O priority: %s"
+msgstr ""
+
+#: rpmio/digest_nss.c:68
+msgid "Failed to initialize NSS library\n"
+msgstr ""
 
-#: rpmio/macro.c:323
+#: rpmio/digest_nss.c:79
 #, c-format
-msgid "%3d>%*s(empty)"
+msgid "Failed to register fork handler: %m\n"
+msgstr ""
+
+#: rpmio/macro.c:286
+#, fuzzy, c-format
+msgid "%3d>%*s(empty)\n"
 msgstr "%3d>%*s(清空)"
 
-#: rpmio/macro.c:364
+#: rpmio/macro.c:316
 #, c-format
 msgid "%3d<%*s(empty)\n"
 msgstr "%3d<%*s(清空)\n"
 
-#: rpmio/macro.c:537 rpmio/macro.c:575
+#: rpmio/macro.c:483
 #, c-format
-msgid "Macro %%%s has unterminated body\n"
-msgstr "巨集 %%%s 具有未終結的主體\n"
+msgid "Macro %%%s has unterminated opts\n"
+msgstr "巨集 %%%s 具有未終結的選項\n"
 
-#: rpmio/macro.c:594
+#: rpmio/macro.c:495 rpmio/macro.c:533
 #, c-format
-msgid "Macro %%%s has illegal name (%%define)\n"
-msgstr "巨集 %%%s 具有無效的名稱 (%%define)\n"
+msgid "Macro %%%s has unterminated body\n"
+msgstr "巨集 %%%s 具有未終結的主體\n"
 
-#: rpmio/macro.c:600
+#: rpmio/macro.c:551
 #, c-format
-msgid "Macro %%%s has unterminated opts\n"
-msgstr "巨集 %%%s 具有未終結的選項\n"
+msgid "Macro %%%s has illegal name (%s)\n"
+msgstr ""
 
-#: rpmio/macro.c:605
+#: rpmio/macro.c:557
 #, c-format
 msgid "Macro %%%s has empty body\n"
 msgstr "巨集 %%%s 具有空的主體\n"
 
-#: rpmio/macro.c:611
+#: rpmio/macro.c:562
+#, c-format
+msgid "Macro %%%s needs whitespace before body\n"
+msgstr ""
+
+#: rpmio/macro.c:566
 #, c-format
 msgid "Macro %%%s failed to expand\n"
 msgstr "巨集 %%%s 展開時失敗\n"
 
-#: rpmio/macro.c:649
+#: rpmio/macro.c:607
 #, c-format
 msgid "Macro %%%s has illegal name (%%undefine)\n"
 msgstr "巨集 %%%s 具有無效的名稱 (%%undefine)\n"
 
-#: rpmio/macro.c:743
+#: rpmio/macro.c:637
 #, c-format
-msgid "Macro %%%s (%s) was not used below level %d\n"
-msgstr "巨集 %%%s (%s) 在層級 %d 之下未被使用\n"
+msgid "Macro %%%s defined but not used within scope\n"
+msgstr ""
 
-#: rpmio/macro.c:825
+#: rpmio/macro.c:761
 #, c-format
 msgid "Unknown option %c in %s(%s)\n"
 msgstr "在 %2$s(%3$s) 中有未知的選項 %1$c\n"
 
-#: rpmio/macro.c:1048
+#: rpmio/macro.c:1055
 msgid ""
 "Too many levels of recursion in macro expansion. It is likely caused by "
 "recursive macro declaration.\n"
 msgstr ""
 
-#: rpmio/macro.c:1117 rpmio/macro.c:1134
+#: rpmio/macro.c:1125 rpmio/macro.c:1141
 #, c-format
 msgid "Unterminated %c: %s\n"
 msgstr "未終結的 %c:%s\n"
 
-#: rpmio/macro.c:1175
+#: rpmio/macro.c:1182
 #, c-format
 msgid "A %% is followed by an unparseable macro\n"
 msgstr "在無法解析的巨集之後跟著一個 %%\n"
 
-#: rpmio/rpmfileutil.c:245
+#: rpmio/macro.c:1197
+#, c-format
+msgid "failed to load macro file %s"
+msgstr ""
+
+#: rpmio/macro.c:1578
+#, c-format
+msgid "======================== active %d empty %d\n"
+msgstr "======================== 作用中 %d 清空 %d\n"
+
+#: rpmio/rpmfileutil.c:258
 #, c-format
 msgid "error creating temporary file %s: %m\n"
 msgstr ""
 
-#: rpmio/rpmfileutil.c:310 rpmio/rpmfileutil.c:316
+#: rpmio/rpmfileutil.c:323 rpmio/rpmfileutil.c:329
 #, c-format
 msgid "File %s: %s\n"
 msgstr "檔案 %s:%s\n"
 
-#: rpmio/rpmfileutil.c:319
+#: rpmio/rpmfileutil.c:332
 #, c-format
 msgid "File %s is smaller than %u bytes\n"
 msgstr "檔案 %s 小於 %u 位元組\n"
 
-#: rpmio/rpmfileutil.c:587
-msgid "failed to create directory"
-msgstr "無法建立目錄"
+#: rpmio/rpmio.c:298
+msgid "[none]"
+msgstr ""
+
+#: rpmio/rpmlog.c:81
+msgid "(no error)"
+msgstr "(無錯誤)"
+
+#: rpmio/rpmlog.c:191 rpmio/rpmlog.c:192 rpmio/rpmlog.c:193
+msgid "fatal error: "
+msgstr "嚴重錯誤:"
 
-#: rpmio/rpmlua.c:506
+#: rpmio/rpmlog.c:194
+msgid "error: "
+msgstr "錯誤:"
+
+#: rpmio/rpmlog.c:195
+msgid "warning: "
+msgstr "警告:"
+
+#: rpmio/rpmlua.c:523
 #, c-format
 msgid "invalid syntax in lua scriptlet: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:522
+#: rpmio/rpmlua.c:541
 #, c-format
 msgid "invalid syntax in lua script: %s\n"
 msgstr ""
 
-#: rpmio/rpmlua.c:527 rpmio/rpmlua.c:546
+#: rpmio/rpmlua.c:546 rpmio/rpmlua.c:565
 #, c-format
 msgid "lua script failed: %s\n"
 msgstr "lua 指令稿失敗:%s\n"
 
-#: rpmio/rpmlua.c:541
+#: rpmio/rpmlua.c:560
 #, c-format
 msgid "invalid syntax in lua file: %s\n"
 msgstr "lua 檔案內有無效語法:%s\n"
 
-#: rpmio/rpmlua.c:709
+#: rpmio/rpmlua.c:756
 #, c-format
 msgid "lua hook failed: %s\n"
 msgstr ""
 
-#: rpmio/rpmio.c:314
-msgid "[none]"
-msgstr ""
-
-#: rpmio/rpmlog.c:37
-msgid "(no error)"
-msgstr "(無錯誤)"
-
-#: rpmio/rpmlog.c:148 rpmio/rpmlog.c:149 rpmio/rpmlog.c:150
-msgid "fatal error: "
-msgstr "嚴重錯誤:"
-
-#: rpmio/rpmlog.c:151
-msgid "error: "
-msgstr "錯誤:"
-
-#: rpmio/rpmlog.c:152
-msgid "warning: "
-msgstr "警告:"
-
 #: rpmio/rpmmalloc.c:25
 #, c-format
 msgid "memory alloc (%u bytes) returned NULL.\n"
 msgstr "記憶體配置 (%u 位元組) 回傳 NULL。\n"
 
-#: rpmio/rpmpgp.c:1008
+#: rpmio/rpmpgp.c:664 rpmio/rpmpgp.c:752 rpmio/rpmpgp.c:826
+#, c-format
+msgid "Unsupported version of key: V%d\n"
+msgstr ""
+
+#: rpmio/rpmpgp.c:1127
 #, c-format
 msgid "V%d %s/%s %s, key ID %s"
 msgstr ""
 
-#: rpmio/rpmpgp.c:1016
+#: rpmio/rpmpgp.c:1135
 msgid "(none)"
 msgstr "(無)"
 
-#: sign/rpmgensig.c:87
+#: rpmio/rpmsq.c:37
+#, c-format
+msgid "exiting on signal %d from pid %d\n"
+msgstr ""
+
+#: sign/rpmgensig.c:54
+#, c-format
+msgid "error creating temp directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:62
+#, c-format
+msgid "error creating fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:83
+#, c-format
+msgid "error delete fifo %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:91
+#, c-format
+msgid "error delete directory %s: %m\n"
+msgstr ""
+
+#: sign/rpmgensig.c:167
 #, c-format
 msgid "%s: Fwrite failed: %s\n"
 msgstr "%s: Fwrite 失敗:%s\n"
 
-#: sign/rpmgensig.c:97
+#: sign/rpmgensig.c:173
+#, c-format
+msgid "%s: Fread failed: %s\n"
+msgstr "%s:Fread 失敗:%s\n"
+
+#: sign/rpmgensig.c:177
 #, c-format
 msgid "%s: Fflush failed: %s\n"
 msgstr ""
 
-#: sign/rpmgensig.c:125
+#: sign/rpmgensig.c:202
 msgid "Unsupported PGP signature\n"
 msgstr ""
 
-#: sign/rpmgensig.c:131
+#: sign/rpmgensig.c:208
 #, c-format
 msgid "Unsupported PGP hash algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:144
+#: sign/rpmgensig.c:221
 #, c-format
 msgid "Unsupported PGP pubkey algorithm %u\n"
 msgstr ""
 
-#: sign/rpmgensig.c:174
+#: sign/rpmgensig.c:270
+#, c-format
+msgid "Could not exec %s: %s\n"
+msgstr "無法執行 %s:%s\n"
+
+#: sign/rpmgensig.c:280
+msgid "Fopen failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:295
+msgid "Could not write to pipe\n"
+msgstr ""
+
+#: sign/rpmgensig.c:302
 #, c-format
-msgid "Couldn't create pipe for signing: %m"
-msgstr "無法建立簽署用的導管:%m"
+msgid "Could not read from file %s: %s\n"
+msgstr ""
 
-#: sign/rpmgensig.c:216
+#: sign/rpmgensig.c:312
 #, c-format
 msgid "gpg exec failed (%d)\n"
 msgstr "gpg 執行失敗 (%d)\n"
 
-#: sign/rpmgensig.c:246
+#: sign/rpmgensig.c:354
 msgid "gpg failed to write signature\n"
 msgstr "寫入簽署時 gpg 失敗\n"
 
-#: sign/rpmgensig.c:263
+#: sign/rpmgensig.c:371
 msgid "unable to read the signature\n"
 msgstr "無法讀取簽名\n"
 
-#: sign/rpmgensig.c:449 sign/rpmgensig.c:518
+#: sign/rpmgensig.c:499
+msgid "generateSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:513
+msgid "rpmReadSignature failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:557
+msgid "headerReload failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:564 sign/rpmgensig.c:780
 msgid "rpmMkTemp failed\n"
 msgstr "rpmMkTemp 失敗\n"
 
-#: sign/rpmgensig.c:501
+#: sign/rpmgensig.c:571 sign/rpmgensig.c:607
+msgid "copyFile failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:590
+msgid "headerWrite failed\n"
+msgstr ""
+
+#: sign/rpmgensig.c:622
 #, c-format
-msgid "%s already contains identical signature, skipping\n"
+msgid "%s already contains identical file signatures\n"
+msgstr ""
+
+#: sign/rpmgensig.c:639
+msgid "file signing support not built in\n"
 msgstr ""
 
-#: sign/rpmgensig.c:525
+#: sign/rpmgensig.c:682
 #, c-format
-msgid "%s: writeLead failed: %s\n"
-msgstr "%s:writeLead 失敗:%s\n"
+msgid "%s: rpmReadSignature failed: %s"
+msgstr "%s:rpmReadSignature 失敗:%s"
+
+#: sign/rpmgensig.c:689
+#, c-format
+msgid "%s: headerRead failed: %s\n"
+msgstr ""
+
+#: sign/rpmgensig.c:694
+msgid "Cannot sign RPM v3 packages\n"
+msgstr ""
+
+#: sign/rpmgensig.c:722
+#, c-format
+msgid "%s already contains identical signature, skipping\n"
+msgstr ""
 
-#: sign/rpmgensig.c:531
+#: sign/rpmgensig.c:770 sign/rpmgensig.c:793
 #, c-format
 msgid "%s: rpmWriteSignature failed: %s\n"
 msgstr "%s:rpmWriteSignature 失敗:%s\n"
 
-#: sign/rpmgensig.c:545
+#: sign/rpmgensig.c:787
+#, c-format
+msgid "%s: writeLead failed: %s\n"
+msgstr "%s:writeLead 失敗:%s\n"
+
+#: sign/rpmgensig.c:812
 #, c-format
 msgid "replacing %s failed: %s\n"
 msgstr ""
 
-#: tools/rpmgraph.c:142
+#: sign/rpmsignfiles.c:59
+msgid "sign_hash failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:99
+msgid "File digest algorithm id is invalid"
+msgstr ""
+
+#: sign/rpmsignfiles.c:106
+msgid "hash_algo_name failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:119
+msgid "signFile failed\n"
+msgstr ""
+
+#: sign/rpmsignfiles.c:125
+msgid "headerPutString failed\n"
+msgstr ""
+
+#: tools/rpmgraph.c:141
 #, c-format
 msgid "%s: read manifest failed: %s\n"
 msgstr "%s:讀取清單失敗:%s\n"
 
-#: tools/rpmgraph.c:220
+#: tools/rpmgraph.c:219
 msgid "don't verify header+payload signature"
 msgstr "不驗證表頭+酬載簽署"
index d21d043cc4f11ee54697a94714733b393577e724..ea188e168bfe79d4946eae8201eca6023518f012 100644 (file)
@@ -82,10 +82,10 @@ include/rpm/rpmfi.h: lib/rpmfi.h include/rpm/$(dirstamp)
        $(INSTALL_DATA) $(top_srcdir)/lib/rpmfi.h include/rpm/rpmfi.h
 BUILT_SOURCES += include/rpm/rpmfi.h
 CLEANFILES += include/rpm/rpmfi.h
-include/rpm/rpmlegacy.h: lib/rpmlegacy.h include/rpm/$(dirstamp)
-       $(INSTALL_DATA) $(top_srcdir)/lib/rpmlegacy.h include/rpm/rpmlegacy.h
-BUILT_SOURCES += include/rpm/rpmlegacy.h
-CLEANFILES += include/rpm/rpmlegacy.h
+include/rpm/rpmfiles.h: lib/rpmfiles.h include/rpm/$(dirstamp)
+       $(INSTALL_DATA) $(top_srcdir)/lib/rpmfiles.h include/rpm/rpmfiles.h
+BUILT_SOURCES += include/rpm/rpmfiles.h
+CLEANFILES += include/rpm/rpmfiles.h
 include/rpm/rpmpol.h: lib/rpmpol.h include/rpm/$(dirstamp)
        $(INSTALL_DATA) $(top_srcdir)/lib/rpmpol.h include/rpm/rpmpol.h
 BUILT_SOURCES += include/rpm/rpmpol.h
@@ -122,6 +122,10 @@ include/rpm/rpmvf.h: lib/rpmvf.h include/rpm/$(dirstamp)
        $(INSTALL_DATA) $(top_srcdir)/lib/rpmvf.h include/rpm/rpmvf.h
 BUILT_SOURCES += include/rpm/rpmvf.h
 CLEANFILES += include/rpm/rpmvf.h
+include/rpm/rpmarchive.h: lib/rpmarchive.h include/rpm/$(dirstamp)
+       $(INSTALL_DATA) $(top_srcdir)/lib/rpmarchive.h include/rpm/rpmarchive.h
+BUILT_SOURCES += include/rpm/rpmarchive.h
+CLEANFILES += include/rpm/rpmarchive.h
 include/rpm/rpmsign.h: sign/rpmsign.h include/rpm/$(dirstamp)
        $(INSTALL_DATA) $(top_srcdir)/sign/rpmsign.h include/rpm/rpmsign.h
 BUILT_SOURCES += include/rpm/rpmsign.h
diff --git a/python/.gitignore b/python/.gitignore
deleted file mode 100644 (file)
index ca7802a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/setup.py
diff --git a/python/MANIFEST.in b/python/MANIFEST.in
deleted file mode 100644 (file)
index a430636..0000000
+++ /dev/null
@@ -1 +0,0 @@
-include MANIFEST.in *.h
index 1f2e596acef9c141d96db65deaa2a269f8bbf118..a9bd347292820367c5d94a665f72d4be5ec7ccdd 100644 (file)
@@ -1,52 +1,56 @@
 # Makefile for rpm library.
 
+include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
+
 EXTRA_DIST = rpm/__init__.py rpm/transaction.py
 
 AM_CPPFLAGS = -I$(top_builddir)/include/
 AM_CPPFLAGS += -I$(top_srcdir)/python
-AM_CPPFLAGS += -I@WITH_PYTHON_INCLUDE@
-AM_CPPFLAGS += -I$(top_srcdir)
+AM_CPPFLAGS += @PYTHON_CFLAGS@
 
-rpmpyexec_LTLIBRARIES = _rpm.la _rpmb.la _rpms.la
-rpmpyexec_DATA = rpm/__init__.py rpm/transaction.py
-rpmpyexecdir = @pyexecdir@/@PYTHON_MODULENAME@
+pkgpyexec_LTLIBRARIES = _rpmmodule.la _rpmbmodule.la _rpmsmodule.la
+pkgpyexec_DATA = rpm/__init__.py rpm/transaction.py
 
-_rpm_la_LDFLAGS = -module -avoid-version -shared
-_rpm_la_LIBADD = \
+_rpmmodule_la_LDFLAGS = -module -avoid-version -shared
+_rpmmodule_la_LIBADD = \
        $(top_builddir)/lib/librpm.la \
        $(top_builddir)/rpmio/librpmio.la \
-       @WITH_PYTHON_LIB@
+       @PYTHON_LIBS@
 
-_rpm_la_SOURCES = rpmmodule.c rpmsystem-py.h \
+_rpmmodule_la_SOURCES = rpmmodule.c rpmsystem-py.h \
        header-py.c header-py.h \
+       rpmarchive-py.c rpmarchive-py.h \
        rpmds-py.c rpmds-py.h \
        rpmfd-py.c rpmfd-py.h \
        rpmfi-py.c rpmfi-py.h \
+       rpmfiles-py.c rpmfiles-py.h \
        rpmkeyring-py.c rpmkeyring-py.h \
        rpmmi-py.c rpmmi-py.h \
        rpmii-py.c rpmii-py.h \
        rpmps-py.c rpmps-py.h \
        rpmmacro-py.c rpmmacro-py.h \
+       rpmstrpool-py.c rpmstrpool-py.h \
        rpmtd-py.c rpmtd-py.h \
        rpmte-py.c rpmte-py.h \
        rpmts-py.c rpmts-py.h
 
-_rpmb_la_LDFLAGS = -module -avoid-version -shared
-_rpmb_la_LIBADD = \
+_rpmbmodule_la_LDFLAGS = -module -avoid-version -shared
+_rpmbmodule_la_LIBADD = \
        $(top_builddir)/build/librpmbuild.la \
        $(top_builddir)/lib/librpm.la \
        $(top_builddir)/rpmio/librpmio.la \
-       @WITH_PYTHON_LIB@
+       @PYTHON_LIBS@
 
-_rpmb_la_SOURCES = rpmbmodule.c rpmsystem-py.h \
+_rpmbmodule_la_SOURCES = rpmbmodule.c rpmsystem-py.h \
        spec-py.c spec-py.h
 
-_rpms_la_LDFLAGS = -module -avoid-version -shared
-_rpms_la_LIBADD = \
+_rpmsmodule_la_LDFLAGS = -module -avoid-version -shared
+_rpmsmodule_la_LIBADD = \
         $(top_builddir)/sign/librpmsign.la \
         $(top_builddir)/lib/librpm.la \
         $(top_builddir)/rpmio/librpmio.la \
-        @WITH_PYTHON_LIB@
+       @PYTHON_LIBS@
 
-_rpms_la_SOURCES = rpmsmodule.c rpmsystem-py.h
+_rpmsmodule_la_SOURCES = rpmsmodule.c rpmsystem-py.h
 
index ff581f11240b6f8a2eee36dea55c42f21b79a1d2..45af516377d7826db573db77a49607da2a520be9 100644 (file)
@@ -157,20 +157,11 @@ static PyObject * hdrKeyList(hdrObject * s)
     return keys;
 }
 
-static PyObject * hdrAsBytes(hdrObject * s, int legacy)
+static PyObject * hdrAsBytes(hdrObject * s)
 {
     PyObject *res = NULL;
-    char *buf = NULL;
-    unsigned int len;
-    Header h = headerLink(s->h);
-   
-    /* XXX this legacy switch is a hack, needs to be removed. */
-    if (legacy) {
-       h = headerCopy(s->h);   /* XXX strip region tags, etc */
-       headerFree(s->h);
-    }
-    buf = headerExport(h, &len);
-    h = headerFree(h);
+    unsigned int len = 0;
+    char *buf = headerExport(s->h, &len);
 
     if (buf == NULL || len == 0) {
        PyErr_SetString(pyrpmError, "can't unload bad header\n");
@@ -181,15 +172,9 @@ static PyObject * hdrAsBytes(hdrObject * s, int legacy)
     return res;
 }
 
-static PyObject * hdrUnload(hdrObject * s, PyObject * args, PyObject *keywords)
+static PyObject * hdrUnload(hdrObject * s)
 {
-    int legacy = 0;
-    static char *kwlist[] = { "legacyHeader", NULL};
-
-    if (!PyArg_ParseTupleAndKeywords(args, keywords, "|i", kwlist, &legacy))
-       return NULL;
-
-    return hdrAsBytes(s, legacy);
+    return hdrAsBytes(s);
 }
 
 static PyObject * hdrExpandFilelist(hdrObject * s)
@@ -223,7 +208,6 @@ static PyObject * hdrFullFilelist(hdrObject * s)
     if (headerGet(h, RPMTAG_FILENAMES, fileNames, HEADERGET_EXT)) {
        rpmtdSetTag(fileNames, RPMTAG_OLDFILENAMES);
        headerPut(h, fileNames, HEADERPUT_DEFAULT);
-       rpmtdFreeData(fileNames);
     }
     rpmtdFree(fileNames);
 
@@ -337,7 +321,7 @@ static long hdr_hash(PyObject * h)
 static PyObject * hdr_reduce(hdrObject *s)
 {
     PyObject *res = NULL;
-    PyObject *blob = hdrAsBytes(s, 0);
+    PyObject *blob = hdrAsBytes(s);
     if (blob) {
        res = Py_BuildValue("O(O)", Py_TYPE(s), blob);
        Py_DECREF(blob);
@@ -347,31 +331,31 @@ static PyObject * hdr_reduce(hdrObject *s)
 
 static struct PyMethodDef hdr_methods[] = {
     {"keys",           (PyCFunction) hdrKeyList,       METH_NOARGS,
-       NULL },
-    {"unload",         (PyCFunction) hdrUnload,        METH_VARARGS|METH_KEYWORDS,
-       NULL },
+     "hdr.keys() -- Return a list of the header's rpm tags (int RPMTAG_*)." },
+    {"unload",         (PyCFunction) hdrUnload,        METH_NOARGS,
+     "hdr.unload() -- Return binary representation\nof the header." },
     {"expandFilelist", (PyCFunction) hdrExpandFilelist,METH_NOARGS,
-       NULL },
+     "DEPRECATED -- Use hdr.convert() instead." },
     {"compressFilelist",(PyCFunction) hdrCompressFilelist,METH_NOARGS,
-       NULL },
+     "DEPRECATED -- Use hdr.convert() instead." },
     {"fullFilelist",   (PyCFunction) hdrFullFilelist,  METH_NOARGS,
-       NULL },
+     "DEPRECATED -- Obsolete method."},
     {"convert",                (PyCFunction) hdrConvert,       METH_VARARGS|METH_KEYWORDS,
-       NULL },
+     "hdr.convert(op=-1) -- Convert header - See HEADERCONV_*\nfor possible values of op."},
     {"format",         (PyCFunction) hdrFormat,        METH_VARARGS|METH_KEYWORDS,
-       NULL },
+     "hdr.format(format) -- Expand a query string with the header data.\n\nSee rpm -q for syntax." },
     {"sprintf",                (PyCFunction) hdrFormat,        METH_VARARGS|METH_KEYWORDS,
-       NULL },
+     "Alias for .format()." },
     {"isSource",       (PyCFunction)hdrIsSource,       METH_NOARGS, 
-       NULL },
+     "hdr.isSource() -- Return if header describes a source package." },
     {"write",          (PyCFunction)hdrWrite,          METH_VARARGS|METH_KEYWORDS,
-       NULL },
+     "hdr.write(file, magic=True) -- Write header to file." },
     {"dsOfHeader",     (PyCFunction)hdr_dsOfHeader,    METH_NOARGS,
-       NULL},
+     "hdr.dsOfHeader() -- Return dependency set with the header's NEVR."},
     {"dsFromHeader",   (PyCFunction)hdr_dsFromHeader,  METH_VARARGS|METH_KEYWORDS,
-       NULL},
+     "hdr.dsFromHeader(to=RPMTAG_REQUIRENAME, flags=None)\nGet dependency set from header. to must be one of the NAME tags\nbelonging to a dependency:\n'Providename', 'Requirename', 'Obsoletename', 'Conflictname',\n'Triggername', 'Recommendname', 'Suggestname', 'Supplementname',\n'Enhancename' or one of the corresponding RPMTAG_*NAME constants." },
     {"fiFromHeader",   (PyCFunction)hdr_fiFromHeader,  METH_VARARGS|METH_KEYWORDS,
-       NULL},
+     "hdr.fiFromHeader() -- Return rpm.fi object containing the file\nmeta data from the header.\n\nDEPRECATED - Use rpm.files(hdr) instead."},
     {"__reduce__",     (PyCFunction)hdr_reduce,        METH_NOARGS,
        NULL},
 
@@ -393,7 +377,8 @@ static PyObject *hdr_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
     if (obj == NULL) {
        h = headerNew();
     } else if (CAPSULE_CHECK(obj)) {
-       h = CAPSULE_EXTRACT(obj, PYTHON_MODULENAME"._C_Header");
+       h = CAPSULE_EXTRACT(obj, "rpm._C_Header");
+       headerLink(h);
     } else if (hdrObject_Check(obj)) {
        h = headerCopy(((hdrObject*) obj)->h);
     } else if (PyBytes_Check(obj)) {
@@ -404,7 +389,7 @@ static PyObject *hdr_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
        Py_END_ALLOW_THREADS;
        Py_XDECREF(fdo);
     } else {
-       PyErr_SetString(PyExc_TypeError, "header, blob or file expected!!");
+       PyErr_SetString(PyExc_TypeError, "header, blob or file expected");
        return NULL;
     }
 
@@ -606,7 +591,7 @@ static int hdrPutTag(Header h, rpmTagVal tag, PyObject *value)
            rc = hdrAppendItem(h, tag, type, item);
        }
     } else {
-       PyErr_SetString(PyExc_RuntimeError, "cant happen, right?");
+       PyErr_SetString(PyExc_RuntimeError, "can't happen, right?");
     }
 
     return rc;
@@ -680,11 +665,60 @@ static PySequenceMethods hdr_as_sequence = {
 };
 
 static char hdr_doc[] =
-"";
+  "A header object represents an RPM package header.\n"
+  "\n"
+  "All RPM packages have headers that provide metadata for the package.\n"
+  "Header objects can be returned by database queries or loaded from a\n"
+  "binary package on disk.\n"
+  "\n"
+  "The ts.hdrFromFdno() function returns the package header from a\n"
+  "package on disk, verifying package signatures and digests of the\n"
+  "package while reading.\n"
+  "\n"
+  "Note: The older method rpm.headerFromPackage() which has been replaced\n"
+  "by ts.hdrFromFdno() used to return a (hdr, isSource) tuple.\n"
+  "\n"
+  "If you need to distinguish source/binary headers, do:\n"
+  "\n"
+  "    import os, rpm\n"
+  "\n"
+  "    ts = rpm.TransactionSet()\n"
+  "    fdno = os.open('/tmp/foo-1.0-1.i386.rpm', os.O_RDONLY)\n"
+  "    hdr = ts.hdrFromFdno(fdno)\n"
+  "    os.close(fdno)\n"
+  "    if hdr[rpm.RPMTAG_SOURCEPACKAGE]:\n"
+  "       print 'header is from a source package'\n"
+  "    else:\n"
+  "       print 'header is from a binary package'\n"
+  "\n"
+  "The Python interface to the header data is quite elegant.  It\n"
+  "presents the data in a dictionary form.  We'll take the header we\n"
+  "just loaded and access the data within it:\n"
+  "\n"
+  "    print hdr[rpm.RPMTAG_NAME]\n"
+  "    print hdr[rpm.RPMTAG_VERSION]\n"
+  "    print hdr[rpm.RPMTAG_RELEASE]\n"
+  "\n"
+  "in the case of our 'foo-1.0-1.i386.rpm' package, this code would\n"
+  "output:\n"
+  "    foo\n"
+  "    1.0\n"
+  "    1\n"
+  "\n"
+  "You make also access the header data by string name:\n"
+  "\n"
+  "    print hdr['name']\n"
+  "    print hdr['version']\n"
+  "    print hdr['release']\n"
+  "\n"
+  "This method of access is a teensy bit slower because the name must be\n"
+  "translated into the tag number dynamically. You also must make sure\n"
+  "the strings in header lookups don't get translated, or the lookups\n"
+  "will fail.\n";
 
 PyTypeObject hdr_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".hdr",        /* tp_name */
+       "rpm.hdr",                      /* tp_name */
        sizeof(hdrObject),              /* tp_size */
        0,                              /* tp_itemsize */
        (destructor) hdr_dealloc,       /* tp_dealloc */
@@ -729,8 +763,7 @@ PyObject * hdr_Wrap(PyTypeObject *subtype, Header h)
 {
     hdrObject * hdr = (hdrObject *)subtype->tp_alloc(subtype, 0);
     if (hdr == NULL) return NULL;
-
-    hdr->h = headerLink(h);
+    hdr->h = h;
     return (PyObject *) hdr;
 }
 
diff --git a/python/rpm/__init__.py b/python/rpm/__init__.py
new file mode 100644 (file)
index 0000000..54728bb
--- /dev/null
@@ -0,0 +1,128 @@
+r"""RPM Module
+
+This module enables you to manipulate rpms and the rpm database.
+
+The rpm base module provides the main starting point for
+accessing RPM from Python. For most usage, call
+the TransactionSet method to get a transaction set (rpmts).
+
+For example:
+       import rpm
+       ts = rpm.TransactionSet()
+
+The transaction set will open the RPM database as needed, so
+in most cases, you do not need to explicitly open the
+database. The transaction set is the workhorse of RPM.
+
+You can open another RPM database, such as one that holds
+all packages for a given Linux distribution, to provide
+packages used to solve dependencies. To do this, use
+the following code:
+
+rpm.addMacro('_dbpath', '/path/to/alternate/database')
+solvets = rpm.TransactionSet()
+solvets.openDB()
+rpm.delMacro('_dbpath')
+
+# Open default database
+ts = rpm.TransactionSet()
+
+This code gives you access to two RPM databases through
+two transaction sets (rpmts): ts is a transaction set
+associated with the default RPM database and solvets
+is a transaction set tied to an alternate database, which
+is very useful for resolving dependencies.
+"""
+
+import warnings
+from rpm._rpm import *
+from rpm.transaction import *
+import rpm._rpm as _rpm
+_RPMVSF_NODIGESTS = _rpm._RPMVSF_NODIGESTS
+_RPMVSF_NOHEADER = _rpm._RPMVSF_NOHEADER
+_RPMVSF_NOPAYLOAD = _rpm._RPMVSF_NOPAYLOAD
+_RPMVSF_NOSIGNATURES = _rpm._RPMVSF_NOSIGNATURES
+
+__version__ = _rpm.__version__
+__version_info__ = tuple(__version__.split('.'))
+
+# try to import build bits but dont require it
+try:
+    from rpm._rpmb import *
+except ImportError:
+    pass
+
+# try to import signing bits but dont require it
+try:
+    from rpm._rpms import *
+except ImportError:
+    pass
+
+# backwards compatibility + give the same class both ways
+ts = TransactionSet
+
+
+def headerLoad(*args, **kwds):
+    """DEPRECATED! Use rpm.hdr() instead."""
+    warnings.warn("Use rpm.hdr() instead.", DeprecationWarning, stacklevel=2)
+    return hdr(*args, **kwds)
+
+
+def _doHeaderListFromFD(rpm_fd, retrofit):
+    hlist = []
+    while 1:
+        try:
+            h = hdr(rpm_fd)
+            if retrofit:
+                h.convert(HEADERCONV_RETROFIT_V3)
+            hlist.append(h)
+        except _rpm.error:
+            break
+
+    return hlist
+
+
+def readHeaderListFromFD(file_desc, retrofit=True):
+    if not isinstance(file_desc, fd):
+        file_desc = fd(file_desc)
+    return _doHeaderListFromFD(file_desc, retrofit)
+
+
+def readHeaderListFromFile(path, retrofit=True):
+    f = fd(path)
+    hlist = _doHeaderListFromFD(f, retrofit)
+    f.close()
+    return hlist
+
+
+def readHeaderFromFD(file_desc):
+    """Return (header, pos_before_hdr)"""
+    if not isinstance(file_desc, fd):
+        file_desc = fd(file_desc)
+    try:
+        offset = file_desc.tell()
+        h = hdr(file_desc)
+    except (_rpm.error, IOError):
+        offset = None
+        h = None
+
+    return (h, offset)
+
+
+def signalsCaught(siglist):
+    """Returns list of signals that were caught."""
+    caught = []
+    for sig in siglist:
+        if signalCaught(sig):
+            caught.append(sig)
+
+    return caught
+
+
+def dsSingle(TagN, N, EVR="", Flags=RPMSENSE_ANY):
+    """
+    Creates a single entry dependency set (ds)
+
+    dsSingle(RPMTAG_CONFLICTNAME, "rpm") corresponds to "Conflicts: rpm"
+    """
+    return ds((N, Flags, EVR), TagN)
diff --git a/python/rpm/__init__.py.in b/python/rpm/__init__.py.in
deleted file mode 100644 (file)
index df1e3a2..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-r"""RPM Module
-
-This module enables you to manipulate rpms and the rpm database.
-
-"""
-
-import warnings
-import os
-from @PYTHON_MODULENAME@._rpm import *
-from @PYTHON_MODULENAME@.transaction import *
-import @PYTHON_MODULENAME@._rpm as _rpm
-_RPMVSF_NODIGESTS = _rpm._RPMVSF_NODIGESTS
-_RPMVSF_NOHEADER = _rpm._RPMVSF_NOHEADER
-_RPMVSF_NOPAYLOAD = _rpm._RPMVSF_NOPAYLOAD
-_RPMVSF_NOSIGNATURES = _rpm._RPMVSF_NOSIGNATURES
-
-__version__ = _rpm.__version__
-__version_info__ = tuple(__version__.split('.'))
-
-# try to import build bits but dont require it
-try:
-    from @PYTHON_MODULENAME@._rpmb import *
-except ImportError:
-    pass
-
-# try to import signing bits but dont require it
-try:
-    from @PYTHON_MODULENAME@._rpms import *
-except ImportError:
-    pass
-
-# backwards compatibility + give the same class both ways
-ts = TransactionSet
-
-def headerLoad(*args, **kwds):
-    warnings.warn("Use rpm.hdr() instead.", DeprecationWarning, stacklevel=2)
-    return hdr(*args, **kwds)
-
-def _doHeaderListFromFD(rpm_fd, retrofit):
-    hlist = []
-    while 1:
-        try:
-            h = hdr(rpm_fd)
-            if retrofit:
-                h.convert(HEADERCONV_RETROFIT_V3)
-            hlist.append(h)
-        except _rpm.error:
-            break
-
-    return hlist
-
-def readHeaderListFromFD(file_desc, retrofit = True):
-    if not isinstance(file_desc, fd):
-        file_desc = fd(file_desc)
-    return _doHeaderListFromFD(file_desc, retrofit)
-        
-def readHeaderListFromFile(path, retrofit = True):
-    f = fd(path)
-    hlist = _doHeaderListFromFD(f, retrofit)
-    f.close()
-    return hlist
-    
-def readHeaderFromFD(file_desc):
-    if not isinstance(file_desc, fd):
-        file_desc = fd(file_desc)
-    try:
-        offset = file_desc.tell()
-        h = hdr(file_desc)
-    except (_rpm.error, IOError):
-        offset = None
-        h = None
-
-    return (h, offset)
-
-def signalsCaught(siglist):
-    caught = []
-    for sig in siglist:
-        if signalCaught(sig):
-            caught.append(sig)
-
-    return caught
-
-def dsSingle(TagN, N, EVR = "", Flags = RPMSENSE_ANY):
-    return ds((N, EVR, Flags), TagN)
diff --git a/python/rpm/transaction.py b/python/rpm/transaction.py
new file mode 100644 (file)
index 0000000..675ecaf
--- /dev/null
@@ -0,0 +1,176 @@
+from __future__ import with_statement
+
+import sys
+import rpm
+from rpm._rpm import ts as TransactionSetCore
+
+if sys.version_info[0] == 3:
+    _string_types = str,
+else:
+    _string_types = basestring,
+
+
+# TODO: migrate relevant documentation from C-side
+class TransactionSet(TransactionSetCore):
+    _probFilter = 0
+
+    def _wrapSetGet(self, attr, val):
+        oval = getattr(self, attr)
+        setattr(self, attr, val)
+        return oval
+
+    def setVSFlags(self, flags):
+        return self._wrapSetGet('_vsflags', flags)
+
+    def getVSFlags(self):
+        return self._vsflags
+
+    def setColor(self, color):
+        return self._wrapSetGet('_color', color)
+
+    def setPrefColor(self, color):
+        return self._wrapSetGet('_prefcolor', color)
+
+    def setFlags(self, flags):
+        return self._wrapSetGet('_flags', flags)
+
+    def setProbFilter(self, ignoreSet):
+        return self._wrapSetGet('_probFilter', ignoreSet)
+
+    def parseSpec(self, specfile):
+        import rpm._rpmb
+        return rpm._rpmb.spec(specfile)
+
+    def getKeys(self):
+        keys = []
+        for te in self:
+            keys.append(te.Key())
+        # Backwards compatibility goo - WTH does this return a *tuple* ?!
+        if not keys:
+            return None
+        else:
+            return tuple(keys)
+
+    def _f2hdr(self, item):
+        if isinstance(item, _string_types):
+            with open(item) as f:
+                header = self.hdrFromFdno(f)
+        elif isinstance(item, rpm.hdr):
+            header = item
+        else:
+            header = self.hdrFromFdno(item)
+        return header
+
+    def addInstall(self, item, key, how="u"):
+        header = self._f2hdr(item)
+
+        if how not in ['u', 'i']:
+            raise ValueError('how argument must be "u" or "i"')
+        upgrade = (how == "u")
+
+        if not TransactionSetCore.addInstall(self, header, key, upgrade):
+            raise rpm.error("adding package to transaction failed")
+
+    def addReinstall(self, item, key):
+        header = self._f2hdr(item)
+
+        if not TransactionSetCore.addReinstall(self, header, key):
+            raise rpm.error("adding package to transaction failed")
+
+    def addErase(self, item):
+        hdrs = []
+        if isinstance(item, rpm.hdr):
+            hdrs = [item]
+        elif isinstance(item, rpm.mi):
+            hdrs = item
+        elif isinstance(item, int):
+            hdrs = self.dbMatch(rpm.RPMDBI_PACKAGES, item)
+        elif isinstance(item, _string_types):
+            hdrs = self.dbMatch(rpm.RPMDBI_LABEL, item)
+        else:
+            raise TypeError("invalid type %s" % type(item))
+
+        for h in hdrs:
+            if not TransactionSetCore.addErase(self, h):
+                raise rpm.error("package not installed")
+
+        # garbage collection should take care but just in case...
+        if isinstance(hdrs, rpm.mi):
+            del hdrs
+
+    def run(self, callback, data):
+        rc = TransactionSetCore.run(self, callback, data, self._probFilter)
+
+        # crazy backwards compatibility goo: None for ok, list of problems
+        # if transaction didn't complete and empty list if it completed
+        # with errors
+        if rc == 0:
+            return None
+
+        res = []
+        if rc > 0:
+            for prob in self.problems():
+                item = ("%s" % prob, (prob.type, prob._str, prob._num))
+                res.append(item)
+        return res
+
+    def check(self, *args, **kwds):
+        TransactionSetCore.check(self, *args, **kwds)
+
+        # compatibility: munge problem strings into dependency tuples of doom
+        res = []
+        for p in self.problems():
+            # is it anything we need to care about?
+            if p.type == rpm.RPMPROB_CONFLICT:
+                sense = rpm.RPMDEP_SENSE_CONFLICTS
+            elif p.type == rpm.RPMPROB_REQUIRES:
+                sense = rpm.RPMDEP_SENSE_REQUIRES
+            else:
+                continue
+
+            # strip arch, split to name, version, release
+            nevr = p.altNEVR.rsplit('.', 1)[0]
+            n, v, r = nevr.rsplit('-', 2)
+
+            # extract the dependency information
+            needs = p._str.split()
+            needname = needs[0]
+            needflags = rpm.RPMSENSE_ANY
+            if len(needs) == 3:
+                needop = needs[1]
+                if '<' in needop:
+                    needflags |= rpm.RPMSENSE_LESS
+                if '=' in needop:
+                    needflags |= rpm.RPMSENSE_EQUAL
+                if '>' in needop:
+                    needflags |= rpm.RPMSENSE_GREATER
+                needver = needs[2]
+            else:
+                needver = ""
+
+            res.append(((n, v, r),
+                        (needname, needver), needflags, sense, p.key))
+
+        return res
+
+    def hdrCheck(self, blob):
+        res, msg = TransactionSetCore.hdrCheck(self, blob)
+        # generate backwards compatibly broken exceptions
+        if res == rpm.RPMRC_NOKEY:
+            raise rpm.error("public key not available")
+        elif res == rpm.RPMRC_NOTTRUSTED:
+            raise rpm.error("public key not trusted")
+        elif res != rpm.RPMRC_OK:
+            raise rpm.error(msg)
+
+    def hdrFromFdno(self, fd):
+        res, h = TransactionSetCore.hdrFromFdno(self, fd)
+        # generate backwards compatibly broken exceptions
+        if res == rpm.RPMRC_NOKEY:
+            raise rpm.error("public key not available")
+        elif res == rpm.RPMRC_NOTTRUSTED:
+            raise rpm.error("public key not trusted")
+        elif res != rpm.RPMRC_OK:
+            raise rpm.error("error reading package header")
+
+        return h
diff --git a/python/rpm/transaction.py.in b/python/rpm/transaction.py.in
deleted file mode 100644 (file)
index e730759..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-#!/usr/bin/python
-
-import @PYTHON_MODULENAME@ as rpm
-from @PYTHON_MODULENAME@._rpm import ts as TransactionSetCore
-
-# TODO: migrate relevant documentation from C-side
-class TransactionSet(TransactionSetCore):
-    _probFilter = 0
-
-    def _wrapSetGet(self, attr, val):
-        oval = getattr(self, attr)
-        setattr(self, attr, val)
-        return oval
-        
-    def setVSFlags(self, flags):
-        return self._wrapSetGet('_vsflags', flags)
-
-    def getVSFlags(self):
-        return self._vsflags
-
-    def setColor(self, color):
-        return self._wrapSetGet('_color', color)
-
-    def setPrefColor(self, color):
-        return self._wrapSetGet('_prefcolor', color)
-
-    def setFlags(self, flags):
-        return self._wrapSetGet('_flags', flags)
-
-    def setProbFilter(self, ignoreSet):
-        return self._wrapSetGet('_probFilter', ignoreSet)
-
-    def parseSpec(self, specfile):
-        import _rpmb
-        return _rpmb.spec(specfile)
-
-    def getKeys(self):
-        keys = []
-        for te in self:
-            keys.append(te.Key())
-        # Backwards compatibility goo - WTH does this return a *tuple* ?!
-        if not keys:
-            return None
-        else:
-            return tuple(keys)
-
-    def addInstall(self, item, key, how="u"):
-        if isinstance(item, basestring):
-            f = file(item)
-            header = self.hdrFromFdno(f)
-            f.close()
-        elif isinstance(item, file):
-            header = self.hdrFromFdno(item)
-        else:
-            header = item
-
-        if not how in ['u', 'i']:
-            raise ValueError('how argument must be "u" or "i"')
-        upgrade = (how == "u")
-
-        if not TransactionSetCore.addInstall(self, header, key, upgrade):
-            raise rpm.error("adding package to transaction failed")
-
-    def addErase(self, item):
-        hdrs = []
-        if isinstance(item, rpm.hdr):
-            hdrs = [item]
-        elif isinstance(item, rpm.mi):
-            hdrs = item
-        elif isinstance(item, int):
-            hdrs = self.dbMatch(rpm.RPMDBI_PACKAGES, item)
-        elif isinstance(item, basestring):
-            hdrs = self.dbMatch(rpm.RPMDBI_LABEL, item)
-        else:
-            raise TypeError("invalid type %s" % type(item))
-
-        for h in hdrs:
-            if not TransactionSetCore.addErase(self, h):
-                raise rpm.error("package not installed")
-
-        # garbage collection should take care but just in case...
-        if isinstance(hdrs, rpm.mi):
-            del hdrs
-
-    def run(self, callback, data):
-        rc = TransactionSetCore.run(self, callback, data, self._probFilter)
-
-        # crazy backwards compatibility goo: None for ok, list of problems
-        # if transaction didnt complete and empty list if it completed
-        # with errors
-        if rc == 0:
-            return None
-
-        res = []
-        if rc > 0:
-            for prob in self.problems():
-                item = ("%s" % prob, (prob.type, prob._str, prob._num))
-                res.append(item)
-        return res
-
-    def check(self, *args, **kwds):
-        TransactionSetCore.check(self, *args, **kwds)
-
-        # compatibility: munge problem strings into dependency tuples of doom
-        res = []
-        for p in self.problems():
-            # is it anything we need to care about?
-            if p.type == rpm.RPMPROB_CONFLICT:
-                sense = rpm.RPMDEP_SENSE_CONFLICTS
-            elif p.type == rpm.RPMPROB_REQUIRES:
-                sense = rpm.RPMDEP_SENSE_REQUIRES
-            else:
-                continue
-
-            # strip arch, split to name, version, release
-            nevr = p.altNEVR.rsplit('.', 1)[0]
-            n, v, r = nevr.rsplit('-', 2)
-
-            # extract the dependency information
-            needs = p._str.split()
-            needname = needs[0]
-            needflags = rpm.RPMSENSE_ANY
-            if len(needs) == 3:
-                needop = needs[1]
-                if needop.find('<') >= 0: needflags |= rpm.RPMSENSE_LESS
-                if needop.find('=') >= 0: needflags |= rpm.RPMSENSE_EQUAL
-                if needop.find('>') >= 0: needflags |= rpm.RPMSENSE_GREATER
-                needver = needs[2]
-            else:
-                needver = ""
-
-            res.append(((n, v, r),(needname,needver),needflags,sense,p.key))
-
-        return res
-
-    def hdrCheck(self, blob):
-        res, msg = TransactionSetCore.hdrCheck(self, blob)
-        # generate backwards compatibly broken exceptions
-        if res == rpm.RPMRC_NOKEY:
-            raise rpm.error("public key not available")
-        elif res == rpm.RPMRC_NOTTRUSTED:
-            raise rpm.error("public key not trusted")
-        elif res != rpm.RPMRC_OK:
-            raise rpm.error(msg)
-
-    def hdrFromFdno(self, fd):
-        res, h = TransactionSetCore.hdrFromFdno(self, fd)
-        # generate backwards compatibly broken exceptions
-        if res == rpm.RPMRC_NOKEY:
-            raise rpm.error("public key not available")
-        elif res == rpm.RPMRC_NOTTRUSTED:
-            raise rpm.error("public key not trusted")
-        elif res != rpm.RPMRC_OK:
-            raise rpm.error("error reading package header")
-
-        return h
diff --git a/python/rpmarchive-py.c b/python/rpmarchive-py.c
new file mode 100644 (file)
index 0000000..53a078a
--- /dev/null
@@ -0,0 +1,275 @@
+#include "rpmsystem-py.h"
+
+#include <rpm/rpmtypes.h>
+#include <rpm/rpmpgp.h>
+
+#include "header-py.h"
+#include "rpmfi-py.h"
+#include "rpmfd-py.h"
+#include "rpmfiles-py.h"
+#include "rpmarchive-py.h"
+#include "rpmstrpool-py.h"
+
+struct rpmarchiveObject_s {
+    PyObject_HEAD
+    PyObject *md_dict;
+    rpmfi archive;
+    rpmfiles files;
+};
+
+static void rpmarchive_dealloc(rpmarchiveObject * s)
+{
+    rpmfilesFree(s->files);
+    rpmfiArchiveClose(s->archive);
+    rpmfiFree(s->archive);
+    Py_TYPE(s)->tp_free((PyObject *)s);
+}
+
+static PyObject *rpmarchive_error(int rc)
+{
+    PyErr_SetObject(PyExc_IOError,
+                   Py_BuildValue("(is)", rc, rpmfileStrerror(rc)));
+    return NULL;
+}
+
+static PyObject *rpmarchive_closed(void)
+{
+    PyErr_SetString(PyExc_IOError, "I/O operation on closed archive");
+    return NULL;
+}
+
+static PyObject *rpmarchive_tell(rpmarchiveObject *s)
+{
+    return PyLong_FromLongLong(rpmfiArchiveTell(s->archive));
+}
+
+static PyObject *rpmarchive_close(rpmarchiveObject *s)
+{
+    if (s->archive) {
+       int rc = rpmfiArchiveClose(s->archive);
+       s->archive = rpmfiFree(s->archive);
+       if (rc)
+           return rpmarchive_error(rc);
+    }
+    Py_RETURN_NONE;
+}
+
+static PyObject *rpmarchive_has_content(rpmarchiveObject *s)
+{
+    return PyLong_FromLong(rpmfiArchiveHasContent(s->archive));
+}
+
+static PyObject *rpmarchive_read(rpmarchiveObject *s,
+                                PyObject *args, PyObject *kwds)
+{
+    char *kwlist[] = { "size", NULL };
+    char buf[BUFSIZ];
+    ssize_t chunksize = sizeof(buf);
+    ssize_t left = -1;
+    ssize_t nb = 0;
+    PyObject *res = NULL;
+    
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|l", kwlist, &left))
+       return NULL;
+
+    if (s->archive == NULL)
+       return rpmarchive_closed();
+
+    /* ConcatAndDel() doesn't work on NULL string, meh */
+    res = PyBytes_FromStringAndSize(NULL, 0);
+    do {
+       if (left >= 0 && left < chunksize)
+           chunksize = left;
+
+       Py_BEGIN_ALLOW_THREADS 
+       nb = rpmfiArchiveRead(s->archive, buf, chunksize);
+       Py_END_ALLOW_THREADS 
+
+       if (nb > 0) {
+           PyObject *tmp = PyBytes_FromStringAndSize(buf, nb);
+           PyBytes_ConcatAndDel(&res, tmp);
+           left -= nb;
+       }
+    } while (nb > 0);
+
+    if (nb < 0) {
+       Py_XDECREF(res);
+       return rpmarchive_error(nb);
+    } else {
+       return res;
+    }
+}
+
+static PyObject *rpmarchive_write(rpmarchiveObject *s,
+                                PyObject *args, PyObject *kwds)
+{
+    const char *buf = NULL;
+    ssize_t size = 0;
+    char *kwlist[] = { "buffer", NULL };
+    ssize_t rc = 0;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", kwlist, &buf, &size)) {
+       return NULL;
+    }
+
+    if (s->archive == NULL)
+       return rpmarchive_closed();
+
+    Py_BEGIN_ALLOW_THREADS 
+    rc = rpmfiArchiveWrite(s->archive, buf, size);
+    Py_END_ALLOW_THREADS 
+
+    if (rc < 0)
+       return rpmarchive_error(rc);
+    else
+       return Py_BuildValue("n", rc);
+}
+
+static PyObject *rpmarchive_readto(rpmarchiveObject *s,
+                                PyObject *args, PyObject *kwds)
+{
+    rpmfdObject *fdo = NULL;
+    int nodigest = 0;
+    int rc;
+    char *kwlist[] = { "fd", "nodigest", NULL };
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|i", kwlist,
+                                rpmfdFromPyObject, &fdo, &nodigest)) {
+       return NULL;
+    }
+
+    if (s->archive == NULL)
+       return rpmarchive_closed();
+
+    Py_BEGIN_ALLOW_THREADS
+    rc = rpmfiArchiveReadToFile(s->archive, rpmfdGetFd(fdo), nodigest);
+    Py_END_ALLOW_THREADS
+
+    if (rc)
+       return rpmarchive_error(rc);
+    
+    Py_RETURN_NONE;
+}
+
+static PyObject *rpmarchive_writeto(rpmarchiveObject *s,
+                                PyObject *args, PyObject *kwds)
+{
+    rpmfdObject *fdo = NULL;
+    int rc;
+    char *kwlist[] = { "fd", NULL };
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|i", kwlist,
+                                rpmfdFromPyObject, &fdo)) {
+       return NULL;
+    }
+
+    if (s->archive == NULL)
+       return rpmarchive_closed();
+
+    Py_BEGIN_ALLOW_THREADS
+    rc = rpmfiArchiveWriteFile(s->archive, rpmfdGetFd(fdo));
+    Py_END_ALLOW_THREADS
+
+    if (rc)
+       return rpmarchive_error(rc);
+
+    Py_RETURN_NONE;
+}
+
+static struct PyMethodDef rpmarchive_methods[] = {
+    { "tell",  (PyCFunction)rpmarchive_tell,           METH_NOARGS,
+      "archive.tell() -- Return current position in archive." },
+    { "close", (PyCFunction)rpmarchive_close,          METH_NOARGS,
+      "archive.close() -- Close archive and do final consistency checks."},
+    { "read",  (PyCFunction)rpmarchive_read,   METH_VARARGS|METH_KEYWORDS,
+      "archive.read(size=None) -- Read next size bytes from current file.\n\n"
+      "Returns bytes\n"},
+    { "write", (PyCFunction)rpmarchive_write,  METH_VARARGS|METH_KEYWORDS,
+      "archive.write(buffer) -- Write buffer to current file." },
+    { "readto",        (PyCFunction)rpmarchive_readto, METH_VARARGS|METH_KEYWORDS,
+      "archive.readto(fd, nodigest=None) -- Read content of fd\n"
+      "and write as content of the current file to archive." },
+    { "writeto", (PyCFunction)rpmarchive_writeto,METH_VARARGS|METH_KEYWORDS,
+      "archive.writeto(fd) -- Write content of current file in archive\n to fd." },
+    { "hascontent", (PyCFunction)rpmarchive_has_content, METH_NOARGS,
+      "archive.hascontent() -- Return if current file has a content.\n\n"
+      "Returns false for non regular and all but one of hardlinked files."},
+    { NULL, NULL, 0, NULL }
+};
+
+static char rpmarchive_doc[] =
+"Gives access to the payload of an rpm package.\n\n"
+"Is returned by .archive() method of an rpm.files instance.\n"
+"All methods can raise an IOError exception.";
+
+static PyObject *rpmarchive_iternext(rpmarchiveObject *s)
+{
+    PyObject *next = NULL;
+    int fx = rpmfiNext(s->archive);
+
+    if (fx >= 0) {
+       next = rpmfile_Wrap(s->files, fx);
+    } else if (fx < -1) {
+       next = rpmarchive_error(fx);
+    } else {
+       /* end of iteration, nothing to do */
+    }
+    
+    return next;
+}
+
+PyTypeObject rpmarchive_Type = {
+       PyVarObject_HEAD_INIT(&PyType_Type, 0)
+       "rpm.archive",                  /* tp_name */
+       sizeof(rpmarchiveObject),               /* tp_basicsize */
+       0,                              /* tp_itemsize */
+       (destructor) rpmarchive_dealloc,        /* tp_dealloc */
+       0,                              /* tp_print */
+       0,                              /* tp_getattr */
+       0,                              /* tp_setattr */
+       0,                              /* tp_compare */
+       0,                              /* tp_repr */
+       0,                              /* tp_as_number */
+       0,              /* tp_as_sequence */
+       0,              /* tp_as_mapping */
+       0,                              /* tp_hash */
+       0,                              /* tp_call */
+       0,                              /* tp_str */
+       PyObject_GenericGetAttr,        /* tp_getattro */
+       PyObject_GenericSetAttr,        /* tp_setattro */
+       0,                              /* tp_as_buffer */
+       Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
+       rpmarchive_doc,                 /* tp_doc */
+       0,                              /* tp_traverse */
+       0,                              /* tp_clear */
+       0,                              /* tp_richcompare */
+       0,                              /* tp_weaklistoffset */
+       PyObject_SelfIter,              /* tp_iter */
+       (iternextfunc) rpmarchive_iternext,             /* tp_iternext */
+       rpmarchive_methods,             /* tp_methods */
+       0,                              /* tp_members */
+       0,                              /* tp_getset */
+       0,                              /* tp_base */
+       0,                              /* tp_dict */
+       0,                              /* tp_descr_get */
+       0,                              /* tp_descr_set */
+       0,                              /* tp_dictoffset */
+       0,                              /* tp_init */
+       0,                              /* tp_alloc */
+       0,                              /* tp_new */
+       0,                              /* tp_free */
+       0,                              /* tp_is_gc */
+};
+
+PyObject * rpmarchive_Wrap(PyTypeObject *subtype,
+                          rpmfiles files, rpmfi archive)
+{
+    rpmarchiveObject *s = (rpmarchiveObject *)subtype->tp_alloc(subtype, 0);
+    if (s == NULL) return NULL;
+
+    s->files = rpmfilesLink(files);
+    s->archive = archive;
+
+    return (PyObject *) s;
+}
+
diff --git a/python/rpmarchive-py.h b/python/rpmarchive-py.h
new file mode 100644 (file)
index 0000000..96f09fd
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef H_RPMARCHIVE_PY
+#define H_RPMARCHIVE_PY
+
+#include <rpm/rpmarchive.h>
+
+typedef struct rpmarchiveObject_s rpmarchiveObject;
+
+extern PyTypeObject rpmarchive_Type;
+
+#define rpmarchiveObject_Check(v)      ((v)->ob_type == &rpmarchive_Type)
+
+PyObject * rpmarchive_Wrap(PyTypeObject *subtype,
+                          rpmfiles files, rpmfi archive);
+
+#endif
index 4b44220dc1f325e1008bff468cd5165d73bb3e21..9eae9a2286b7ddf0a1a7e70187a55f764611e899 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "header-py.h"
 #include "rpmds-py.h"
+#include "rpmstrpool-py.h"
 
 struct rpmdsObject_s {
     PyObject_HEAD
@@ -96,21 +97,6 @@ rpmds_SetNoPromote(rpmdsObject * s, PyObject * args, PyObject * kwds)
     return Py_BuildValue("i", rpmdsSetNoPromote(s->ds, nopromote));
 }
 
-static PyObject *
-rpmds_Notify(rpmdsObject * s, PyObject * args, PyObject * kwds)
-{
-    const char * where;
-    int rc;
-    char * kwlist[] = {"location", "returnCode", NULL};
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "si:Notify", kwlist,
-           &where, &rc))
-       return NULL;
-
-    rpmdsNotify(s->ds, where, rc);
-    Py_RETURN_NONE;
-}
-
 /* XXX rpmdsFind uses bsearch on s->ds, so a sort is needed. */
 static PyObject *
 rpmds_Sort(rpmdsObject * s)
@@ -169,12 +155,18 @@ static PyObject *rpmds_Instance(rpmdsObject * s)
     return Py_BuildValue("i", rpmdsInstance(s->ds));
 }
 
-static PyObject * rpmds_Rpmlib(rpmdsObject * s)
+static PyObject * rpmds_Rpmlib(rpmdsObject * s, PyObject *args, PyObject *kwds)
 {
+    rpmstrPool pool = NULL;
     rpmds ds = NULL;
+    char * kwlist[] = {"pool", NULL};
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O&:rpmds_Rpmlib", kwlist, 
+                &poolFromPyObject, &pool))
+       return NULL;
 
     /* XXX check return code, permit arg (NULL uses system default). */
-    rpmdsRpmlib(&ds, NULL);
+    rpmdsRpmlibPool(pool, &ds, NULL);
 
     return rpmds_Wrap(&rpmds_Type, ds);
 }
@@ -183,39 +175,39 @@ static struct PyMethodDef rpmds_methods[] = {
  {"Count",     (PyCFunction)rpmds_Count,       METH_NOARGS,
        "Deprecated, use len(ds) instead.\n" },
  {"Ix",                (PyCFunction)rpmds_Ix,          METH_NOARGS,
-       "ds.Ix -> Ix            - Return current element index.\n" },
+       "ds.Ix -> Ix -- Return current element index.\n" },
  {"DNEVR",     (PyCFunction)rpmds_DNEVR,       METH_NOARGS,
-       "ds.DNEVR -> DNEVR      - Return current DNEVR.\n" },
+       "ds.DNEVR -> DNEVR -- Return current DNEVR.\n" },
  {"N",         (PyCFunction)rpmds_N,           METH_NOARGS,
-       "ds.N -> N              - Return current N.\n" },
+       "ds.N -> N -- Return current N.\n" },
  {"EVR",       (PyCFunction)rpmds_EVR,         METH_NOARGS,
-       "ds.EVR -> EVR          - Return current EVR.\n" },
+       "ds.EVR -> EVR -- Return current EVR.\n" },
  {"Flags",     (PyCFunction)rpmds_Flags,       METH_NOARGS,
-       "ds.Flags -> Flags      - Return current Flags.\n" },
+       "ds.Flags -> Flags -- Return current Flags.\n" },
  {"TagN",      (PyCFunction)rpmds_TagN,        METH_NOARGS,
-       "ds.TagN -> TagN        - Return current TagN.\n" },
+  "ds.TagN -> TagN -- Return TagN (RPMTAG_*NAME)\n\n"
+  "the type of all dependencies in this set.\n" },
  {"Color",     (PyCFunction)rpmds_Color,       METH_NOARGS,
-       "ds.Color -> Color      - Return current Color.\n" },
+       "ds.Color -> Color -- Return current Color.\n" },
  {"SetNoPromote",(PyCFunction)rpmds_SetNoPromote, METH_VARARGS|METH_KEYWORDS,
-       NULL},
- {"Notify",    (PyCFunction)rpmds_Notify,      METH_VARARGS|METH_KEYWORDS,
-       NULL},
+  "ds.SetNoPromote(noPromote) -- Set noPromote for this instance.\n\n"
+  "If True non existing epochs are no longer equal to an epoch of 0."},
  {"Sort",      (PyCFunction)rpmds_Sort,        METH_NOARGS,
        NULL},
  {"Find",      (PyCFunction)rpmds_Find,        METH_O,
-       NULL},
+  "ds.find(other_ds) -- Return index of other_ds in ds"},
  {"Merge",     (PyCFunction)rpmds_Merge,       METH_O,
        NULL},
  {"Search",     (PyCFunction)rpmds_Search,      METH_O,
 "ds.Search(element) -> matching ds index (-1 on failure)\n\
-Check that element dependency range overlaps some member of ds.\n\
-The current index in ds is positioned at overlapping member upon success.\n" },
- {"Rpmlib",     (PyCFunction)rpmds_Rpmlib,      METH_NOARGS|METH_STATIC,
-       "ds.Rpmlib -> nds       - Return internal rpmlib dependency set.\n"},
+Check that element dependency range overlaps some member of ds.\n\
+The current index in ds is positioned at overlapping member." },
+ {"Rpmlib",     (PyCFunction)rpmds_Rpmlib,      METH_VARARGS|METH_KEYWORDS|METH_STATIC,
+       "ds.Rpmlib -> nds -- Return internal rpmlib dependency set.\n"},
  {"Compare",   (PyCFunction)rpmds_Compare,     METH_O,
-       NULL},
+  "ds.compare(other) -- Compare current entries of self and other.\n\nReturns True if the entries match each other, False otherwise"},
  {"Instance",  (PyCFunction)rpmds_Instance,    METH_NOARGS,
-       NULL},
+  "ds.Instance() -- Return rpmdb key of corresponding package or 0."},
  {NULL,                NULL}           /* sentinel */
 };
 
@@ -305,10 +297,12 @@ static PyObject * rpmds_new(PyTypeObject * subtype, PyObject *args, PyObject *kw
     rpmTagVal tagN = RPMTAG_REQUIRENAME;
     rpmds ds = NULL;
     Header h = NULL;
-    char * kwlist[] = {"obj", "tag", NULL};
+    rpmstrPool pool = NULL;
+    char * kwlist[] = {"obj", "tag", "pool", NULL};
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:rpmds_new", kwlist, 
-                &obj, tagNumFromPyObject, &tagN))
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&|O&:rpmds_new", kwlist, 
+                &obj, tagNumFromPyObject, &tagN,
+                &poolFromPyObject, &pool))
        return NULL;
 
     if (PyTuple_Check(obj)) {
@@ -317,16 +311,16 @@ static PyObject * rpmds_new(PyTypeObject * subtype, PyObject *args, PyObject *kw
        rpmsenseFlags flags = RPMSENSE_ANY;
        /* TODO: if flags are specified, evr should be required too */
        if (PyArg_ParseTuple(obj, "s|O&s", &name, depflags, &flags, &evr)) {
-           ds = rpmdsSingle(tagN, name, evr, flags);
+           ds = rpmdsSinglePool(pool, tagN, name, evr, flags);
        } else {
            PyErr_SetString(PyExc_ValueError, "invalid dependency tuple");
            return NULL;
        }
     } else if (hdrFromPyObject(obj, &h)) {
        if (tagN == RPMTAG_NEVR) {
-           ds = rpmdsThis(h, RPMTAG_PROVIDENAME, RPMSENSE_EQUAL);
+           ds = rpmdsThisPool(pool, h, RPMTAG_PROVIDENAME, RPMSENSE_EQUAL);
        } else {
-           ds = rpmdsNew(h, tagN, 0);
+           ds = rpmdsNewPool(pool, h, tagN, 0);
        }
     } else {
        PyErr_SetString(PyExc_TypeError, "header or tuple expected");
@@ -337,11 +331,15 @@ static PyObject * rpmds_new(PyTypeObject * subtype, PyObject *args, PyObject *kw
 }
 
 static char rpmds_doc[] =
-"";
+    "rpm.ds (dependendcy set) gives a more convenient access to dependencies\n\n"
+    "It can hold multiple entries of Name Flags and EVR.\n"
+    "It typically represents all dependencies of one kind of a package\n"
+    "e.g. all Requires or all Conflicts.\n"
+    ;
 
 PyTypeObject rpmds_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".ds",         /* tp_name */
+       "rpm.ds",                       /* tp_name */
        sizeof(rpmdsObject),            /* tp_basicsize */
        0,                              /* tp_itemsize */
        /* methods */
index 41f494108b3ce42829aca687873bb55a5e1dc85a..85fb0cd24714b24af1c1af746d225e58a9d8deff 100644 (file)
@@ -8,6 +8,8 @@ struct rpmfdObject_s {
     PyObject_HEAD
     PyObject *md_dict;
     FD_t fd;
+    char *mode;
+    char *flags;
 };
 
 FD_t rpmfdGetFd(rpmfdObject *fdo)
@@ -43,14 +45,21 @@ static PyObject *err_closed(void)
     return NULL;
 }
 
-static FD_t openPath(const char *path, const char *mode, const char *flags)
+static FD_t openPath(const char *path, const char *mode)
 {
     FD_t fd;
-    char *m = rstrscat(NULL, mode, ".", flags, NULL);
     Py_BEGIN_ALLOW_THREADS
-    fd = Fopen(path, m);
+    fd = Fopen(path, mode);
+    Py_END_ALLOW_THREADS;
+    return fd;
+}
+
+static FD_t openFd(FD_t ofd, const char *mode)
+{
+    FD_t fd;
+    Py_BEGIN_ALLOW_THREADS
+    fd = Fdopen(ofd, mode);
     Py_END_ALLOW_THREADS;
-    free(m);
     return fd;
 }
 
@@ -59,6 +68,7 @@ static int rpmfd_init(rpmfdObject *s, PyObject *args, PyObject *kwds)
     char *kwlist[] = { "obj", "mode", "flags", NULL };
     const char *mode = "r";
     const char *flags = "ufdio";
+    char *rpmio_mode = NULL;
     PyObject *fo = NULL;
     FD_t fd = NULL;
     int fdno;
@@ -67,8 +77,10 @@ static int rpmfd_init(rpmfdObject *s, PyObject *args, PyObject *kwds)
                                     &fo, &mode, &flags))
        return -1;
 
+    rpmio_mode = rstrscat(NULL, mode, ".", flags, NULL);
+
     if (PyBytes_Check(fo)) {
-       fd = openPath(PyBytes_AsString(fo), mode, flags);
+       fd = openPath(PyBytes_AsString(fo), rpmio_mode);
     } else if (PyUnicode_Check(fo)) {
        PyObject *enc = NULL;
        int rc;
@@ -78,26 +90,38 @@ static int rpmfd_init(rpmfdObject *s, PyObject *args, PyObject *kwds)
        rc = utf8FromPyObject(fo, &enc);
 #endif
        if (rc) {
-           fd = openPath(PyBytes_AsString(enc), mode, flags);
+           fd = openPath(PyBytes_AsString(enc), rpmio_mode);
            Py_DECREF(enc);
        }
+    } else if (rpmfdObject_Check(fo)) {
+       rpmfdObject *fdo = (rpmfdObject *)fo;
+       fd = openFd(fdDup(Fileno(fdo->fd)), rpmio_mode);
     } else if ((fdno = PyObject_AsFileDescriptor(fo)) >= 0) {
-       fd = fdDup(fdno);
+       fd = openFd(fdDup(fdno), rpmio_mode);
     } else {
        PyErr_SetString(PyExc_TypeError, "path or file object expected");
     }
 
     if (fd != NULL) {
-       /* TODO: remember our filename, mode & flags */
        Fclose(s->fd); /* in case __init__ was called again */
+       free(s->mode);
+       free(s->flags);
        s->fd = fd;
+       s->mode = rstrdup(mode);
+       s->flags = rstrdup(flags);
     } else {
        PyErr_SetString(PyExc_IOError, Fstrerror(fd));
     }
 
+    free(rpmio_mode);
     return (fd == NULL) ? -1 : 0;
 }
 
+static PyObject *rpmfd_open(PyObject *cls, PyObject *args, PyObject *kwds)
+{
+    return PyObject_Call(cls, args, kwds);
+}
+
 static PyObject *do_close(rpmfdObject *s)
 {
     /* mimic python fileobject: close on closed file is not an error */
@@ -119,6 +143,8 @@ static void rpmfd_dealloc(rpmfdObject *s)
 {
     PyObject *res = do_close(s);
     Py_XDECREF(res);
+    free(s->mode);
+    free(s->flags);
     Py_TYPE(s)->tp_free((PyObject *)s);
 }
 
@@ -272,6 +298,8 @@ static PyObject *rpmfd_write(rpmfdObject *s, PyObject *args, PyObject *kwds)
 static char rpmfd_doc[] = "";
 
 static struct PyMethodDef rpmfd_methods[] = {
+    { "open",  (PyCFunction) rpmfd_open,       METH_VARARGS|METH_KEYWORDS|METH_CLASS,
+       NULL },
     { "close", (PyCFunction) rpmfd_close,      METH_NOARGS,
        NULL },
     { "fileno",        (PyCFunction) rpmfd_fileno,     METH_NOARGS,
@@ -302,15 +330,27 @@ static PyObject *rpmfd_get_name(rpmfdObject *s)
     return Py_BuildValue("s", Fdescr(s->fd));
 }
 
+static PyObject *rpmfd_get_mode(rpmfdObject *s)
+{
+    return Py_BuildValue("s", s->mode);
+}
+
+static PyObject *rpmfd_get_flags(rpmfdObject *s)
+{
+    return Py_BuildValue("s", s->flags);
+}
+
 static PyGetSetDef rpmfd_getseters[] = {
     { "closed", (getter)rpmfd_get_closed, NULL, NULL },
     { "name", (getter)rpmfd_get_name, NULL, NULL },
+    { "mode", (getter)rpmfd_get_mode, NULL, NULL },
+    { "flags", (getter)rpmfd_get_flags, NULL, NULL },
     { NULL },
 };
 
 PyTypeObject rpmfd_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".fd",         /* tp_name */
+       "rpm.fd",                       /* tp_name */
        sizeof(rpmfdObject),            /* tp_size */
        0,                              /* tp_itemsize */
        /* methods */
index 14e89df1f019c0d7fe0bbcbf373c51a356f22cca..a1a743a1dfa9b5ae336f994705481bc00a79164a 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "header-py.h"
 #include "rpmfi-py.h"
+#include "rpmstrpool-py.h"
 
 struct rpmfiObject_s {
     PyObject_HEAD
@@ -55,6 +56,18 @@ rpmfi_FN(rpmfiObject * s, PyObject * unused)
     return Py_BuildValue("s", rpmfiFN(s->fi));
 }
 
+static PyObject *
+rpmfi_FindFN(rpmfiObject * s, PyObject * args, PyObject * kwds)
+{
+    char * kwlist[] = {"filename", NULL};
+    PyObject * filename = NULL;
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "S:FindFN", kwlist,
+                                     &filename))
+        return NULL;
+    return Py_BuildValue("i", rpmfiFindFN(s->fi, PyBytes_AsString(filename)));
+}
+
+
 static PyObject *
 rpmfi_FFlags(rpmfiObject * s, PyObject * unused)
 {
@@ -145,6 +158,25 @@ rpmfi_FClass(rpmfiObject * s, PyObject * unused)
     return Py_BuildValue("s", FClass);
 }
 
+static PyObject *
+rpmfi_FLinks(rpmfiObject * s, PyObject * unused)
+{
+    uint32_t nlinks;
+    const int * files;
+    PyObject * result;
+
+    nlinks = rpmfiFLinks(s->fi, &files);
+    if (nlinks==1) {
+       return Py_BuildValue("(i)", rpmfiFX(s->fi));
+    }
+
+    result = PyTuple_New(nlinks);
+    for (uint32_t i=0; i<nlinks; i++) {
+       PyTuple_SET_ITEM(result,  i, PyInt_FromLong(files[i]));
+    }
+    return result;
+}
+
 static PyObject *
 rpmfi_iternext(rpmfiObject * s)
 {
@@ -206,47 +238,51 @@ rpmfi_iternext(rpmfiObject * s)
 
 static struct PyMethodDef rpmfi_methods[] = {
  {"FC",                (PyCFunction)rpmfi_FC,          METH_NOARGS,
-       NULL},
+  "fi.FC() -- Return number of files entries."},
  {"FX",                (PyCFunction)rpmfi_FX,          METH_NOARGS,
-       NULL},
+  "fi.FX() -- Return current position of the iterator."},
  {"DC",                (PyCFunction)rpmfi_DC,          METH_NOARGS,
-       NULL},
+  "fi.DC() --Return number of directory entries."},
  {"DX",                (PyCFunction)rpmfi_DX,          METH_NOARGS,
-       NULL},
+  "fi.DX() -- Return number of directory entry matching current file."},
  {"BN",                (PyCFunction)rpmfi_BN,          METH_NOARGS,
-       NULL},
+  "fi.BN() -- Return base name of current file."},
  {"DN",                (PyCFunction)rpmfi_DN,          METH_NOARGS,
-       NULL},
+  "fi.DN() -- Return directory name of the current file."},
  {"FN",                (PyCFunction)rpmfi_FN,          METH_NOARGS,
-       NULL},
+  "fi.FN() -- Return the name/path of the current file."},
+ {"FindFN",    (PyCFunction)rpmfi_FindFN,      METH_VARARGS|METH_KEYWORDS,
+  "fi.FindFN(pathname) -- Return entry number of given pathname.\n\nReturn -1 if file is not found.\nLeading '.' in the given name is stripped before the search."},
  {"FFlags",    (PyCFunction)rpmfi_FFlags,      METH_NOARGS,
-       NULL},
+  "fi.FFlags() -- Return the flags of the current file."},
  {"VFlags",    (PyCFunction)rpmfi_VFlags,      METH_NOARGS,
-       NULL},
+  "fi.VFlags() -- Return the verify flags of the current file.\n\nSee RPMVERIFY_* (in rpmvf.h)"},
  {"FMode",     (PyCFunction)rpmfi_FMode,       METH_NOARGS,
-       NULL},
+  "fi.FMode() -- Return the mode flags of the current file."},
  {"FState",    (PyCFunction)rpmfi_FState,      METH_NOARGS,
-       NULL},
+  "fi.FState() -- Return the file state of the current file."},
  {"MD5",       (PyCFunction)rpmfi_Digest,      METH_NOARGS,
-       NULL},
+  "fi.() -- Return the checksum of the current file.\n\nDEPRECATED! Use fi.Digest instead!"},
  {"Digest",    (PyCFunction)rpmfi_Digest,      METH_NOARGS,
-       NULL},
+  "fi.() -- Return the checksum of the current file."},
  {"FLink",     (PyCFunction)rpmfi_FLink,       METH_NOARGS,
-       NULL},
+  "fi.() -- Return the link target of the current file.\n\nFor soft links only."},
  {"FSize",     (PyCFunction)rpmfi_FSize,       METH_NOARGS,
-       NULL},
+  "fi.() -- Return the size of the current file."},
  {"FRdev",     (PyCFunction)rpmfi_FRdev,       METH_NOARGS,
-       NULL},
+  "fi.() -- Return the device number of the current file.\n\nFor device files only."},
  {"FMtime",    (PyCFunction)rpmfi_FMtime,      METH_NOARGS,
-       NULL},
+  "fi.() -- Return the modification time of the current file."},
  {"FUser",     (PyCFunction)rpmfi_FUser,       METH_NOARGS,
-       NULL},
+  "fi.() -- Return the user name owning the current file."},
  {"FGroup",    (PyCFunction)rpmfi_FGroup,      METH_NOARGS,
-       NULL},
+  "fi.() -- Return the group name of the current file."},
  {"FColor",    (PyCFunction)rpmfi_FColor,      METH_NOARGS,
-       NULL},
+  "fi.() -- Return the color of the current file.\n\n2 for 64 bit binaries\n1 for 32 bit binaries\n0 for everything else"},
  {"FClass",    (PyCFunction)rpmfi_FClass,      METH_NOARGS,
-       NULL},
+  "fi.() -- Return the classification of the current file."},
+ {"FLinks",    (PyCFunction)rpmfi_FLinks,      METH_NOARGS,
+  "fi.() -- Return the number of hardlinks pointing to of the\ncurrent file."},
  {NULL,                NULL}           /* sentinel */
 };
 
@@ -299,13 +335,15 @@ static PyObject * rpmfi_new(PyTypeObject * subtype, PyObject *args, PyObject *kw
     rpmfi fi = NULL;
     rpmTagVal tagN = RPMTAG_BASENAMES;
     int flags = 0;
-    char * kwlist[] = {"header", "tag", "flags", NULL};
+    rpmstrPool pool = NULL;
+    char * kwlist[] = {"header", "tag", "flags", "pool", NULL};
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|Oi:rpmfi_init", kwlist,
-                               hdrFromPyObject, &h, &to, &flags))
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|OiO&:rpmfi_init", kwlist,
+                               hdrFromPyObject, &h, &to, &flags,
+                               poolFromPyObject, &pool))
        return NULL;
 
-    fi = rpmfiNew(NULL, h, tagN, flags);
+    fi = rpmfiNewPool(pool, h, tagN, flags);
 
     if (fi == NULL) {
        PyErr_SetString(PyExc_ValueError, "invalid file data in header");
@@ -316,11 +354,15 @@ static PyObject * rpmfi_new(PyTypeObject * subtype, PyObject *args, PyObject *kw
 }
 
 static char rpmfi_doc[] =
-"";
+"File iterator\n\n"
+"DEPRECATED! This old API mixes storing and iterating over the meta data\n"
+"of the files of a package. Use rpm.files and rpm.file data types as a\n"
+"much cleaner API.\n\n"
+"Iteration returns a tuple of\n(FN, FSize, FMode, FMtime, FFlags, FRdev, FInode, FNlink, FState,\n VFlags, FUser, FGroup, Digest)";
 
 PyTypeObject rpmfi_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".fi",         /* tp_name */
+       "rpm.fi",                       /* tp_name */
        sizeof(rpmfiObject),            /* tp_basicsize */
        0,                              /* tp_itemsize */
        /* methods */
diff --git a/python/rpmfiles-py.c b/python/rpmfiles-py.c
new file mode 100644 (file)
index 0000000..d69d1f2
--- /dev/null
@@ -0,0 +1,598 @@
+#include "rpmsystem-py.h"
+
+#include <rpm/rpmtypes.h>
+#include <rpm/rpmpgp.h>
+
+#include "header-py.h"
+#include "rpmfi-py.h"
+#include "rpmfiles-py.h"
+#include "rpmfd-py.h"
+#include "rpmarchive-py.h"
+#include "rpmstrpool-py.h"
+
+/* A single file from rpmfiles set, can't be independently instanciated */
+struct rpmfileObject_s {
+    PyObject_HEAD
+    PyObject *md_dict;
+    rpmfiles files;            /* reference to rpmfiles */
+    int ix;                    /* index to rpmfiles */
+};
+
+static void rpmfile_dealloc(rpmfileObject * s)
+{
+    s->files = rpmfilesFree(s->files);
+    Py_TYPE(s)->tp_free((PyObject *)s);
+}
+
+static char rpmfile_doc[] =
+    "Gives access to the meta data of a single file.\n\n"
+    "Instances of this class are only available through an rpm.files object.";
+
+static PyObject *rpmfile_fx(rpmfileObject *s)
+{
+    return Py_BuildValue("i", s->ix);
+}
+
+static PyObject *rpmfile_dx(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesDI(s->files, s->ix));
+}
+
+static PyObject *rpmfile_name(rpmfileObject *s)
+{
+    char * fn = rpmfilesFN(s->files, s->ix);
+    PyObject *o = Py_BuildValue("s", fn);
+    free(fn);
+    return o;
+}
+
+static PyObject *rpmfile_basename(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesBN(s->files, s->ix));
+}
+
+static PyObject *rpmfile_dirname(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesDN(s->files, rpmfilesDI(s->files, s->ix)));
+}
+
+static PyObject *rpmfile_orig_name(rpmfileObject *s)
+{
+    char * fn = rpmfilesOFN(s->files, s->ix);
+    PyObject *o = Py_BuildValue("s", fn);
+    free(fn);
+    return o;
+}
+
+static PyObject *rpmfile_orig_basename(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesOBN(s->files, s->ix));
+}
+
+static PyObject *rpmfile_orig_dirname(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesODN(s->files, rpmfilesODI(s->files, s->ix)));
+}
+static PyObject *rpmfile_mode(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesFMode(s->files, s->ix));
+}
+
+static PyObject *rpmfile_size(rpmfileObject *s)
+{
+    return Py_BuildValue("L", rpmfilesFSize(s->files, s->ix));
+}
+
+static PyObject *rpmfile_mtime(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesFMtime(s->files, s->ix));
+}
+
+static PyObject *rpmfile_rdev(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesFRdev(s->files, s->ix));
+}
+
+static PyObject *rpmfile_inode(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesFInode(s->files, s->ix));
+}
+
+static PyObject *rpmfile_nlink(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesFNlink(s->files, s->ix));
+}
+
+static PyObject *rpmfile_linkto(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesFLink(s->files, s->ix));
+}
+
+static PyObject *rpmfile_user(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesFUser(s->files, s->ix));
+}
+
+static PyObject *rpmfile_group(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesFGroup(s->files, s->ix));
+}
+
+static PyObject *rpmfile_fflags(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesFFlags(s->files, s->ix));
+}
+
+static PyObject *rpmfile_vflags(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesVFlags(s->files, s->ix));
+}
+
+static PyObject *rpmfile_color(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesFColor(s->files, s->ix));
+}
+
+static PyObject *rpmfile_state(rpmfileObject *s)
+{
+    return Py_BuildValue("i", rpmfilesFState(s->files, s->ix));
+}
+
+static PyObject *rpmfile_digest(rpmfileObject *s)
+{
+    size_t diglen = 0;
+    const unsigned char *digest = rpmfilesFDigest(s->files, s->ix,
+                                                 NULL, &diglen);
+    if (digest) {
+       char * hex = pgpHexStr(digest, diglen);
+       PyObject *o = Py_BuildValue("s", hex);
+       free(hex);
+       return o;
+    }
+    Py_RETURN_NONE;
+}
+
+static PyObject *rpmfile_class(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesFClass(s->files, s->ix));
+}
+
+static PyObject *rpmfile_caps(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesFCaps(s->files, s->ix));
+}
+
+static PyObject *rpmfile_langs(rpmfileObject *s)
+{
+    return Py_BuildValue("s", rpmfilesFLangs(s->files, s->ix));
+}
+
+static PyObject *rpmfile_links(rpmfileObject *s)
+{
+    PyObject *result = NULL;
+    const int * links = NULL;
+    uint32_t nlinks = rpmfilesFLinks(s->files, s->ix, &links);
+
+    if (nlinks == 0)
+       Py_RETURN_NONE;
+    else if (nlinks == 1)
+       links = &s->ix; /* file itself */
+
+    result = PyTuple_New(nlinks);
+    if (result) {
+       for (uint32_t i = 0; i < nlinks; i++) {
+           int lix = links[i];
+           PyObject * o;
+
+           if (lix == s->ix) {
+               /* file itself, return a reference instead of new object */
+               Py_INCREF(s);
+               o = (PyObject *) s;
+           } else {
+               o = rpmfile_Wrap(s->files, lix);
+           }
+
+           PyTuple_SET_ITEM(result, i, o);
+       }
+    }
+    return result;
+}
+
+/*
+ * Exported as "matches" instead of a rich comparison operator or such
+ * as this cannot be used for comparing file *object* equality,
+ * rpmfilesCompare() determines whether the file *contents* match.
+ */
+static PyObject *rpmfile_matches(rpmfileObject *s, PyObject *o)
+{
+    PyObject *result = NULL;
+    if (rpmfileObject_Check(o)) {
+       rpmfileObject *of = (rpmfileObject *)o;
+       int rc = rpmfilesCompare(s->files, s->ix, of->files, of->ix);
+       result = PyBool_FromLong(rc == 0);
+    } else {
+       PyErr_SetObject(PyExc_TypeError, o);
+    }
+    return result;
+}
+
+static PyObject *rpmfile_verify(rpmfileObject *s, PyObject *args, PyObject *kwds)
+{
+    static char *kwlist[] = { "omitMask", NULL };
+    rpmVerifyAttrs omitMask = 0;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i", kwlist, &omitMask))
+       return NULL;
+
+    return Py_BuildValue("i", rpmfilesVerify(s->files, s->ix, omitMask));
+}
+
+static PyGetSetDef rpmfile_getseters[] = {
+    { "fx",            (getter) rpmfile_fx,            NULL,
+      "index in header and rpm.files object" },
+    { "dx",            (getter) rpmfile_dx,            NULL,
+      "index of dirname entry" },
+    { "name",          (getter) rpmfile_name,          NULL,
+      "file name (path)" },
+    { "basename",      (getter) rpmfile_basename,      NULL, NULL },
+    { "dirname",       (getter) rpmfile_dirname,       NULL, NULL },
+    { "orig_name",     (getter) rpmfile_orig_name,     NULL,
+      "original file name (may differ due to relocation)" },
+    { "orig_basename", (getter) rpmfile_orig_basename, NULL,
+      "original base name (may differ due to relocation)" },
+    { "orig_dirname",  (getter) rpmfile_orig_dirname,  NULL,
+      "original dir name (may differ due to relocation)" },
+    { "mode",          (getter) rpmfile_mode,          NULL,
+      "mode flags / unix permissions" },
+    { "mtime",         (getter) rpmfile_mtime,         NULL,
+      "modification time (in unix time)" },
+    { "size",          (getter) rpmfile_size,          NULL,
+      "file size" },
+    { "rdev",          (getter) rpmfile_rdev,          NULL,
+      "device number - for device files only" },
+    { "inode",         (getter) rpmfile_inode,         NULL,
+      "inode number - contains fake, data used to identify hard liked files" },
+    { "fflags",                (getter) rpmfile_fflags,        NULL,
+      "file flags - see RPMFILE_* constants" },
+    { "vflags",                (getter) rpmfile_vflags,        NULL,
+      "verification flags - see RPMVERIFY_* (in rpmvf.h)" },
+    { "linkto",                (getter) rpmfile_linkto,        NULL,
+      "link target - symlinks only" },
+    { "color",         (getter) rpmfile_color,         NULL,
+      "file color - 2 for 64 bit binaries, 1 for 32 bit binaries, 0 else" },
+    { "nlink",         (getter) rpmfile_nlink,         NULL,
+      "number of hardlinks pointing to the same content as this file" },
+    { "links",         (getter) rpmfile_links,         NULL,
+      "list of file indexes that are hardlinked with this file" },
+    { "user",          (getter) rpmfile_user,          NULL,
+      "user name owning this file" },
+    { "group",         (getter) rpmfile_group,         NULL,
+      "group name owning this file" },
+    { "digest",                (getter) rpmfile_digest,        NULL,
+      "check sum of file content" },
+    { "class",         (getter) rpmfile_class,         NULL,
+      "classfication of file content based on libmagic/file(1)" },
+    { "state",         (getter) rpmfile_state,         NULL,
+      "file state  - see RPMFILE_STATE_* constants" },
+    { "langs",         (getter) rpmfile_langs,         NULL,
+      "language the file provides (typically for doc files)" },
+    { "caps",          (getter) rpmfile_caps,          NULL,
+      "file capabilities" },
+    { NULL, NULL, NULL, NULL }
+};
+
+static struct PyMethodDef rpmfile_methods[] = {
+    { "matches", (PyCFunction) rpmfile_matches,                METH_O,
+       NULL },
+    { "verify",        (PyCFunction) rpmfile_verify,   METH_VARARGS|METH_KEYWORDS,
+       NULL },
+    { NULL, NULL, 0, NULL }
+};
+
+PyTypeObject rpmfile_Type = {
+       PyVarObject_HEAD_INIT(&PyType_Type, 0)
+       "rpm.file",                     /* tp_name */
+       sizeof(rpmfileObject),          /* tp_basicsize */
+       0,                              /* tp_itemsize */
+       /* methods */
+       (destructor) rpmfile_dealloc,   /* tp_dealloc */
+       0,                              /* tp_print */
+       0,                              /* tp_getattr */
+       0,                              /* tp_setattr */
+       0,                              /* tp_compare */
+       0,                              /* tp_repr */
+       0,                              /* tp_as_number */
+       0,                              /* tp_as_sequence */
+       0,                              /* tp_as_mapping */
+       0,                              /* tp_hash */
+       0,                              /* tp_call */
+       (reprfunc)rpmfile_name,         /* tp_str */
+       PyObject_GenericGetAttr,        /* tp_getattro */
+       PyObject_GenericSetAttr,        /* tp_setattro */
+       0,                              /* tp_as_buffer */
+       Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
+       rpmfile_doc,                    /* tp_doc */
+       0,                              /* tp_traverse */
+       0,                              /* tp_clear */
+       0,                              /* tp_richcompare */
+       0,                              /* tp_weaklistoffset */
+       0,                              /* tp_iter */
+       0,                              /* tp_iternext */
+       rpmfile_methods,                /* tp_methods */
+       0,                              /* tp_members */
+       rpmfile_getseters,              /* tp_getset */
+       0,                              /* tp_base */
+       0,                              /* tp_dict */
+       0,                              /* tp_descr_get */
+       0,                              /* tp_descr_set */
+       0,                              /* tp_dictoffset */
+       0,                              /* tp_init */
+       0,                              /* tp_alloc */
+       0,                              /* tp_new */
+       0,                              /* tp_free */
+       0,                              /* tp_is_gc */
+};
+
+PyObject * rpmfile_Wrap(rpmfiles files, int ix)
+{
+    rpmfileObject *s = PyObject_New(rpmfileObject, &rpmfile_Type);
+    if (s == NULL) return NULL;
+
+    s->files = rpmfilesLink(files);
+    s->ix = ix;
+    return (PyObject *) s;
+}
+
+/* The actual rpmfiles info set */
+struct rpmfilesObject_s {
+    PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
+    rpmfiles files;
+};
+
+static void rpmfiles_dealloc(rpmfilesObject * s)
+{
+    s->files = rpmfilesFree(s->files);
+    Py_TYPE(s)->tp_free((PyObject *)s);
+}
+
+static PyObject * rpmfiles_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
+{
+    PyObject * to = NULL;
+    Header h = NULL;
+    rpmfiles files = NULL;
+    rpmTagVal tagN = RPMTAG_BASENAMES;
+    int flags = 0;
+    rpmstrPool pool = NULL;
+    char * kwlist[] = {"header", "tag", "flags", "pool", NULL};
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|OiO&:rpmfiles_new", kwlist,
+                               hdrFromPyObject, &h, &to, &flags,
+                               poolFromPyObject, &pool))
+       return NULL;
+
+    files = rpmfilesNew(pool, h, tagN, flags);
+
+    if (files == NULL) {
+       PyErr_SetString(PyExc_ValueError, "invalid file data in header");
+       return NULL;
+    }
+
+    return rpmfiles_Wrap(subtype, files);
+}
+
+static Py_ssize_t rpmfiles_length(rpmfilesObject *s)
+{
+    return rpmfilesFC(s->files);
+}
+
+static PyObject * rpmfiles_getitem(rpmfilesObject *s, Py_ssize_t ix)
+{
+    if (ix >= 0 && ix < rpmfilesFC(s->files))
+       return rpmfile_Wrap(s->files, ix);
+
+    PyErr_SetObject(PyExc_IndexError, Py_BuildValue("i", ix));
+    return NULL;
+}
+
+static int rpmfiles_contains(rpmfilesObject *s, PyObject *value)
+{
+    const char *fn = NULL;
+
+    if (!PyArg_Parse(value, "s", &fn))
+       return -1;
+
+    return (rpmfilesFindFN(s->files, fn) >= 0) ? 1 : 0;
+}
+
+static PySequenceMethods rpmfiles_as_sequence = {
+    (lenfunc)rpmfiles_length,          /* sq_length */
+    0,                                 /* sq_concat */
+    0,                                 /* sq_repeat */
+    (ssizeargfunc) rpmfiles_getitem,   /* sq_item */
+    0,                                 /* sq_slice */
+    0,                                 /* sq_ass_item */
+    0,                                 /* sq_ass_slice */
+    (objobjproc)rpmfiles_contains,     /* sq_contains */
+    0,                                 /* sq_inplace_concat */
+    0,                                 /* sq_inplace_repeat */
+};
+
+static PyObject * rpmfiles_find(rpmfileObject *s,
+                               PyObject *args, PyObject *kwds)
+{
+    const char *fn = NULL;
+    int fx, orig = 0;
+    char * kwlist[] = {"filename", "orig", NULL};
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|i", kwlist, &fn, &orig))
+       return NULL;
+
+    if (orig)
+       fx = rpmfilesFindOFN(s->files, fn);
+    else
+       fx = rpmfilesFindFN(s->files, fn);
+
+    if (fx >= 0)
+       return rpmfile_Wrap(s->files, fx);
+
+    Py_RETURN_NONE;
+}
+
+static PyObject *rpmfiles_archive(rpmfilesObject *s,
+                                 PyObject *args, PyObject *kwds)
+{
+    char * kwlist[] = {"fd", "write", NULL};
+    rpmfdObject *fdo = NULL;
+    FD_t fd = NULL;
+    rpmfi archive = NULL;
+    int writer = 0;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|i", kwlist,
+                                    rpmfdFromPyObject, &fdo, &writer)) {
+       return NULL;
+    }
+
+    fd = rpmfdGetFd(fdo);
+    if (writer) {
+       archive = rpmfiNewArchiveWriter(fd, s->files);
+    } else {
+       archive = rpmfiNewArchiveReader(fd, s->files, RPMFI_ITER_READ_ARCHIVE);
+    }
+
+    return rpmarchive_Wrap(&rpmarchive_Type, s->files, archive);
+}
+
+static PyObject *rpmfiles_subscript(rpmfilesObject *s, PyObject *item)
+{
+    PyObject *str = NULL;
+
+    /* treat numbers as sequence accesses */
+    if (PyInt_Check(item)) {
+       return rpmfiles_getitem(s, PyInt_AsSsize_t(item));
+    } else if (PyLong_Check(item)) {
+       return rpmfiles_getitem(s, PyLong_AsSsize_t(item));
+    }
+
+    /* handle slices by returning tuples of rpm.file items */
+    if (PySlice_Check(item)) {
+       Py_ssize_t start, stop, step, slicelength, i, cur;
+       PyObject * result;
+       
+       if (PySlice_GetIndicesEx(
+#if PY_MAJOR_VERSION < 3
+                                (PySliceObject*)
+#endif
+                                item, rpmfiles_length(s),
+                                &start, &stop, &step, &slicelength) < 0) {
+           return NULL;
+       }
+
+       result = PyTuple_New(slicelength);
+       if (result) {
+           for (cur = start, i = 0; i < slicelength; cur += step, i++) {
+               PyTuple_SET_ITEM(result, i, rpmfiles_getitem(s, cur));
+           }
+       }
+       return result;
+    }
+
+    /* ... and strings as mapping access */
+    if (utf8FromPyObject(item, &str)) {
+       int fx = rpmfilesFindFN(s->files, PyBytes_AsString(str));
+       Py_DECREF(str);
+
+       if (fx >= 0) {
+           return rpmfile_Wrap(s->files, fx);
+       } else {
+           PyErr_SetObject(PyExc_KeyError, item);
+       }
+    } else {
+       PyErr_SetObject(PyExc_TypeError, item);
+    }
+
+    return NULL;
+}
+
+static PyMappingMethods rpmfiles_as_mapping = {
+    (lenfunc) rpmfiles_length,         /* mp_length */
+    (binaryfunc) rpmfiles_subscript,   /* mp_subscript */
+    0,                                 /* mp_ass_subscript */
+};
+
+static struct PyMethodDef rpmfiles_methods[] = {
+    { "archive", (PyCFunction) rpmfiles_archive, METH_VARARGS|METH_KEYWORDS,
+      "files.archive(fd, write=False) -- Return a rpm.archive object\n\n"
+      "Args:\n"
+      "  fd : File to read from or write to.\n"
+      "  write : True to get an archive writer, False for an archive reader"},
+    { "find",  (PyCFunction) rpmfiles_find,    METH_VARARGS|METH_KEYWORDS,
+      "files.find(filename, orig=False) -- Return index of given file name.\n\n"
+      "  Return -1 if file is not found.\n"
+      "  Leading \".\" in filename is ignored."},
+    { NULL, NULL, 0, NULL }
+};
+
+static char rpmfiles_doc[] =
+    "rpm.files(hdr, tag=RPMTAG_BASENAMES, flags=None, pool=None)\n\n"
+    "Stores the meta data of a package's files.\n\n"
+    "Args:\n"
+    "\thdr: The header object to get the data from.\n"
+    "\tflags : Controls which data to store and whether to create\n\t\tcopies or use the data from the header.\n\t\tBy default all data is copied.\n\t\tSee RPMFI_* constants in rpmfiles.h.\n"
+    "\tpool : rpm.strpool object to store the strings in.\n\t\tLeave empty to use global pool.\n"
+    "\ttag : Obsolete. Leave alone!\n\n"
+    "rpm.files is basically a sequence of rpm.file objects.\nNote that this is a read only data structure. To write file data you\nhave to write it directly into aheader object.";
+
+PyTypeObject rpmfiles_Type = {
+       PyVarObject_HEAD_INIT(&PyType_Type, 0)
+       "rpm.files",                    /* tp_name */
+       sizeof(rpmfilesObject),         /* tp_basicsize */
+       0,                              /* tp_itemsize */
+       /* methods */
+       (destructor) rpmfiles_dealloc,  /* tp_dealloc */
+       0,                              /* tp_print */
+       0,                              /* tp_getattr */
+       0,                              /* tp_setattr */
+       0,                              /* tp_compare */
+       0,                              /* tp_repr */
+       0,                              /* tp_as_number */
+       &rpmfiles_as_sequence,          /* tp_as_sequence */
+       &rpmfiles_as_mapping,           /* tp_as_mapping */
+       0,                              /* tp_hash */
+       0,                              /* tp_call */
+       0,                              /* tp_str */
+       PyObject_GenericGetAttr,        /* tp_getattro */
+       PyObject_GenericSetAttr,        /* tp_setattro */
+       0,                              /* tp_as_buffer */
+       Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
+       rpmfiles_doc,                   /* tp_doc */
+       0,                              /* tp_traverse */
+       0,                              /* tp_clear */
+       0,                              /* tp_richcompare */
+       0,                              /* tp_weaklistoffset */
+       0,                              /* tp_iter */
+       0,                              /* tp_iternext */
+       rpmfiles_methods,               /* tp_methods */
+       0,                              /* tp_members */
+       0,                              /* tp_getset */
+       0,                              /* tp_base */
+       0,                              /* tp_dict */
+       0,                              /* tp_descr_get */
+       0,                              /* tp_descr_set */
+       0,                              /* tp_dictoffset */
+       0,                              /* tp_init */
+       0,                              /* tp_alloc */
+       (newfunc) rpmfiles_new,         /* tp_new */
+       0,                              /* tp_free */
+       0,                              /* tp_is_gc */
+};
+
+PyObject * rpmfiles_Wrap(PyTypeObject *subtype, rpmfiles files)
+{
+    rpmfilesObject *s = (rpmfilesObject *)subtype->tp_alloc(subtype, 0);
+    if (s == NULL) return NULL;
+
+    s->files = files;
+    return (PyObject *) s;
+}
+
diff --git a/python/rpmfiles-py.h b/python/rpmfiles-py.h
new file mode 100644 (file)
index 0000000..2e27d3d
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef H_RPMFILES_PY
+#define H_RPMFILES_PY
+
+#include <rpm/rpmfiles.h>
+
+typedef struct rpmfileObject_s rpmfileObject;
+typedef struct rpmfilesObject_s rpmfilesObject;
+
+extern PyTypeObject rpmfile_Type;
+extern PyTypeObject rpmfiles_Type;
+
+#define rpmfileObject_Check(v) ((v)->ob_type == &rpmfile_Type)
+#define rpmfilesObject_Check(v)        ((v)->ob_type == &rpmfiles_Type)
+
+PyObject * rpmfile_Wrap(rpmfiles files, int ix);
+PyObject * rpmfiles_Wrap(PyTypeObject *subtype, rpmfiles files);
+
+#endif
index 9209b54e550894dcc40484561a010b7762f362ee..1807414793ce26300f262f09d65e53b1839bab2b 100644 (file)
@@ -1,7 +1,9 @@
 #include "rpmsystem-py.h"
 
 #include <rpm/rpmdb.h>
+#include <rpm/rpmtd.h>
 
+#include "rpmtd-py.h"
 #include "rpmii-py.h"
 #include "header-py.h"
 
@@ -36,18 +38,25 @@ struct rpmiiObject_s {
     PyObject *md_dict;         /*!< to look like PyModuleObject */
     PyObject *ref;             /* for db/ts refcounting */
     rpmdbIndexIterator ii;
+    rpmtd keytd;
 };
 
 static PyObject *
 rpmii_iternext(rpmiiObject * s)
 {
-    char * key;
-    size_t keylen;
-    if (s->ii == NULL || (rpmdbIndexIteratorNext(s->ii, (const void**)&key, &keylen)) != 0) {
-       s->ii = rpmdbIndexIteratorFree(s->ii);
-       return NULL;
+    PyObject *keyo = NULL;
+
+    if (s->ii != NULL) {
+       if (rpmdbIndexIteratorNextTd(s->ii, s->keytd) == 0) {
+           /* The keys must never be arrays so rpmtd_AsPyObj() wont work */
+           keyo = rpmtd_ItemAsPyobj(s->keytd, rpmtdClass(s->keytd));
+           rpmtdFreeData(s->keytd);
+       } else {
+           s->ii = rpmdbIndexIteratorFree(s->ii);
+       }
     }
-    return PyBytes_FromStringAndSize(key, keylen);
+
+    return keyo;
 };
 
 static PyObject *
@@ -75,6 +84,7 @@ static struct PyMethodDef rpmii_methods[] = {
 static void rpmii_dealloc(rpmiiObject * s)
 {
     s->ii = rpmdbIndexIteratorFree(s->ii);
+    rpmtdFree(s->keytd);
     Py_DECREF(s->ref);
     Py_TYPE(s)->tp_free((PyObject *)s);
 }
@@ -88,6 +98,9 @@ static PyNumberMethods rpmii_as_number = {
        0, /* nb_add */
        0, /* nb_subtract */
        0, /* nb_multiply */
+#if PY_MAJOR_VERSION < 3
+       0, /* nb_divide */
+#endif
        0, /* nb_remainder */
        0, /* nb_divmod */
        0, /* nb_power */
@@ -102,7 +115,7 @@ static char rpmii_doc[] =
 
 PyTypeObject rpmii_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".ii",         /* tp_name */
+       "rpm.ii",                       /* tp_name */
        sizeof(rpmiiObject),            /* tp_size */
        0,                              /* tp_itemsize */
        (destructor) rpmii_dealloc,     /* tp_dealloc */
@@ -150,6 +163,7 @@ PyObject * rpmii_Wrap(PyTypeObject *subtype, rpmdbIndexIterator ii, PyObject *s)
 
     iio->ii = ii;
     iio->ref = s;
+    iio->keytd = rpmtdNew();
     Py_INCREF(iio->ref);
     return (PyObject *) iio;
 }
index 7df847db731f89eb90544ea2a1f398a273b4bba7..d5f131e42c0df89dee11bb2c770b28d05dc406ea 100644 (file)
@@ -52,7 +52,7 @@ static char rpmPubkey_doc[] = "";
 
 PyTypeObject rpmPubkey_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".pubkey",     /* tp_name */
+       "rpm.pubkey",                   /* tp_name */
        sizeof(rpmPubkeyObject),        /* tp_size */
        0,                              /* tp_itemsize */
        (destructor) rpmPubkey_dealloc,/* tp_dealloc */
@@ -133,7 +133,7 @@ static char rpmKeyring_doc[] =
 
 PyTypeObject rpmKeyring_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".keyring",    /* tp_name */
+       "rpm.keyring",                  /* tp_name */
        sizeof(rpmKeyringObject),       /* tp_size */
        0,                              /* tp_itemsize */
        (destructor) rpmKeyring_dealloc,/* tp_dealloc */
index 3eb0acb566fe46967d2cf43e79be148d80513d4d..3cb1a51f58c6b5dfa3ad5d9bdfd59f6224403dde 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <rpm/rpmmacro.h>
 
+#include "header-py.h" /* XXX for pyrpmError, doh */
 #include "rpmmacro-py.h"
 
 PyObject *
@@ -14,7 +15,7 @@ rpmmacro_AddMacro(PyObject * self, PyObject * args, PyObject * kwds)
            &name, &val))
        return NULL;
 
-    addMacro(NULL, name, NULL, val, -1);
+    rpmPushMacro(NULL, name, NULL, val, -1);
 
     Py_RETURN_NONE;
 }
@@ -28,7 +29,7 @@ rpmmacro_DelMacro(PyObject * self, PyObject * args, PyObject * kwds)
     if (!PyArg_ParseTupleAndKeywords(args, kwds, "s:DelMacro", kwlist, &name))
        return NULL;
 
-    delMacro(NULL, name);
+    rpmPopMacro(NULL, name);
 
     Py_RETURN_NONE;
 }
@@ -37,7 +38,7 @@ PyObject *
 rpmmacro_ExpandMacro(PyObject * self, PyObject * args, PyObject * kwds)
 {
     const char *macro;
-    PyObject *res;
+    PyObject *res = NULL;
     int num = 0;
     char * kwlist[] = {"macro", "numeric", NULL};
 
@@ -47,8 +48,11 @@ rpmmacro_ExpandMacro(PyObject * self, PyObject * args, PyObject * kwds)
     if (num) {
        res = Py_BuildValue("i", rpmExpandNumeric(macro));
     } else {
-       char *str = rpmExpand(macro, NULL);
-       res = Py_BuildValue("s", str);
+       char *str = NULL;
+       if (rpmExpandMacros(NULL, macro, &str, 0) < 0)
+           PyErr_SetString(pyrpmError, "error expanding macro");
+       else
+           res = Py_BuildValue("s", str);
        free(str);
     }
     return res;
index 70bb1665b38b208708e99a660ea70516f8e3171f..379cafb3868e8b323f2fc70cdb00acce1d126e31 100644 (file)
@@ -1,6 +1,7 @@
 #include "rpmsystem-py.h"
 
 #include <rpm/rpmdb.h>
+#include <rpm/header.h>
 
 #include "rpmmi-py.h"
 #include "header-py.h"
  * \code
  *     import rpm
  *     ts = rpm.TransactionSet()
- *     mi = ts.dbMatch('name', "kernel")
+ *     mi = ts.dbMatch('name', 'kernel')
  *     for h in mi:
- *         print "%s-%s-%s" % (h['name'], h['version'], h['release'])
+ *         print '%s-%s-%s' % (h['name'], h['version'], h['release'])
  * \endcode
  *
  * Finally, here's an example that retrieves all packages whose name
- * matches the glob expression "XFree*":
+ * matches the glob expression 'XFree*':
  * \code
  *     import rpm
  *     ts = rpm.TransactionSet()
  *     mi = ts.dbMatch()
- *     mi.pattern('name', rpm.RPMMIRE_GLOB, "XFree*")
+ *     mi.pattern('name', rpm.RPMMIRE_GLOB, 'XFree*')
  *     for h in mi:
- *         print "%s-%s-%s" % (h['name'], h['version'], h['release'])
+ *         print '%s-%s-%s' % (h['name'], h['version'], h['release'])
  * \endcode
  *
  */
@@ -74,6 +75,7 @@ rpmmi_iternext(rpmmiObject * s)
        s->mi = rpmdbFreeIterator(s->mi);
        return NULL;
     }
+    headerLink(h);
     return hdr_Wrap(&hdr_Type, h);
 }
 
@@ -114,7 +116,7 @@ rpmmi_Pattern(rpmmiObject * s, PyObject * args, PyObject * kwds)
 
 static struct PyMethodDef rpmmi_methods[] = {
     {"instance",    (PyCFunction) rpmmi_Instance,      METH_NOARGS,
-       NULL },
+     "mi.instance() -- Return the number (db key) of the current header."},
     {"count",       (PyCFunction) rpmmi_Count,         METH_NOARGS,
 "Deprecated, use len(mi) instead.\n" },
     {"pattern",            (PyCFunction) rpmmi_Pattern,        METH_VARARGS|METH_KEYWORDS,
@@ -149,6 +151,9 @@ static PyNumberMethods rpmmi_as_number = {
        0, /* nb_add */
        0, /* nb_subtract */
        0, /* nb_multiply */
+#if PY_MAJOR_VERSION < 3
+       0, /* nb_divide */
+#endif
        0, /* nb_remainder */
        0, /* nb_divmod */
        0, /* nb_power */
@@ -159,11 +164,44 @@ static PyNumberMethods rpmmi_as_number = {
 };
 
 static char rpmmi_doc[] =
-"";
+  "rpm.mi match iterator object represents the result of a\n"
+  "    database query.\n"
+  "\n"
+  "Instances of the rpm.mi object provide access to headers that match\n"
+  "certain criteria. Typically, a primary index is accessed to find\n"
+  "a set of headers that contain a key, and each header is returned\n"
+  "serially.\n"
+  "\n"
+  "To obtain a rpm.mi object to query the database used by a transaction,\n"
+  "the ts.match(tag,key,len) method is used.\n"
+  "\n"
+  "Here's an example that prints the name of all installed packages:\n"
+  "    import rpm\n"
+  "    ts = rpm.TransactionSet()\n"
+  "    for h in ts.dbMatch():\n"
+  "        print h['name']\n"
+  "\n"
+  "Here's a more typical example that uses the Name index to retrieve\n"
+  "all installed kernel(s):\n"
+  "    import rpm\n"
+  "    ts = rpm.TransactionSet()\n"
+  "    mi = ts.dbMatch('name', 'kernel')\n"
+  "    for h in mi:\n"
+  "        print '%s-%s-%s' % (h['name'], h['version'], h['release'])\n"
+  "\n"
+  "Finally, here's an example that retrieves all packages whose name\n"
+  "matches the glob expression 'XFree*':\n"
+  "    import rpm\n"
+  "    ts = rpm.TransactionSet()\n"
+  "    mi = ts.dbMatch()\n"
+  "    mi.pattern('name', rpm.RPMMIRE_GLOB, 'XFree*')\n"
+  "    for h in mi:\n"
+  "        print '%s-%s-%s' % (h['name'], h['version'], h['release'])\n"
+;
 
 PyTypeObject rpmmi_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".mi",         /* tp_name */
+       "rpm.mi",                       /* tp_name */
        sizeof(rpmmiObject),            /* tp_size */
        0,                              /* tp_itemsize */
        (destructor) rpmmi_dealloc,     /* tp_dealloc */
index a4fe217ddad893c842a2575efed6bd6ed7688d0f..d1390e889d7de25bd580ba72a3e42d917967dc91 100644 (file)
@@ -8,14 +8,17 @@
 #include <rpm/rpmmacro.h>
 
 #include "header-py.h"
+#include "rpmarchive-py.h"
 #include "rpmds-py.h"
 #include "rpmfd-py.h"
 #include "rpmfi-py.h"
+#include "rpmfiles-py.h"
 #include "rpmkeyring-py.h"
 #include "rpmmi-py.h"
 #include "rpmii-py.h"
 #include "rpmps-py.h"
 #include "rpmmacro-py.h"
+#include "rpmstrpool-py.h"
 #include "rpmtd-py.h"
 #include "rpmte-py.h"
 #include "rpmts-py.h"
@@ -46,10 +49,18 @@ static PyObject * signalCaught(PyObject *self, PyObject *o)
 
 static PyObject * checkSignals(PyObject * self)
 {
-    rpmdbCheckSignals();
-    Py_RETURN_NONE;
+    return Py_BuildValue("i", rpmsqPoll());
+}
+
+static PyObject * blockSignals(PyObject * self, PyObject *arg)
+{
+    int block;
+    if (!PyArg_Parse(arg, "p", &block)) return NULL;
+
+    return Py_BuildValue("i", rpmsqBlock(block ? SIG_BLOCK : SIG_UNBLOCK));
 }
 
+
 static PyObject * setLogFile (PyObject * self, PyObject *arg)
 {
     FILE *fp;
@@ -131,56 +142,83 @@ static PyObject * reloadConfig(PyObject * self, PyObject * args, PyObject *kwds)
     return PyBool_FromLong(rc == 0);
 }
 
+static PyObject * setInterruptSafety(PyObject * self, PyObject * args, PyObject *kwds)
+{
+    int on = 1;
+    PyObject * obj;
+    char * kwlist[] = { "on", NULL };
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, &obj))
+       return NULL;
+    if (obj) {
+       on = PyObject_IsTrue(obj);
+    }
+    rpmsqSetInterruptSafety(on);
+    Py_RETURN_NONE;
+}
+
 static PyMethodDef rpmModuleMethods[] = {
     { "addMacro", (PyCFunction) rpmmacro_AddMacro, METH_VARARGS|METH_KEYWORDS,
-       NULL },
+      "rpmPushMacro(macro, value)\n"
+    },
     { "delMacro", (PyCFunction) rpmmacro_DelMacro, METH_VARARGS|METH_KEYWORDS,
-       NULL },
+      "rpmPopMacro(macro)\n"
+    },
     { "expandMacro", (PyCFunction) rpmmacro_ExpandMacro, METH_VARARGS|METH_KEYWORDS,
-       NULL },
+      "expandMacro(string, numeric=False) -- expands a string containing macros\n\n"
+      "Returns an int if numeric is True. 'Y' or 'y' returns 1,\n'N' or 'n' returns 0\nAn undefined macro returns 0."},
 
     { "archscore", (PyCFunction) archScore, METH_O,
-       NULL },
+      "archscore(archname) -- How well does an architecture fit on this machine\n\n"
+      "0 for non matching arch names\n1 for best arch\nhigher numbers for less fitting arches\n(e.g. 2 for \"i586\" on an i686 machine)" },
 
     { "signalCaught", (PyCFunction) signalCaught, METH_O, 
-       NULL },
+       "signalCaught(signo) -- Returns True if signal was caught." },
     { "checkSignals", (PyCFunction) checkSignals, METH_NOARGS,
-        NULL },
+      "checkSignals() -- Check for and exit on termination signals."},
+    { "blockSignals", (PyCFunction) blockSignals, METH_O,
+      "blocksignals(True/False) -- Block/unblock signals, refcounted."},
 
     { "mergeHeaderListFromFD", (PyCFunction) rpmMergeHeadersFromFD, METH_VARARGS|METH_KEYWORDS,
        NULL },
 
     { "log",           (PyCFunction) doLog, METH_VARARGS|METH_KEYWORDS,
-       NULL },
+       "log(level, msg) -- Write msg to log if level is selected to be logged.\n\n"
+    "level must be one of the RPMLOG_* constants."},
     { "setLogFile", (PyCFunction) setLogFile, METH_O,
-       NULL },
+       "setLogFile(file) -- set file to write log messages to or None." },
 
     { "versionCompare", (PyCFunction) versionCompare, METH_VARARGS|METH_KEYWORDS,
-       NULL },
+      "versionCompare(version0, version1) -- compares two version strings\n\n"
+      "Returns 1 if version0 > version1\n"
+      "Returns 0 if version0 == version1\n"
+      "Returns -1 if version0 < version1\n"},
     { "labelCompare", (PyCFunction) labelCompare, METH_VARARGS|METH_KEYWORDS,
-       NULL },
+      "labelCompare(version0, version1) -- as versionCompare()\n\n"
+      "but arguments are tuples of of strings for (epoch, version, release)"},
     { "setVerbosity", (PyCFunction) setVerbosity, METH_O,
-       NULL },
+      "setVerbosity(level) -- Set log level. See RPMLOG_* constants." },
     { "setEpochPromote", (PyCFunction) setEpochPromote, METH_O,
-       NULL },
+       "setEpochPromote(bool) -- Set if no epoch shall be treated as epoch 0" },
     { "setStats", (PyCFunction) setStats, METH_O,
-       NULL },
+      "setStats(bool) -- Set if timing stats are printed after a transaction."},
     { "reloadConfig", (PyCFunction) reloadConfig, METH_VARARGS|METH_KEYWORDS,
-       NULL },
-
+      "reloadConfig(target=None) -- Reload config from files.\n\n"
+      "Set all macros and settings accordingly."},
+
+    { "setInterruptSafety", (PyCFunction) setInterruptSafety,
+      METH_VARARGS|METH_KEYWORDS,
+      "setInterruptSafety(on=True) -- Set if various signals get intercepted.\n\n"
+      "By default, librpm will trap various unix signals (like SIGINT and\n"
+      "SIGTERM), in order to avoid process exit while locks are held or\n"
+      "a transaction is being performed.\n\n"
+      "If this is not the desired behaviour it's recommended to call this\n"
+      "once only at process startup because currently signal handlers will\n"
+      "not be retroactively applied if a database is open."
+    },
     { NULL }
 } ;
 
-/*
-* Force clean up of open iterators and dbs on exit.
-*/
-static void rpm_exithook(void)
-{
-   rpmdbCheckTerminate(1);
-}
-
-static char rpm__doc__[] =
-"";
+static char rpm__doc__[] = "";
 
 /*
  * Add rpm tag dictionaries to the module
@@ -205,7 +243,6 @@ static void addRpmTags(PyObject *module)
        Py_DECREF(pyname);
     }
     PyModule_AddObject(module, "tagnames", dict);
-    rpmtdFreeData(names);
     rpmtdFree(names);
 }
 
@@ -215,14 +252,18 @@ static void addRpmTags(PyObject *module)
 static int prepareInitModule(void)
 {
     if (PyType_Ready(&hdr_Type) < 0) return 0;
+    if (PyType_Ready(&rpmarchive_Type) < 0) return 0;
     if (PyType_Ready(&rpmds_Type) < 0) return 0;
     if (PyType_Ready(&rpmfd_Type) < 0) return 0;
     if (PyType_Ready(&rpmfi_Type) < 0) return 0;
+    if (PyType_Ready(&rpmfile_Type) < 0) return 0;
+    if (PyType_Ready(&rpmfiles_Type) < 0) return 0;
     if (PyType_Ready(&rpmKeyring_Type) < 0) return 0;
     if (PyType_Ready(&rpmmi_Type) < 0) return 0;
     if (PyType_Ready(&rpmii_Type) < 0) return 0;
     if (PyType_Ready(&rpmProblem_Type) < 0) return 0;
     if (PyType_Ready(&rpmPubkey_Type) < 0) return 0;
+    if (PyType_Ready(&rpmstrPool_Type) < 0) return 0;
 #if 0
     if (PyType_Ready(&rpmtd_Type) < 0) return 0;
 #endif
@@ -287,14 +328,9 @@ static int initModule(PyObject *m)
 {
     PyObject * d;
 
-    /* 
-     * treat error to register rpm cleanup hook as fatal, tracebacks
-     * can and will leave stale locks around if we can't clean up
-     */
-    if (Py_AtExit(rpm_exithook) == -1)
-        return 0;
-
-    rpmReadConfigFiles(NULL, NULL);
+    /* failure to initialize rpm (crypto and all) is rather fatal too... */
+    if (rpmReadConfigFiles(NULL, NULL) == -1)
+       return 0;
 
     d = PyModule_GetDict(m);
 
@@ -305,6 +341,9 @@ static int initModule(PyObject *m)
     Py_INCREF(&hdr_Type);
     PyModule_AddObject(m, "hdr", (PyObject *) &hdr_Type);
 
+    Py_INCREF(&rpmarchive_Type);
+    PyModule_AddObject(m, "archive", (PyObject *) &rpmarchive_Type);
+
     Py_INCREF(&rpmds_Type);
     PyModule_AddObject(m, "ds", (PyObject *) &rpmds_Type);
 
@@ -314,6 +353,12 @@ static int initModule(PyObject *m)
     Py_INCREF(&rpmfi_Type);
     PyModule_AddObject(m, "fi", (PyObject *) &rpmfi_Type);
 
+    Py_INCREF(&rpmfile_Type);
+    PyModule_AddObject(m, "file", (PyObject *) &rpmfile_Type);
+
+    Py_INCREF(&rpmfiles_Type);
+    PyModule_AddObject(m, "files", (PyObject *) &rpmfiles_Type);
+
     Py_INCREF(&rpmKeyring_Type);
     PyModule_AddObject(m, "keyring", (PyObject *) &rpmKeyring_Type);
 
@@ -329,6 +374,9 @@ static int initModule(PyObject *m)
     Py_INCREF(&rpmPubkey_Type);
     PyModule_AddObject(m, "pubkey", (PyObject *) &rpmPubkey_Type);
 
+    Py_INCREF(&rpmstrPool_Type);
+    PyModule_AddObject(m, "strpool", (PyObject *) &rpmstrPool_Type);
+
 #if 0
     Py_INCREF(&rpmtd_Type);
     PyModule_AddObject(m, "td", (PyObject *) &rpmtd_Type);
@@ -344,6 +392,9 @@ static int initModule(PyObject *m)
 
     PyModule_AddStringConstant(m, "__version__", RPMVERSION);
 
+    PyModule_AddObject(m, "header_magic",
+               PyBytes_FromStringAndSize((const char *)rpm_header_magic, 8));
+
 #define REGISTER_ENUM(val) PyModule_AddIntConstant(m, #val, val)
 
     REGISTER_ENUM(RPMTAG_NOT_FOUND);
@@ -362,12 +413,15 @@ static int initModule(PyObject *m)
 
     REGISTER_ENUM(RPMFILE_CONFIG);
     REGISTER_ENUM(RPMFILE_DOC);
+    REGISTER_ENUM(RPMFILE_ICON);
     REGISTER_ENUM(RPMFILE_MISSINGOK);
     REGISTER_ENUM(RPMFILE_NOREPLACE);
+    REGISTER_ENUM(RPMFILE_SPECFILE);
     REGISTER_ENUM(RPMFILE_GHOST);
     REGISTER_ENUM(RPMFILE_LICENSE);
     REGISTER_ENUM(RPMFILE_README);
     REGISTER_ENUM(RPMFILE_PUBKEY);
+    REGISTER_ENUM(RPMFILE_ARTIFACT);
 
     REGISTER_ENUM(RPMDEP_SENSE_REQUIRES);
     REGISTER_ENUM(RPMDEP_SENSE_CONFLICTS);
@@ -395,6 +449,7 @@ static int initModule(PyObject *m)
     REGISTER_ENUM(RPMSENSE_KEYRING);
     REGISTER_ENUM(RPMSENSE_STRONG);
     REGISTER_ENUM(RPMSENSE_CONFIG);
+    REGISTER_ENUM(RPMSENSE_MISSINGOK);
 
     REGISTER_ENUM(RPMTRANS_FLAG_TEST);
     REGISTER_ENUM(RPMTRANS_FLAG_BUILD_PROBS);
@@ -403,8 +458,10 @@ static int initModule(PyObject *m)
     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERS);
     REGISTER_ENUM(RPMTRANS_FLAG_NODOCS);
     REGISTER_ENUM(RPMTRANS_FLAG_ALLFILES);
+    REGISTER_ENUM(RPMTRANS_FLAG_NOPLUGINS);
     REGISTER_ENUM(RPMTRANS_FLAG_KEEPOBSOLETE);
     REGISTER_ENUM(RPMTRANS_FLAG_NOCONTEXTS);
+    REGISTER_ENUM(RPMTRANS_FLAG_NOCAPS);
     REGISTER_ENUM(RPMTRANS_FLAG_REPACKAGE);
     REGISTER_ENUM(RPMTRANS_FLAG_REVERSE);
     REGISTER_ENUM(RPMTRANS_FLAG_NOPRE);
@@ -415,11 +472,14 @@ static int initModule(PyObject *m)
     REGISTER_ENUM(RPMTRANS_FLAG_NOPREUN);
     REGISTER_ENUM(RPMTRANS_FLAG_NOPOSTUN);
     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPOSTUN);
+    REGISTER_ENUM(RPMTRANS_FLAG_NOPRETRANS);
+    REGISTER_ENUM(RPMTRANS_FLAG_NOPOSTTRANS);
     REGISTER_ENUM(RPMTRANS_FLAG_NOMD5);
     REGISTER_ENUM(RPMTRANS_FLAG_NOFILEDIGEST);
     REGISTER_ENUM(RPMTRANS_FLAG_NOSUGGEST);
     REGISTER_ENUM(RPMTRANS_FLAG_ADDINDEPS);
     REGISTER_ENUM(RPMTRANS_FLAG_NOCONFIGS);
+    REGISTER_ENUM(RPMTRANS_FLAG_DEPLOOPS);
 
     REGISTER_ENUM(RPMPROB_FILTER_IGNOREOS);
     REGISTER_ENUM(RPMPROB_FILTER_IGNOREARCH);
@@ -451,6 +511,7 @@ static int initModule(PyObject *m)
     REGISTER_ENUM(RPMCALLBACK_SCRIPT_START);
     REGISTER_ENUM(RPMCALLBACK_SCRIPT_STOP);
     REGISTER_ENUM(RPMCALLBACK_INST_STOP);
+    REGISTER_ENUM(RPMCALLBACK_ELEM_PROGRESS);
 
     REGISTER_ENUM(RPMPROB_BADARCH);
     REGISTER_ENUM(RPMPROB_BADOS);
@@ -486,10 +547,10 @@ static int initModule(PyObject *m)
     REGISTER_ENUM(RPMVSF_NOHDRCHK);
     REGISTER_ENUM(RPMVSF_NEEDPAYLOAD);
     REGISTER_ENUM(RPMVSF_NOSHA1HEADER);
-    REGISTER_ENUM(RPMVSF_NOMD5HEADER);
+    REGISTER_ENUM(RPMVSF_NOSHA256HEADER);
     REGISTER_ENUM(RPMVSF_NODSAHEADER);
     REGISTER_ENUM(RPMVSF_NORSAHEADER);
-    REGISTER_ENUM(RPMVSF_NOSHA1);
+    REGISTER_ENUM(RPMVSF_NOPAYLOAD);
     REGISTER_ENUM(RPMVSF_NOMD5);
     REGISTER_ENUM(RPMVSF_NODSA);
     REGISTER_ENUM(RPMVSF_NORSA);
@@ -521,6 +582,20 @@ static int initModule(PyObject *m)
     REGISTER_ENUM(HEADERCONV_COMPRESSFILELIST);
     REGISTER_ENUM(HEADERCONV_RETROFIT_V3);
 
+    REGISTER_ENUM(RPMVERIFY_NONE);
+    REGISTER_ENUM(RPMVERIFY_FILEDIGEST);
+    REGISTER_ENUM(RPMVERIFY_FILESIZE);
+    REGISTER_ENUM(RPMVERIFY_LINKTO);
+    REGISTER_ENUM(RPMVERIFY_USER);
+    REGISTER_ENUM(RPMVERIFY_GROUP);
+    REGISTER_ENUM(RPMVERIFY_MTIME);
+    REGISTER_ENUM(RPMVERIFY_MODE);
+    REGISTER_ENUM(RPMVERIFY_RDEV);
+    REGISTER_ENUM(RPMVERIFY_CAPS);
+    REGISTER_ENUM(RPMVERIFY_READLINKFAIL);
+    REGISTER_ENUM(RPMVERIFY_READFAIL);
+    REGISTER_ENUM(RPMVERIFY_LSTATFAIL);
+
     return 1;
 }
 
index 3ee9d4a9a8f0bb9d17bc879503e40f2e08f3fee2..bdc899a608122dd6a6dd2734b12f9751fc00bf31 100644 (file)
@@ -72,7 +72,7 @@ static void rpmprob_dealloc(rpmProblemObject *s)
 
 PyTypeObject rpmProblem_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".prob",               /* tp_name */
+       "rpm.prob",                     /* tp_name */
        sizeof(rpmProblemObject),               /* tp_basicsize */
        0,                              /* tp_itemsize */
        /* methods */
index a8289b5f62ac18ae3e41a8c70d8411ccd51cc50d..72465221d421048dd95a111a5205556af296252c 100644 (file)
@@ -5,33 +5,36 @@
 static char rpms__doc__[] =
 "";
 
+static int parseSignArgs(PyObject * args, PyObject *kwds,
+                       const char **path, struct rpmSignArgs *sargs)
+{
+    char * kwlist[] = { "path", "keyid", "hashalgo", NULL };
+
+    memset(sargs, 0, sizeof(*sargs));
+    return PyArg_ParseTupleAndKeywords(args, kwds, "s|si", kwlist,
+                                   path, &sargs->keyid, &sargs->hashalgo);
+}
+
 static PyObject * addSign(PyObject * self, PyObject * args, PyObject *kwds)
 {
     const char *path = NULL;
-    const char *passPhrase = NULL;
-    char * kwlist[] = { "path", "passPhrase", "keyid", "hashalgo", NULL };
-    struct rpmSignArgs sig, *sigp = NULL;
+    struct rpmSignArgs sargs;
 
-    memset(&sig, 0, sizeof(sig));
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss|si", kwlist,
-                               &path, &passPhrase, &sig.keyid, &sig.hashalgo))
+    if (parseSignArgs(args, kwds, &path, &sargs))
        return NULL;
 
-    if (sig.keyid || sig.hashalgo)
-       sigp = &sig;
-
-    return PyBool_FromLong(rpmPkgSign(path, sigp, passPhrase) == 0);
+    return PyBool_FromLong(rpmPkgSign(path, &sargs) == 0);
 }
 
 static PyObject * delSign(PyObject * self, PyObject * args, PyObject *kwds)
 {
     const char *path = NULL;
-    char * kwlist[] = { "path", NULL };
+    struct rpmSignArgs sargs;
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &path))
+    if (parseSignArgs(args, kwds, &path, &sargs))
        return NULL;
 
-    return PyBool_FromLong(rpmPkgDelSign(path) == 0);
+    return PyBool_FromLong(rpmPkgDelSign(path, &sargs) == 0);
 }
 
 /*
diff --git a/python/rpmstrpool-py.c b/python/rpmstrpool-py.c
new file mode 100644 (file)
index 0000000..356bd1d
--- /dev/null
@@ -0,0 +1,156 @@
+#include "rpmsystem-py.h"
+#include <rpm/rpmstrpool.h>
+#include "rpmstrpool-py.h"
+
+struct rpmstrPoolObject_s {
+    PyObject_HEAD
+    PyObject *md_dict;
+    rpmstrPool pool;
+};
+
+static char strpool_doc[] = "";
+
+static void strpool_dealloc(rpmstrPoolObject *s)
+{
+    s->pool = rpmstrPoolFree(s->pool);
+    Py_TYPE(s)->tp_free((PyObject *)s);
+}
+
+static PyObject *strpool_new(PyTypeObject *subtype,
+                            PyObject *args, PyObject *kwds)
+{
+    return rpmstrPool_Wrap(subtype, NULL);
+}
+
+static PyObject *strpool_str2id(rpmstrPoolObject *s,
+                               PyObject *args, PyObject *kwds)
+{
+    char * kwlist[] = { "str", "create", NULL };
+    const char *str = NULL;
+    int create = 1;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|i", kwlist, &str, &create))
+       return NULL;
+
+    return PyLong_FromLong(rpmstrPoolId(s->pool, str, create));
+}
+
+static PyObject *strpool_id2str(rpmstrPoolObject *s, PyObject *item)
+{
+    PyObject *ret = NULL;
+    rpmsid id = 0;
+
+    if (PyArg_Parse(item, "I", &id)) {
+       const char *str = rpmstrPoolStr(s->pool, id);
+
+       if (str)
+           ret = PyBytes_FromString(str);
+       else 
+           PyErr_SetObject(PyExc_KeyError, item);
+    }
+    return ret;
+}
+
+static PyObject *strpool_freeze(rpmstrPoolObject *s,
+                               PyObject *args, PyObject *kwds)
+{
+    char * kwlist[] = { "keephash", NULL };
+    int keephash = 0;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i", kwlist, &keephash))
+       return NULL;
+
+    rpmstrPoolFreeze(s->pool, keephash);
+    Py_RETURN_NONE;
+}
+
+static PyObject *strpool_unfreeze(rpmstrPoolObject *s)
+{
+    rpmstrPoolUnfreeze(s->pool);
+    Py_RETURN_NONE;
+}
+
+static Py_ssize_t strpool_length(rpmstrPoolObject *s)
+{
+    return rpmstrPoolNumStr(s->pool);
+}
+
+static struct PyMethodDef strpool_methods[] = {
+    { "str2id",        (PyCFunction)strpool_str2id,    METH_VARARGS|METH_KEYWORDS,
+       NULL },
+    { "id2str", (PyCFunction)strpool_id2str,   METH_O,
+       NULL },
+    { "freeze", (PyCFunction)strpool_freeze,   METH_VARARGS|METH_KEYWORDS,
+       NULL },
+    { "unfreeze", (PyCFunction)strpool_unfreeze, METH_NOARGS,
+       NULL },
+    { NULL,    NULL }
+};
+
+static PyMappingMethods strpool_as_mapping = {
+    (lenfunc) strpool_length,          /* mp_length */
+    (binaryfunc) strpool_id2str,       /* mp_subscript */
+    (objobjargproc) 0,                 /* mp_ass_subscript */
+};
+
+PyTypeObject rpmstrPool_Type = {
+       PyVarObject_HEAD_INIT(&PyType_Type, 0)
+       "rpm.strpool",                  /* tp_name */
+       sizeof(rpmstrPoolObject),       /* tp_size */
+       0,                              /* tp_itemsize */
+       (destructor) strpool_dealloc,   /* tp_dealloc */
+       0,                              /* tp_print */
+       (getattrfunc)0,                 /* tp_getattr */
+       0,                              /* tp_setattr */
+       0,                              /* tp_compare */
+       0,                              /* tp_repr */
+       0,                              /* tp_as_number */
+       0,                              /* tp_as_sequence */
+       &strpool_as_mapping,            /* tp_as_mapping */
+       0,                              /* tp_hash */
+       0,                              /* tp_call */
+       0,                              /* tp_str */
+       PyObject_GenericGetAttr,        /* tp_getattro */
+       PyObject_GenericSetAttr,        /* tp_setattro */
+       0,                              /* tp_as_buffer */
+       Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
+       strpool_doc,                    /* tp_doc */
+       0,                              /* tp_traverse */
+       0,                              /* tp_clear */
+       0,                              /* tp_richcompare */
+       0,                              /* tp_weaklistoffset */
+       0,                              /* tp_iter */
+       0,                              /* tp_iternext */
+       strpool_methods,                /* tp_methods */
+       0,                              /* tp_members */
+       0,                              /* tp_getset */
+       0,                              /* tp_base */
+       0,                              /* tp_dict */
+       0,                              /* tp_descr_get */
+       0,                              /* tp_descr_set */
+       0,                              /* tp_dictoffset */
+       0,                              /* tp_init */
+       0,                              /* tp_alloc */
+       strpool_new,                    /* tp_new */
+       0,                              /* tp_free */
+       0,                              /* tp_is_gc */
+};
+
+PyObject * rpmstrPool_Wrap(PyTypeObject *subtype, rpmstrPool pool)
+{
+    rpmstrPoolObject *s = (rpmstrPoolObject *)subtype->tp_alloc(subtype, 0);
+    if (s == NULL) return NULL;
+
+    /* permit referencing a pre-existing pool as well */
+    s->pool = (pool != NULL) ? rpmstrPoolLink(pool) : rpmstrPoolCreate();
+
+    return (PyObject *) s;
+}
+
+int poolFromPyObject(PyObject *item, rpmstrPool *pool)
+{
+    rpmstrPoolObject *p = NULL;
+    if (PyArg_Parse(item, "O!", &rpmstrPool_Type, &p))
+       *pool = p->pool;
+    return (p != NULL);
+}
diff --git a/python/rpmstrpool-py.h b/python/rpmstrpool-py.h
new file mode 100644 (file)
index 0000000..b91c8f6
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef H_RPMSTRPOOL_PY
+#define H_RPMSTRPOOL_PY
+
+#include <rpm/rpmtypes.h>
+
+typedef struct rpmstrPoolObject_s rpmstrPoolObject;
+
+extern PyTypeObject rpmstrPool_Type;
+
+PyObject * rpmstrPool_Wrap(PyTypeObject *subtype, rpmstrPool pool);
+
+int poolFromPyObject(PyObject *item, rpmstrPool *pool);
+
+#endif
index 30f74561e26bcaf08d14c0ac69e3b85d138a462c..c8423e3dc30159b4280bdb90b28a988b36686f56 100644 (file)
@@ -5,11 +5,10 @@
 #include <sys/types.h>
 #endif
 
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
 #include <structmember.h>
 
-#include "config.h"
-
 #if ((PY_MAJOR_VERSION << 8) | (PY_MINOR_VERSION << 0)) < 0x0205
 typedef ssize_t Py_ssize_t;
 typedef Py_ssize_t (*lenfunc)(PyObject *);
index ed3a1455a61b7301c605654c7c6c146fc593127c..247c7502ae08107a7dc0cfa44635264b45c12554 100644 (file)
@@ -11,7 +11,7 @@
 /*
  * Convert single tag data item to python object of suitable type
  */
-static PyObject * rpmtd_ItemAsPyobj(rpmtd td, rpmTagClass tclass)
+PyObject * rpmtd_ItemAsPyobj(rpmtd td, rpmTagClass tclass)
 {
     PyObject *res = NULL;
 
@@ -61,161 +61,3 @@ PyObject *rpmtd_AsPyobj(rpmtd td)
     }
     return res;
 }
-
-#if 0
-struct rpmtdObject_s {
-    PyObject_HEAD
-    PyObject *md_dict;
-    struct rpmtd_s td;
-};
-
-/* string format should never fail but do regular repr just in case it does */
-static PyObject *rpmtd_str(rpmtdObject *s)
-{
-    PyObject *res = NULL;
-    char *str = rpmtdFormat(&(s->td), RPMTD_FORMAT_STRING, NULL);
-    if (str) {
-        res = PyBytes_FromString(str);
-       free(str);
-    } else {
-       res = PyObject_Repr((PyObject *)s);
-    }
-    return res;
-}
-
-static PyObject *rpmtd_iternext(rpmtdObject *s)
-{
-    PyObject *next = NULL;
-
-    if (rpmtdNext(&(s->td)) >= 0) {
-        Py_INCREF(s);
-        next = (PyObject*) s;
-    }
-    return next;
-}
-
-static PyObject *rpmtd_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
-{
-    rpmtdObject *s = NULL;
-    Header h = NULL;
-    rpmTagVal tag;
-    int raw = 0;
-    int noext = 0;
-    headerGetFlags flags = (HEADERGET_EXT | HEADERGET_ALLOC);
-    char *kwlist[] = { "header", "tag", "raw", "noext", NULL };
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&O&|ii", kwlist,
-                       hdrFromPyObject, &h, tagNumFromPyObject, &tag,
-                       &raw, &noext))
-       return NULL;
-
-    if (raw) {
-       flags |= HEADERGET_RAW;
-       noext = 1; /* extensions with raw dont make sense */
-    }
-    if (noext) flags &= ~HEADERGET_EXT;
-
-    if ((s = (rpmtdObject *)subtype->tp_alloc(subtype, 0)) == NULL)
-       return NULL;
-
-    headerGet(h, tag, &(s->td), flags);
-
-    return (PyObject *) s;
-}
-
-static void rpmtd_dealloc(rpmtdObject * s)
-{
-    rpmtdFreeData(&(s->td));
-    Py_TYPE(s)->tp_free((PyObject *)s);
-}
-
-static int rpmtd_length(rpmtdObject *s)
-{
-    return rpmtdCount(&(s->td));
-}
-
-static PyMappingMethods rpmtd_as_mapping = {
-    (lenfunc) rpmtd_length,             /* mp_length */
-};
-
-static PyMemberDef rpmtd_members[] = {
-    { "type", T_INT, offsetof(rpmtdObject, td.type), READONLY, NULL },
-    { NULL }
-};
-
-static PyObject *rpmtd_get_tag(rpmtdObject *s, void *closure)
-{
-    return Py_BuildValue("i", rpmtdTag(&(s->td)));
-}
-
-static int rpmtd_set_tag(rpmtdObject *s, PyObject *value, void *closure)
-{
-    rpmTagVal tag;
-    if (!tagNumFromPyObject(value, &tag)) return -1;
-
-    if (!rpmtdSetTag(&(s->td), tag)) {
-       PyErr_SetString(PyExc_ValueError, "incompatible tag for data");
-       return -1;
-    }
-    return 0;
-}
-
-static PyGetSetDef rpmtd_getseters[] = {
-    { "tag", (getter)rpmtd_get_tag, (setter)rpmtd_set_tag, NULL },
-    { NULL }
-};
-
-PyTypeObject rpmtd_Type = {
-       PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".td",         /* tp_name */
-       sizeof(rpmtdObject),            /* tp_size */
-       0,                              /* tp_itemsize */
-       (destructor) rpmtd_dealloc,     /* tp_dealloc */
-       0,                              /* tp_print */
-       (getattrfunc)0,                 /* tp_getattr */
-       0,                              /* tp_setattr */
-       0,                              /* tp_compare */
-       0,                              /* tp_repr */
-       0,                              /* tp_as_number */
-       0,                              /* tp_as_sequence */
-       &rpmtd_as_mapping,              /* tp_as_mapping */
-       0,                              /* tp_hash */
-       0,                              /* tp_call */
-       (reprfunc)rpmtd_str,            /* tp_str */
-       PyObject_GenericGetAttr,        /* tp_getattro */
-       PyObject_GenericSetAttr,        /* tp_setattro */
-       0,                              /* tp_as_buffer */
-       Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
-       0,                              /* tp_doc */
-       0,                              /* tp_traverse */
-       0,                              /* tp_clear */
-       0,                              /* tp_richcompare */
-       0,                              /* tp_weaklistoffset */
-       PyObject_SelfIter,              /* tp_iter */
-       (iternextfunc)rpmtd_iternext,   /* tp_iternext */
-       0,                              /* tp_methods */
-       rpmtd_members,                  /* tp_members */
-       rpmtd_getseters,                /* tp_getset */
-       0,                              /* tp_base */
-       0,                              /* tp_dict */
-       0,                              /* tp_descr_get */
-       0,                              /* tp_descr_set */
-       0,                              /* tp_dictoffset */
-       0,                              /* tp_init */
-       0,                              /* tp_alloc */
-       rpmtd_new,                      /* tp_new */
-       0,                              /* tp_free */
-       0,                              /* tp_is_gc */
-};
-
-int rpmtdFromPyObject(PyObject *obj, rpmtd *td)
-{
-    if (rpmtdObject_Check(obj)) {
-       *td = &(((rpmtdObject *)obj)->td);
-       return 1;
-    } else {
-       PyErr_SetString(PyExc_TypeError, PYTHON_MODULENAME".td type expected");
-       return 0;
-    }
-}
-#endif
index 4c95e89b41c61756c3a0dfd950ad299396748c99..c7ac4091c643b4b1b87414d457b749ba42a265d9 100644 (file)
@@ -7,6 +7,7 @@ extern PyTypeObject rpmtd_Type;
 
 #define rpmtdObject_Check(v)   ((v)->ob_type == &rpmtd_Type)
 
+PyObject * rpmtd_ItemAsPyobj(rpmtd td, rpmTagClass tclass);
 PyObject * rpmtd_AsPyobj(rpmtd td);
 
 int rpmtdFromPyObject(PyObject *obj, rpmtd *td);
index 6b338260fa17df73eeeeff4ed5ad722cbee6b92c..6936e757e11975114d865ccdec6771c5eb5c13ed 100644 (file)
@@ -3,6 +3,7 @@
 #include "header-py.h" /* XXX tagNumFromPyObject */
 #include "rpmds-py.h"
 #include "rpmfi-py.h"
+#include "rpmfiles-py.h"
 #include "rpmte-py.h"
 #include "rpmps-py.h"
 
@@ -35,8 +36,9 @@
  * - te.Key()  Return the associated opaque key, i.e. 2nd arg ts.addInstall().
  * - te.DS(tag)        Return package dependency set.
  * @param tag  'Providename', 'Requirename', 'Obsoletename', 'Conflictname'
- * - te.FI(tag)        Return package file info set.
+ * - te.FI(tag)        Return package file info set iterator (deprecated).
  * @param tag  'Basenames'
+ * - te.Files()        Return package file info set.
  */
 
 struct rpmteObject_s {
@@ -182,6 +184,8 @@ rpmte_FI(rpmteObject * s, PyObject * args, PyObject * kwds)
 {
     rpmfi fi;
 
+    DEPRECATED_METHOD("use .Files() instead");
+
     fi = rpmteFI(s->te);
     if (fi == NULL) {
        Py_RETURN_NONE;
@@ -189,57 +193,60 @@ rpmte_FI(rpmteObject * s, PyObject * args, PyObject * kwds)
     return rpmfi_Wrap(&rpmfi_Type, rpmfiLink(fi));
 }
 
+static PyObject *
+rpmte_Files(rpmteObject * s, PyObject * args, PyObject * kwds)
+{
+    rpmfiles files = rpmteFiles(s->te);
+    if (files == NULL) {
+       Py_RETURN_NONE;
+    }
+    return rpmfiles_Wrap(&rpmfiles_Type, files);
+}
 static struct PyMethodDef rpmte_methods[] = {
     {"Type",   (PyCFunction)rpmte_TEType,      METH_NOARGS,
-"te.Type() -> Type\n\
-- Return element type ("PYTHON_MODULENAME".TR_ADDED | "PYTHON_MODULENAME".TR_REMOVED).\n" },
+     "te.Type() -- Return element type (rpm.TR_ADDED | rpm.TR_REMOVED).\n" },
     {"N",      (PyCFunction)rpmte_N,           METH_NOARGS,
-"te.N() -> N\n\
-- Return element name.\n" },
+     "te.N() -- Return element name.\n" },
     {"E",      (PyCFunction)rpmte_E,           METH_NOARGS,
-"te.E() -> E\n\
-- Return element epoch.\n" },
+     "te.E() -- Return element epoch.\n" },
     {"V",      (PyCFunction)rpmte_V,           METH_NOARGS,
-"te.V() -> V\n\
-- Return element version.\n" },
+     "te.V() -- Return element version.\n" },
     {"R",      (PyCFunction)rpmte_R,           METH_NOARGS,
-"te.R() -> R\n\
-- Return element release.\n" },
+     "te.R() -- Return element release.\n" },
     {"A",      (PyCFunction)rpmte_A,           METH_NOARGS,
-"te.A() -> A\n\
-- Return element arch.\n" },
+     "te.A() -- Return element arch.\n" },
     {"O",      (PyCFunction)rpmte_O,           METH_NOARGS,
-"te.O() -> O\n\
-- Return element os.\n" },
+     "te.O() -- Return element os.\n" },
     {"NEVR",   (PyCFunction)rpmte_NEVR,        METH_NOARGS,
-"te.NEVR() -> NEVR\n\
-- Return element name-[epoch:]version-release.\n" },
+     "te.NEVR() -- Return element name-[epoch:]version-release.\n" },
     {"NEVRA",  (PyCFunction)rpmte_NEVRA,       METH_NOARGS,
-"te.NEVRA() -> NEVRA\n\
-- Return element name-[epoch:]version-release.arch\n" },
+     "te.NEVRA() -- Return element name-[epoch:]version-release.arch\n" },
     {"Color",(PyCFunction)rpmte_Color,         METH_NOARGS,
-       NULL},
+     "te.Color() -- Return package color bits."},
     {"PkgFileSize",(PyCFunction)rpmte_PkgFileSize,     METH_NOARGS,
-       NULL},
+     "te.PkgFileSize() -- Return no. of bytes in package file (approx)."},
     {"Parent", (PyCFunction)rpmte_Parent,      METH_NOARGS,
-       NULL},
+     "te.Parent() -- Return the parent element index."},
     {"Problems",(PyCFunction)rpmte_Problems,   METH_NOARGS,
-       NULL},
+     "te.Problems() -- Return problems associated with this element."},
 /*    {"DependsOnKey",(PyCFunction)rpmte_DependsOnKey, METH_NOARGS,
       NULL}, */
     {"DBOffset",(PyCFunction)rpmte_DBOffset,   METH_NOARGS,
-       NULL},
+     "te.DBOffset() -- Return the Package's database instance number.\n\nTR_REMOVED only"},
     {"Failed", (PyCFunction)rpmte_Failed,      METH_NOARGS,
-       NULL},
+     "te.Failed() -- Return if there are any related errors."},
     {"Key",    (PyCFunction)rpmte_Key,         METH_NOARGS,
-       NULL},
+     "te.Key() -- Return the associated opaque key aka user data\n\
+       as passed e.g. as data arg ts.addInstall()"},
     {"DS",     (PyCFunction)rpmte_DS,          METH_VARARGS|METH_KEYWORDS,
-"te.DS(TagN) -> DS\n\
-- Return the TagN dependency set (or None). TagN is one of\n\
-       'Providename', 'Requirename', 'Obsoletename', 'Conflictname'\n" },
+"te.DS(TagN) -- Return the TagN dependency set (or None).\n\
+       TagN is one of 'Providename', 'Requirename', 'Obsoletename',\n\
+       'Conflictname', 'Triggername', 'Recommendname', 'Suggestname',\n\
+       'Supplementname', 'Enhancename'" },
     {"FI",     (PyCFunction)rpmte_FI,          METH_VARARGS|METH_KEYWORDS,
-"te.FI(TagN) -> FI\n\
-- Return the TagN dependency set (or None). TagN must be 'Basenames'.\n" },
+"te.FI(TagN) -- Return file info iterator of element.\n\n DEPRECATED! Use .Files() instead.\n" },
+    {"Files",  (PyCFunction)rpmte_Files,       METH_NOARGS,
+"te.Files() -- Return file info set of element.\n" },
     {NULL,             NULL}           /* sentinel */
 };
 
@@ -250,7 +257,7 @@ static char rpmte_doc[] =
 
 PyTypeObject rpmte_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".te",         /* tp_name */
+       "rpm.te",                       /* tp_name */
        sizeof(rpmteObject),            /* tp_size */
        0,                              /* tp_itemsize */
        (destructor)0,                  /* tp_dealloc */
index 1072f354ec036cbabebe8d940cf6ca15ebd05d4c..d56a09c22e7470d9fd64813405ab703c65322bc3 100644 (file)
  * @return     None
  *
  * - ts.setFlags(transFlags) Set transaction set flags.
- * @param transFlags - bit(s) to controll transaction operations. The
+ * @param transFlags - bit(s) to control transaction operations. The
  *             following values can be logically OR'ed together:
  *     - rpm.RPMTRANS_FLAG_TEST - test mode, do not modify the RPM
  *             database, change any files, or run any package scripts
  *     - rpm.RPMTRANS_FLAG_BUILD_PROBS - only build a list of
  *             problems encountered when attempting to run this transaction
  *             set
- *     - rpm.RPMTRANS_FLAG_NOSCRIPTS - do not execute package scripts
  *     - rpm.RPMTRANS_FLAG_JUSTDB - only make changes to the rpm
  *             database, do not modify files.
+ *     - rpm.RPMTRANS_FLAG_NOSCRIPTS - do not execute package scripts
  *     - rpm.RPMTRANS_FLAG_NOTRIGGERS - do not run trigger scripts
+ *     - rpm.RPMTRANS_FLAG_NO* - disable specific scripts and triggers
  *     - rpm.RPMTRANS_FLAG_NODOCS - do not install files marked as %doc
+ *     - rpm.RPMTRANS_FLAG_NOPLUGINS - do not run plugins
+ *     - rpm.RPMTRANS_FLAG_NOFILEDIGEST - disable checking checksums
  *     - rpm.RPMTRANS_FLAG_ALLFILES - create all files, even if a
  *             file is marked %config(missingok) and an upgrade is
  *             being performed.
- *     - rpm.RPMTRANS_FLAG_KEEPOBSOLETE - do not remove obsoleted
- *             packages.
+ *     - rpm.RPMTRANS_FLAG_NOCONFIGS - skip config files
+ *     - rpm.RPMTRANS_FLAG_DEPLOOPS - enable debugging for dependency loops
  * @return     previous transFlags
  *
  * - ts.setProbFilter(ignoreSet) Set transaction set problem filter.
@@ -164,7 +167,6 @@ static void die(PyObject *cb)
     }
     fprintf(stderr, "FATAL ERROR: python callback %s failed, aborting!\n", 
                      pyfn ? pyfn : "???");
-    rpmdbCheckTerminate(1);
     exit(EXIT_FAILURE);
 }
 
@@ -187,6 +189,24 @@ rpmts_AddInstall(rpmtsObject * s, PyObject * args)
     return PyBool_FromLong((rc == 0));
 }
 
+static PyObject *
+rpmts_AddReinstall(rpmtsObject * s, PyObject * args)
+{
+    Header h = NULL;
+    PyObject * key;
+    int rc;
+
+    if (!PyArg_ParseTuple(args, "O&O:AddReinstall", 
+                         hdrFromPyObject, &h, &key))
+       return NULL;
+
+    rc = rpmtsAddReinstallElement(s->ts, h, key);
+    if (key && rc == 0) {
+       PyList_Append(s->keyList, key);
+    }
+    return PyBool_FromLong((rc == 0));
+}
+
 static PyObject *
 rpmts_AddErase(rpmtsObject * s, PyObject * args)
 {
@@ -363,7 +383,6 @@ rpmts_HdrFromFdno(rpmtsObject * s, PyObject *arg)
 
     if (rpmrc == RPMRC_OK) {
        ho = hdr_Wrap(&hdr_Type, h);
-       h = headerFree(h); /* ref held by python object */
     } else {
        Py_INCREF(Py_None);
        ho = Py_None;
@@ -440,7 +459,7 @@ static PyObject *rpmts_setKeyring(rpmtsObject *s, PyObject *arg)
     if (arg == Py_None || rpmKeyringFromPyObject(arg, &keyring)) {
        return PyBool_FromLong(rpmtsSetKeyring(s->ts, keyring) == 0);
     } else {
-       PyErr_SetString(PyExc_TypeError, PYTHON_MODULENAME".keyring or None expected");
+       PyErr_SetString(PyExc_TypeError, "rpm.keyring or None expected");
        return NULL;
     }
 }
@@ -609,6 +628,10 @@ rpmts_Match(rpmtsObject * s, PyObject * args, PyObject * kwds)
            lkey = PyInt_AsLong(Key);
            key = (char *)&lkey;
            len = sizeof(lkey);
+       } else if (PyLong_Check(Key)) {
+           lkey = PyLong_AsLong(Key);
+           key = (char *)&lkey;
+           len = sizeof(lkey);
        } else if (utf8FromPyObject(Key, &str)) {
            key = PyBytes_AsString(str);
            len = PyBytes_Size(str);
@@ -669,13 +692,55 @@ exit:
 
 static struct PyMethodDef rpmts_methods[] = {
  {"addInstall",        (PyCFunction) rpmts_AddInstall, METH_VARARGS,
-       NULL },
+  "ts.addInstall(hdr, data, mode) --  Add transaction element(s)\n"
+  "representing an installation or update of a package.\n\n"
+  "Args:\n"
+  "  hdr : the header to be added\n"
+  "  data : user data that will be passed to the transaction callback\n\t\tduring transaction execution\n"
+  "  mode : optional argument that specifies if this package should be\n\t\tinstalled ('i'), upgraded ('u')"},
+ {"addReinstall",      (PyCFunction) rpmts_AddReinstall,       METH_VARARGS,
+  "ts.addReinstall(hdr, data) -- Adds transaction elements\nrepresenting a reinstall of an already installed package.\n\nSee addInstall for details."},
  {"addErase",  (PyCFunction) rpmts_AddErase,   METH_VARARGS|METH_KEYWORDS,
-       NULL },
+  "addErase(name) -- Add a transaction element representing an erase\nof an installed package.\n\n"
+  "  name: the package name to be erased"},
  {"check",     (PyCFunction) rpmts_Check,      METH_VARARGS|METH_KEYWORDS,
-       NULL },
+  "ts.check( )-- Perform a dependency check on the transaction set.\n"
+  "            After headers have been added to a transaction set,\n"
+  "            a dependencycheck can be performed to make sure that\n"
+  "            all package dependencies are satisfied.\n"
+  "Return      None If there are no unresolved dependencies\n"
+  "            Otherwise a list of complex tuples is returned,\n"
+  "            one tuple per unresolved dependency, with\n"
+  "The format of the dependency tuple is:\n"
+  "    ((packageName, packageVersion, packageRelease),\n"
+  "     (reqName, reqVersion),\n"
+  "     needsFlags,\n"
+  "     suggestedPackage,\n"
+  "     sense)\n"
+  "  packageName, packageVersion, packageRelease are the name,\n"
+  "    version, and release of the package that has the unresolved\n"
+  "    dependency or conflict.\n"
+  "  The reqName and reqVersion are the name and version of the\n"
+  "    requirement or conflict.\n"
+  "  The needsFlags is a bitfield that describes the versioned\n"
+  "    nature of a requirement or conflict.  The constants\n"
+  "    rpm.RPMSENSE_LESS, rpm.RPMSENSE_GREATER, and\n"
+  "    rpm.RPMSENSE_EQUAL can be logical ANDed with the needsFlags\n"
+  "    to get versioned dependency information.\n"
+  "  suggestedPackage is a tuple if the dependency check was aware\n"
+  "    of a package that solves this dependency problem when the\n"
+  "    dependency check was run.  Packages that are added to the\n"
+  "    transaction set as \"available\" are examined during the\n"
+  "    dependency check as possible dependency solvers. The tuple\n"
+  "    contains two values, (header, suggestedName).  These are set to\n"
+  "    the header of the suggested package and its name, respectively.\n"
+  "    If there is no known package to solve the dependency problem,\n"
+  "    suggestedPackage is None.\n"
+  "  The constants rpm.RPMDEP_SENSE_CONFLICTS and\n"
+  "    rpm.RPMDEP_SENSE_REQUIRES are set to show a dependency as a\n"
+  "    requirement or a conflict.\n"},
  {"order",     (PyCFunction) rpmts_Order,      METH_NOARGS,
-       NULL },
+  "ts.order() Do a topological sort of added element relations." },
  {"problems",  (PyCFunction) rpmts_Problems,   METH_NOARGS,
 "ts.problems() -> ps\n\
 - Return current problem set.\n" },
@@ -684,18 +749,18 @@ static struct PyMethodDef rpmts_methods[] = {
 - Run a transaction set, returning list of problems found.\n\
   Note: The callback may not be None.\n" },
  {"clean",     (PyCFunction) rpmts_Clean,      METH_NOARGS,
-       NULL },
+  "ts.clean()-- Free memory needed only for dependency checks\nand ordering. Should not be needed in normal operation." },
  {"clear",     (PyCFunction) rpmts_Clear,      METH_NOARGS,
 "ts.clear() -> None\n\
 Remove all elements from the transaction set\n" },
  {"openDB",    (PyCFunction) rpmts_OpenDB,     METH_NOARGS,
-"ts.openDB() -> None\n\
-- Open the default transaction rpmdb.\n\
-  Note: The transaction rpmdb is lazily opened, so ts.openDB() is seldom needed.\n" },
+"ts.openDB() -> None -- Open the default transaction rpmdb.\n\n\
+  Note: The transaction rpmdb is lazily opened,\n  so ts.openDB() is seldom needed.\n" },
  {"closeDB",   (PyCFunction) rpmts_CloseDB,    METH_NOARGS,
 "ts.closeDB() -> None\n\
 - Close the default transaction rpmdb.\n\
-  Note: ts.closeDB() disables lazy opens, and should hardly ever be used.\n" },
+  Note: ts.closeDB() disables lazy opens,\n\
+  and should hardly ever be used.\n" },
  {"initDB",    (PyCFunction) rpmts_InitDB,     METH_NOARGS,
 "ts.initDB() -> None\n\
 - Initialize the default transaction rpmdb.\n\
@@ -710,15 +775,21 @@ Remove all elements from the transaction set\n" },
 "ts.hdrFromFdno(fdno) -> hdr\n\
 - Read a package header from a file descriptor.\n" },
  {"hdrCheck",  (PyCFunction) rpmts_HdrCheck,   METH_O,
-       NULL },
+  "ts.hdrCheck(hdrblob) -- Check header consistency,\nperforming headerGetEntry() the hard way.\n\n"
+  "Sanity checks on the header are performed while looking for a\n"
+  "header-only digest or signature to verify the blob. If found,\n"
+  "the digest or signature is verified.\n\n"
+  "\thdrblob : unloaded header blob\n"
+  "Return tuple (int status, message string)"},
  {"pgpPrtPkts",        (PyCFunction) rpmts_PgpPrtPkts, METH_VARARGS|METH_KEYWORDS,
-       NULL },
+  "pgpPrtPkts(octets) -- Print/parse a OpenPGP packet(s).\n\nReturn 0 on success." },
  {"pgpImportPubkey",   (PyCFunction) rpmts_PgpImportPubkey,    METH_VARARGS|METH_KEYWORDS,
-       NULL },
+  "pgpImportPubkey(pubkey) -- Import public key packet." },
  {"getKeyring",        (PyCFunction) rpmts_getKeyring, METH_VARARGS|METH_KEYWORDS, 
-       NULL },
+  "ts.getKeyring(autoload=False) -- Return key ring object." },
  {"setKeyring",        (PyCFunction) rpmts_setKeyring, METH_O, 
-       NULL },
+  "ts.setKeyring(keyring) -- Set key ring used for checking signatures\n\n"
+  "Pass None for an empty key ring." },
  {"dbMatch",   (PyCFunction) rpmts_Match,      METH_VARARGS|METH_KEYWORDS,
 "ts.dbMatch([TagN, [key]]) -> mi\n\
 - Create a match iterator for the default transaction rpmdb.\n" },
@@ -856,13 +927,38 @@ static PyObject *rpmts_get_vsflags(rpmtsObject *s, void *closure)
 }
 
 static char rpmts_doc[] =
-"";
+  "A python rpm.ts object represents an RPM transaction set.\n"
+  "\n"
+  "The transaction set is the workhorse of RPM. It performs the\n"
+  "installation and upgrade of packages. The rpm.ts object is\n"
+  "instantiated by the TransactionSet function in the rpm module.\n"
+  "\n"
+  "The TransactionSet function takes two optional arguments. The first\n"
+  "argument is the root path. The second is the verify signature disable\n"
+  "flags, a set of the following bits:\n"
+  "\n"
+  "-    rpm.RPMVSF_NOHDRCHK    if set, don't check rpmdb headers\n"
+  "-    rpm.RPMVSF_NEEDPAYLOAD if not set, check header+payload\n"
+  "                            (if possible)\n"
+  "-    rpm.RPMVSF_NOSHA1HEADER        if set, don't check header SHA1 digest\n"
+  "-    rpm.RPMVSF_NODSAHEADER if set, don't check header DSA signature\n"
+  "-    rpm.RPMVSF_NOMD5       if set, don't check header+payload MD5 digest\n"
+  "-    rpm.RPMVSF_NODSA       if set, don't check header+payload DSA signature\n"
+  "-    rpm.RPMVSF_NORSA       if set, don't check header+payload RSA signature\n"
+  "\n"
+  "For convenience, there are the following masks:\n"
+  "-    rpm._RPMVSF_NODIGESTS  if set, don't check digest(s).\n"
+  "-    rpm._RPMVSF_NOSIGNATURES       if set, don't check signature(s).\n\n"
+  "The transaction set offers an read only iterable interface for the\ntransaction elements added by the .addInstall(), .addErase() and\n.addReinstall() methods.";
 
 static PyGetSetDef rpmts_getseters[] = {
        /* only provide a setter until we have rpmfd wrappings */
-       {"scriptFd",    NULL,   (setter)rpmts_set_scriptFd, NULL },
-       {"tid",         (getter)rpmts_get_tid, NULL, NULL },
-       {"rootDir",     (getter)rpmts_get_rootDir, NULL, NULL },
+       {"scriptFd",    NULL,   (setter)rpmts_set_scriptFd,
+        "write only, file descriptor the output of script gets written to." },
+       {"tid",         (getter)rpmts_get_tid, NULL,
+        "read only, current transaction id, i.e. transaction time stamp."},
+       {"rootDir",     (getter)rpmts_get_rootDir, NULL,
+        "read only, directory rpm treats as root of the file system." },
        {"_color",      (getter)rpmts_get_color, (setter)rpmts_set_color, NULL},
        {"_prefcolor",  (getter)rpmts_get_prefcolor, (setter)rpmts_set_prefcolor, NULL},
        {"_flags",      (getter)rpmts_get_flags, (setter)rpmts_set_flags, NULL},
@@ -872,7 +968,7 @@ static PyGetSetDef rpmts_getseters[] = {
 
 PyTypeObject rpmts_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".ts",         /* tp_name */
+       "rpm.ts",                       /* tp_name */
        sizeof(rpmtsObject),            /* tp_size */
        0,                              /* tp_itemsize */
        (destructor) rpmts_dealloc,     /* tp_dealloc */
index 14be973a30d8a361cacbe6f4159d186f4d0149f0..dd56a47a9ae05cd7297b852f1aa9838804ebb565 100644 (file)
@@ -2,7 +2,7 @@
 
 from distutils.core import setup, Extension
 import subprocess
-from glob import glob
+import os
 
 def pkgconfig(what):
     out = []
@@ -12,37 +12,50 @@ def pkgconfig(what):
         out.append(token[2:])
     return out
 
-def mksources(names):
-    srcs = []
-    for n in names:
-        srcs.extend(glob('%s*.c' % n))
-    return srcs
+cflags = ['-std=c99', '-Wno-strict-aliasing']
+additional_link_args = []
 
-cflags = ['-std=c99']
+# See if we're building in-tree
+if os.access('Makefile.am', os.F_OK):
+    cflags.append('-I../include')
+    additional_link_args.extend(['-Wl,-L../rpmio/.libs',
+                                 '-Wl,-L../lib/.libs',
+                                 '-Wl,-L../build/.libs',
+                                 '-Wl,-L../sign/.libs'])
+    os.environ['PKG_CONFIG_PATH'] = '..'
 
-rpmmod = Extension('@PYTHON_MODULENAME@._rpm',
-                   sources = mksources([
-                                'header', 'rpmds', 'rpmfd', 'rpmfi', 'rpmii',
-                                'rpmkeyring', 'rpmmacro', 'rpmmi', 'rpmps',
-                                'rpmtd', 'rpmte', 'rpmts', 'rpmmodule',
-                             ]),
+
+rpmmod = Extension('rpm._rpm',
+                   sources = [  'header-py.c', 'rpmds-py.c', 'rpmfd-py.c',
+                               'rpmfi-py.c', 'rpmii-py.c', 'rpmkeyring-py.c',
+                                'rpmmacro-py.c', 'rpmmi-py.c', 'rpmps-py.c',
+                                'rpmstrpool-py.c', 'rpmfiles-py.c', 
+                               'rpmarchive-py.c', 'rpmtd-py.c',
+                                'rpmte-py.c', 'rpmts-py.c', 'rpmmodule.c',
+                             ],
                    include_dirs = pkgconfig('--cflags'),
-                   libraries = pkgconfig('--libs'),
-                   extra_compile_args = cflags
+                   library_dirs = pkgconfig('--libs-only-L'),
+                   libraries = pkgconfig('--libs-only-l'),
+                   extra_compile_args = cflags,
+                   extra_link_args = additional_link_args
                   )
 
-rpmbuild_mod = Extension('@PYTHON_MODULENAME@._rpmb',
-                   sources = mksources(['rpmbmodule', 'spec']),
+rpmbuild_mod = Extension('rpm._rpmb',
+                   sources = ['rpmbmodule.c', 'spec-py.c'],
                    include_dirs = pkgconfig('--cflags'),
-                   libraries = pkgconfig('--libs') + ['rpmbuild'],
-                   extra_compile_args = cflags
+                   library_dirs = pkgconfig('--libs-only-L'),
+                   libraries = pkgconfig('--libs-only-l') + ['rpmbuild'],
+                   extra_compile_args = cflags,
+                   extra_link_args = additional_link_args
                   )
 
-rpmsign_mod = Extension('@PYTHON_MODULENAME@._rpms',
-                   sources = mksources(['rpmbmodule']),
+rpmsign_mod = Extension('rpm._rpms',
+                   sources = ['rpmsmodule.c'],
                    include_dirs = pkgconfig('--cflags'),
-                   libraries = pkgconfig('--libs') + ['rpmsign'],
-                   extra_compile_args = cflags
+                   library_dirs = pkgconfig('--libs-only-L'),
+                   libraries = pkgconfig('--libs-only-l') + ['rpmsign'],
+                   extra_compile_args = cflags,
+                   extra_link_args = additional_link_args
                   )
 
 setup(name='@PACKAGE_NAME@',
index 82245200e0aeec0b97c6de0b27b088537cc94a5c..47c17400f2112d12c557881893494a2cd459a1b7 100644 (file)
@@ -19,7 +19,7 @@
  *  For example
  * \code
  *  import rpm
- *  rpm.addMacro("_topdir","/path/to/topdir")
+ *  rpm.rpmPushMacro("_topdir","/path/to/topdir")
  *  s=rpm.spec("foo.spec")
  *  print s.prep()
  * \endcode
 /* Header objects are in another module, some hoop jumping required... */
 static PyObject *makeHeader(Header h)
 {
-    PyObject *rpmmod = PyImport_ImportModuleNoBlock(PYTHON_MODULENAME);
+    PyObject *rpmmod = PyImport_ImportModuleNoBlock("rpm");
     if (rpmmod == NULL) return NULL;
 
-    PyObject *ptr = CAPSULE_BUILD(h, PYTHON_MODULENAME"._C_Header");
+    PyObject *ptr = CAPSULE_BUILD(h, "rpm._C_Header");
     PyObject *hdr = PyObject_CallMethod(rpmmod, "hdr", "(O)", ptr);
     Py_XDECREF(ptr);
     Py_XDECREF(rpmmod);
@@ -45,27 +45,63 @@ struct specPkgObject_s {
     PyObject_HEAD
     /*type specific fields */
     rpmSpecPkg pkg;
+    specObject *source_spec;
 };
 
+static void specPkg_dealloc(specPkgObject * s)
+{
+    Py_DECREF(s->source_spec);
+}
+
+static PyObject *pkgGetSection(rpmSpecPkg pkg, int section)
+{
+    char *sect = rpmSpecPkgGetSection(pkg, section);
+    if (sect != NULL) {
+        PyObject *ps = PyBytes_FromString(sect);
+        free(sect);
+        if (ps != NULL)
+            return ps;
+    }
+    Py_RETURN_NONE;
+}
+
 static char specPkg_doc[] =
-"";
+"Package data parsed from spec file.";
 
 static PyObject * specpkg_get_header(specPkgObject *s, void *closure)
 {
     return makeHeader(rpmSpecPkgHeader(s->pkg));
 }
 
+static PyObject * specpkg_get_fileFile(specPkgObject *s, void *closure)
+{
+    return  pkgGetSection(s->pkg, RPMBUILD_FILE_FILE);
+}
+
+static PyObject * specpkg_get_fileList(specPkgObject *s, void *closure)
+{
+    return  pkgGetSection(s->pkg, RPMBUILD_FILE_LIST);
+}
+
+static PyObject * specpkg_get_policyList(specPkgObject *s, void *closure)
+{
+    return  pkgGetSection(s->pkg, RPMBUILD_POLICY);
+}
+
 static PyGetSetDef specpkg_getseters[] = {
-    { "header",        (getter) specpkg_get_header, NULL, NULL },
-    { NULL }   /* sentinel */
+    { "header",     (getter) specpkg_get_header,     NULL, NULL },
+    { "fileFile",   (getter) specpkg_get_fileFile,   NULL, NULL },
+    { "fileList",   (getter) specpkg_get_fileList,   NULL, NULL },
+    { "policyList", (getter) specpkg_get_policyList, NULL, NULL },
+    { NULL }   /* sentinel */
 };
 
 PyTypeObject specPkg_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
-       PYTHON_MODULENAME".specpkg",    /* tp_name */
+       "rpm.specpkg",                  /* tp_name */
        sizeof(specPkgObject),          /* tp_size */
        0,                              /* tp_itemsize */
-       0,                              /* tp_dealloc */
+       (destructor) specPkg_dealloc,   /* tp_dealloc */
        0,                              /* tp_print */
        0,                              /* tp_getattr */
        0,                              /* tp_setattr */
@@ -127,6 +163,12 @@ static PyObject * getSection(rpmSpec spec, int section)
     Py_RETURN_NONE;
 }
 
+static PyObject *
+spec_get_parsed(specObject * s, void *closure)
+{
+    return getSection(s->spec, RPMBUILD_NONE);
+}
+
 static PyObject * 
 spec_get_prep(specObject * s, void *closure) 
 {
@@ -144,6 +186,11 @@ static PyObject * spec_get_install(specObject * s, void *closure)
     return getSection(s->spec, RPMBUILD_INSTALL);
 }
 
+static PyObject * spec_get_check(specObject * s, void *closure)
+{
+    return getSection(s->spec, RPMBUILD_CHECK);
+}
+
 static PyObject * spec_get_clean(specObject * s, void *closure) 
 {
     return getSection(s->spec, RPMBUILD_CLEAN);
@@ -192,7 +239,7 @@ static PyObject * spec_get_packages(specObject *s, void *closure)
     iter = rpmSpecPkgIterInit(s->spec);
 
     while ((pkg = rpmSpecPkgIterNext(iter)) != NULL) {
-       PyObject *po = specPkg_Wrap(&specPkg_Type, pkg);
+       PyObject *po = specPkg_Wrap(&specPkg_Type, pkg, s);
         if (!po) {
             rpmSpecPkgIterFree(iter);
             Py_DECREF(pkgList);
@@ -214,9 +261,11 @@ static char spec_doc[] = "RPM Spec file object";
 
 static PyGetSetDef spec_getseters[] = {
     {"sources",   (getter) spec_get_sources, NULL, NULL },
+    {"parsed",    (getter) spec_get_parsed, NULL, NULL},
     {"prep",   (getter) spec_get_prep, NULL, NULL },
     {"build",   (getter) spec_get_build, NULL, NULL },
     {"install",   (getter) spec_get_install, NULL, NULL },
+    {"check",  (getter) spec_get_check, NULL, NULL },
     {"clean",   (getter) spec_get_clean, NULL, NULL },
     {"packages", (getter) spec_get_packages, NULL, NULL },
     {"sourceHeader", (getter) spec_get_source_header, NULL, NULL },
@@ -263,7 +312,7 @@ static struct PyMethodDef spec_methods[] = {
 
 PyTypeObject spec_Type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
-    PYTHON_MODULENAME".spec",  /*tp_name*/
+    "rpm.spec",               /*tp_name*/
     sizeof(specObject),        /*tp_basicsize*/
     0,                         /*tp_itemsize*/
     (destructor) spec_dealloc, /*tp_dealloc*/
@@ -314,12 +363,14 @@ spec_Wrap(PyTypeObject *subtype, rpmSpec spec)
     return (PyObject *) s;
 }
 
-PyObject * specPkg_Wrap(PyTypeObject *subtype, rpmSpecPkg pkg
+PyObject * specPkg_Wrap(PyTypeObject *subtype, rpmSpecPkg pkg, specObject *source)
 {
     specPkgObject * s = (specPkgObject *)subtype->tp_alloc(subtype, 0);
     if (s == NULL) return NULL;
 
     s->pkg = pkg;
+    s->source_spec = source;
+    Py_INCREF(s->source_spec);
     return (PyObject *) s;
 }
 
index 558fbf20726b1da55c064b784ebb0fd82d74abaa..65b8dc3d782f5ab74cfc48dcfadf52c3fa9f6112 100644 (file)
@@ -13,6 +13,6 @@ extern PyTypeObject specPkg_Type;
 #define specPkgObject_Check(v) ((v)->ob_type == &specPkg_Type)
 
 PyObject * spec_Wrap(PyTypeObject *subtype, rpmSpec spec);
-PyObject * specPkg_Wrap(PyTypeObject *subtype, rpmSpecPkg pkg);
+PyObject * specPkg_Wrap(PyTypeObject *subtype, rpmSpecPkg pkg, specObject *source);
 
 #endif /* RPMPYTHON_SPEC */
diff --git a/rpm.am b/rpm.am
index 1f2303a7986d7c19b156f2a606f600423e5afe67..1b9ef71cf09d4c69abe27f965695a49698f1cbf6 100644 (file)
--- a/rpm.am
+++ b/rpm.am
@@ -1,7 +1,9 @@
 # Internal binaries
-## HACK: It probably should be $(libexecdir)/rpm or $(libdir)/rpm
-rpmlibexecdir = $(libdir)/rpm
+rpmlibexecdir = @RPMCONFIGDIR@
 
 # Host independent config files
 ## HACK: it probably should be $(datadir)/rpm
-rpmconfigdir = $(libdir)/rpm
+rpmconfigdir = @RPMCONFIGDIR@
+
+# Libtool version (current-revision-age) for all our libraries
+rpm_version_info = 4:0:1
\ No newline at end of file
index 9426920157932c16ae5999bb1cf17d4bd19b3266..d942e516535d1b9013d59ad52f897a08c9e5449e 100644 (file)
--- a/rpm.pc.in
+++ b/rpm.pc.in
@@ -8,8 +8,8 @@ Name: RPM
 Description: RPM Package Manager
 Version: @VERSION@
 URL: http://rpm.org
-# Requires: 
+Requires.private: @ZSTD_REQUIRES@ @LMDB_REQUIRES@
 # Conflicts:
 Cflags: -I${includedir}
 Libs: -L${libdir} -lrpm -lrpmio
-Libs.private: -lpopt -lrt -lpthread @WITH_SELINUX_LIB@ @WITH_LZMA_LIB@ @WITH_DB_LIB@ @WITH_BZ2_LIB@ @WITH_ZLIB_LIB@ @WITH_NSS_LIB@ @WITH_LUA_LIB@
+Libs.private: -lpopt -lrt -lpthread @WITH_LZMA_LIB@ @WITH_DB_LIB@ @WITH_BZ2_LIB@ @WITH_ZLIB_LIB@ @WITH_BEECRYPT_LIB@ @WITH_NSS_LIB@ @LUA_LIBS@
diff --git a/rpm2archive.c b/rpm2archive.c
new file mode 100644 (file)
index 0000000..27b84d6
--- /dev/null
@@ -0,0 +1,218 @@
+/* rpmarchive: spit out the main archive portion of a package */
+
+#include "system.h"
+
+#include <rpm/rpmlib.h>                /* rpmReadPackageFile .. */
+#include <rpm/rpmfi.h>
+#include <rpm/rpmtag.h>
+#include <rpm/rpmio.h>
+#include <rpm/rpmpgp.h>
+
+#include <rpm/rpmts.h>
+
+#include <archive.h>
+#include <archive_entry.h>
+#include <unistd.h>
+
+#include "debug.h"
+
+#define BUFSIZE (128*1024)
+
+static void fill_archive_entry(struct archive * a, struct archive_entry * entry, rpmfi fi)
+{
+    archive_entry_clear(entry);
+
+    char * filename = rstrscat(NULL, ".", rpmfiDN(fi), rpmfiBN(fi), NULL);
+    archive_entry_copy_pathname(entry, filename);
+    _free(filename);
+
+    archive_entry_set_size(entry, rpmfiFSize(fi));
+    rpm_mode_t mode = rpmfiFMode(fi);
+    archive_entry_set_filetype(entry, mode & S_IFMT);
+    archive_entry_set_perm(entry, mode);
+
+    archive_entry_set_uname(entry, rpmfiFUser(fi));
+    archive_entry_set_gname(entry, rpmfiFGroup(fi));
+    archive_entry_set_rdev(entry, rpmfiFRdev(fi));
+    archive_entry_set_mtime(entry, rpmfiFMtime(fi), 0);
+
+    if (S_ISLNK(mode))
+       archive_entry_set_symlink(entry, rpmfiFLink(fi));
+}
+
+static void write_file_content(struct archive * a, char * buf, rpmfi fi)
+{
+    rpm_loff_t left = rpmfiFSize(fi);
+    size_t len, read;
+
+    while (left) {
+       len = (left > BUFSIZE ? BUFSIZE : left);
+       read = rpmfiArchiveRead(fi, buf, len);
+       if (read==len) {
+           archive_write_data(a, buf, len);
+       } else {
+           fprintf(stderr, "Error reading file from rpm payload\n");
+           break;
+       }
+       left -= len;
+    }
+}
+
+static int process_package(rpmts ts, char * filename)
+{
+    FD_t fdi;
+    FD_t gzdi;
+    Header h;
+    int rc = 0;
+    char * rpmio_flags = NULL;
+    struct archive *a;
+    struct archive_entry *entry;
+
+    if (!strcmp(filename, "-")) {
+       fdi = fdDup(STDIN_FILENO);
+    } else {
+       fdi = Fopen(filename, "r.ufdio");
+    }
+
+    if (Ferror(fdi)) {
+       fprintf(stderr, "rpm2archive: %s: %s\n",
+               filename, Fstrerror(fdi));
+       exit(EXIT_FAILURE);
+    }
+
+    rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h);
+
+    switch (rc) {
+    case RPMRC_OK:
+    case RPMRC_NOKEY:
+    case RPMRC_NOTTRUSTED:
+       break;
+    case RPMRC_NOTFOUND:
+       fprintf(stderr, _("argument is not an RPM package\n"));
+       exit(EXIT_FAILURE);
+       break;
+    case RPMRC_FAIL:
+    default:
+       fprintf(stderr, _("error reading header from package\n"));
+       exit(EXIT_FAILURE);
+       break;
+    }
+
+
+    /* Retrieve payload size and compression type. */
+    {  const char *compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR);
+       rpmio_flags = rstrscat(NULL, "r.", compr ? compr : "gzip", NULL);
+    }
+
+    gzdi = Fdopen(fdi, rpmio_flags);   /* XXX gzdi == fdi */
+    free(rpmio_flags);
+
+    if (gzdi == NULL) {
+       fprintf(stderr, _("cannot re-open payload: %s\n"), Fstrerror(gzdi));
+       exit(EXIT_FAILURE);
+    }
+
+    rpmfiles files = rpmfilesNew(NULL, h, 0, RPMFI_KEEPHEADER);
+    rpmfi fi = rpmfiNewArchiveReader(gzdi, files, RPMFI_ITER_READ_ARCHIVE_CONTENT_FIRST);
+
+    /* create archive */
+    a = archive_write_new();
+    archive_write_add_filter_gzip(a);
+    archive_write_set_format_pax_restricted(a);
+
+    if (!strcmp(filename, "-")) {
+       if (isatty(STDOUT_FILENO)) {
+           fprintf(stderr, "Error: refusing to output archive data to a terminal.\n");
+           exit(EXIT_FAILURE);
+       }
+       archive_write_open_fd(a, STDOUT_FILENO);
+    } else {
+       char * outname = rstrscat(NULL, filename, ".tgz", NULL);
+       archive_write_open_filename(a, outname);
+       _free(outname);
+       // XXX error handling
+    }
+
+    entry = archive_entry_new();
+
+    char * buf = xmalloc(BUFSIZE);
+    char * hardlink = NULL;
+
+    rc = 0;
+    while (rc >= 0) {
+       rc = rpmfiNext(fi);
+       if (rc == RPMERR_ITER_END) {
+           break;
+       }
+
+       rpm_mode_t mode = rpmfiFMode(fi);
+       int nlink = rpmfiFNlink(fi);
+
+       fill_archive_entry(a, entry, fi);
+
+       if (nlink > 1) {
+           if (rpmfiArchiveHasContent(fi)) {
+               _free(hardlink);
+               hardlink = rstrscat(NULL, ".", rpmfiFN(fi), NULL);
+           } else {
+               archive_entry_set_hardlink(entry, hardlink);
+           }
+       }
+
+       archive_write_header(a, entry);
+
+       if (S_ISREG(mode) && (nlink == 1 || rpmfiArchiveHasContent(fi))) {
+           write_file_content(a, buf, fi);
+       }
+    }
+    /* End of iteration is not an error */
+    if (rc == RPMERR_ITER_END) {
+       rc = 0;
+    }
+
+    _free(hardlink);
+
+    Fclose(gzdi);      /* XXX gzdi == fdi */
+    archive_entry_free(entry);
+    archive_write_close(a);
+    archive_write_free(a);
+    buf = _free(buf);
+    rpmfilesFree(files);
+    rpmfiFree(fi);
+    headerFree(h);
+    return rc;
+}
+
+int main(int argc, char *argv[])
+{
+    int rc;
+    
+    xsetprogname(argv[0]);     /* Portability call -- see system.h */
+    rpmReadConfigFiles(NULL, NULL);
+    char * filename;
+    if (argc == 1)
+       filename = "-";
+    else {
+       if (rstreq(argv[1], "-h") || rstreq(argv[1], "--help")) {
+           fprintf(stderr, "Usage: rpm2archive file.rpm\n");
+           exit(EXIT_FAILURE);
+       } else {
+           filename = argv[1];
+       }
+    }
+
+    rpmts ts = rpmtsCreate();
+    rpmVSFlags vsflags = 0;
+
+    /* XXX retain the ageless behavior of rpm2cpio */
+    vsflags |= _RPMVSF_NODIGESTS;
+    vsflags |= _RPMVSF_NOSIGNATURES;
+    vsflags |= RPMVSF_NOHDRCHK;
+    (void) rpmtsSetVSFlags(ts, vsflags);
+
+    rc = process_package(ts, filename);
+
+    ts = rpmtsFree(ts);
+
+    return rc;
+}
index 89ebdfac0e14ac240f4526f86b167c6a5337335b..8bee3c7cc8ff7803fc0f1c3e170d09c2d5ad1da4 100644 (file)
@@ -1,7 +1,6 @@
 /* rpmarchive: spit out the main archive portion of a package */
 
 #include "system.h"
-const char *__progname;
 
 #include <rpm/rpmlib.h>                /* rpmReadPackageFile .. */
 #include <rpm/rpmtag.h>
@@ -9,6 +8,7 @@ const char *__progname;
 #include <rpm/rpmpgp.h>
 
 #include <rpm/rpmts.h>
+#include <unistd.h>
 
 #include "debug.h"
 
@@ -21,7 +21,8 @@ int main(int argc, char *argv[])
     off_t payload_size;
     FD_t gzdi;
     
-    setprogname(argv[0]);      /* Retrofit glibc __progname */
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
+
     rpmReadConfigFiles(NULL, NULL);
     if (argc == 1)
        fdi = fdDup(STDIN_FILENO);
@@ -38,6 +39,10 @@ int main(int argc, char *argv[])
                (argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
        exit(EXIT_FAILURE);
     }
+    if (isatty(STDOUT_FILENO)) {
+       fprintf(stderr, "Error: refusing to output cpio data to a terminal.\n");
+       exit(EXIT_FAILURE);
+    }
     fdo = fdDup(STDOUT_FILENO);
 
     {  rpmts ts = rpmtsCreate();
index 4fb4289f834359b64d81a3340844c6e13f98be03..893a55987d5e3e8441cd0d00512b1a5e37743c0a 100644 (file)
@@ -1,5 +1,4 @@
 #include "system.h"
-const char *__progname;
 
 #include <errno.h>
 #include <libgen.h>
@@ -28,9 +27,10 @@ static struct rpmBuildArguments_s rpmBTArgs;
 #define        POPT_NOBUILD            -1017
 #define        POPT_RMSPEC             -1019
 #define POPT_NODIRTOKENS       -1020
+#define POPT_BUILDINPLACE      -1021
 
-#define        POPT_REBUILD            0x4220
-#define        POPT_RECOMPILE          0x4320
+#define        POPT_REBUILD            0x4262 /* Bb */
+#define        POPT_RECOMPILE          0x4369 /* Ci */
 #define        POPT_BA                 0x6261
 #define        POPT_BB                 0x6262
 #define        POPT_BC                 0x6263
@@ -38,6 +38,13 @@ static struct rpmBuildArguments_s rpmBTArgs;
 #define        POPT_BL                 0x626c
 #define        POPT_BP                 0x6270
 #define        POPT_BS                 0x6273
+#define        POPT_RA                 0x4261
+#define        POPT_RB                 0x4262
+#define        POPT_RC                 0x4263
+#define        POPT_RI                 0x4269
+#define        POPT_RL                 0x426c
+#define        POPT_RP                 0x4270
+#define        POPT_RS                 0x4273
 #define        POPT_TA                 0x7461
 #define        POPT_TB                 0x7462
 #define        POPT_TC                 0x7463
@@ -55,6 +62,7 @@ static char buildMode = 0;            /*!< Build mode (one of "btBC") */
 static char buildChar = 0;             /*!< Build stage (one of "abcilps ") */
 static rpmBuildFlags nobuildAmount = 0;        /*!< Build stage disablers */
 static ARGV_t build_targets = NULL;    /*!< Target platform(s) */
+static int buildInPlace = 0;           /*!< from --build-in-place */
 
 static void buildArgCallback( poptContext con,
        enum poptCallbackReason reason,
@@ -73,6 +81,13 @@ static void buildArgCallback( poptContext con,
     case POPT_BL:
     case POPT_BP:
     case POPT_BS:
+    case POPT_RA:
+    /* case POPT_RB: same value as POPT_REBUILD */
+    case POPT_RC:
+    case POPT_RI:
+    case POPT_RL:
+    case POPT_RP:
+    case POPT_RS:
     case POPT_TA:
     case POPT_TB:
     case POPT_TC:
@@ -109,6 +124,10 @@ static void buildArgCallback( poptContext con,
        spec_flags |= RPMSPEC_FORCE;
        break;
 
+    case POPT_BUILDINPLACE:
+       rpmDefineMacro(NULL, "_build_in_place 1", 0);
+       buildInPlace = 1;
+       break;
     }
 }
 
@@ -138,6 +157,28 @@ static struct poptOption rpmBuildPoptTable[] = {
        N_("build source package only from <specfile>"),
        N_("<specfile>") },
 
+ { "rp", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_RP,
+       N_("build through %prep (unpack sources and apply patches) from <source package>"),
+       N_("<source package>") },
+ { "rc", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_RC,
+       N_("build through %build (%prep, then compile) from <source package>"),
+       N_("<source package>") },
+ { "ri", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_RI,
+       N_("build through %install (%prep, %build, then install) from <source package>"),
+       N_("<source package>") },
+ { "rl", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_RL,
+       N_("verify %files section from <source package>"),
+       N_("<source package>") },
+ { "ra", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_RA,
+       N_("build source and binary packages from <source package>"),
+       N_("<source package>") },
+ { "rb", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_RB,
+       N_("build binary package only from <source package>"),
+       N_("<source package>") },
+ { "rs", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_RS,
+       N_("build source package only from <source package>"),
+       N_("<source package>") },
+
  { "tp", 0, POPT_ARGFLAG_ONEDASH, 0, POPT_TP,
        N_("build through %prep (unpack sources and apply patches) from <tarball>"),
        N_("<tarball>") },
@@ -169,6 +210,8 @@ static struct poptOption rpmBuildPoptTable[] = {
 
  { "buildroot", '\0', POPT_ARG_STRING, 0,  POPT_BUILDROOT,
        N_("override build root"), "DIRECTORY" },
+ { "build-in-place", '\0', 0, 0, POPT_BUILDINPLACE,
+       N_("run build in current directory"), NULL },
  { "clean", '\0', 0, 0, POPT_RMBUILD,
        N_("remove build tree when done"), NULL},
  { "force", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_FORCE,
@@ -185,6 +228,8 @@ static struct poptOption rpmBuildPoptTable[] = {
 
  { "noclean", '\0', POPT_BIT_SET, &nobuildAmount, RPMBUILD_CLEAN,
        N_("do not execute %clean stage of the build"), NULL },
+ { "noprep", '\0', POPT_BIT_SET, &nobuildAmount, RPMBUILD_PREP,
+       N_("do not execute %prep stage of the build"), NULL },
  { "nocheck", '\0', POPT_BIT_SET, &nobuildAmount, RPMBUILD_CHECK,
        N_("do not execute %check stage of the build"), NULL },
 
@@ -308,9 +353,10 @@ static char * getTarSpec(const char *arg)
     for (spec = tryspec; *spec != NULL; spec++) {
        FILE *fp;
        char *cmd;
+       int specfiles = 0;
 
        cmd = rpmExpand("%{uncompress: ", arg, "} | ",
-                       "%{__tar} xOvf - --wildcards ", *spec,
+                       "%{__tar} xOvof - --wildcards ", *spec,
                        " 2>&1 > ", tmpSpecFile, NULL);
 
        if (!(fp = popen(cmd, "r"))) {
@@ -319,12 +365,19 @@ static char * getTarSpec(const char *arg)
            char *fok;
            for (;;) {
                fok = fgets(tarbuf, sizeof(tarbuf) - 1, fp);
+               if (!fok) break;
                /* tar sometimes prints "tar: Record size = 16" messages */
-               if (!fok || strncmp(fok, "tar: ", 5) != 0)
-                   break;
+               if (strstr(fok, "tar: ")) {
+                   continue;
+               }
+               specfiles++;
            }
            pclose(fp);
-           gotspec = (fok != NULL) && isSpecFile(tmpSpecFile);
+           gotspec = (specfiles == 1) && isSpecFile(tmpSpecFile);
+           if (specfiles > 1) {
+               rpmlog(RPMLOG_ERR, _("Found more than one spec file in %s\n"), arg);
+               goto exit;
+           }
        }
 
        if (!gotspec) 
@@ -373,6 +426,13 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba)
     int justRm = ((buildAmount & ~(RPMBUILD_RMSOURCE|RPMBUILD_RMSPEC)) == 0);
     rpmSpecFlags specFlags = spec_flags;
 
+    /* Override default BUILD value for _builddir */
+    if (buildInPlace) {
+       char *cwd = rpmGetCwd();
+       rpmPushMacro(NULL, "_builddir", NULL, cwd, 0);
+       free(cwd);
+    }
+
     if (ba->buildRootOverride)
        buildRootURL = rpmGenPath(NULL, ba->buildRootOverride, NULL);
 
@@ -399,7 +459,7 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba)
            dir = xstrdup(arg);
        }
        srcdir = dirname(dir);
-       addMacro(NULL, "_sourcedir", NULL, srcdir, RMIL_TARBALL);
+       rpmPushMacro(NULL, "_sourcedir", NULL, srcdir, RMIL_TARBALL);
        free(dir);
     } else {
        specFile = xstrdup(arg);
@@ -505,6 +565,10 @@ static int build(rpmts ts, const char * arg, BTA_t ba, const char * rcfile)
 
        /* Read in configuration for target. */
        rpmFreeMacros(NULL);
+       if (buildInPlace) {
+               /* Need to redefine this after freeing all the macros */
+               rpmDefineMacro(NULL, "_build_in_place 1", 0);
+       }
        rpmFreeRpmrc();
        (void) rpmReadConfigFiles(rcfile, *target);
        rc = buildForTarget(ts, arg, ba);
@@ -531,9 +595,15 @@ int main(int argc, char *argv[])
 
     const char *pkg = NULL;
     int ec = 0;
-    poptContext optCon = rpmcliInit(argc, argv, optionsTable);
 
-    if (argc <= 1 || poptPeekArg(optCon) == NULL) {
+    poptContext optCon = NULL;
+
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
+
+    optCon = rpmcliInit(argc, argv, optionsTable);
+
+    /* Args required only when building, let lone --eval etc through */
+    if (ba->buildAmount && poptPeekArg(optCon) == NULL) {
        printUsage(optCon, stderr, 0);
        exit(EXIT_FAILURE);
     }
@@ -549,24 +619,59 @@ int main(int argc, char *argv[])
        argerror(_("arguments to --root (-r) must begin with a /"));
     }
 
-    /* rpmbuild is rather chatty by default */
-    rpmSetVerbosity(quiet ? RPMLOG_WARNING : RPMLOG_INFO);
+    /* rpmbuild runs in verbose mode by default */
+    if (rpmlogSetMask(0) < RPMLOG_MASK(RPMLOG_INFO))
+       rpmSetVerbosity(RPMLOG_INFO);
+
+    if (quiet)
+       rpmSetVerbosity(RPMLOG_WARNING);
 
     if (rpmcliPipeOutput && initPipe())
        exit(EXIT_FAILURE);
        
     ts = rpmtsCreate();
     (void) rpmtsSetRootDir(ts, rpmcliRootDir);
+    rpmtsSetFlags(ts, rpmtsFlags(ts) | RPMTRANS_FLAG_NOPLUGINS);
+
+    switch (buildChar) {
+    case 'a':
+       ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
+    case 'b':
+       ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
+       ba->buildAmount |= RPMBUILD_CLEAN;
+       if ((buildChar == 'b') && shortCircuit)
+           break;
+    case 'i':
+       ba->buildAmount |= RPMBUILD_INSTALL;
+       ba->buildAmount |= RPMBUILD_CHECK;
+       if ((buildChar == 'i') && shortCircuit)
+           break;
+    case 'c':
+       ba->buildAmount |= RPMBUILD_BUILD;
+       if ((buildChar == 'c') && shortCircuit)
+           break;
+    case 'p':
+       ba->buildAmount |= RPMBUILD_PREP;
+       break;
+    case 'l':
+       ba->buildAmount |= RPMBUILD_FILECHECK;
+       break;
+    case 's':
+       ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
+       break;
+    }
+    ba->buildAmount &= ~(nobuildAmount);
+
     switch (bigMode) {
     case MODE_REBUILD:
     case MODE_RECOMPILE:
-       ba->buildAmount =
-           RPMBUILD_PREP | RPMBUILD_BUILD | RPMBUILD_INSTALL | RPMBUILD_CHECK;
-       if (bigMode == MODE_REBUILD) {
-           ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
+       if (bigMode == MODE_REBUILD &&
+           buildChar != 'p' &&
+           buildChar != 'c' &&
+           buildChar != 'i' &&
+           buildChar != 'l') {
            ba->buildAmount |= RPMBUILD_RMSOURCE;
            ba->buildAmount |= RPMBUILD_RMSPEC;
-           ba->buildAmount |= RPMBUILD_CLEAN;
            ba->buildAmount |= RPMBUILD_RMBUILD;
        }
        ba->buildAmount &= ~(nobuildAmount);
@@ -589,35 +694,6 @@ int main(int argc, char *argv[])
        break;
     case MODE_BUILD:
     case MODE_TARBUILD:
-       switch (buildChar) {
-       case 'a':
-           ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
-       case 'b':
-           ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
-           ba->buildAmount |= RPMBUILD_CLEAN;
-           if ((buildChar == 'b') && shortCircuit)
-               break;
-       case 'i':
-           ba->buildAmount |= RPMBUILD_INSTALL;
-           ba->buildAmount |= RPMBUILD_CHECK;
-           if ((buildChar == 'i') && shortCircuit)
-               break;
-       case 'c':
-           ba->buildAmount |= RPMBUILD_BUILD;
-           if ((buildChar == 'c') && shortCircuit)
-               break;
-       case 'p':
-           ba->buildAmount |= RPMBUILD_PREP;
-           break;
-           
-       case 'l':
-           ba->buildAmount |= RPMBUILD_FILECHECK;
-           break;
-       case 's':
-           ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
-           break;
-       }
-       ba->buildAmount &= ~(nobuildAmount);
 
        while ((pkg = poptGetArg(optCon))) {
            ba->rootdir = rpmcliRootDir;
diff --git a/rpmdb.c b/rpmdb.c
index 7223fdf2818f14787358963fe2f22c2b0189ef57..25c088da973810ba2b0bec3c63cc8749f1212a34 100644 (file)
--- a/rpmdb.c
+++ b/rpmdb.c
@@ -2,17 +2,16 @@
 
 #include <popt.h>
 #include <rpm/rpmcli.h>
+#include <rpm/rpmdb.h>
 #include "cliutils.h"
 #include "debug.h"
 
-#if !defined(__GLIBC__) && !defined(__APPLE__)
-char ** environ = NULL;
-#endif
-
 enum modes {
     MODE_INITDB                = (1 << 0),
     MODE_REBUILDDB     = (1 << 1),
     MODE_VERIFYDB      = (1 << 2),
+    MODE_EXPORTDB      = (1 << 3),
+    MODE_IMPORTDB      = (1 << 4),
 };
 
 static int mode = 0;
@@ -25,6 +24,12 @@ static struct poptOption dbOptsTable[] = {
        NULL},
     { "verifydb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR|POPT_ARGFLAG_DOC_HIDDEN),
        &mode, MODE_VERIFYDB, N_("verify database files"), NULL},
+    { "exportdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_EXPORTDB,
+       N_("export database to stdout header list"),
+       NULL},
+    { "importdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_IMPORTDB,
+       N_("import database from stdin header list"),
+       NULL},
     POPT_TABLEEND
 };
 
@@ -39,12 +44,57 @@ static struct poptOption optionsTable[] = {
     POPT_TABLEEND
 };
 
+static int exportDB(rpmts ts)
+{
+    FD_t fd = fdDup(STDOUT_FILENO);
+    rpmtxn txn = rpmtxnBegin(ts, RPMTXN_READ);
+    int rc = 0;
+
+    if (txn && fd) {
+       Header h;
+       rpmdbMatchIterator mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, NULL, 0);
+       while ((h = rpmdbNextIterator(mi))) {
+           rc += headerWrite(fd, h, HEADER_MAGIC_YES);
+       }
+       rpmdbFreeIterator(mi);
+    } else {
+       rc = -1;
+    }
+    Fclose(fd);
+    rpmtxnEnd(txn);
+    return rc;
+}
+
+/* XXX: only allow this on empty db? */
+static int importDB(rpmts ts)
+{
+    FD_t fd = fdDup(STDIN_FILENO);
+    rpmtxn txn = rpmtxnBegin(ts, RPMTXN_WRITE);
+    int rc = 0;
+
+    if (txn && fd) {
+       Header h;
+       while ((h = headerRead(fd, HEADER_MAGIC_YES))) {
+           rc += rpmtsImportHeader(txn, h, 0);
+       }
+    } else {
+       rc = -1;
+    }
+    rpmtxnEnd(txn);
+    Fclose(fd);
+    return rc;
+}
+
 int main(int argc, char *argv[])
 {
     int ec = EXIT_FAILURE;
-    poptContext optCon = rpmcliInit(argc, argv, optionsTable);
+    poptContext optCon = NULL;
     rpmts ts = NULL;
-    
+
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
+
+    optCon = rpmcliInit(argc, argv, optionsTable);
+
     if (argc < 2 || poptPeekArg(optCon)) {
        printUsage(optCon, stderr, 0);
        goto exit;
@@ -66,6 +116,12 @@ int main(int argc, char *argv[])
     case MODE_VERIFYDB:
        ec = rpmtsVerifyDB(ts);
        break;
+    case MODE_EXPORTDB:
+       ec = exportDB(ts);
+       break;
+    case MODE_IMPORTDB:
+       ec = importDB(ts);
+       break;
     default:
        argerror(_("only one major mode may be specified"));
     }
index 7b27d6153af9474e6622136be9ca0479be428718..6024ae4e25883d372fe670eab88719317dfa57ed 100644 (file)
@@ -1,9 +1,14 @@
 # Makefile for rpm library.
 
+include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
+
 AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -I$(top_builddir)/include/
 AM_CPPFLAGS += @WITH_NSS_INCLUDE@
 AM_CPPFLAGS += @WITH_BEECRYPT_INCLUDE@
+AM_CPPFLAGS += @WITH_OPENSSL_INCLUDE@
 AM_CPPFLAGS += @WITH_POPT_INCLUDE@
+AM_CPPFLAGS += $(ZSTD_CFLAGS)
 AM_CPPFLAGS += -I$(top_srcdir)/misc
 AM_CPPFLAGS += -DRPMCONFIGDIR="\"@RPMCONFIGDIR@\""
 AM_CPPFLAGS += -DLOCALSTATEDIR="\"$(localstatedir)\""
@@ -21,20 +26,26 @@ librpmio_la_SOURCES = \
 if WITH_BEECRYPT
 librpmio_la_SOURCES += digest_beecrypt.c
 else
+if WITH_OPENSSL
+librpmio_la_SOURCES += digest_openssl.c
+else
 librpmio_la_SOURCES += digest_nss.c
 endif
+endif
 
 
-librpmio_la_LDFLAGS = -version-info 4:0:1
+librpmio_la_LDFLAGS = -version-info $(rpm_version_info)
 librpmio_la_LIBADD = \
        ../misc/libmisc.la \
        @WITH_NSS_LIB@ \
        @WITH_BEECRYPT_LIB@ \
+       @WITH_OPENSSL_LIB@ \
        @WITH_BZ2_LIB@ \
        @WITH_ZLIB_LIB@ \
        @WITH_LIBELF_LIB@ \
        @WITH_POPT_LIB@ \
        @WITH_LZMA_LIB@ \
+       $(ZSTD_LIBS) \
        -lpthread
 
 if WITH_INTERNAL_BEECRYPT
index f061f03de5c10caf531dbe5de27fa2bf1776fbf6..3508a9fc12074314a49bbbcfe9ae1a2024c83781 100644 (file)
@@ -213,12 +213,32 @@ int argvSplit(ARGV_t * argvp, const char * str, const char * seps)
 
 char *argvJoin(ARGV_const_t argv, const char *sep)
 {
+    int argc = 0;
+    size_t argvlen = 0;
     char *dest = NULL;
-    char * const *arg;
 
-    for (arg = argv; arg && *arg; arg++) {
-       rstrscat(&dest, *arg, *(arg+1) ? sep : "", NULL);
-    } 
+    if (argv) {
+       ARGV_const_t arg;
+       for (arg = argv; *arg; arg++)
+           argvlen += strlen(*arg);
+       argc = arg - argv;
+    }
+
+    if (argc > 0) {
+       size_t seplen = (sep != NULL) ? strlen(sep) : 0;
+       char *p;
+
+       dest = xmalloc(argvlen + (seplen * (argc - 1)) + 1);
+
+       p = stpcpy(dest, argv[0]);
+       for (int i = 1; i < argc; i++) {
+           if (seplen)
+               p = stpcpy(p, sep);
+           p = stpcpy(p, argv[i]);
+       }
+       *p = '\0';
+    }
+
     return dest;
 }
     
index d73a3c35f9049901e7382dbbc4d4f444baa45967..602b1dc200a672a8ed95378a4b5480f584b1cdd4 100644 (file)
@@ -3,6 +3,8 @@
 
 /** \ingroup rpmargv
  * \file rpmio/argv.h
+ *
+ * Argument Manipulation API.
  */
 
 #include <stdio.h>
@@ -149,7 +151,7 @@ typedef rpmFlags argvFlags;
 /** \ingroup rpmargv
  * Split a string into an argv array.
  * @param str          string arg to split
- * @param seps         seperator characters
+ * @param seps         separator characters
  * @param flags                flags to control behavior
  * @return             argv array
  */
@@ -159,7 +161,7 @@ ARGV_t argvSplitString(const char * str, const char * seps, argvFlags flags);
  * Split a string into an argv array.
  * @retval *argvp      argv array
  * @param str          string arg to split
- * @param seps         seperator characters
+ * @param seps         separator characters
  * @return             0 always
  */
 int argvSplit(ARGV_t * argvp, const char * str, const char * seps);
@@ -167,7 +169,7 @@ int argvSplit(ARGV_t * argvp, const char * str, const char * seps);
 /** \ingroup rpmargv
  * Join an argv array into a string.
  * @param *argv                argv array to join
- * @param sep          seperator string to use
+ * @param sep          separator string to use
  * @return             malloc'ed string
  */
 char *argvJoin(ARGV_const_t argv, const char *sep);
index 60e67d442902d407e489367eebcdffe585771ac3..4424aabbdd26d46b08cf95446e16760ecad94013 100644 (file)
@@ -104,7 +104,7 @@ static int base64_decode_value(unsigned char value_in)
 {
        static const int decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
        value_in -= 43;
-       if (value_in > sizeof(decoding)/sizeof(int))
+       if (value_in >= sizeof(decoding)/sizeof(int))
                return -1;
        return decoding[value_in];
 }
index c1f73b33114df0deb0a7c28533364be3f8de2fd4..1f5e1667ba713c7d812c9ceb6ad230ddeda699df 100644 (file)
@@ -8,14 +8,28 @@
 
 #include "debug.h"
 
-#define DIGESTS_MAX 11
+#define DIGESTS_MAX 12
 struct rpmDigestBundle_s {
-    int index_min;                     /*!< Smallest index of active digest */
     int index_max;                     /*!< Largest index of active digest */
     off_t nbytes;                      /*!< Length of total input data */
-    DIGEST_CTX digests[DIGESTS_MAX];   /*!< Digest contexts indexed by algo */
+    DIGEST_CTX digests[DIGESTS_MAX];   /*!< Digest contexts identified by id */
+    int ids[DIGESTS_MAX];              /*!< Digest ID (arbitrary non-zero) */
 };
 
+static int findID(rpmDigestBundle bundle, int id)
+{
+    int ix = -1;
+    if (bundle) {
+       for (int i = 0; i < DIGESTS_MAX; i++) {
+           if (bundle->ids[i] == id) {
+               ix = i;
+               break;
+           }
+       }
+    }
+    return ix;
+}
+
 rpmDigestBundle rpmDigestBundleNew(void)
 {
     rpmDigestBundle bundle = xcalloc(1, sizeof(*bundle));
@@ -25,7 +39,7 @@ rpmDigestBundle rpmDigestBundleNew(void)
 rpmDigestBundle rpmDigestBundleFree(rpmDigestBundle bundle)
 {
     if (bundle) {
-       for (int i = bundle->index_min; i <= bundle->index_max ; i++) {
+       for (int i = 0; i <= bundle->index_max ; i++) {
            if (bundle->digests[i] == NULL)
                continue;
            rpmDigestFinal(bundle->digests[i], NULL, NULL, 0);
@@ -40,56 +54,58 @@ rpmDigestBundle rpmDigestBundleFree(rpmDigestBundle bundle)
 int rpmDigestBundleAdd(rpmDigestBundle bundle, int algo,
                        rpmDigestFlags flags)
 {
-    DIGEST_CTX ctx = NULL;
-    if (bundle && algo > 0 && algo < DIGESTS_MAX) {
-       if (bundle->digests[algo] == NULL) {
-           ctx = rpmDigestInit(algo, flags);
-           if (ctx) {
-               bundle->digests[algo] = ctx;
-               if (algo < bundle->index_min) {
-                   bundle->index_min = algo;
-               }
-               if (algo > bundle->index_max) {
-                   bundle->index_max = algo;
-               }
+    return rpmDigestBundleAddID(bundle, algo, algo, flags);
+}
+
+int rpmDigestBundleAddID(rpmDigestBundle bundle, int algo, int id,
+                       rpmDigestFlags flags)
+{
+    int rc = -1;
+    if (id > 0 && findID(bundle, id) < 0) {
+       int ix = findID(bundle, 0); /* Find first free slot */
+       if (ix >= 0) {
+           bundle->digests[ix] = rpmDigestInit(algo, flags);
+           if (bundle->digests[ix]) {
+               bundle->ids[ix]= id;
+               if (ix > bundle->index_max)
+                   bundle->index_max = ix;
+               rc = 0;
            }
        }
     }
-    return (ctx != NULL);
+    return rc;
 }
-
 int rpmDigestBundleUpdate(rpmDigestBundle bundle, const void *data, size_t len)
 {
     int rc = 0;
     if (bundle && data && len > 0) {
-       for (int i = bundle->index_min; i <= bundle->index_max; i++) {
-           DIGEST_CTX ctx = bundle->digests[i];
-           if (ctx == NULL)
-               continue;
-           rc += rpmDigestUpdate(ctx, data, len);
+       for (int i = 0; i <= bundle->index_max; i++) {
+           if (bundle->ids[i] > 0)
+               rc += rpmDigestUpdate(bundle->digests[i], data, len);
        }
        bundle->nbytes += len;
     }
     return rc;
 }
 
-int rpmDigestBundleFinal(rpmDigestBundle bundle, 
-               int algo, void ** datap, size_t * lenp, int asAscii)
+int rpmDigestBundleFinal(rpmDigestBundle bundle, int id,
+                        void ** datap, size_t * lenp, int asAscii)
 {
     int rc = 0;
-    if (bundle && algo >= bundle->index_min && algo <= bundle->index_max) {
-       rc = rpmDigestFinal(bundle->digests[algo], datap, lenp, asAscii);
-       bundle->digests[algo] = NULL;
+    int ix = findID(bundle, id);
+
+    if (ix >= 0) {
+       rc = rpmDigestFinal(bundle->digests[ix], datap, lenp, asAscii);
+       bundle->digests[ix] = NULL;
+       bundle->ids[ix] = 0;
     }
     return rc;
 }
 
-DIGEST_CTX rpmDigestBundleDupCtx(rpmDigestBundle bundle, int algo)
+DIGEST_CTX rpmDigestBundleDupCtx(rpmDigestBundle bundle, int id)
 {
-    DIGEST_CTX dup = NULL;
-    if (bundle && algo >= bundle->index_min && algo <= bundle->index_max) {
-       dup = rpmDigestDup(bundle->digests[algo]);
-    }
+    int ix = findID(bundle, id);
+    DIGEST_CTX dup = (ix >= 0) ? rpmDigestDup(bundle->digests[ix]) : NULL;
     return dup;
 }
 
index f10f1c871d766f7c63d6e09d45f614413ed9a541..9e0cde3b9259fa701c9fd16ee744d60a4292aad1 100644 (file)
@@ -5,8 +5,7 @@
 
 typedef struct pgpDigAlg_s * pgpDigAlg;
 
-typedef int (*setmpifunc)(pgpDigAlg digp,
-                          int num, const uint8_t *p, const uint8_t *pend);
+typedef int (*setmpifunc)(pgpDigAlg digp, int num, const uint8_t *p);
 typedef int (*verifyfunc)(pgpDigAlg pgpkey, pgpDigAlg pgpsig,
                           uint8_t *hash, size_t hashlen, int hash_algo);
 typedef void (*freefunc)(pgpDigAlg digp);
@@ -28,7 +27,7 @@ struct pgpDigParams_s {
     uint8_t tag;
 
     uint8_t version;           /*!< version number. */
-    pgpTime_t time;            /*!< time that the key was created. */
+    uint32_t time;             /*!< key/signature creation time. */
     uint8_t pubkey_algo;               /*!< public key algorithm. */
 
     uint8_t hash_algo;
index 7ff7060345029f5e15f175792d46a0ba2154988e..597027e250533b53dd3f6be1d52d133ffbedaa14 100644 (file)
@@ -1,17 +1,17 @@
 #include "system.h"
 
-#include <beecrypt.h>
-#include <dsa.h>
-#include <endianness.h>
-#include <md5.h>
-#include <mp.h>
-#include <rsa.h>
-#include <rsapk.h>
-#include <sha1.h>
+#include <beecrypt/beecrypt.h>
+#include <beecrypt/dsa.h>
+#include <beecrypt/endianness.h>
+#include <beecrypt/md5.h>
+#include <beecrypt/mp.h>
+#include <beecrypt/rsa.h>
+#include <beecrypt/rsapk.h>
+#include <beecrypt/sha1.h>
 #if HAVE_BEECRYPT_API_H
-#include <sha256.h>
-#include <sha384.h>
-#include <sha512.h>
+#include <beecrypt/sha256.h>
+#include <beecrypt/sha384.h>
+#include <beecrypt/sha512.h>
 #endif
 
 #include <rpm/rpmpgp.h>
@@ -198,66 +198,6 @@ int rpmDigestFinal(DIGEST_CTX ctx, void ** datap, size_t *lenp, int asAscii)
     return 0;
 }
 
-/**************************** helpers ************************************/
-
-static inline char * pgpHexCvt(char *t, const byte *s, int nbytes)
-{
-    static char hex[] = "0123456789abcdef";
-    while (nbytes-- > 0) { 
-        unsigned int i;
-        i = *s++;
-        *t++ = hex[ (i >> 4) & 0xf ];
-        *t++ = hex[ (i     ) & 0xf ];
-    }    
-    *t = '\0';
-    return t;
-}
-
-static const char * pgpMpiHex(const byte *p, const byte *pend)
-{
-    static char prbuf[2048];
-    char *t = prbuf;
-    int nbytes =  pgpMpiLen(p) - 2;
-    if (nbytes > 1024 || nbytes > pend - (p + 2))
-       return NULL;
-    t = pgpHexCvt(t, p+2, nbytes);
-    return prbuf;
-}
-
-static int pgpHexSet(int lbits, mpnumber * mpn, const byte * p, const byte * pend)
-{
-    unsigned int mbits = pgpMpiBits(p);
-    unsigned int nbits;
-    unsigned int nbytes;
-    char *t;
-    unsigned int ix;
-
-    nbits = (lbits > mbits ? lbits : mbits);
-    nbytes = ((nbits + 7) >> 3);
-    t = xmalloc(2*nbytes+1);
-    ix = 2 * ((nbits - mbits) >> 3);
-
-    if (ix > 0) memset(t, (int)'0', ix);
-    strcpy(t+ix, pgpMpiHex(p, pend));
-    (void) mpnsethex(mpn, t);
-    t = _free(t);
-    return 0;
-}
-
-static void pgpFreeSigRSADSA(pgpDigAlg sa)
-{
-    if (sa->data)
-       free(sa->data);
-    sa->data = 0;
-}
-
-static void pgpFreeKeyRSADSA(pgpDigAlg sa)
-{
-    if (sa->data)
-       free(sa->data);
-    sa->data = 0;
-}
-
 
 /****************************** RSA **************************************/
 
@@ -267,45 +207,73 @@ struct pgpDigSigRSA_s {
 
 struct pgpDigKeyRSA_s {
     rsapk rsa_pk;
+    int nbytes;
 };
 
-static int pgpSetSigMpiRSA(pgpDigAlg pgpsig, int num,
-                           const uint8_t *p, const uint8_t *pend)
+static int pgpSetSigMpiRSA(pgpDigAlg pgpsig, int num, const uint8_t *p)
 {
     struct pgpDigSigRSA_s *sig = pgpsig->data;
+    int mlen = pgpMpiLen(p) - 2;
     int rc = 1;
 
+    if (!sig)
+       sig = pgpsig->data = xcalloc(1, sizeof(*sig));
+
     switch (num) {
     case 0:
-       sig = pgpsig->data = xcalloc(1, sizeof(*sig));
-       (void) mpnsethex(&sig->c, pgpMpiHex(p, pend));
-       rc = 0;
+       if (!mpnsetbin(&sig->c, p + 2, mlen))
+           rc = 0;
        break;
     }
     return rc;
 }
 
-static int pgpSetKeyMpiRSA(pgpDigAlg pgpkey, int num,
-                           const uint8_t *p, const uint8_t *pend)
+static int pgpSetKeyMpiRSA(pgpDigAlg pgpkey, int num, const uint8_t *p)
 {
     struct pgpDigKeyRSA_s *key = pgpkey->data;
+    int mlen = pgpMpiLen(p) - 2;
     int rc = 1;
 
     if (!key)
        key = pgpkey->data = xcalloc(1, sizeof(*key));
+
     switch (num) {
     case 0:
-       (void) mpbsethex(&key->rsa_pk.n, pgpMpiHex(p, pend));
-       rc = 0;
+       key->nbytes = mlen;
+       if (!mpbsetbin(&key->rsa_pk.n, p + 2, mlen))
+           rc = 0;
        break;
     case 1:
-       (void) mpnsethex(&key->rsa_pk.e, pgpMpiHex(p, pend));
-       rc = 0;
+       if (!mpnsetbin(&key->rsa_pk.e, p + 2, mlen))
+           rc = 0;
        break;
     }
     return rc;
 }
 
+static int pkcs1pad(mpnumber *rsahm, int nbytes, const char *prefix, uint8_t *hash, size_t hashlen)
+{
+    int datalen = strlen(prefix) / 2 + hashlen;
+    byte *buf, *bp;
+    int rc = 1;
+
+    if (nbytes < 4 + datalen)
+       return 1;
+    buf = xmalloc(nbytes);
+    memset(buf, 0xff, nbytes);
+    buf[0] = 0x00;
+    buf[1] = 0x01;
+    bp = buf + nbytes - datalen;
+    bp[-1] = 0;
+    for (; *prefix; prefix += 2)
+       *bp++ = (rnibble(prefix[0]) << 4) | rnibble(prefix[1]);
+    memcpy(bp, hash, hashlen);
+    if (!mpnsetbin(rsahm, buf, nbytes))
+       rc = 0;
+    buf = _free(buf);
+    return rc;
+}
+
 static int pgpVerifySigRSA(pgpDigAlg pgpkey, pgpDigAlg pgpsig, uint8_t *hash, size_t hashlen, int hash_algo)
 {
     struct pgpDigKeyRSA_s *key = pgpkey->data;
@@ -340,28 +308,10 @@ static int pgpVerifySigRSA(pgpDigAlg pgpkey, pgpDigAlg pgpsig, uint8_t *hash, si
        return 1;
     }
 
-    /* Generate RSA modulus parameter. */
-    {   unsigned int nbits = MP_WORDS_TO_BITS(sig->c.size);
-        unsigned int nb = (nbits + 7) >> 3;
-        byte *buf, *bp;
-
-       if (nb < 3)
-           return 1;
-       buf = xmalloc(nb);
-       memset(buf, 0xff, nb);
-       buf[0] = 0x00;
-       buf[1] = 0x01;
-       bp = buf + nb - strlen(prefix)/2 - hashlen - 1;
-       if (bp < buf)
-           return 1;
-       *bp++ = 0;
-       for (; *prefix; prefix += 2)
-           *bp++ = (rnibble(prefix[0]) << 4) | rnibble(prefix[1]);
-        memcpy(bp, hash, hashlen);
-        mpnzero(&rsahm);
-        (void) mpnsetbin(&rsahm, buf, nb);
-        buf = _free(buf);
-    }
+    memset(&rsahm, 0, sizeof(rsahm));
+    if (pkcs1pad(&rsahm, key->nbytes, prefix, hash, hashlen) != 0)
+       return 1;
+
 #if HAVE_BEECRYPT_API_H
     rc = rsavrfy(&key->rsa_pk.n, &key->rsa_pk.e, &sig->c, &rsahm) == 1 ? 0 : 1;
 #else
@@ -371,6 +321,25 @@ static int pgpVerifySigRSA(pgpDigAlg pgpkey, pgpDigAlg pgpsig, uint8_t *hash, si
     return rc;
 }
 
+static void pgpFreeSigRSA(pgpDigAlg pgpsig)
+{
+    struct pgpDigSigRSA_s *sig = pgpsig->data;
+    if (sig) {
+       mpnfree(&sig->c);
+       pgpsig->data = _free(sig);
+    }
+}
+
+static void pgpFreeKeyRSA(pgpDigAlg pgpkey)
+{
+    struct pgpDigKeyRSA_s *key = pgpkey->data;
+    if (key) {
+       mpbfree(&key->rsa_pk.n);
+       mpnfree(&key->rsa_pk.e);
+       pgpkey->data = _free(key);
+    }
+}
+
 
 /****************************** DSA **************************************/
 
@@ -384,30 +353,35 @@ struct pgpDigKeyDSA_s {
     mpbarrett q;
     mpnumber g;
     mpnumber y;
+    int qbytes;
 };
 
-static int pgpSetSigMpiDSA(pgpDigAlg pgpsig, int num,
-                           const uint8_t *p, const uint8_t *pend)
+static int pgpSetSigMpiDSA(pgpDigAlg pgpsig, int num, const uint8_t *p)
 {
     struct pgpDigSigDSA_s *sig = pgpsig->data;
+    int mlen = pgpMpiLen(p) - 2;
     int rc = 1;
 
+    if (!sig)
+       sig = pgpsig->data = xcalloc(1, sizeof(*sig));
+
     switch (num) {
     case 0:
-       sig = pgpsig->data = xcalloc(1, sizeof(*sig));
-       rc = pgpHexSet(160, &sig->r, p, pend);
+       if (!mpnsetbin(&sig->r, p + 2, mlen))
+           rc = 0;
        break;
     case 1:
-       rc = pgpHexSet(160, &sig->s, p, pend);
+       if (!mpnsetbin(&sig->s, p + 2, mlen))
+           rc = 0;
        break;
     }
     return rc;
 }
 
-static int pgpSetKeyMpiDSA(pgpDigAlg pgpkey, int num,
-                           const uint8_t *p, const uint8_t *pend)
+static int pgpSetKeyMpiDSA(pgpDigAlg pgpkey, int num, const uint8_t *p)
 {
     struct pgpDigKeyDSA_s *key = pgpkey->data;
+    int mlen = pgpMpiLen(p) - 2;
     int rc = 1;
 
     if (!key)
@@ -415,20 +389,21 @@ static int pgpSetKeyMpiDSA(pgpDigAlg pgpkey, int num,
 
     switch (num) {
     case 0:
-       mpbsethex(&key->p, pgpMpiHex(p, pend));
-       rc = 0;
+       if (!mpbsetbin(&key->p, p + 2, mlen))
+           rc = 0;
        break;
     case 1:
-       mpbsethex(&key->q, pgpMpiHex(p, pend));
-       rc = 0;
+       key->qbytes = mlen;
+       if (!mpbsetbin(&key->q, p + 2, mlen))
+           rc = 0;
        break;
     case 2:
-       mpnsethex(&key->g, pgpMpiHex(p, pend));
-       rc = 0;
+       if (!mpnsetbin(&key->g, p + 2, mlen))
+           rc = 0;
        break;
     case 3:
-       mpnsethex(&key->y, pgpMpiHex(p, pend));
-       rc = 0;
+       if (!mpnsetbin(&key->y, p + 2, mlen))
+           rc = 0;
        break;
     }
     return rc;
@@ -441,17 +416,41 @@ static int pgpVerifySigDSA(pgpDigAlg pgpkey, pgpDigAlg pgpsig, uint8_t *hash, si
     mpnumber hm;
     int rc = 1;
 
-    if (sig && key) {
+    if (sig && key && hashlen >= key->qbytes) {
        mpnzero(&hm);
-       mpnsetbin(&hm, hash, hashlen);
+       mpnsetbin(&hm, hash, key->qbytes);
        rc = dsavrfy(&key->p, &key->q, &key->g, &hm, &key->y, &sig->r, &sig->s) == 1 ? 0 : 1;
        mpnfree(&hm);
     }
     return rc;
 }
 
-static int pgpSetMpiNULL(pgpDigAlg pgpkey, int num,
-                         const uint8_t *p, const uint8_t *pend)
+static void pgpFreeSigDSA(pgpDigAlg pgpsig)
+{
+    struct pgpDigSigDSA_s *sig = pgpsig->data;
+    if (sig) {
+       mpnfree(&sig->r);
+       mpnfree(&sig->s);
+       pgpsig->data = _free(sig);
+    }
+}
+
+static void pgpFreeKeyDSA(pgpDigAlg pgpkey)
+{
+    struct pgpDigKeyDSA_s *key = pgpkey->data;
+    if (key) {
+       mpbfree(&key->p);
+       mpbfree(&key->q);
+       mpnfree(&key->g);
+       mpnfree(&key->y);
+       pgpkey->data = _free(key);
+    }
+}
+
+
+/****************************** NULL **************************************/
+
+static int pgpSetMpiNULL(pgpDigAlg pgpkey, int num, const uint8_t *p)
 {
     return 1;
 }
@@ -469,12 +468,12 @@ pgpDigAlg pgpPubkeyNew(int algo)
     switch (algo) {
     case PGPPUBKEYALGO_RSA:
         ka->setmpi = pgpSetKeyMpiRSA;
-        ka->free = pgpFreeKeyRSADSA;
+        ka->free = pgpFreeKeyRSA;
         ka->mpis = 2;
         break;
     case PGPPUBKEYALGO_DSA:
         ka->setmpi = pgpSetKeyMpiDSA;
-        ka->free = pgpFreeKeyRSADSA;
+        ka->free = pgpFreeKeyDSA;
         ka->mpis = 4;
         break;
     default:
@@ -495,13 +494,13 @@ pgpDigAlg pgpSignatureNew(int algo)
     switch (algo) {
     case PGPPUBKEYALGO_RSA:
         sa->setmpi = pgpSetSigMpiRSA;
-        sa->free = pgpFreeSigRSADSA;
+        sa->free = pgpFreeSigRSA;
         sa->verify = pgpVerifySigRSA;
         sa->mpis = 1;
         break;
     case PGPPUBKEYALGO_DSA:
         sa->setmpi = pgpSetSigMpiDSA;
-        sa->free = pgpFreeSigRSADSA;
+        sa->free = pgpFreeSigDSA;
         sa->verify = pgpVerifySigDSA;
         sa->mpis = 2;
         break;
index 8a948219dda06dbcfc93018126539eca2a51101c..992d9acf6c52f7bfec954d23e25cae007212d6bb 100644 (file)
@@ -53,6 +53,9 @@ int rpmInitCrypto(void)
      * a private context if possible.
      */
     if (!_crypto_initialized) {
+       /* NSPR sets SIGPIPE to ignore behind our back, save and restore */
+       struct sigaction oact;
+       sigaction(SIGPIPE, NULL, &oact);
 #if HAVE_NSS_INITCONTEXT
        PRUint32 flags = (NSS_INIT_READONLY|NSS_INIT_NOCERTDB|
                          NSS_INIT_NOMODDB|NSS_INIT_FORCEOPEN|
@@ -62,10 +65,12 @@ int rpmInitCrypto(void)
 #else
        if (NSS_NoDB_Init(NULL) != SECSuccess) {
 #endif
+           rpmlog(RPMLOG_ERR, _("Failed to initialize NSS library\n"));
            rc = -1;
        } else {
            _crypto_initialized = 1;
        }
+       sigaction(SIGPIPE, &oact, NULL);
     }
 
     /* Register one post-fork handler per process */
@@ -223,8 +228,7 @@ static SECOidTag getHashAlg(unsigned int hashalgo)
     return SEC_OID_UNKNOWN;
 }
 
-static int pgpMpiSet(unsigned int lbits, uint8_t *dest,
-                    const uint8_t * p, const uint8_t * pend)
+static int pgpMpiSet(unsigned int lbits, uint8_t *dest, const uint8_t * p)
 {
     unsigned int mbits = pgpMpiBits(p);
     unsigned int nbits;
@@ -232,9 +236,6 @@ static int pgpMpiSet(unsigned int lbits, uint8_t *dest,
     uint8_t *t = dest;
     unsigned int ix;
 
-    if ((p + ((mbits+7) >> 3)) > pend)
-       return 1;
-
     if (mbits > lbits)
        return 1;
 
@@ -249,14 +250,10 @@ static int pgpMpiSet(unsigned int lbits, uint8_t *dest,
     return 0;
 }
 
-static SECItem *pgpMpiItem(PRArenaPool *arena, SECItem *item,
-                          const uint8_t *p, const uint8_t *pend)
+static SECItem *pgpMpiItem(PRArenaPool *arena, SECItem *item, const uint8_t *p)
 {
     size_t nbytes = pgpMpiLen(p)-2;
 
-    if (p + nbytes + 2 > pend)
-       return NULL;
-
     if (item == NULL) {
        if ((item=SECITEM_AllocItem(arena, item, nbytes)) == NULL)
            return item;
@@ -312,25 +309,28 @@ static SECKEYPublicKey *pgpNewPublicKey(KeyType type)
 #define DSA1_Q_BITS DSA_Q_BITS
 #endif
 
-static int pgpSetSigMpiDSA(pgpDigAlg pgpsig, int num,
-                          const uint8_t *p, const uint8_t *pend)
+static int pgpSetSigMpiDSA(pgpDigAlg pgpsig, int num, const uint8_t *p)
 {
     SECItem *sig = pgpsig->data;
-    int lbits = DSA1_Q_BITS;
+    unsigned int qbits = DSA1_Q_BITS;
+    unsigned int subprlen = DSA1_SUBPRIME_LEN;
+    unsigned int siglen = DSA1_SIGNATURE_LEN;
     int rc = 1; /* assume failure */
 
     switch (num) {
     case 0:
-       sig = pgpsig->data = SECITEM_AllocItem(NULL, NULL, DSA1_SIGNATURE_LEN);
+       sig = pgpsig->data = SECITEM_AllocItem(NULL, NULL, siglen);
        if (sig) {
-           memset(sig->data, 0, DSA1_SIGNATURE_LEN);
-           rc = pgpMpiSet(lbits, sig->data, p, pend);
+           memset(sig->data, 0, siglen);
+           rc = pgpMpiSet(qbits, sig->data, p);
        }
        break;
     case 1:
-       if (sig && pgpMpiSet(lbits, sig->data+DSA1_SUBPRIME_LEN, p, pend) == 0) {
+       if (sig && pgpMpiSet(qbits, sig->data+subprlen, p) == 0) {
            SECItem *signew = SECITEM_AllocItem(NULL, NULL, 0);
-           if (signew && DSAU_EncodeDerSig(signew, sig) == SECSuccess) {
+           if (signew == NULL)
+               break;
+           if (DSAU_EncodeDerSigWithLen(signew, sig, siglen) == SECSuccess) {
                SECITEM_FreeItem(sig, PR_TRUE);
                pgpsig->data = signew;
                rc = 0;
@@ -342,8 +342,7 @@ static int pgpSetSigMpiDSA(pgpDigAlg pgpsig, int num,
     return rc;
 }
 
-static int pgpSetKeyMpiDSA(pgpDigAlg pgpkey, int num,
-                          const uint8_t *p, const uint8_t *pend)
+static int pgpSetKeyMpiDSA(pgpDigAlg pgpkey, int num, const uint8_t *p)
 {
     SECItem *mpi = NULL;
     SECKEYPublicKey *key = pgpkey->data;
@@ -354,16 +353,16 @@ static int pgpSetKeyMpiDSA(pgpDigAlg pgpkey, int num,
     if (key) {
        switch (num) {
        case 0:
-           mpi = pgpMpiItem(key->arena, &key->u.dsa.params.prime, p, pend);
+           mpi = pgpMpiItem(key->arena, &key->u.dsa.params.prime, p);
            break;
        case 1:
-           mpi = pgpMpiItem(key->arena, &key->u.dsa.params.subPrime, p, pend);
+           mpi = pgpMpiItem(key->arena, &key->u.dsa.params.subPrime, p);
            break;
        case 2:
-           mpi = pgpMpiItem(key->arena, &key->u.dsa.params.base, p, pend);
+           mpi = pgpMpiItem(key->arena, &key->u.dsa.params.base, p);
            break;
        case 3:
-           mpi = pgpMpiItem(key->arena, &key->u.dsa.publicValue, p, pend);
+           mpi = pgpMpiItem(key->arena, &key->u.dsa.publicValue, p);
            break;
        }
     }
@@ -388,21 +387,19 @@ static int pgpVerifySigDSA(pgpDigAlg pgpkey, pgpDigAlg pgpsig,
     return (rc != SECSuccess);
 }
 
-static int pgpSetSigMpiRSA(pgpDigAlg pgpsig, int num,
-                          const uint8_t *p, const uint8_t *pend)
+static int pgpSetSigMpiRSA(pgpDigAlg pgpsig, int num, const uint8_t *p)
 {
     SECItem *sigitem = NULL;
 
     if (num == 0) {
-       sigitem = pgpMpiItem(NULL, pgpsig->data, p, pend);
+       sigitem = pgpMpiItem(NULL, pgpsig->data, p);
        if (sigitem)
            pgpsig->data = sigitem;
     }
     return (sigitem == NULL);
 }
 
-static int pgpSetKeyMpiRSA(pgpDigAlg pgpkey, int num,
-                          const uint8_t *p, const uint8_t *pend)
+static int pgpSetKeyMpiRSA(pgpDigAlg pgpkey, int num, const uint8_t *p)
 {
     SECItem *kitem = NULL;
     SECKEYPublicKey *key = pgpkey->data;
@@ -413,10 +410,10 @@ static int pgpSetKeyMpiRSA(pgpDigAlg pgpkey, int num,
     if (key) {
        switch (num) {
        case 0:
-           kitem = pgpMpiItem(key->arena, &key->u.rsa.modulus, p, pend);
+           kitem = pgpMpiItem(key->arena, &key->u.rsa.modulus, p);
            break;
        case 1:
-           kitem = pgpMpiItem(key->arena, &key->u.rsa.publicExponent, p, pend);
+           kitem = pgpMpiItem(key->arena, &key->u.rsa.publicExponent, p);
            break;
        }
     }
@@ -471,8 +468,7 @@ static void pgpFreeKeyRSADSA(pgpDigAlg ka)
     ka->data = NULL;
 }
 
-static int pgpSetMpiNULL(pgpDigAlg pgpkey, int num,
-                        const uint8_t *p, const uint8_t *pend)
+static int pgpSetMpiNULL(pgpDigAlg pgpkey, int num, const uint8_t *p)
 {
     return 1;
 }
diff --git a/rpmio/digest_openssl.c b/rpmio/digest_openssl.c
new file mode 100644 (file)
index 0000000..18e52a7
--- /dev/null
@@ -0,0 +1,839 @@
+#include "system.h"
+
+#include <openssl/evp.h>
+#include <openssl/rsa.h>
+#include <openssl/dsa.h>
+#include <rpm/rpmpgp.h>
+
+#include "rpmio/digest.h"
+
+
+/* Compatibility functions for OpenSSL 1.0.2 */
+
+#ifndef HAVE_EVP_MD_CTX_NEW
+# define EVP_MD_CTX_new EVP_MD_CTX_create
+# define EVP_MD_CTX_free EVP_MD_CTX_destroy
+#endif
+
+#ifndef HAVE_RSA_SET0_KEY
+int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d);
+int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d)
+{
+    if (!r) return 0;
+
+    if (n) {
+        r->n = n;
+    }
+
+    if (e) {
+        r->e = e;
+    }
+
+    if (d) {
+        r->d = d;
+    }
+
+    return 1;
+}
+#endif /* HAVE_RSA_SET0_KEY */
+
+#ifndef HAVE_DSA_SET0_KEY
+int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key);
+
+int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
+{
+    if (!d) return 0;
+
+    if (pub_key) {
+        d->pub_key = pub_key;
+    }
+
+    if (priv_key) {
+        d->priv_key = priv_key;
+    }
+
+    return 1;
+}
+#endif /* HAVE_DSA_SET0_KEY */
+
+#ifndef HAVE_DSA_SET0_PQG
+int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g);
+
+int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
+{
+    if (!d) return 0;
+
+    if (p) {
+        d->p = p;
+    }
+
+    if (q) {
+        d->q = q;
+    }
+
+    if (g) {
+        d->g = g;
+    }
+
+    return 1;
+}
+#endif /* HAVE_DSA_SET0_PQG */
+
+#ifndef HAVE_DSA_SIG_SET0
+int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s);
+
+int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s)
+{
+    if (!sig) return 0;
+
+    if (r) {
+        sig->r = r;
+    }
+
+    if (s) {
+        sig->s = s;
+    }
+
+    return 1;
+}
+#endif /* HAVE_DSA_SIG_SET0 */
+
+#ifndef HAVE_BN2BINPAD
+static int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen)
+{
+    int i;
+
+    i = BN_num_bytes(a);
+    if (tolen < i)
+        return -1;
+
+    /* Add leading zeroes if necessary */
+    if (tolen > i) {
+        memset(to, 0, tolen - i);
+        to += tolen - i;
+    }
+
+    BN_bn2bin(a, to);
+
+    return tolen;
+}
+#endif /* HAVE_BN2BINPAD */
+
+struct DIGEST_CTX_s {
+    rpmDigestFlags flags;      /*!< Bit(s) to control digest operation. */
+    int algo;                  /*!< Used hash algorithm */
+
+    EVP_MD_CTX *md_ctx; /* Digest context (opaque) */
+
+};
+
+/****************************  init   ************************************/
+
+int rpmInitCrypto(void) {
+    return 0;
+}
+
+int rpmFreeCrypto(void) {
+    return 0;
+}
+
+/****************************  digest ************************************/
+
+DIGEST_CTX rpmDigestDup(DIGEST_CTX octx)
+{
+    if (!octx) return NULL;
+
+    DIGEST_CTX nctx = NULL;
+    nctx = xcalloc(1, sizeof(*nctx));
+
+    nctx->flags = octx->flags;
+    nctx->algo = octx->algo;
+    nctx->md_ctx = EVP_MD_CTX_new();
+    if (!nctx->md_ctx) {
+        free(nctx);
+        return NULL;
+    }
+
+    if (!EVP_MD_CTX_copy(nctx->md_ctx, octx->md_ctx)) {
+        free(nctx);
+        return NULL;
+    }
+
+    return nctx;
+}
+
+static const EVP_MD *getEVPMD(int hashalgo)
+{
+    switch (hashalgo) {
+
+    case PGPHASHALGO_MD5:
+        return EVP_md5();
+
+    case PGPHASHALGO_SHA1:
+        return EVP_sha1();
+
+    case PGPHASHALGO_RIPEMD160:
+        return EVP_ripemd160();
+
+    case PGPHASHALGO_MD2:
+        return EVP_md2();
+
+    case PGPHASHALGO_SHA256:
+        return EVP_sha256();
+
+    case PGPHASHALGO_SHA384:
+        return EVP_sha384();
+
+    case PGPHASHALGO_SHA512:
+        return EVP_sha512();
+
+    case PGPHASHALGO_SHA224:
+        return EVP_sha224();
+
+    default:
+        return EVP_md_null();
+    }
+}
+
+size_t rpmDigestLength(int hashalgo)
+{
+    return EVP_MD_size(getEVPMD(hashalgo));
+}
+
+DIGEST_CTX rpmDigestInit(int hashalgo, rpmDigestFlags flags)
+{
+    DIGEST_CTX ctx = xcalloc(1, sizeof(*ctx));
+
+    ctx->md_ctx = EVP_MD_CTX_new();
+    if (!ctx->md_ctx) {
+        free(ctx);
+        return NULL;
+    }
+
+    const EVP_MD *md = getEVPMD(hashalgo);
+    if (md == EVP_md_null()) {
+        free(ctx->md_ctx);
+        free(ctx);
+        return NULL;
+    }
+
+    ctx->algo = hashalgo;
+    ctx->flags = flags;
+    if (!EVP_DigestInit_ex(ctx->md_ctx, md, NULL)) {
+        free(ctx->md_ctx);
+        free(ctx);
+        return NULL;
+    }
+
+    return ctx;
+}
+
+int rpmDigestUpdate(DIGEST_CTX ctx, const void *data, size_t len)
+{
+    if (ctx == NULL) return -1;
+
+    EVP_DigestUpdate(ctx->md_ctx, data, len);
+
+    return 0;
+}
+
+int rpmDigestFinal(DIGEST_CTX ctx, void ** datap, size_t *lenp, int asAscii)
+{
+    int ret;
+    unsigned char *digest = NULL;
+    unsigned int digestlen;
+
+    if (ctx == NULL) return -1;
+
+    digestlen = EVP_MD_CTX_size(ctx->md_ctx);
+    digest = xcalloc(digestlen, sizeof(*digest));
+
+    ret = EVP_DigestFinal_ex(ctx->md_ctx, digest, &digestlen);
+    if (ret != 1) goto done;
+
+    if (!asAscii) {
+        /* Raw data requested */
+        if (lenp) *lenp = digestlen;
+        if (datap) {
+            *datap = digest;
+            digest = NULL;
+        }
+    }
+
+    else {
+        /* ASCII requested */
+        if (lenp) *lenp = (2*digestlen) + 1;
+        if (datap) {
+            const uint8_t * s = (const uint8_t *) digest;
+            *datap = pgpHexStr(s, digestlen);
+        }
+    }
+
+    ret = 1;
+
+done:
+    if (digest) {
+        /* Zero the digest, just in case it's sensitive */
+        memset(digest, 0, digestlen);
+        free(digest);
+    }
+
+    EVP_MD_CTX_free(ctx->md_ctx);
+    free(ctx);
+
+    if (ret != 1) {
+        return -1;
+    }
+
+    return 0;
+}
+
+
+/****************************** RSA **************************************/
+
+/* Key */
+
+struct pgpDigKeyRSA_s {
+    size_t nbytes; /* Size of modulus */
+
+    BIGNUM *n; /* Common Modulus */
+    BIGNUM *e; /* Public Exponent */
+
+    EVP_PKEY *evp_pkey; /* Fully constructed key */
+};
+
+static int constructRSASigningKey(struct pgpDigKeyRSA_s *key)
+{
+    if (key->evp_pkey) {
+        /* We've already constructed it, so just reuse it */
+        return 1;
+    }
+
+    /* Create the RSA key */
+    RSA *rsa = RSA_new();
+    if (!rsa) return 0;
+
+    if (!RSA_set0_key(rsa, key->n, key->e, NULL)) {
+        RSA_free(rsa);
+        return 0;
+    }
+
+    /* Create an EVP_PKEY container to abstract the key-type. */
+    key->evp_pkey = EVP_PKEY_new();
+    if (!key->evp_pkey) {
+        RSA_free(rsa);
+        return 0;
+    }
+
+    /* Assign the RSA key to the EVP_PKEY structure.
+       This will take over memory management of the RSA key */
+    if (!EVP_PKEY_assign_RSA(key->evp_pkey, rsa)) {
+        EVP_PKEY_free(key->evp_pkey);
+        key->evp_pkey = NULL;
+        RSA_free(rsa);
+    }
+
+    return 1;
+}
+
+static int pgpSetKeyMpiRSA(pgpDigAlg pgpkey, int num, const uint8_t *p)
+{
+    size_t mlen = pgpMpiLen(p) - 2;
+    struct pgpDigKeyRSA_s *key = pgpkey->data;
+
+    if (!key) {
+        key = pgpkey->data = xcalloc(1, sizeof(*key));
+    }
+
+    switch (num) {
+    case 0:
+        /* Modulus */
+        if (key->n) {
+            /* This should only ever happen once per key */
+            return 1;
+        }
+
+        key->nbytes = mlen;
+        /* Create a BIGNUM from the pointer.
+           Note: this assumes big-endian data as required by PGP */
+        key->n = BN_bin2bn(p+2, mlen, NULL);
+        if (!key->n) return 1;
+        break;
+
+    case 1:
+        /* Exponent */
+        if (key->e) {
+            /* This should only ever happen once per key */
+            return 1;
+        }
+
+        /* Create a BIGNUM from the pointer.
+           Note: this assumes big-endian data as required by PGP */
+        key->e = BN_bin2bn(p+2, mlen, NULL);
+        if (!key->e) return 1;
+        break;
+    }
+
+    return 0;
+}
+
+static void pgpFreeKeyRSA(pgpDigAlg pgpkey)
+{
+    struct pgpDigKeyRSA_s *key = pgpkey->data;
+    if (key) {
+        if (key->evp_pkey) {
+            EVP_PKEY_free(key->evp_pkey);
+        } else {
+            /* If key->evp_pkey was constructed,
+             * the memory management of these BNs
+             * are freed with it. */
+            BN_clear_free(key->n);
+            BN_clear_free(key->e);
+        }
+
+        free(key);
+    }
+}
+
+/* Signature */
+
+struct pgpDigSigRSA_s {
+    BIGNUM *bn;
+    size_t len;
+};
+
+static int pgpSetSigMpiRSA(pgpDigAlg pgpsig, int num, const uint8_t *p)
+{
+    BIGNUM *bn = NULL;
+
+    int mlen = pgpMpiLen(p) - 2;
+    int rc = 1;
+
+    struct pgpDigSigRSA_s *sig = pgpsig->data;
+    if (!sig) {
+        sig = xcalloc(1, sizeof(*sig));
+    }
+
+    switch (num) {
+    case 0:
+        if (sig->bn) {
+            /* This should only ever happen once per signature */
+            return 1;
+        }
+
+        bn = sig->bn = BN_new();
+        if (!bn) return 1;
+
+        /* Create a BIGNUM from the signature pointer.
+           Note: this assumes big-endian data as required
+           by the PGP multiprecision integer format
+           (RFC4880, Section 3.2)
+           This will be useful later, as we can
+           retrieve this value with appropriate
+           padding. */
+        bn = BN_bin2bn(p+2, mlen, bn);
+        if (!bn) return 1;
+
+        sig->bn = bn;
+        sig->len = mlen;
+
+        pgpsig->data = sig;
+        rc = 0;
+        break;
+    }
+    return rc;
+}
+
+static void pgpFreeSigRSA(pgpDigAlg pgpsig)
+{
+    struct pgpDigSigRSA_s *sig = pgpsig->data;
+    if (sig) {
+        BN_clear_free(sig->bn);
+        free(pgpsig->data);
+    }
+}
+
+static int pgpVerifySigRSA(pgpDigAlg pgpkey, pgpDigAlg pgpsig,
+                           uint8_t *hash, size_t hashlen, int hash_algo)
+{
+    int rc, ret;
+    EVP_PKEY_CTX *pkey_ctx = NULL;
+    struct pgpDigSigRSA_s *sig = pgpsig->data;
+
+    void *padded_sig = NULL;
+
+    struct pgpDigKeyRSA_s *key = pgpkey->data;
+
+    if (!constructRSASigningKey(key)) {
+        rc = 1;
+        goto done;
+    }
+
+    pkey_ctx = EVP_PKEY_CTX_new(key->evp_pkey, NULL);
+    if (!pkey_ctx) {
+        rc = 1;
+        goto done;
+    }
+
+    ret = EVP_PKEY_verify_init(pkey_ctx);
+    if (ret < 0) {
+        rc = 1;
+        goto done;
+    }
+
+    ret = EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PADDING);
+    if (ret < 0) {
+        rc = 1;
+        goto done;
+    }
+
+    ret = EVP_PKEY_CTX_set_signature_md(pkey_ctx, getEVPMD(hash_algo));
+    if (ret < 0) {
+        rc = 1;
+        goto done;
+    }
+
+    int pkey_len = EVP_PKEY_size(key->evp_pkey);
+    padded_sig = xcalloc(1, pkey_len);
+    if (!BN_bn2binpad(sig->bn, padded_sig, pkey_len)) {
+        rc = 1;
+        goto done;
+    }
+
+    ret = EVP_PKEY_verify(pkey_ctx, padded_sig, pkey_len, hash, hashlen);
+    if (ret == 1)
+    {
+        /* Success */
+        rc = 0;
+    }
+    else
+    {
+        /* Failure */
+        rc = 1;
+    }
+
+done:
+    EVP_PKEY_CTX_free(pkey_ctx);
+    free(padded_sig);
+    return rc;
+}
+
+/****************************** DSA ***************************************/
+/* Key */
+
+struct pgpDigKeyDSA_s {
+    BIGNUM *p; /* Prime */
+    BIGNUM *q; /* Subprime */
+    BIGNUM *g; /* Base */
+    BIGNUM *y; /* Public Key */
+
+    DSA *dsa_key; /* Fully constructed key */
+};
+
+static int constructDSASigningKey(struct pgpDigKeyDSA_s *key)
+{
+    int rc;
+
+    if (key->dsa_key) {
+        /* We've already constructed it, so just reuse it */
+        return 1;
+    }
+
+    /* Create the DSA key */
+    DSA *dsa = DSA_new();
+    if (!dsa) return 0;
+
+    if (!DSA_set0_pqg(dsa, key->p, key->q, key->g)) {
+        rc = 0;
+        goto done;
+    }
+
+    if (!DSA_set0_key(dsa, key->y, NULL)) {
+        rc = 0;
+        goto done;
+    }
+
+    key->dsa_key = dsa;
+
+    rc = 1;
+done:
+    if (rc == 0) {
+        DSA_free(dsa);
+    }
+    return rc;
+}
+
+
+static int pgpSetKeyMpiDSA(pgpDigAlg pgpkey, int num, const uint8_t *p)
+{
+    BIGNUM *bn;
+    size_t mlen = pgpMpiLen(p) - 2;
+    struct pgpDigKeyDSA_s *key = pgpkey->data;
+
+    if (!key) {
+        key = pgpkey->data = xcalloc(1, sizeof(*key));
+    }
+
+    /* Create a BIGNUM from the key pointer.
+       Note: this assumes big-endian data as required
+       by the PGP multiprecision integer format
+       (RFC4880, Section 3.2) */
+    bn = BN_bin2bn(p+2, mlen, NULL);
+    if (!bn) return 1;
+
+    switch (num) {
+    case 0:
+        /* Prime */
+        if (key->p) {
+            /* This should only ever happen once per key */
+            return 1;
+        }
+        key->p = bn;
+        break;
+
+    case 1:
+        /* Subprime */
+        if (key->q) {
+            /* This should only ever happen once per key */
+            return 1;
+        }
+        key->q = bn;
+        break;
+    case 2:
+        /* Base */
+        if (key->g) {
+            /* This should only ever happen once per key */
+            return 1;
+        }
+        key->g = bn;
+        break;
+    case 3:
+        /* Public */
+        if (key->y) {
+            /* This should only ever happen once per key */
+            return 1;
+        }
+        key->y = bn;
+        break;
+    }
+
+    return 0;
+}
+
+static void pgpFreeKeyDSA(pgpDigAlg pgpkey)
+{
+    struct pgpDigKeyDSA_s *key = pgpkey->data;
+    if (key) {
+        if (key->dsa_key) {
+            DSA_free(key->dsa_key);
+        } else {
+            /* If sig->dsa_key was constructed,
+             * the memory management of these BNs
+             * are freed with it. */
+            BN_clear_free(key->p);
+            BN_clear_free(key->q);
+            BN_clear_free(key->g);
+            BN_clear_free(key->y);
+        }
+        free(key);
+    }
+}
+
+/* Signature */
+
+struct pgpDigSigDSA_s {
+    BIGNUM *r;
+    BIGNUM *s;
+
+    DSA_SIG *dsa_sig;
+};
+
+static int constructDSASignature(struct pgpDigSigDSA_s *sig)
+{
+    int rc;
+
+    if (sig->dsa_sig) {
+        /* We've already constructed it, so just reuse it */
+        return 1;
+    }
+
+    /* Create the DSA signature */
+    DSA_SIG *dsa_sig = DSA_SIG_new();
+    if (!dsa_sig) return 0;
+
+    if (!DSA_SIG_set0(dsa_sig, sig->r, sig->s)) {
+        rc = 0;
+        goto done;
+    }
+
+    sig->dsa_sig = dsa_sig;
+
+    rc = 1;
+done:
+    if (rc == 0) {
+        DSA_SIG_free(sig->dsa_sig);
+    }
+    return rc;
+}
+
+static int pgpSetSigMpiDSA(pgpDigAlg pgpsig, int num, const uint8_t *p)
+{
+    BIGNUM *bn = NULL;
+
+    int mlen = pgpMpiLen(p) - 2;
+    int rc = 1;
+
+    struct pgpDigSigDSA_s *sig = pgpsig->data;
+    if (!sig) {
+        sig = xcalloc(1, sizeof(*sig));
+    }
+
+    /* Create a BIGNUM from the signature pointer.
+       Note: this assumes big-endian data as required
+       by the PGP multiprecision integer format
+       (RFC4880, Section 3.2) */
+    bn = BN_bin2bn(p+2, mlen, NULL);
+    if (!bn) return 1;
+
+    switch (num) {
+    case 0:
+        if (sig->r) {
+            /* This should only ever happen once per signature */
+            BN_free(bn);
+            return 1;
+        }
+        sig->r = bn;
+        rc = 0;
+        break;
+    case 1:
+        if (sig->s) {
+            /* This should only ever happen once per signature */
+            BN_free(bn);
+            return 1;
+        }
+        sig->s = bn;
+        rc = 0;
+        break;
+    }
+
+    pgpsig->data = sig;
+
+    return rc;
+}
+
+static void pgpFreeSigDSA(pgpDigAlg pgpsig)
+{
+    struct pgpDigSigDSA_s *sig = pgpsig->data;
+    if (sig) {
+        if (sig->dsa_sig) {
+            DSA_SIG_free(sig->dsa_sig);
+        } else {
+            /* If sig->dsa_sig was constructed,
+             * the memory management of these BNs
+             * are freed with it. */
+            BN_clear_free(sig->r);
+            BN_clear_free(sig->s);
+        }
+        free(pgpsig->data);
+    }
+}
+
+static int pgpVerifySigDSA(pgpDigAlg pgpkey, pgpDigAlg pgpsig,
+                           uint8_t *hash, size_t hashlen, int hash_algo)
+{
+    int rc, ret;
+    struct pgpDigSigDSA_s *sig = pgpsig->data;
+
+    struct pgpDigKeyDSA_s *key = pgpkey->data;
+
+    if (!constructDSASigningKey(key)) {
+        rc = 1;
+        goto done;
+    }
+
+    if (!constructDSASignature(sig)) {
+        rc = 1;
+        goto done;
+    }
+
+    ret = DSA_do_verify(hash, hashlen, sig->dsa_sig, key->dsa_key);
+    if (ret == 1)
+    {
+        /* Success */
+        rc = 0;
+    }
+    else
+    {
+        /* Failure */
+        rc = 1;
+    }
+
+done:
+    return rc;
+}
+
+/****************************** NULL **************************************/
+
+static int pgpSetMpiNULL(pgpDigAlg pgpkey, int num, const uint8_t *p)
+{
+    return 1;
+}
+
+static int pgpVerifyNULL(pgpDigAlg pgpkey, pgpDigAlg pgpsig,
+                         uint8_t *hash, size_t hashlen, int hash_algo)
+{
+    return 1;
+}
+
+/****************************** PGP **************************************/
+pgpDigAlg pgpPubkeyNew(int algo)
+{
+    pgpDigAlg ka = xcalloc(1, sizeof(*ka));;
+
+    switch (algo) {
+    case PGPPUBKEYALGO_RSA:
+        ka->setmpi = pgpSetKeyMpiRSA;
+        ka->free = pgpFreeKeyRSA;
+        ka->mpis = 2;
+        break;
+    case PGPPUBKEYALGO_DSA:
+        ka->setmpi = pgpSetKeyMpiDSA;
+        ka->free = pgpFreeKeyDSA;
+        ka->mpis = 4;
+        break;
+    default:
+        ka->setmpi = pgpSetMpiNULL;
+        ka->mpis = -1;
+        break;
+    }
+
+    ka->verify = pgpVerifyNULL; /* keys can't be verified */
+
+    return ka;
+}
+
+pgpDigAlg pgpSignatureNew(int algo)
+{
+    pgpDigAlg sa = xcalloc(1, sizeof(*sa));
+
+    switch (algo) {
+    case PGPPUBKEYALGO_RSA:
+        sa->setmpi = pgpSetSigMpiRSA;
+        sa->free = pgpFreeSigRSA;
+        sa->verify = pgpVerifySigRSA;
+        sa->mpis = 1;
+        break;
+    case PGPPUBKEYALGO_DSA:
+        sa->setmpi = pgpSetSigMpiDSA;
+        sa->free = pgpFreeSigDSA;
+        sa->verify = pgpVerifySigDSA;
+        sa->mpis = 2;
+        break;
+    default:
+        sa->setmpi = pgpSetMpiNULL;
+        sa->verify = pgpVerifyNULL;
+        sa->mpis = -1;
+        break;
+    }
+    return sa;
+}
index c1bb04334573214a3bfbfe7063ee07770c5e3e3b..7858b10b22455f539d0dff1ff61346ce92a5263f 100644 (file)
@@ -4,6 +4,8 @@
 
 #include "system.h"
 #include <stdarg.h>
+#include <pthread.h>
+#include <errno.h>
 #ifdef HAVE_GETOPT_H
 #include <getopt.h>
 #else
@@ -34,21 +36,31 @@ extern int optind;
 
 #include "debug.h"
 
+enum macroFlags_e {
+    ME_NONE    = 0,
+    ME_AUTO    = (1 << 0),
+    ME_USED    = (1 << 1),
+};
+
 /*! The structure used to store a macro. */
 struct rpmMacroEntry_s {
     struct rpmMacroEntry_s *prev;/*!< Macro entry stack. */
-    char *name;        /*!< Macro name. */
-    char *opts;        /*!< Macro parameters (a la getopt) */
-    char *body;        /*!< Macro body. */
-    int used;           /*!< No. of expansions. */
+    const char *name;          /*!< Macro name. */
+    const char *opts;          /*!< Macro parameters (a la getopt) */
+    const char *body;  /*!< Macro body. */
+    int flags;         /*!< Macro state bits. */
     int level;          /*!< Scoping level. */
+    char arena[];      /*!< String arena. */
 };
 
 /*! The structure used to store the set of macros in a context. */
 struct rpmMacroContext_s {
-    rpmMacroEntry *macroTable;  /*!< Macro entry table for context. */
-    int macrosAllocated;/*!< No. of allocated macros. */
-    int firstFree;      /*!< No. of macros. */
+    rpmMacroEntry *tab;  /*!< Macro entry table (array of pointers). */
+    int n;      /*!< No. of macros. */
+    int depth;          /*!< Depth tracking when recursing from Lua  */
+    int level;          /*!< Scope level tracking when recursing from Lua  */
+    pthread_mutex_t lock;
+    pthread_mutexattr_t lockattr;
 };
 
 
@@ -58,6 +70,29 @@ rpmMacroContext rpmGlobalMacroContext = &rpmGlobalMacroContext_s;
 static struct rpmMacroContext_s rpmCLIMacroContext_s;
 rpmMacroContext rpmCLIMacroContext = &rpmCLIMacroContext_s;
 
+/*
+ * The macro engine internals do not require recursive mutexes but Lua
+ * macro bindings which can get called from the internals use the external
+ * interfaces which do perform locking. Until that is fixed somehow
+ * we'll just have to settle for recursive mutexes.
+ * Unfortunately POSIX doesn't specify static initializers for recursive
+ * mutexes so we need to have a separate PTHREAD_ONCE initializer just
+ * to initialize the otherwise static macro context mutexes. Pooh.
+ */
+static pthread_once_t locksInitialized = PTHREAD_ONCE_INIT;
+
+static void initLocks(void)
+{
+    rpmMacroContext mcs[] = { rpmGlobalMacroContext, rpmCLIMacroContext, NULL };
+
+    for (rpmMacroContext *mcp = mcs; *mcp; mcp++) {
+       rpmMacroContext mc = *mcp;
+       pthread_mutexattr_init(&mc->lockattr);
+       pthread_mutexattr_settype(&mc->lockattr, PTHREAD_MUTEX_RECURSIVE);
+       pthread_mutex_init(&mc->lock, &mc->lockattr);
+    }
+}
+
 /**
  * Macro expansion state.
  */
@@ -66,12 +101,16 @@ typedef struct MacroBuf_s {
     size_t tpos;               /*!< Current position in expansion buffer */
     size_t nb;                 /*!< No. bytes remaining in expansion buffer. */
     int depth;                 /*!< Current expansion depth. */
+    int level;                 /*!< Current scoping level */
+    int error;                 /*!< Errors encountered during expansion? */
     int macro_trace;           /*!< Pre-print macro to expand? */
     int expand_trace;          /*!< Post-print macro expansion? */
+    int escape;                        /*!< Preserve '%%' during expansion? */
+    int flags;                 /*!< Flags to control behavior */
     rpmMacroContext mc;
 } * MacroBuf;
 
-#define        _MAX_MACRO_DEPTH        16
+#define        _MAX_MACRO_DEPTH        64
 static int max_macro_depth = _MAX_MACRO_DEPTH;
 
 #define        _PRINT_MACRO_TRACE      0
@@ -80,110 +119,28 @@ static int print_macro_trace = _PRINT_MACRO_TRACE;
 #define        _PRINT_EXPAND_TRACE     0
 static int print_expand_trace = _PRINT_EXPAND_TRACE;
 
-#define        MACRO_CHUNK_SIZE        16
-
 /* forward ref */
 static int expandMacro(MacroBuf mb, const char *src, size_t slen);
+static void pushMacro(rpmMacroContext mc,
+       const char * n, const char * o, const char * b, int level, int flags);
+static void popMacro(rpmMacroContext mc, const char * n);
+static int loadMacroFile(rpmMacroContext mc, const char * fn);
 
 /* =============================================================== */
 
-/**
- * Compare macro entries by name (qsort/bsearch).
- * @param ap           1st macro entry
- * @param bp           2nd macro entry
- * @return             result of comparison
- */
-static int
-compareMacroName(const void * ap, const void * bp)
+static rpmMacroContext rpmmctxAcquire(rpmMacroContext mc)
 {
-    rpmMacroEntry ame = *((const rpmMacroEntry *)ap);
-    rpmMacroEntry bme = *((const rpmMacroEntry *)bp);
-
-    if (ame == NULL && bme == NULL)
-       return 0;
-    if (ame == NULL)
-       return 1;
-    if (bme == NULL)
-       return -1;
-    return strcmp(ame->name, bme->name);
+    if (mc == NULL)
+       mc = rpmGlobalMacroContext;
+    pthread_once(&locksInitialized, initLocks);
+    pthread_mutex_lock(&mc->lock);
+    return mc;
 }
 
-/**
- * Enlarge macro table.
- * @param mc           macro context
- */
-static void
-expandMacroTable(rpmMacroContext mc)
+static rpmMacroContext rpmmctxRelease(rpmMacroContext mc)
 {
-    if (mc->macroTable == NULL) {
-       mc->macrosAllocated = MACRO_CHUNK_SIZE;
-       mc->macroTable = (rpmMacroEntry *)
-           xmalloc(sizeof(*(mc->macroTable)) * mc->macrosAllocated);
-       mc->firstFree = 0;
-    } else {
-       mc->macrosAllocated += MACRO_CHUNK_SIZE;
-       mc->macroTable = (rpmMacroEntry *)
-           xrealloc(mc->macroTable, sizeof(*(mc->macroTable)) *
-                       mc->macrosAllocated);
-    }
-    memset(&mc->macroTable[mc->firstFree], 0, MACRO_CHUNK_SIZE * sizeof(*(mc->macroTable)));
-}
-
-/**
- * Sort entries in macro table.
- * @param mc           macro context
- */
-static void
-sortMacroTable(rpmMacroContext mc)
-{
-    int i;
-
-    if (mc == NULL || mc->macroTable == NULL)
-       return;
-
-    qsort(mc->macroTable, mc->firstFree, sizeof(*(mc->macroTable)),
-               compareMacroName);
-
-    /* Empty pointers are now at end of table. Reset first free index. */
-    for (i = 0; i < mc->firstFree; i++) {
-       if (mc->macroTable[i] != NULL)
-           continue;
-       mc->firstFree = i;
-       break;
-    }
-}
-
-void
-rpmDumpMacroTable(rpmMacroContext mc, FILE * fp)
-{
-    int nempty = 0;
-    int nactive = 0;
-
-    if (mc == NULL) mc = rpmGlobalMacroContext;
-    if (fp == NULL) fp = stderr;
-    
-    fprintf(fp, "========================\n");
-    if (mc->macroTable != NULL) {
-       int i;
-       for (i = 0; i < mc->firstFree; i++) {
-           rpmMacroEntry me;
-           if ((me = mc->macroTable[i]) == NULL) {
-               /* XXX this should never happen */
-               nempty++;
-               continue;
-           }
-           fprintf(fp, "%3d%c %s", me->level,
-                       (me->used > 0 ? '=' : ':'), me->name);
-           if (me->opts && *me->opts)
-                   fprintf(fp, "(%s)", me->opts);
-           if (me->body && *me->body)
-                   fprintf(fp, "\t%s", me->body);
-           fprintf(fp, "\n");
-           nactive++;
-       }
-    }
-    fprintf(fp, _("======================== active %d empty %d\n"),
-               nactive, nempty);
+    pthread_mutex_unlock(&mc->lock);
+    return NULL;
 }
 
 /**
@@ -191,33 +148,41 @@ rpmDumpMacroTable(rpmMacroContext mc, FILE * fp)
  * @param mc           macro context
  * @param name         macro name
  * @param namelen      no. of bytes
+ * @param pos          found/insert position
  * @return             address of slot in macro table with name (or NULL)
  */
 static rpmMacroEntry *
-findEntry(rpmMacroContext mc, const char * name, size_t namelen)
+findEntry(rpmMacroContext mc, const char *name, size_t namelen, size_t *pos)
 {
-    rpmMacroEntry key, *ret;
-    struct rpmMacroEntry_s keybuf;
-    char namebuf[namelen+1];
-    const char *mname = name;
-
-    if (mc == NULL) mc = rpmGlobalMacroContext;
-    if (mc->macroTable == NULL || mc->firstFree == 0)
-       return NULL;
-
-    if (namelen > 0) {
-       strncpy(namebuf, name, namelen);
-       namebuf[namelen] = '\0';
-       mname = namebuf;
+    /* bsearch */
+    int cmp = 1;
+    size_t l = 0;
+    size_t u = mc->n;
+    size_t i = 0;
+    while (l < u) {
+       i = (l + u) / 2;
+       rpmMacroEntry me = mc->tab[i];
+       if (namelen == 0)
+           cmp = strcmp(me->name, name);
+       else {
+           cmp = strncmp(me->name, name, namelen);
+           /* longer me->name compares greater */
+           if (cmp == 0)
+               cmp = (me->name[namelen] != '\0');
+       }
+       if (cmp < 0)
+           l = i + 1;
+       else if (cmp > 0)
+           u = i;
+       else
+           break;
     }
-    
-    key = &keybuf;
-    memset(key, 0, sizeof(*key));
-    key->name = (char *)mname;
-    ret = (rpmMacroEntry *) bsearch(&key, mc->macroTable, mc->firstFree,
-                       sizeof(*(mc->macroTable)), compareMacroName);
-    /* XXX TODO: find 1st empty slot and return that */
-    return ret;
+
+    if (pos)
+       *pos = (cmp < 0) ? i + 1 : i;
+    if (cmp == 0)
+       return &mc->tab[i];
+    return NULL;
 }
 
 /* =============================================================== */
@@ -226,7 +191,7 @@ findEntry(rpmMacroContext mc, const char * name, size_t namelen)
  * fgets(3) analogue that reads \ continuations. Last newline always trimmed.
  * @param buf          input buffer
  * @param size         inbut buffer size (bytes)
- * @param fd           file handle
+ * @param f            file handle
  * @return             buffer, or NULL on end-of-file
  */
 static char *
@@ -316,11 +281,9 @@ static void
 printMacro(MacroBuf mb, const char * s, const char * se)
 {
     const char *senl;
-    const char *ellipsis;
-    int choplen;
 
     if (s >= se) {     /* XXX just in case */
-       fprintf(stderr, _("%3d>%*s(empty)"), mb->depth,
+       fprintf(stderr, _("%3d>%*s(empty)\n"), mb->depth,
                (2 * mb->depth + 1), "");
        return;
     }
@@ -332,19 +295,11 @@ printMacro(MacroBuf mb, const char * s, const char * se)
     for (senl = se; *senl && !iseol(*senl); senl++)
        {};
 
-    /* Limit trailing non-trace output */
-    choplen = 61 - (2 * mb->depth);
-    if ((senl - s) > choplen) {
-       senl = s + choplen;
-       ellipsis = "...";
-    } else
-       ellipsis = "";
-
     /* Substitute caret at end-of-macro position */
     fprintf(stderr, "%3d>%*s%%%.*s^", mb->depth,
        (2 * mb->depth + 1), "", (int)(se - s), s);
-    if (se[1] != '\0' && (senl - (se+1)) > 0)
-       fprintf(stderr, "%-.*s%s", (int)(senl - (se+1)), se+1, ellipsis);
+    if (se[0] != '\0' && se[1] != '\0' && (senl - (se+1)) > 0)
+       fprintf(stderr, "%-.*s", (int)(senl - (se+1)), se+1);
     fprintf(stderr, "\n");
 }
 
@@ -357,9 +312,6 @@ printMacro(MacroBuf mb, const char * s, const char * se)
 static void
 printExpansion(MacroBuf mb, const char * t, const char * te)
 {
-    const char *ellipsis;
-    int choplen;
-
     if (!(te > t)) {
        rpmlog(RPMLOG_DEBUG, _("%3d<%*s(empty)\n"), mb->depth, (2 * mb->depth + 1), "");
        return;
@@ -368,7 +320,6 @@ printExpansion(MacroBuf mb, const char * t, const char * te)
     /* Shorten output which contains newlines */
     while (te > t && iseol(te[-1]))
        te--;
-    ellipsis = "";
     if (mb->depth > 0) {
        const char *tenl;
 
@@ -376,17 +327,11 @@ printExpansion(MacroBuf mb, const char * t, const char * te)
        while ((tenl = strchr(t, '\n')) && tenl < te)
            t = ++tenl;
 
-       /* Limit expand output */
-       choplen = 61 - (2 * mb->depth);
-       if ((te - t) > choplen) {
-           te = t + choplen;
-           ellipsis = "...";
-       }
     }
 
     rpmlog(RPMLOG_DEBUG,"%3d<%*s", mb->depth, (2 * mb->depth + 1), "");
     if (te > t)
-       rpmlog(RPMLOG_DEBUG, "%.*s%s", (int)(te - t), t, ellipsis);
+       rpmlog(RPMLOG_DEBUG, "%.*s", (int)(te - t), t);
     rpmlog(RPMLOG_DEBUG, "\n");
 }
 
@@ -400,14 +345,14 @@ printExpansion(MacroBuf mb, const char * t, const char * te)
 
 #define        COPYNAME(_ne, _s, _c)   \
     {  SKIPBLANK(_s,_c);       \
-       while(((_c) = *(_s)) && (risalnum(_c) || (_c) == '_')) \
+       while (((_c) = *(_s)) && (risalnum(_c) || (_c) == '_')) \
                *(_ne)++ = *(_s)++; \
        *(_ne) = '\0';          \
     }
 
 #define        COPYOPTS(_oe, _s, _c)   \
     { \
-       while(((_c) = *(_s)) && (_c) != ')') \
+       while (((_c) = *(_s)) && (_c) != ')') \
                *(_oe)++ = *(_s)++; \
        *(_oe) = '\0';          \
     }
@@ -424,15 +369,18 @@ static int
 expandThis(MacroBuf mb, const char * src, size_t slen, char **target)
 {
     struct MacroBuf_s umb;
-    int rc;
 
     /* Copy other state from "parent", but we want a buffer of our own */
     umb = *mb;
     umb.buf = NULL;
-    rc = expandMacro(&umb, src, slen);
+    umb.error = 0;
+    /* In case of error, flag it in the "parent"... */
+    if (expandMacro(&umb, src, slen))
+       mb->error = 1;
     *target = umb.buf;
 
-    return rc;
+    /* ...but return code for this operation specifically */
+    return umb.error;
 }
 
 static void mbAppend(MacroBuf mb, char c)
@@ -446,6 +394,7 @@ static void mbAppend(MacroBuf mb, char c)
     mb->nb--;
 }
 
+#ifdef WITH_LUA
 static void mbAppendStr(MacroBuf mb, const char *str)
 {
     size_t len = strlen(str);
@@ -457,68 +406,66 @@ static void mbAppendStr(MacroBuf mb, const char *str)
     mb->tpos += len;
     mb->nb -= len;
 }
+#endif
+
 /**
  * Expand output of shell command into target buffer.
  * @param mb           macro expansion state
  * @param cmd          shell command
  * @param clen         no. bytes in shell command
- * @return             result of expansion
  */
-static int
+static void
 doShellEscape(MacroBuf mb, const char * cmd, size_t clen)
 {
     char *buf = NULL;
     FILE *shf;
-    int rc = 0;
     int c;
 
-    rpmlog(RPMLOG_WARNING, _("Refusing to run shell code: %s\n"), cmd);
-    mbAppendStr(mb, "UNEXPANDEDSHELLSCRIPT");
-#if 0
-    rc = expandThis(mb, cmd, clen, &buf);
-    if (rc)
+    if (expandThis(mb, cmd, clen, &buf))
        goto exit;
 
     if ((shf = popen(buf, "r")) == NULL) {
-       rc = 1;
+       mb->error = 1;
        goto exit;
     }
-    while((c = fgetc(shf)) != EOF) {
+
+    size_t tpos = mb->tpos;
+    while ((c = fgetc(shf)) != EOF) {
        mbAppend(mb, c);
     }
     (void) pclose(shf);
 
-    /* XXX delete trailing \r \n */
-    while (iseol(mb->buf[mb->tpos-1])) {
-       mb->buf[mb->tpos--] = '\0';
+    /* Delete trailing \r \n */
+    while (mb->tpos > tpos && iseol(mb->buf[mb->tpos-1])) {
+       mb->buf[--mb->tpos] = '\0';
        mb->nb++;
     }
 
 exit:
     _free(buf);
-#endif
-    return rc;
 }
 
 /**
  * Parse (and execute) new macro definition.
  * @param mb           macro expansion state
  * @param se           macro definition to parse
+ * @param slen         length of se argument
  * @param level                macro recursion level
  * @param expandbody   should body be expanded?
  * @return             address to continue parsing
  */
 static const char *
-doDefine(MacroBuf mb, const char * se, int level, int expandbody)
+doDefine(MacroBuf mb, const char * se, size_t slen, int level, int expandbody)
 {
     const char *s = se;
-    size_t blen = MACROBUFSIZ;
-    char *buf = xmalloc(blen);
+    char *buf = xmalloc(slen + 3); /* Some leeway for termination issues... */
     char *n = buf, *ne = n;
     char *o = NULL, *oe;
     char *b, *be, *ebody = NULL;
     int c;
     int oc = ')';
+    const char *sbody; /* as-is body start */
+    int rc = 1; /* assume failure */
 
     /* Copy name */
     COPYNAME(ne, s, c);
@@ -527,13 +474,20 @@ doDefine(MacroBuf mb, const char * se, int level, int expandbody)
     oe = ne + 1;
     if (*s == '(') {
        s++;    /* skip ( */
-       o = oe;
-       COPYOPTS(oe, s, oc);
-       s++;    /* skip ) */
+       /* Options must be terminated with ')' */
+       if (strchr(s, ')')) {
+           o = oe;
+           COPYOPTS(oe, s, oc);
+           s++;        /* skip ) */
+       } else {
+           rpmlog(RPMLOG_ERR, _("Macro %%%s has unterminated opts\n"), n);
+           goto exit;
+       }
     }
 
     /* Copy body, skipping over escaped newlines */
     b = be = oe + 1;
+    sbody = s;
     SKIPBLANK(s, c);
     if (c == '{') {    /* XXX permit silent {...} grouping */
        if ((se = matchchar(s, c, '}')) == NULL) {
@@ -594,14 +548,8 @@ doDefine(MacroBuf mb, const char * se, int level, int expandbody)
 
     /* Names must start with alphabetic or _ and be at least 3 chars */
     if (!((c = *n) && (risalpha(c) || c == '_') && (ne - n) > 2)) {
-       rpmlog(RPMLOG_ERR,
-               _("Macro %%%s has illegal name (%%define)\n"), n);
-       goto exit;
-    }
-
-    /* Options must be terminated with ')' */
-    if (o && oc != ')') {
-       rpmlog(RPMLOG_ERR, _("Macro %%%s has unterminated opts\n"), n);
+       rpmlog(RPMLOG_ERR, _("Macro %%%s has illegal name (%s)\n"),
+               n, expandbody ? "%global": "%define");
        goto exit;
     }
 
@@ -610,6 +558,9 @@ doDefine(MacroBuf mb, const char * se, int level, int expandbody)
        goto exit;
     }
 
+    if (!isblank(*sbody) && !(*sbody == '\\' && iseol(sbody[1])))
+       rpmlog(RPMLOG_WARNING, _("Macro %%%s needs whitespace before body\n"), n);
+
     if (expandbody) {
        if (expandThis(mb, b, 0, &ebody)) {
            rpmlog(RPMLOG_ERR, _("Macro %%%s failed to expand\n"), n);
@@ -618,9 +569,12 @@ doDefine(MacroBuf mb, const char * se, int level, int expandbody)
        b = ebody;
     }
 
-    addMacro(mb->mc, n, o, b, (level - 1));
+    pushMacro(mb->mc, n, o, b, level, ME_NONE);
+    rc = 0;
 
 exit:
+    if (rc)
+       mb->error = 1;
     _free(buf);
     _free(ebody);
     return se;
@@ -628,15 +582,16 @@ exit:
 
 /**
  * Parse (and execute) macro undefinition.
- * @param mc           macro context
+ * @param mb           macro expansion state
  * @param se           macro name to undefine
+ * @param slen         length of se argument
  * @return             address to continue parsing
  */
 static const char *
-doUndefine(rpmMacroContext mc, const char * se)
+doUndefine(MacroBuf mb, const char * se, size_t slen)
 {
     const char *s = se;
-    char *buf = xmalloc(MACROBUFSIZ);
+    char *buf = xmalloc(slen + 1);
     char *n = buf, *ne = n;
     int c;
 
@@ -649,70 +604,18 @@ doUndefine(rpmMacroContext mc, const char * se)
 
     /* Names must start with alphabetic or _ and be at least 3 chars */
     if (!((c = *n) && (risalpha(c) || c == '_') && (ne - n) > 2)) {
-       rpmlog(RPMLOG_ERR,
-               _("Macro %%%s has illegal name (%%undefine)\n"), n);
+       rpmlog(RPMLOG_ERR, _("Macro %%%s has illegal name (%%undefine)\n"), n);
+       mb->error = 1;
        goto exit;
     }
 
-    delMacro(mc, n);
+    popMacro(mb->mc, n);
 
 exit:
     _free(buf);
     return se;
 }
 
-/**
- * Push new macro definition onto macro entry stack.
- * @param mep          address of macro entry slot
- * @param n            macro name
- * @param o            macro parameters (NULL if none)
- * @param b            macro body (NULL becomes "")
- * @param level                macro recursion level
- */
-static void
-pushMacro(rpmMacroEntry * mep,
-               const char * n, const char * o,
-               const char * b, int level)
-{
-    rpmMacroEntry prev = (mep && *mep ? *mep : NULL);
-    rpmMacroEntry me = (rpmMacroEntry) xmalloc(sizeof(*me));
-
-    me->prev = prev;
-    me->name = (prev ? prev->name : xstrdup(n));
-    me->opts = (o ? xstrdup(o) : NULL);
-    me->body = xstrdup(b ? b : "");
-    me->used = 0;
-    me->level = level;
-    if (mep)
-       *mep = me;
-    else
-       me = _free(me);
-}
-
-/**
- * Pop macro definition from macro entry stack.
- * @param mep          address of macro entry slot
- */
-static void
-popMacro(rpmMacroEntry * mep)
-{
-    if (mep && *mep) {
-       rpmMacroEntry me = *mep;
-
-       /* restore previous definition of the macro */
-       *mep = me->prev;
-
-       /* name is shared between entries, only free if last of its kind */
-       if (me->prev == NULL)
-           free(me->name);
-       free(me->opts);
-       free(me->body);
-
-       memset(me, 0, sizeof(*me)); /* trash and burn */
-       free(me);
-    }
-}
-
 /**
  * Free parsed arguments for parameterized macro.
  * @param mb           macro expansion state
@@ -721,41 +624,60 @@ static void
 freeArgs(MacroBuf mb)
 {
     rpmMacroContext mc = mb->mc;
-    int ndeleted = 0;
-    int i;
-
-    if (mc == NULL || mc->macroTable == NULL)
-       return;
 
     /* Delete dynamic macro definitions */
-    for (i = 0; i < mc->firstFree; i++) {
-       rpmMacroEntry *mep, me;
-       int skiptest = 0;
-       mep = &mc->macroTable[i];
-       me = *mep;
-
-       if (me == NULL)         /* XXX this should never happen */
-           continue;
-       if (me->level < mb->depth)
+    for (int i = 0; i < mc->n; i++) {
+       rpmMacroEntry me = mc->tab[i];
+       assert(me);
+       if (me->level < mb->level)
            continue;
-       if (strlen(me->name) == 1 && strchr("#*0", *me->name)) {
-           if (*me->name == '*' && me->used > 0)
-               skiptest = 1; /* XXX skip test for %# %* %0 */
-       } else if (!skiptest && me->used <= 0) {
-#if NOTYET
-           rpmlog(RPMLOG_ERR,
-                       _("Macro %%%s (%s) was not used below level %d\n"),
-                       me->name, me->body, me->level);
-#endif
+       /* Warn on defined but unused non-automatic, scoped macros */
+       if (!(me->flags & (ME_AUTO|ME_USED))) {
+           rpmlog(RPMLOG_WARNING,
+                       _("Macro %%%s defined but not used within scope\n"),
+                       me->name);
+           /* Only whine once */
+           me->flags |= ME_USED;
        }
-       popMacro(mep);
-       if (!(mep && *mep))
-           ndeleted++;
+
+       /* compensate if the slot is to go away */
+       if (me->prev == NULL)
+           i--;
+       popMacro(mc, me->name);
     }
+    mb->level--;
+}
 
-    /* If any deleted macros, sort macro table */
-    if (ndeleted)
-       sortMacroTable(mc);
+static void splitQuoted(ARGV_t *av, const char * str, const char * seps)
+{
+    const int qchar = 0x1f; /* ASCII unit separator */
+    const char *s = str;
+    const char *start = str;
+    int quoted = 0;
+
+    while (start != NULL) {
+       if (!quoted && strchr(seps, *s)) {
+           size_t slen = s - start;
+           /* quoted arguments are always kept, otherwise skip empty args */
+           if (slen > 0) {
+               char *d, arg[slen + 1];
+               const char *t;
+               for (d = arg, t = start; t - start < slen; t++) {
+                   if (*t == qchar)
+                       continue;
+                   *d++ = *t;
+               }
+               arg[d - arg] = '\0';
+               argvAdd(av, arg);
+           }
+           start = s + 1;
+       }
+       if (*s == qchar)
+           quoted = !quoted;
+       else if (*s == '\0')
+           start = NULL;
+       s++;
+    }
 }
 
 /**
@@ -771,31 +693,41 @@ static const char *
 grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se,
                const char * lastc)
 {
+    const char *cont = NULL;
     const char *opts;
     char *args = NULL;
     ARGV_t argv = NULL;
     int argc = 0;
     int c;
 
-    /* Copy macro name as argv[0] */
-    argvAdd(&argv, me->name);
-    addMacro(mb->mc, "0", NULL, me->name, mb->depth);
-    
     /* 
+     * Prepare list of call arguments, starting with macro name as argv[0].
      * Make a copy of se up to lastc string that we can pass to argvSplit().
      * Append the results to main argv. 
      */
-    {  ARGV_t av = NULL;
-       char *s = xcalloc((lastc-se)+1, sizeof(*s));
-       memcpy(s, se, (lastc-se));
+    argvAdd(&argv, me->name);
+    if (lastc) {
+       int oescape = mb->escape;
+       char *s = NULL;
 
-       argvSplit(&av, s, " \t");
-       argvAppend(&argv, av);
+       /* Expand possible macros in arguments */
+       mb->escape = 1;
+       expandThis(mb, se, lastc-se, &s);
+       mb->escape = oescape;
 
-       argvFree(av);
+       splitQuoted(&argv, s, " \t");
        free(s);
+
+       cont = ((*lastc == '\0' || *lastc == '\n') && *(lastc-1) != '\\') ?
+              lastc : lastc + 1;
     }
 
+    /* Bump call depth on entry before first macro define */
+    mb->level++;
+
+    /* Setup macro name as %0 */
+    pushMacro(mb->mc, "0", NULL, me->name, mb->level, ME_AUTO);
+
     /*
      * The macro %* analoguous to the shell's $* means "Pass all non-macro
      * parameters." Consequently, there needs to be a macro that means "Pass all
@@ -805,7 +737,7 @@ grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se,
      * This is the (potential) justification for %{**} ...
     */
     args = argvJoin(argv + 1, " ");
-    addMacro(mb->mc, "**", NULL, args, mb->depth);
+    pushMacro(mb->mc, "**", NULL, args, mb->level, ME_AUTO);
     free(args);
 
     /*
@@ -822,12 +754,13 @@ grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se,
     argc = argvCount(argv);
 
     /* Define option macros. */
-    while((c = getopt(argc, argv, opts)) != -1)
+    while ((c = getopt(argc, argv, opts)) != -1)
     {
        char *name = NULL, *body = NULL;
        if (c == '?' || strchr(opts, c) == NULL) {
            rpmlog(RPMLOG_ERR, _("Unknown option %c in %s(%s)\n"),
                        (char)optopt, me->name, opts);
+           mb->error = 1;
            goto exit;
        }
 
@@ -837,13 +770,13 @@ grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se,
        } else {
            rasprintf(&body, "-%c", c);
        }
-       addMacro(mb->mc, name, NULL, body, mb->depth);
+       pushMacro(mb->mc, name, NULL, body, mb->level, ME_AUTO);
        free(name);
        free(body);
 
        if (optarg) {
            rasprintf(&name, "-%c*", c);
-           addMacro(mb->mc, name, NULL, optarg, mb->depth);
+           pushMacro(mb->mc, name, NULL, optarg, mb->level, ME_AUTO);
            free(name);
        }
     }
@@ -851,7 +784,7 @@ grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se,
     /* Add argument count (remaining non-option items) as macro. */
     {  char *ac = NULL;
        rasprintf(&ac, "%d", (argc - optind));
-       addMacro(mb->mc, "#", NULL, ac, mb->depth);
+       pushMacro(mb->mc, "#", NULL, ac, mb->level, ME_AUTO);
        free(ac);
     }
 
@@ -860,41 +793,70 @@ grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se,
        for (c = optind; c < argc; c++) {
            char *name = NULL;
            rasprintf(&name, "%d", (c - optind + 1));
-           addMacro(mb->mc, name, NULL, argv[c], mb->depth);
+           pushMacro(mb->mc, name, NULL, argv[c], mb->level, ME_AUTO);
            free(name);
        }
     }
 
     /* Add concatenated unexpanded arguments as yet another macro. */
     args = argvJoin(argv + optind, " ");
-    addMacro(mb->mc, "*", NULL, args ? args : "", mb->depth);
+    pushMacro(mb->mc, "*", NULL, args ? args : "", mb->level, ME_AUTO);
     free(args);
 
 exit:
     argvFree(argv);
-    return *lastc ? lastc + 1 : lastc; 
+    return cont;
 }
 
 /**
  * Perform macro message output
  * @param mb           macro expansion state
  * @param waserror     use rpmlog()?
- * @param msg          message to ouput
+ * @param msg          message to output
  * @param msglen       no. of bytes in message
  */
 static void
-doOutput(MacroBuf mb, int waserror, const char * msg, size_t msglen)
+doOutput(MacroBuf mb, int loglevel, const char * msg, size_t msglen)
 {
     char *buf = NULL;
 
     (void) expandThis(mb, msg, msglen, &buf);
-    if (waserror)
-       rpmlog(RPMLOG_ERR, "%s\n", buf);
-    else
-       fprintf(stderr, "%s", buf);
+    rpmlog(loglevel, "%s\n", buf);
     _free(buf);
 }
 
+static void doLua(MacroBuf mb, const char * f, size_t fn, const char * g, size_t gn)
+{
+#ifdef WITH_LUA
+    rpmlua lua = NULL; /* Global state. */
+    char *scriptbuf = xmalloc(gn + 1);
+    char *printbuf;
+    rpmMacroContext mc = mb->mc;
+    int odepth = mc->depth;
+    int olevel = mc->level;
+
+    if (g != NULL && gn > 0)
+       memcpy(scriptbuf, g, gn);
+    scriptbuf[gn] = '\0';
+    rpmluaPushPrintBuffer(lua);
+    mc->depth = mb->depth;
+    mc->level = mb->level;
+    if (rpmluaRunScript(lua, scriptbuf, NULL) == -1)
+       mb->error = 1;
+    mc->depth = odepth;
+    mc->level = olevel;
+    printbuf = rpmluaPopPrintBuffer(lua);
+    if (printbuf) {
+       mbAppendStr(mb, printbuf);
+       free(printbuf);
+    }
+    free(scriptbuf);
+#else
+    rpmlog(RPMLOG_ERR, _("<lua> scriptlet support not built in\n"));
+    mb->error = 1;
+#endif
+}
+
 /**
  * Execute macro primitives.
  * @param mb           macro expansion state
@@ -911,8 +873,14 @@ doFoo(MacroBuf mb, int negate, const char * f, size_t fn,
     char *buf = NULL;
     char *b = NULL, *be;
     int c;
+    int verbose = (rpmIsVerbose() != 0);
+    int expand = (g != NULL && gn > 0);
+
+    /* Don't expand %{verbose:...} argument on false condition */
+    if (STREQ("verbose", f, fn) && (verbose == negate))
+       expand = 0;
 
-    if (g != NULL) {
+    if (expand) {
        (void) expandThis(mb, g, gn, &buf);
     } else {
        buf = xmalloc(MACROBUFSIZ + fn + gn);
@@ -927,16 +895,38 @@ doFoo(MacroBuf mb, int negate, const char * f, size_t fn,
        if ((b = strrchr(buf, '/')) != NULL)
            *b = '\0';
        b = buf;
+    } else if (STREQ("shrink", f, fn)) {
+       /*
+        * shrink body by removing all leading and trailing whitespaces and
+        * reducing intermediate whitespaces to a single space character.
+        */
+       size_t i = 0, j = 0;
+       size_t buflen = strlen(buf);
+       int was_space = 0;
+       while (i < buflen) {
+           if (risspace(buf[i])) {
+               was_space = 1;
+               i++;
+               continue;
+           } else if (was_space) {
+               was_space = 0;
+               if (j > 0) /* remove leading blanks at all */
+                   buf[j++] = ' ';
+           }
+           buf[j++] = buf[i++];
+       }
+       buf[j] = '\0';
+       b = buf;
+    } else if (STREQ("quote", f, fn)) {
+       char *quoted = NULL;
+       rasprintf(&quoted, "%c%s%c", 0x1f, buf, 0x1f);
+       free(buf);
+       b = buf = quoted;
     } else if (STREQ("suffix", f, fn)) {
        if ((b = strrchr(buf, '.')) != NULL)
            b++;
-    } else if (STREQ("expand", f, fn)) {
+    } else if (STREQ("expand", f, fn) || STREQ("verbose", f, fn)) {
        b = buf;
-    } else if (STREQ("verbose", f, fn)) {
-       if (negate)
-           b = (rpmIsVerbose() ? NULL : buf);
-       else
-           b = (rpmIsVerbose() ? buf : NULL);
     } else if (STREQ("url2path", f, fn) || STREQ("u2p", f, fn)) {
        (void)urlPath(buf, (const char **)&b);
        if (*b == '\0') b = "/";
@@ -948,7 +938,7 @@ doFoo(MacroBuf mb, int negate, const char * f, size_t fn,
            be++;
        *be++ = '\0';
        (void) rpmFileIsCompressed(b, &compressed);
-       switch(compressed) {
+       switch (compressed) {
        default:
        case COMPRESSED_NOT:
            sprintf(be, "%%__cat %s", b);
@@ -975,6 +965,9 @@ doFoo(MacroBuf mb, int negate, const char * f, size_t fn,
        case COMPRESSED_7ZIP:
            sprintf(be, "%%__7zip x %s", b);
            break;
+       case COMPRESSED_ZSTD:
+           sprintf(be, "%%__zstd -dc %s", b);
+           break;
        }
        b = be;
     } else if (STREQ("getenv", f, fn)) {
@@ -1013,6 +1006,7 @@ doFoo(MacroBuf mb, int negate, const char * f, size_t fn,
  * The main macro recursion loop.
  * @param mb           macro expansion state
  * @param src          string to expand
+ * @param slen         length of string buffer
  * @return             0 on success, 1 on failure
  */
 static int
@@ -1025,13 +1019,19 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
     const char *g, *ge;
     size_t fn, gn, tpos;
     int c;
-    int rc = 0;
     int negate;
     const char * lastc;
     int chkexist;
     char *source = NULL;
+    int store_macro_trace;
+    int store_expand_trace;
 
-    /* Handle non-terminated substrings by creating a terminated copy */
+    /*
+     * Always make a (terminated) copy of the source string.
+     * Beware: avoiding the copy when src is known \0-terminated seems like
+     * an obvious opportunity for optimization, but doing that breaks
+     * a special case of macro undefining itself.
+     */
     if (!slen)
        slen = strlen(src);
     source = xmalloc(slen + 1);
@@ -1040,36 +1040,41 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
     s = source;
 
     if (mb->buf == NULL) {
-       size_t blen = MACROBUFSIZ + strlen(s);
-       mb->buf = xcalloc(blen + 1, sizeof(*mb->buf));
+       size_t blen = MACROBUFSIZ + slen;
+       mb->buf = xmalloc(blen + 1);
+       mb->buf[0] = '\0';
        mb->tpos = 0;
        mb->nb = blen;
     }
     tpos = mb->tpos; /* save expansion pointer for printExpand */
+    store_macro_trace = mb->macro_trace;
+    store_expand_trace = mb->expand_trace;
 
     if (++mb->depth > max_macro_depth) {
        rpmlog(RPMLOG_ERR,
                _("Too many levels of recursion in macro expansion. It is likely caused by recursive macro declaration.\n"));
        mb->depth--;
        mb->expand_trace = 1;
-       _free(source);
-       return 1;
+       mb->error = 1;
+       goto exit;
     }
 
-    while (rc == 0 && (c = *s) != '\0') {
+    while (mb->error == 0 && (c = *s) != '\0') {
        s++;
        /* Copy text until next macro */
-       switch(c) {
+       switch (c) {
        case '%':
-               if (*s) {       /* Ensure not end-of-string. */
-                   if (*s != '%')
-                       break;
-                   s++;        /* skip first % in %% */
-               }
+           if (*s) {   /* Ensure not end-of-string. */
+               if (*s != '%')
+                   break;
+               s++;    /* skip first % in %% */
+               if (mb->escape)
+                   mbAppend(mb, c);
+           }
        default:
-               mbAppend(mb, c);
-               continue;
-               break;
+           mbAppend(mb, c);
+           continue;
+           break;
        }
 
        /* Expand next macro */
@@ -1082,189 +1087,183 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
        chkexist = 0;
        switch ((c = *s)) {
        default:                /* %name substitution */
-               while (strchr("!?", *s) != NULL) {
-                       switch(*s++) {
-                       case '!':
-                               negate = ((negate + 1) % 2);
-                               break;
-                       case '?':
-                               chkexist++;
-                               break;
-                       }
-               }
-               f = se = s;
-               if (*se == '-')
-                       se++;
-               while((c = *se) && (risalnum(c) || c == '_'))
-                       se++;
-               /* Recognize non-alnum macros too */
-               switch (*se) {
-               case '*':
-                       se++;
-                       if (*se == '*') se++;
-                       break;
-               case '#':
-                       se++;
+           while (*s != '\0' && strchr("!?", *s) != NULL) {
+               switch (*s++) {
+                   case '!':
+                       negate = ((negate + 1) % 2);
                        break;
-               default:
+                   case '?':
+                       chkexist++;
                        break;
                }
-               fe = se;
-               /* For "%name " macros ... */
-               if ((c = *fe) && isblank(c))
-                       if ((lastc = strchr(fe,'\n')) == NULL)
-                lastc = strchr(fe, '\0');
+           }
+           f = se = s;
+           if (*se == '-')
+               se++;
+           while ((c = *se) && (risalnum(c) || c == '_'))
+               se++;
+           /* Recognize non-alnum macros too */
+           switch (*se) {
+           case '*':
+               se++;
+               if (*se == '*') se++;
                break;
+           case '#':
+               se++;
+               break;
+           default:
+               break;
+           }
+           fe = se;
+           /* For "%name " macros ... */
+           if ((c = *fe) && isblank(c))
+               if ((lastc = strchr(fe,'\n')) == NULL)
+                   lastc = strchr(fe, '\0');
+           break;
        case '(':               /* %(...) shell escape */
-               if ((se = matchchar(s, c, ')')) == NULL) {
-                       rpmlog(RPMLOG_ERR,
-                               _("Unterminated %c: %s\n"), (char)c, s);
-                       rc = 1;
-                       continue;
-               }
-               if (mb->macro_trace)
-                       printMacro(mb, s, se+1);
+           if ((se = matchchar(s, c, ')')) == NULL) {
+               rpmlog(RPMLOG_ERR, _("Unterminated %c: %s\n"), (char)c, s);
+               mb->error = 1;
+               continue;
+           }
+           if (mb->macro_trace)
+               printMacro(mb, s, se+1);
 
-               s++;    /* skip ( */
-               rc = doShellEscape(mb, s, (se - s));
-               se++;   /* skip ) */
+           s++;        /* skip ( */
+           doShellEscape(mb, s, (se - s));
+           se++;       /* skip ) */
 
-               s = se;
-               continue;
-               break;
+           s = se;
+           continue;
+           break;
        case '{':               /* %{...}/%{...:...} substitution */
-               if ((se = matchchar(s, c, '}')) == NULL) {
-                       rpmlog(RPMLOG_ERR,
-                               _("Unterminated %c: %s\n"), (char)c, s);
-                       rc = 1;
-                       continue;
-               }
-               f = s+1;/* skip { */
-               se++;   /* skip } */
-               while (strchr("!?", *f) != NULL) {
-                       switch(*f++) {
-                       case '!':
-                               negate = ((negate + 1) % 2);
-                               break;
-                       case '?':
-                               chkexist++;
-                               break;
-                       }
-               }
-               for (fe = f; (c = *fe) && !strchr(" :}", c);)
-                       fe++;
-               switch (c) {
-               case ':':
-                       g = fe + 1;
-                       ge = se - 1;
-                       break;
-               case ' ':
-                       lastc = se-1;
-                       break;
-               default:
-                       break;
+           if ((se = matchchar(s, c, '}')) == NULL) {
+               rpmlog(RPMLOG_ERR, _("Unterminated %c: %s\n"), (char)c, s);
+               mb->error = 1;
+               continue;
+           }
+           f = s+1;/* skip { */
+           se++;       /* skip } */
+           while (strchr("!?", *f) != NULL) {
+               switch (*f++) {
+               case '!':
+                   negate = ((negate + 1) % 2);
+                   break;
+               case '?':
+                   chkexist++;
+                   break;
                }
+           }
+           for (fe = f; (c = *fe) && !strchr(" :}", c);)
+               fe++;
+           switch (c) {
+           case ':':
+               g = fe + 1;
+               ge = se - 1;
+               break;
+           case ' ':
+               lastc = se-1;
                break;
+           default:
+               break;
+           }
+           break;
        }
 
        /* XXX Everything below expects fe > f */
        fn = (fe - f);
        gn = (ge - g);
        if ((fe - f) <= 0) {
-/* XXX Process % in unknown context */
-               c = '%';        /* XXX only need to save % */
-               mbAppend(mb, c);
+           /* XXX Process % in unknown context */
+           c = '%';    /* XXX only need to save % */
+           mbAppend(mb, c);
 #if 0
-               rpmlog(RPMLOG_ERR,
-                       _("A %% is followed by an unparseable macro\n"));
+           rpmlog(RPMLOG_ERR,
+                   _("A %% is followed by an unparseable macro\n"));
 #endif
-               s = se;
-               continue;
+           s = se;
+           continue;
        }
 
        if (mb->macro_trace)
-               printMacro(mb, s, se);
+           printMacro(mb, s, se);
 
        /* Expand builtin macros */
+       if (STREQ("load", f, fn)) {
+           char *arg = NULL;
+           if (g && gn > 0 && expandThis(mb, g, gn, &arg) == 0) {
+               /* Print failure iff %{load:...} or %{!?load:...} */
+               if (loadMacroFile(mb->mc, arg) && chkexist == negate) {
+                   rpmlog(RPMLOG_ERR, _("failed to load macro file %s"), arg);
+                   mb->error = 1;
+               }
+           }
+           free(arg);
+           s = se;
+           continue;
+       }
        if (STREQ("global", f, fn)) {
-               s = doDefine(mb, se, RMIL_GLOBAL, 1);
-               continue;
+           s = doDefine(mb, se, slen - (se - s), RMIL_GLOBAL, 1);
+           continue;
        }
        if (STREQ("define", f, fn)) {
-               s = doDefine(mb, se, mb->depth, 0);
-               continue;
+           s = doDefine(mb, se, slen - (se - s), mb->level, 0);
+           continue;
        }
        if (STREQ("undefine", f, fn)) {
-               s = doUndefine(mb->mc, se);
-               continue;
+           s = doUndefine(mb, se, slen - (se - s));
+           continue;
        }
 
        if (STREQ("echo", f, fn) ||
-           STREQ("warn", f, fn) ||
-           STREQ("error", f, fn)) {
-               int waserror = 0;
-               if (STREQ("error", f, fn))
-                       waserror = 1;
-               if (g != NULL && g < ge)
-                       doOutput(mb, waserror, g, gn);
-               else
-                       doOutput(mb, waserror, f, fn);
-               s = se;
-               continue;
+               STREQ("warn", f, fn) ||
+               STREQ("error", f, fn)) {
+           int loglevel = RPMLOG_NOTICE; /* assume echo */
+           if (STREQ("error", f, fn)) {
+               loglevel = RPMLOG_ERR;
+               mb->error = 1;
+           } else if (STREQ("warn", f, fn)) {
+               loglevel = RPMLOG_WARNING;
+           }
+           if (g != NULL && g < ge)
+               doOutput(mb, loglevel, g, gn);
+           else
+               doOutput(mb, loglevel, "", 0);
+           s = se;
+           continue;
        }
 
        if (STREQ("trace", f, fn)) {
-               /* XXX TODO restore expand_trace/macro_trace to 0 on return */
-               mb->expand_trace = mb->macro_trace = (negate ? 0 : mb->depth);
-               if (mb->depth == 1) {
-                       print_macro_trace = mb->macro_trace;
-                       print_expand_trace = mb->expand_trace;
-               }
-               s = se;
-               continue;
+           /* XXX TODO restore expand_trace/macro_trace to 0 on return */
+           mb->expand_trace = mb->macro_trace = (negate ? 0 : mb->depth);
+           if (mb->depth == 1) {
+               print_macro_trace = mb->macro_trace;
+               print_expand_trace = mb->expand_trace;
+           }
+           s = se;
+           continue;
        }
 
        if (STREQ("dump", f, fn)) {
-               rpmDumpMacroTable(mb->mc, NULL);
-               while (iseol(*se))
-                       se++;
-               s = se;
-               continue;
+           rpmDumpMacroTable(mb->mc, NULL);
+           while (iseol(*se))
+               se++;
+           s = se;
+           continue;
        }
 
-#ifdef WITH_LUA
-#define LUA_FAILURE_OUTPUT "1"
        if (STREQ("lua", f, fn)) {
-               rpmlua lua = NULL; /* Global state. */
-               const char *ls = s+sizeof("{lua:")-1;
-               const char *lse = se-sizeof("}")+1;
-               char *scriptbuf = (char *)xmalloc((lse-ls)+1);
-               char *printbuf;
-               memcpy(scriptbuf, ls, lse-ls);
-               scriptbuf[lse-ls] = '\0';
-               rpmluaPushPrintBuffer(lua);
-               if (rpmluaRunScript(lua, scriptbuf, NULL) == -1) {
-                       printbuf = rpmluaPopPrintBuffer(lua);
-                       rpmlog(RPMLOG_WARNING, _("lua: using fallback output '%s'\n"), LUA_FAILURE_OUTPUT);
-                       printbuf = (char *)xcalloc(1, sizeof(LUA_FAILURE_OUTPUT));
-                       strcpy(printbuf, LUA_FAILURE_OUTPUT);
-               } else {
-                       printbuf = rpmluaPopPrintBuffer(lua);
-               }
-               if (printbuf) {
-                   mbAppendStr(mb, printbuf);
-                   free(printbuf);
-               }
-               free(scriptbuf);
-               s = se;
-               continue;
+           doLua(mb, f, fn, g, gn);
+           s = se;
+           continue;
        }
-#endif
 
        /* XXX necessary but clunky */
        if (STREQ("basename", f, fn) ||
            STREQ("dirname", f, fn) ||
+           STREQ("shrink", f, fn) ||
            STREQ("suffix", f, fn) ||
+           STREQ("quote", f, fn) ||
            STREQ("expand", f, fn) ||
            STREQ("verbose", f, fn) ||
            STREQ("uncompress", f, fn) ||
@@ -1274,110 +1273,116 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
            STREQ("getconfdir", f, fn) ||
            STREQ("S", f, fn) ||
            STREQ("P", f, fn) ||
-           STREQ("F", f, fn)) {
-               /* FIX: verbose may be set */
-               doFoo(mb, negate, f, fn, g, gn);
-               s = se;
-               continue;
+           STREQ("F", f, fn))
+       {
+           /* FIX: verbose may be set */
+           doFoo(mb, negate, f, fn, g, gn);
+           s = se;
+           continue;
        }
 
        /* Expand defined macros */
-       mep = findEntry(mb->mc, f, fn);
+       mep = findEntry(mb->mc, f, fn, NULL);
        me = (mep ? *mep : NULL);
 
+       if (me) {
+           if ((me->flags & ME_AUTO) && mb->level > me->level) {
+               /* Ignore out-of-scope automatic macros */
+               me = NULL;
+           } else {
+               /* If we looked up a macro, consider it used */
+               me->flags |= ME_USED;
+           }
+       }
+
        /* XXX Special processing for flags */
        if (*f == '-') {
-               if (me)
-                       me->used++;     /* Mark macro as used */
-               if ((me == NULL && !negate) ||  /* Without -f, skip %{-f...} */
+           if ((me == NULL && !negate) ||      /* Without -f, skip %{-f...} */
                    (me != NULL && negate)) {   /* With -f, skip %{!-f...} */
-                       s = se;
-                       continue;
-               }
+               s = se;
+               continue;
+           }
 
-               if (g && g < ge) {              /* Expand X in %{-f:X} */
-                       rc = expandMacro(mb, g, gn);
-               } else
+           if (g && g < ge) {          /* Expand X in %{-f:X} */
+               expandMacro(mb, g, gn);
+           } else
                if (me && me->body && *me->body) {/* Expand %{-f}/%{-f*} */
-                       rc = expandMacro(mb, me->body, 0);
+                   expandMacro(mb, me->body, 0);
                }
-               s = se;
-               continue;
+           s = se;
+           continue;
        }
 
        /* XXX Special processing for macro existence */
        if (chkexist) {
-               if ((me == NULL && !negate) ||  /* Without -f, skip %{?f...} */
+           if ((me == NULL && !negate) ||      /* Without -f, skip %{?f...} */
                    (me != NULL && negate)) {   /* With -f, skip %{!?f...} */
-                       s = se;
-                       continue;
-               }
-               if (g && g < ge) {              /* Expand X in %{?f:X} */
-                       rc = expandMacro(mb, g, gn);
-               } else
-               if (me && me->body && *me->body) { /* Expand %{?f}/%{?f*} */
-                       rc = expandMacro(mb, me->body, 0);
-               }
                s = se;
                continue;
+           }
+           if (g && g < ge) {          /* Expand X in %{?f:X} */
+               expandMacro(mb, g, gn);
+           } else
+               if (me && me->body && *me->body) { /* Expand %{?f}/%{?f*} */
+                   expandMacro(mb, me->body, 0);
+               }
+           s = se;
+           continue;
        }
        
        if (me == NULL) {       /* leave unknown %... as is */
-               /* XXX hack to permit non-overloaded %foo to be passed */
-               c = '%';        /* XXX only need to save % */
-               mbAppend(mb, c);
-               continue;
+           /* XXX hack to permit non-overloaded %foo to be passed */
+           c = '%';    /* XXX only need to save % */
+           mbAppend(mb, c);
+           continue;
        }
 
        /* Setup args for "%name " macros with opts */
        if (me && me->opts != NULL) {
-               if (lastc != NULL) {
-                       se = grabArgs(mb, me, fe, lastc);
-               } else {
-                       addMacro(mb->mc, "**", NULL, "", mb->depth);
-                       addMacro(mb->mc, "*", NULL, "", mb->depth);
-                       addMacro(mb->mc, "#", NULL, "0", mb->depth);
-                       addMacro(mb->mc, "0", NULL, me->name, mb->depth);
-               }
+           const char *xe = grabArgs(mb, me, fe, lastc);
+           if (xe != NULL)
+               se = xe;
        }
 
        /* Recursively expand body of macro */
        if (me->body && *me->body) {
-               rc = expandMacro(mb, me->body, 0);
-               if (rc == 0)
-                       me->used++;     /* Mark macro as used */
+           expandMacro(mb, me->body, 0);
        }
 
        /* Free args for "%name " macros with opts */
        if (me->opts != NULL)
-               freeArgs(mb);
+           freeArgs(mb);
 
        s = se;
     }
 
     mb->buf[mb->tpos] = '\0';
     mb->depth--;
-    if (rc != 0 || mb->expand_trace)
+    if (mb->error != 0 || mb->expand_trace)
        printExpansion(mb, mb->buf+tpos, mb->buf+mb->tpos);
+    mb->macro_trace = store_macro_trace;
+    mb->expand_trace = store_expand_trace;
+exit:
     _free(source);
-    return rc;
+    return mb->error;
 }
 
 
 /* =============================================================== */
 
-static int doExpandMacros(rpmMacroContext mc, const char *src, char **target)
+static int doExpandMacros(rpmMacroContext mc, const char *src, int flags,
+                       char **target)
 {
     MacroBuf mb = xcalloc(1, sizeof(*mb));
     int rc = 0;
 
-    if (mc == NULL) mc = rpmGlobalMacroContext;
-
     mb->buf = NULL;
-    mb->depth = 0;
+    mb->depth = mc->depth;
+    mb->level = mc->level;
     mb->macro_trace = print_macro_trace;
     mb->expand_trace = print_expand_trace;
     mb->mc = mc;
+    mb->flags = flags;
 
     rc = expandMacro(mb, src, 0);
 
@@ -1389,91 +1394,111 @@ static int doExpandMacros(rpmMacroContext mc, const char *src, char **target)
     return rc;
 }
 
-int expandMacros(void * spec, rpmMacroContext mc, char * sbuf, size_t slen)
+static void pushMacro(rpmMacroContext mc,
+       const char * n, const char * o, const char * b, int level, int flags)
 {
-    char *target = NULL;
-    int rc = doExpandMacros(mc, sbuf, &target);
-    rstrlcpy(sbuf, target, slen);
-    free(target);
-    return rc;
-}
-
-void
-addMacro(rpmMacroContext mc,
-       const char * n, const char * o, const char * b, int level)
-{
-    rpmMacroEntry * mep;
-
-    if (mc == NULL) mc = rpmGlobalMacroContext;
-
-    /* If new name, expand macro table */
-    if ((mep = findEntry(mc, n, 0)) == NULL) {
-       if (mc->firstFree == mc->macrosAllocated)
-           expandMacroTable(mc);
-       if (mc->macroTable != NULL)
-           mep = mc->macroTable + mc->firstFree++;
+    /* new entry */
+    rpmMacroEntry me;
+    /* pointer into me */
+    char *p;
+    /* calculate sizes */
+    size_t olen = o ? strlen(o) : 0;
+    size_t blen = b ? strlen(b) : 0;
+    size_t mesize = sizeof(*me) + blen + 1 + (olen ? olen + 1 : 0);
+
+    size_t pos;
+    rpmMacroEntry *mep = findEntry(mc, n, 0, &pos);
+    if (mep) {
+       /* entry with shared name */
+       me = xmalloc(mesize);
+       /* copy body */
+       me->body = p = me->arena;
+       if (blen)
+           memcpy(p, b, blen + 1);
+       else
+           *p = '\0';
+       p += blen + 1;
+       /* set name */
+       me->name = (*mep)->name;
     }
-
-    if (mep != NULL) {
-       /* Push macro over previous definition */
-       pushMacro(mep, n, o, b, level);
-
-       /* If new name, sort macro table */
-       if ((*mep)->prev == NULL)
-           sortMacroTable(mc);
+    else {
+       /* extend macro table */
+       const int delta = 256;
+       if (mc->n % delta == 0)
+           mc->tab = xrealloc(mc->tab, sizeof(me) * (mc->n + delta));
+       /* shift pos+ entries to the right */
+       memmove(mc->tab + pos + 1, mc->tab + pos, sizeof(me) * (mc->n - pos));
+       mc->n++;
+       /* make slot */
+       mc->tab[pos] = NULL;
+       mep = &mc->tab[pos];
+       /* entry with new name */
+       size_t nlen = strlen(n);
+       me = xmalloc(mesize + nlen + 1);
+       /* copy body */
+       me->body = p = me->arena;
+       if (blen)
+           memcpy(p, b, blen + 1);
+       else
+           *p = '\0';
+       p += blen + 1;
+       /* copy name */
+       me->name = memcpy(p, n, nlen + 1);
+       p += nlen + 1;
     }
+
+    /* copy options */
+    if (olen)
+       me->opts = memcpy(p, o, olen + 1);
+    else
+       me->opts = o ? "" : NULL;
+    /* initialize */
+    me->flags = flags;
+    me->flags &= ~(ME_USED);
+    me->level = level;
+    /* push over previous definition */
+    me->prev = *mep;
+    *mep = me;
 }
 
-void
-delMacro(rpmMacroContext mc, const char * n)
+static void popMacro(rpmMacroContext mc, const char * n)
 {
-    rpmMacroEntry * mep;
-
-    if (mc == NULL) mc = rpmGlobalMacroContext;
-    /* If name exists, pop entry */
-    if ((mep = findEntry(mc, n, 0)) != NULL) {
-       popMacro(mep);
-       /* If deleted name, sort macro table */
-       if (!(mep && *mep))
-           sortMacroTable(mc);
+    size_t pos;
+    rpmMacroEntry *mep = findEntry(mc, n, 0, &pos);
+    if (mep == NULL)
+       return;
+    /* parting entry */
+    rpmMacroEntry me = *mep;
+    assert(me);
+    /* detach/pop definition */
+    mc->tab[pos] = me->prev;
+    /* shrink macro table */
+    if (me->prev == NULL) {
+       mc->n--;
+       /* move pos+ elements to the left */
+       memmove(mc->tab + pos, mc->tab + pos + 1, sizeof(me) * (mc->n - pos));
+       /* deallocate */
+       if (mc->n == 0)
+           mc->tab = _free(mc->tab);
     }
+    /* comes in a single chunk */
+    free(me);
 }
 
-int
-rpmDefineMacro(rpmMacroContext mc, const char * macro, int level)
+static int defineMacro(rpmMacroContext mc, const char * macro, int level)
 {
     MacroBuf mb = xcalloc(1, sizeof(*mb));
+    int rc;
 
     /* XXX just enough to get by */
-    mb->mc = (mc ? mc : rpmGlobalMacroContext);
-    (void) doDefine(mb, macro, level, 0);
+    mb->mc = mc;
+    (void) doDefine(mb, macro, strlen(macro), level, 0);
+    rc = mb->error;
     _free(mb);
-    return 0;
-}
-
-void
-rpmLoadMacros(rpmMacroContext mc, int level)
-{
-
-    if (mc == NULL || mc == rpmGlobalMacroContext)
-       return;
-
-    if (mc->macroTable != NULL) {
-       int i;
-       for (i = 0; i < mc->firstFree; i++) {
-           rpmMacroEntry *mep, me;
-           mep = &mc->macroTable[i];
-           me = *mep;
-
-           if (me == NULL)             /* XXX this should never happen */
-               continue;
-           addMacro(NULL, me->name, me->opts, me->body, (level - 1));
-       }
-    }
+    return rc;
 }
 
-int
-rpmLoadMacroFile(rpmMacroContext mc, const char * fn)
+static int loadMacroFile(rpmMacroContext mc, const char * fn)
 {
     FILE *fd = fopen(fn, "r");
     size_t blen = MACROBUFSIZ;
@@ -1483,11 +1508,8 @@ rpmLoadMacroFile(rpmMacroContext mc, const char * fn)
     if (fd == NULL)
        goto exit;
 
-    /* XXX Assume new fangled macro expansion */
-    max_macro_depth = 16;
-
     buf[0] = '\0';
-    while(rdcl(buf, blen, fd) != NULL) {
+    while (rdcl(buf, blen, fd) != NULL) {
        char c, *n;
 
        n = buf;
@@ -1496,8 +1518,9 @@ rpmLoadMacroFile(rpmMacroContext mc, const char * fn)
        if (c != '%')
                continue;
        n++;    /* skip % */
-       rc = rpmDefineMacro(mc, n, RMIL_MACROFILES);
+       rc = defineMacro(mc, n, RMIL_MACROFILES);
     }
+
     rc = fclose(fd);
 
 exit:
@@ -1505,15 +1528,124 @@ exit:
     return rc;
 }
 
+static void copyMacros(rpmMacroContext src, rpmMacroContext dst, int level)
+{
+    for (int i = 0; i < src->n; i++) {
+       rpmMacroEntry me = src->tab[i];
+       assert(me);
+       pushMacro(dst, me->name, me->opts, me->body, level, me->flags);
+    }
+}
+
+/* External interfaces */
+
+int rpmExpandMacros(rpmMacroContext mc, const char * sbuf, char ** obuf, int flags)
+{
+    char *target = NULL;
+    int rc;
+
+    mc = rpmmctxAcquire(mc);
+    rc = doExpandMacros(mc, sbuf, flags, &target);
+    rpmmctxRelease(mc);
+
+    if (rc) {
+       free(target);
+       return -1;
+    } else {
+       *obuf = target;
+       return 1;
+    }
+}
+
+void
+rpmDumpMacroTable(rpmMacroContext mc, FILE * fp)
+{
+    mc = rpmmctxAcquire(mc);
+    if (fp == NULL) fp = stderr;
+    
+    fprintf(fp, "========================\n");
+    for (int i = 0; i < mc->n; i++) {
+       rpmMacroEntry me = mc->tab[i];
+       assert(me);
+       fprintf(fp, "%3d%c %s", me->level,
+                   ((me->flags & ME_USED) ? '=' : ':'), me->name);
+       if (me->opts && *me->opts)
+               fprintf(fp, "(%s)", me->opts);
+       if (me->body && *me->body)
+               fprintf(fp, "\t%s", me->body);
+       fprintf(fp, "\n");
+    }
+    fprintf(fp, _("======================== active %d empty %d\n"),
+               mc->n, 0);
+    rpmmctxRelease(mc);
+}
+
+int rpmPushMacro(rpmMacroContext mc,
+             const char * n, const char * o, const char * b, int level)
+{
+    mc = rpmmctxAcquire(mc);
+    pushMacro(mc, n, o, b, level, ME_NONE);
+    rpmmctxRelease(mc);
+    return 0;
+}
+
+int rpmPopMacro(rpmMacroContext mc, const char * n)
+{
+    mc = rpmmctxAcquire(mc);
+    popMacro(mc, n);
+    rpmmctxRelease(mc);
+    return 0;
+}
+
+int
+rpmDefineMacro(rpmMacroContext mc, const char * macro, int level)
+{
+    int rc;
+    mc = rpmmctxAcquire(mc);
+    rc = defineMacro(mc, macro, level);
+    rpmmctxRelease(mc);
+    return rc;
+}
+
+void
+rpmLoadMacros(rpmMacroContext mc, int level)
+{
+    rpmMacroContext gmc;
+    if (mc == NULL || mc == rpmGlobalMacroContext)
+       return;
+
+    gmc = rpmmctxAcquire(NULL);
+    mc = rpmmctxAcquire(mc);
+
+    copyMacros(mc, gmc, level);
+
+    rpmmctxRelease(mc);
+    rpmmctxRelease(gmc);
+}
+
+int
+rpmLoadMacroFile(rpmMacroContext mc, const char * fn)
+{
+    int rc;
+
+    mc = rpmmctxAcquire(mc);
+    rc = loadMacroFile(mc, fn);
+    rpmmctxRelease(mc);
+
+    return rc;
+}
+
 void
 rpmInitMacros(rpmMacroContext mc, const char * macrofiles)
 {
     ARGV_t pattern, globs = NULL;
+    rpmMacroContext climc;
 
     if (macrofiles == NULL)
        return;
 
     argvSplit(&globs, macrofiles, ":");
+    mc = rpmmctxAcquire(mc);
     for (pattern = globs; *pattern; pattern++) {
        ARGV_t path, files = NULL;
     
@@ -1529,31 +1661,30 @@ rpmInitMacros(rpmMacroContext mc, const char * macrofiles)
                rpmFileHasSuffix(*path, ".rpmorig")) {
                continue;
            }
-           (void) rpmLoadMacroFile(mc, *path);
+           (void) loadMacroFile(mc, *path);
        }
        argvFree(files);
     }
     argvFree(globs);
 
     /* Reload cmdline macros */
-    rpmLoadMacros(rpmCLIMacroContext, RMIL_CMDLINE);
+    climc = rpmmctxAcquire(rpmCLIMacroContext);
+    copyMacros(climc, mc, RMIL_CMDLINE);
+    rpmmctxRelease(climc);
+
+    rpmmctxRelease(mc);
 }
 
 void
 rpmFreeMacros(rpmMacroContext mc)
 {
-    
-    if (mc == NULL) mc = rpmGlobalMacroContext;
-
-    if (mc->macroTable != NULL) {
-       for (int i = 0; i < mc->firstFree; i++) {
-           while (mc->macroTable[i] != NULL) {
-               popMacro(&mc->macroTable[i]);
-           }
-       }
-       free(mc->macroTable);
+    mc = rpmmctxAcquire(mc);
+    while (mc->n > 0) {
+       /* remove from the end to avoid memmove */
+       rpmMacroEntry me = mc->tab[mc->n - 1];
+       popMacro(mc, me->name);
     }
-    memset(mc, 0, sizeof(*mc));
+    rpmmctxRelease(mc);
 }
 
 char * 
@@ -1564,6 +1695,7 @@ rpmExpand(const char *arg, ...)
     char *pe;
     const char *s;
     va_list ap;
+    rpmMacroContext mc;
 
     if (arg == NULL) {
        ret = xstrdup("");
@@ -1584,7 +1716,9 @@ rpmExpand(const char *arg, ...)
        pe = stpcpy(pe, s);
     va_end(ap);
 
-    (void) doExpandMacros(NULL, buf, &ret);
+    mc = rpmmctxAcquire(NULL);
+    (void) doExpandMacros(mc, buf, 0, &ret);
+    rpmmctxRelease(mc);
 
     free(buf);
 exit:
index 95ee9cd03dccd19190c3b6a778abd0379f1e37b4..3858cc3311d281c40a08e4fa6bb7f18d8d49ecbc 100644 (file)
@@ -1,6 +1,12 @@
 /* base64 encoder/decoder based on public domain implementation
  * by Chris Venter */
 
+/** \ingroup rpmio
+ * \file rpmio/rpmbase64.h
+ *
+ * Base64 encoding and decoding API
+ */
+
 #include <sys/types.h>
 
 #ifdef __cplusplus
index 6cdfe2552910695bd420c5fcfe4f96a43297477f..9e47ff8a5a2cca19520ae06e88ab6379be1e7819 100644 (file)
@@ -19,6 +19,7 @@
 #include <errno.h>
 #include <popt.h>
 #include <ctype.h>
+#include <pthread.h>
 
 #include <rpm/rpmfileutil.h>
 #include <rpm/rpmurl.h>
@@ -31,6 +32,7 @@
 #include "debug.h"
 
 static const char *rpm_config_dir = NULL;
+static pthread_once_t configDirSet = PTHREAD_ONCE_INIT;
 
 static int is_prelinked(int fdno)
 {
@@ -103,28 +105,38 @@ static int open_dso(const char * path, pid_t * pidp, rpm_loff_t *fsizep)
     if (pidp != NULL && is_prelinked(fdno)) {
        int pipes[2];
        pid_t pid;
-       int xx;
 
-       xx = close(fdno);
+       close(fdno);
        pipes[0] = pipes[1] = -1;
-       xx = pipe(pipes);
-       if (!(pid = fork())) {
+       if (pipe(pipes) < 0)
+           return -1;
+
+       pid = fork();
+       if (pid < 0) {
+           close(pipes[0]);
+           close(pipes[1]);
+           return -1;
+       }
+
+       if (pid == 0) {
            ARGV_t av, lib;
+           int dfd;
            argvSplit(&av, cmd, " ");
 
-           xx = close(pipes[0]);
-           xx = dup2(pipes[1], STDOUT_FILENO);
-           xx = close(pipes[1]);
-           if ((lib = argvSearch(av, "library", NULL)) != NULL) {
+           close(pipes[0]);
+           dfd = dup2(pipes[1], STDOUT_FILENO);
+           close(pipes[1]);
+           if (dfd >= 0 && (lib = argvSearch(av, "library", NULL)) != NULL) {
                *lib = (char *) path;
                unsetenv("MALLOC_CHECK_");
-               xx = execve(av[0], av+1, environ);
+               execve(av[0], av+1, environ);
            }
-           _exit(127);
+           _exit(127); /* not normally reached */
+       } else {
+           *pidp = pid;
+           fdno = pipes[0];
+           close(pipes[1]);
        }
-       *pidp = pid;
-       fdno = pipes[0];
-       xx = close(pipes[1]);
     }
 
     return fdno;
@@ -136,8 +148,8 @@ int rpmDoDigest(int algo, const char * fn,int asAscii,
     const char * path;
     urltype ut = urlPath(fn, &path);
     unsigned char * dig = NULL;
-    size_t diglen;
-    unsigned char buf[32*BUFSIZ];
+    size_t diglen, buflen = 32 * BUFSIZ;
+    unsigned char *buf = xmalloc(buflen);
     FD_t fd;
     rpm_loff_t fsize = 0;
     pid_t pid = 0;
@@ -150,7 +162,7 @@ int rpmDoDigest(int algo, const char * fn,int asAscii,
        goto exit;
     }
 
-    switch(ut) {
+    switch (ut) {
     case URL_IS_PATH:
     case URL_IS_UNKNOWN:
     case URL_IS_HTTPS:
@@ -171,10 +183,10 @@ int rpmDoDigest(int algo, const char * fn,int asAscii,
        
        fdInitDigest(fd, algo, 0);
        fsize = 0;
-       while ((rc = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0)
+       while ((rc = Fread(buf, sizeof(*buf), buflen, fd)) > 0)
            fsize += rc;
        fdFiniDigest(fd, algo, (void **)&dig, &diglen, asAscii);
-       if (Ferror(fd))
+       if (dig == NULL || Ferror(fd))
            rc = 1;
 
        (void) Fclose(fd);
@@ -195,6 +207,7 @@ exit:
     if (!rc)
        memcpy(digest, dig, diglen);
     dig = _free(dig);
+    free(buf);
 
     return rc;
 }
@@ -326,7 +339,8 @@ int rpmFileIsCompressed(const char * file, rpmCompressedMagic * compressed)
 
     rc = 0;
 
-    if ((magic[0] == 'B') && (magic[1] == 'Z')) {
+    if ((magic[0] == 'B') && (magic[1] == 'Z') &&
+        (magic[2] == 'h')) {
        *compressed = COMPRESSED_BZIP2;
     } else if ((magic[0] == 'P') && (magic[1] == 'K') &&
         (((magic[2] == 3) && (magic[3] == 4)) ||
@@ -337,6 +351,9 @@ int rpmFileIsCompressed(const char * file, rpmCompressedMagic * compressed)
               (magic[4] == 0x5a) && (magic[5] == 0x00)) {
        /* new style xz (lzma) with magic */
        *compressed = COMPRESSED_XZ;
+    } else if ((magic[0] == 0x28) && (magic[1] == 0x85) &&
+              (magic[2] == 0x2f)                     ) {
+       *compressed = COMPRESSED_ZSTD;
     } else if ((magic[0] == 'L') && (magic[1] == 'Z') &&
               (magic[2] == 'I') && (magic[3] == 'P')) {
        *compressed = COMPRESSED_LZIP;
@@ -356,6 +373,8 @@ int rpmFileIsCompressed(const char * file, rpmCompressedMagic * compressed)
        *compressed = COMPRESSED_7ZIP;
     } else if (rpmFileHasSuffix(file, ".lzma")) {
        *compressed = COMPRESSED_LZMA;
+    } else if (rpmFileHasSuffix(file, ".gem")) {
+       *compressed = COMPRESSED_GEM;
     }
 
     return rc;
@@ -375,7 +394,7 @@ char *rpmCleanPath(char * path)
     s = t = te = path;
     while (*s != '\0') {
 /*fprintf(stderr, "*** got \"%.*s\"\trest \"%s\"\n", (t-path), path, s); */
-       switch(*s) {
+       switch (*s) {
        case ':':                       /* handle url's */
            if (s[1] == '/' && s[2] == '/') {
                *t++ = *s++;
@@ -599,11 +618,14 @@ int rpmMkdirs(const char *root, const char *pathstr)
     return rc;
 }
 
+static void setConfigDir(void)
+{
+    char *rpmenv = getenv("RPM_CONFIGDIR");
+    rpm_config_dir = rpmenv ? xstrdup(rpmenv) : RPMCONFIGDIR;
+}
+
 const char *rpmConfigDir(void)
 {
-    if (rpm_config_dir == NULL) {
-       char *rpmenv = getenv("RPM_CONFIGDIR");
-       rpm_config_dir = rpmenv ? xstrdup(rpmenv) : RPMCONFIGDIR;
-    }
+    pthread_once(&configDirSet, setConfigDir);
     return rpm_config_dir;
 }
index 79fac8699cca8ab5f868e798b8540c644a5b0a99..916f6b240c92b32f13196de704a5de2ab3907501 100644 (file)
@@ -26,7 +26,9 @@ typedef enum rpmCompressedMagic_e {
     COMPRESSED_XZ              = 5,    /*!< xz can handle */
     COMPRESSED_LZIP            = 6,    /*!< lzip can handle */
     COMPRESSED_LRZIP           = 7,    /*!< lrzip can handle */
-    COMPRESSED_7ZIP            = 8     /*!< 7zip can handle */
+    COMPRESSED_7ZIP            = 8,    /*!< 7zip can handle */
+    COMPRESSED_GEM             = 9,    /*!< gem can handle */
+    COMPRESSED_ZSTD            = 10    /*!< zstd can handle */
 } rpmCompressedMagic;
 
 /** \ingroup rpmfileutil
index 4fc106daf6f222c54647f2378ef9144248a7b3c6..da5493d75306b64339d79e76bbdbd8aa203506af 100644 (file)
@@ -124,30 +124,15 @@ static inline const char *next_brace_sub(const char *begin)
     unsigned int depth = 0;
     const char *cp = begin;
 
-    while (1) {
-       if (depth == 0) {
-           if (*cp != ',' && *cp != '}' && *cp != '\0') {
-               if (*cp == '{')
-                   ++depth;
-               ++cp;
-               continue;
-           }
-       } else {
-           while (*cp != '\0' && (*cp != '}' || depth > 0)) {
-               if (*cp == '}')
-                   --depth;
-               ++cp;
-           }
-           if (*cp == '\0')
-               /* An incorrectly terminated brace expression.  */
-               return NULL;
+    while (*cp != '\0') {
+       if ((*cp == '}' && depth-- == 0) || (*cp == ',' && depth == 0))
+           break;
 
-           continue;
-       }
-       break;
+       if (*cp++ == '{')
+           depth++;
     }
 
-    return cp;
+    return *cp != '\0' ? cp : NULL;
 }
 
 static int __glob_pattern_p(const char *pattern, int quote);
@@ -352,7 +337,7 @@ glob(const char *pattern, int flags,
                user_name = dirname + 1;
            else {
                char *newp;
-               newp = (char *) alloca(end_name - dirname);
+               newp = (char *) alloca(end_name - dirname + 1);
                *((char *) mempcpy(newp, dirname + 1, end_name - dirname))
                    = '\0';
                user_name = newp;
@@ -649,7 +634,7 @@ static int prefix_array(const char *dirname, char **array, size_t n)
 static int __glob_pattern_p(const char *pattern, int quote)
 {
     register const char *p;
-    int open = 0;
+    int openBrackets = 0;
 
     for (p = pattern; *p != '\0'; ++p)
        switch (*p) {
@@ -663,11 +648,11 @@ static int __glob_pattern_p(const char *pattern, int quote)
            break;
 
        case '[':
-           open = 1;
+           openBrackets = 1;
            break;
 
        case ']':
-           if (open)
+           if (openBrackets)
                return 1;
            break;
        }
@@ -844,6 +829,8 @@ int rpmGlob(const char * patterns, int * argcPtr, ARGV_t * argvPtr)
     int i, j;
     int rc;
 
+    gflags |= GLOB_BRACE;
+
     if (home != NULL && strlen(home) > 0) 
        gflags |= GLOB_TILDE;
 
@@ -966,5 +953,32 @@ exit:
 
 int rpmIsGlob(const char * pattern, int quote)
 {
-    return __glob_pattern_p(pattern, quote);
+    if (!__glob_pattern_p(pattern, quote)) {
+
+       const char *begin;
+       const char *next;
+       const char *rest;
+
+       begin = strchr(pattern, '{');
+       if (begin == NULL)
+           return 0;
+       /*
+        * Find the first sub-pattern and at the same time find the
+        *  rest after the closing brace.
+        */
+       next = next_brace_sub(begin + 1);
+       if (next == NULL)
+           return 0;
+
+       /* Now find the end of the whole brace expression.  */
+       rest = next;
+       while (*rest != '}') {
+           rest = next_brace_sub(rest + 1);
+           if (rest == NULL)
+               return 0;
+       }
+       /* Now we can be sure that brace expression is well-foermed. */
+    }
+
+    return 1;
 }
index cd223e8296d4e6aca86fb9ef7d585f7c4b4c05c7..57df81a9dfb91547bb7f24584810b9db789a7a70 100644 (file)
@@ -5,6 +5,11 @@
 #include "system.h"
 #include <stdarg.h>
 #include <errno.h>
+#include <ctype.h>
+#if defined(__linux__)
+#include <sys/personality.h>
+#endif
+#include <sys/utsname.h>
 
 #include <rpm/rpmlog.h>
 #include <rpm/rpmmacro.h>
 
 #include "debug.h"
 
-typedef struct _FDSTACK_s {
+typedef struct FDSTACK_s * FDSTACK_t;
+
+struct FDSTACK_s {
     FDIO_t             io;
     void *             fp;
     int                        fdno;
-} FDSTACK_t;
+    int                        syserrno;       /* last system errno encountered */
+    const char                 *errcookie;     /* pointer to custom error string */
+
+    FDSTACK_t          prev;
+};
 
 /** \ingroup rpmio
  * Cumulative statistics for a descriptor.
@@ -38,13 +49,9 @@ struct _FD_s {
 #define        RPMIO_DEBUG_IO          0x40000000
     int                magic;
 #define        FDMAGIC                 0x04463138
-    int                nfps;
-    FDSTACK_t  fps[8];
+    FDSTACK_t  fps;
     int                urlType;        /* ufdio: */
 
-    int                syserrno;       /* last system errno encountered */
-    const char *errcookie;     /* gzdio/bzdio/ufdio/xzdio: */
-
     char       *descr;         /* file name (or other description) */
     FDSTAT_t   stats;          /* I/O statistics */
 
@@ -57,51 +64,37 @@ struct _FD_s {
 
 #define DBGIO(_f, _x)   DBG((_f), RPMIO_DEBUG_IO, _x)
 
-static FDIO_t fdGetIo(FD_t fd)
-{
-    return (fd != NULL) ? fd->fps[fd->nfps].io : NULL;
-}
-
-static void fdSetIo(FD_t fd, FDIO_t io)
-{
-    if (fd)
-       fd->fps[fd->nfps].io = io;
-}
-
-static void * fdGetFp(FD_t fd)
-{
-    return (fd != NULL) ? fd->fps[fd->nfps].fp : NULL;
-}
-
-static void fdSetFp(FD_t fd, void * fp)
+static FDSTACK_t fdGetFps(FD_t fd)
 {
-    if (fd)
-       fd->fps[fd->nfps].fp = fp;
+    return (fd != NULL) ? fd->fps : NULL;
 }
 
 static void fdSetFdno(FD_t fd, int fdno)
 {
     if (fd) 
-       fd->fps[fd->nfps].fdno = fdno;
+       fd->fps->fdno = fdno;
 }
 
 static void fdPush(FD_t fd, FDIO_t io, void * fp, int fdno)
 {
-    if (fd == NULL || fd->nfps >= (sizeof(fd->fps)/sizeof(fd->fps[0]) - 1))
-       return;
-    fd->nfps++;
-    fdSetIo(fd, io);
-    fdSetFp(fd, fp);
-    fdSetFdno(fd, fdno);
+    FDSTACK_t fps = xcalloc(1, sizeof(*fps));
+    fps->io = io;
+    fps->fp = fp;
+    fps->fdno = fdno;
+    fps->prev = fd->fps;
+
+    fd->fps = fps;
+    fdLink(fd);
 }
 
-static void fdPop(FD_t fd)
+static FDSTACK_t fdPop(FD_t fd)
 {
-    if (fd == NULL || fd->nfps < 0) return;
-    fdSetIo(fd, NULL);
-    fdSetFp(fd, NULL);
-    fdSetFdno(fd, -1);
-    fd->nfps--;
+    FDSTACK_t fps = fd->fps;
+    fd->fps = fps->prev;
+    free(fps);
+    fps = fd->fps;
+    fdFree(fd);
+    return fps;
 }
 
 void fdSetBundle(FD_t fd, rpmDigestBundle bundle)
@@ -110,77 +103,67 @@ void fdSetBundle(FD_t fd, rpmDigestBundle bundle)
        fd->digests = bundle;
 }
 
-rpmDigestBundle fdGetBundle(FD_t fd)
-{
-    return (fd != NULL) ? fd->digests : NULL;
-}
-
-static void * iotFileno(FD_t fd, FDIO_t iot)
+rpmDigestBundle fdGetBundle(FD_t fd, int create)
 {
-    void * rc = NULL;
-
-    if (fd == NULL)
-       return NULL;
-
-    for (int i = fd->nfps; i >= 0; i--) {
-       FDSTACK_t * fps = &fd->fps[i];
-       if (fps->io != iot)
-           continue;
-       rc = fps->fp;
-       break;
+    rpmDigestBundle bundle = NULL;
+    if (fd) {
+       if (fd->digests == NULL && create)
+           fd->digests = rpmDigestBundleNew();
+       bundle = fd->digests;
     }
-    
-    return rc;
+    return bundle;
 }
 
 /** \ingroup rpmio
  * \name RPMIO Vectors.
  */
-typedef ssize_t (*fdio_read_function_t) (FD_t fd, void *buf, size_t nbytes);
-typedef ssize_t (*fdio_write_function_t) (FD_t fd, const void *buf, size_t nbytes);
-typedef int (*fdio_seek_function_t) (FD_t fd, off_t pos, int whence);
-typedef int (*fdio_close_function_t) (FD_t fd);
-typedef FD_t (*fdio_ref_function_t) (FD_t fd);
-typedef FD_t (*fdio_deref_function_t) (FD_t fd);
-typedef FD_t (*fdio_new_function_t) (const char *descr);
-typedef int (*fdio_fileno_function_t) (FD_t fd);
+typedef ssize_t (*fdio_read_function_t) (FDSTACK_t fps, void *buf, size_t nbytes);
+typedef ssize_t (*fdio_write_function_t) (FDSTACK_t fps, const void *buf, size_t nbytes);
+typedef int (*fdio_seek_function_t) (FDSTACK_t fps, off_t pos, int whence);
+typedef int (*fdio_close_function_t) (FDSTACK_t fps);
 typedef FD_t (*fdio_open_function_t) (const char * path, int flags, mode_t mode);
-typedef FD_t (*fdio_fopen_function_t) (const char * path, const char * fmode);
-typedef void * (*fdio_ffileno_function_t) (FD_t fd);
-typedef int (*fdio_fflush_function_t) (FD_t fd);
-typedef long (*fdio_ftell_function_t) (FD_t);
+typedef FD_t (*fdio_fdopen_function_t) (FD_t fd, int fdno, const char * fmode);
+typedef int (*fdio_fflush_function_t) (FDSTACK_t fps);
+typedef off_t (*fdio_ftell_function_t) (FDSTACK_t fps);
+typedef int (*fdio_ferror_function_t) (FDSTACK_t fps);
+typedef const char * (*fdio_fstrerr_function_t)(FDSTACK_t fps);
 
 struct FDIO_s {
+  const char *                 ioname;
+  const char *                 name;
   fdio_read_function_t         read;
   fdio_write_function_t                write;
   fdio_seek_function_t         seek;
   fdio_close_function_t                close;
 
-  fdio_ref_function_t          _fdref;
-  fdio_deref_function_t                _fdderef;
-  fdio_new_function_t          _fdnew;
-  fdio_fileno_function_t       _fileno;
-
   fdio_open_function_t         _open;
-  fdio_fopen_function_t                _fopen;
-  fdio_ffileno_function_t      _ffileno;
+  fdio_fdopen_function_t       _fdopen;
   fdio_fflush_function_t       _fflush;
   fdio_ftell_function_t                _ftell;
+  fdio_ferror_function_t       _ferror;
+  fdio_fstrerr_function_t      _fstrerr;
 };
 
 /* forward refs */
 static const FDIO_t fdio;
 static const FDIO_t ufdio;
 static const FDIO_t gzdio;
+#if HAVE_BZLIB_H
 static const FDIO_t bzdio;
+#endif
+#ifdef HAVE_LZMA_H
 static const FDIO_t xzdio;
 static const FDIO_t lzdio;
+#endif
+#ifdef HAVE_ZSTD
+static const FDIO_t zstdio;
+#endif
 
 /** \ingroup rpmio
  * Update digest(s) attached to fd.
  */
 static void fdUpdateDigests(FD_t fd, const void * buf, size_t buflen);
-static FD_t fdNew(const char *descr);
+static FD_t fdNew(int fdno, const char *descr);
 /**
  */
 int _rpmio_debug = 0;
@@ -191,38 +174,23 @@ static const char * fdbg(FD_t fd)
 {
     static char buf[BUFSIZ];
     char *be = buf;
-    int i;
 
     buf[0] = '\0';
     if (fd == NULL)
        return buf;
 
     *be++ = '\t';
-    for (i = fd->nfps; i >= 0; i--) {
-       FDSTACK_t * fps = &fd->fps[i];
-       if (i != fd->nfps)
+    for (FDSTACK_t fps = fd->fps; fps != NULL; fps = fps->prev) {
+       FDIO_t iot = fps->io;
+       if (fps != fd->fps)
            *be++ = ' ';
        *be++ = '|';
        *be++ = ' ';
-       if (fps->io == fdio) {
-           sprintf(be, "FD %d fp %p", fps->fdno, fps->fp);
-       } else if (fps->io == ufdio) {
-           sprintf(be, "UFD %d fp %p", fps->fdno, fps->fp);
-       } else if (fps->io == gzdio) {
-           sprintf(be, "GZD %p fdno %d", fps->fp, fps->fdno);
-#if HAVE_BZLIB_H
-       } else if (fps->io == bzdio) {
-           sprintf(be, "BZD %p fdno %d", fps->fp, fps->fdno);
-#endif
-#if HAVE_LZMA_H
-       } else if (fps->io == xzdio) {
-           sprintf(be, "XZD %p fdno %d", fps->fp, fps->fdno);
-       } else if (fps->io == lzdio) {
-           sprintf(be, "LZD %p fdno %d", fps->fp, fps->fdno);
-#endif
+       /* plain fd io types dont have _fopen() method */
+       if (iot->_fdopen == NULL) {
+           sprintf(be, "%s %d fp %p", iot->ioname, fps->fdno, fps->fp);
        } else {
-           sprintf(be, "??? io %p fp %p fdno %d ???",
-               fps->io, fps->fp, fps->fdno);
+           sprintf(be, "%s %p fp %d", iot->ioname, fps->fp, fps->fdno);
        }
        be += strlen(be);
        *be = '\0';
@@ -238,8 +206,10 @@ static void fdstat_enter(FD_t fd, fdOpX opx)
 
 static void fdstat_exit(FD_t fd, fdOpX opx, ssize_t rc)
 {
-    if (rc == -1)
-       fd->syserrno = errno;
+    if (rc == -1) {
+       FDSTACK_t fps = fdGetFps(fd);
+       fps->syserrno = errno;
+    }
     if (fd->stats != NULL)
        (void) rpmswExit(fdOp(fd, opx), rc);
 }
@@ -291,21 +261,35 @@ FD_t fdDup(int fdno)
 
     if ((nfdno = dup(fdno)) < 0)
        return NULL;
-    fd = fdNew(NULL);
-    fdSetFdno(fd, nfdno);
+    fd = fdNew(nfdno, NULL);
 DBGIO(fd, (stderr, "==> fdDup(%d) fd %p %s\n", fdno, (fd ? fd : NULL), fdbg(fd)));
     return fd;
 }
 
 /* Regular fd doesn't have fflush() equivalent but its not an error either */
-static int fdFlush(FD_t fd)
+static int fdFlush(FDSTACK_t fps)
 {
     return 0;
 }
 
-static int fdFileno(FD_t fd)
+static int fdError(FDSTACK_t fps)
+{
+    return fps->syserrno;
+}
+
+static int zfdError(FDSTACK_t fps)
 {
-    return (fd != NULL) ? fd->fps[0].fdno : -2;
+    return (fps->syserrno || fps->errcookie != NULL) ? -1 : 0;
+}
+
+static const char * fdStrerr(FDSTACK_t fps)
+{
+    return (fps->syserrno != 0) ? strerror(fps->syserrno) : "";
+}
+
+static const char * zfdStrerr(FDSTACK_t fps)
+{
+    return (fps->errcookie != NULL) ? fps->errcookie : "";
 }
 
 const char * Fdescr(FD_t fd)
@@ -315,7 +299,7 @@ const char * Fdescr(FD_t fd)
 
     /* Lazy lookup if description is not set (eg dupped fd) */
     if (fd->descr == NULL) {
-       int fdno = fd->fps[fd->nfps].fdno;
+       int fdno = fd->fps->fdno;
 #if defined(__linux__)
        /* Grab the path from /proc if we can */
        char *procpath = NULL;
@@ -358,69 +342,55 @@ FD_t fdFree( FD_t fd)
        if (fd->digests) {
            fd->digests = rpmDigestBundleFree(fd->digests);
        }
+       free(fd->fps);
        free(fd->descr);
        free(fd);
     }
     return NULL;
 }
 
-FD_t fdNew(const char *descr)
+static FD_t fdNew(int fdno, const char *descr)
 {
     FD_t fd = xcalloc(1, sizeof(*fd));
-    if (fd == NULL) /* XXX xmalloc never returns NULL */
-       return NULL;
     fd->nrefs = 0;
     fd->flags = 0;
     fd->magic = FDMAGIC;
     fd->urlType = URL_IS_UNKNOWN;
-
-    fd->nfps = 0;
-    memset(fd->fps, 0, sizeof(fd->fps));
-
-    fd->fps[0].io = fdio;
-    fd->fps[0].fp = NULL;
-    fd->fps[0].fdno = -1;
-
-    fd->syserrno = 0;
-    fd->errcookie = NULL;
     fd->stats = xcalloc(1, sizeof(*fd->stats));
     fd->digests = NULL;
     fd->descr = descr ? xstrdup(descr) : NULL;
 
-    return fdLink(fd);
+    fdPush(fd, fdio, NULL, fdno);
+    return fd;
 }
 
-static ssize_t fdRead(FD_t fd, void * buf, size_t count)
+static ssize_t fdRead(FDSTACK_t fps, void * buf, size_t count)
 {
-    return read(fdFileno(fd), buf, count);
+    return read(fps->fdno, buf, count);
 }
 
-static ssize_t fdWrite(FD_t fd, const void * buf, size_t count)
+static ssize_t fdWrite(FDSTACK_t fps, const void * buf, size_t count)
 {
     if (count == 0)
        return 0;
 
-    return write(fdFileno(fd), buf, count);
+    return write(fps->fdno, buf, count);
 }
 
-static int fdSeek(FD_t fd, off_t pos, int whence)
+static int fdSeek(FDSTACK_t fps, off_t pos, int whence)
 {
-    return lseek(fdFileno(fd), pos, whence);
+    return lseek(fps->fdno, pos, whence);
 }
 
-static int fdClose(FD_t fd)
+static int fdClose(FDSTACK_t fps)
 {
-    int fdno;
+    int fdno = fps->fdno;
     int rc;
 
-    if (fd == NULL) return -2;
-    fdno = fdFileno(fd);
-
-    fdSetFdno(fd, -1);
+    fps->fdno = -1;
 
     rc = ((fdno >= 0) ? close(fdno) : -2);
 
-    fdFree(fd);
     return rc;
 }
 
@@ -435,20 +405,20 @@ static FD_t fdOpen(const char *path, int flags, mode_t mode)
        (void) close(fdno);
        return NULL;
     }
-    fd = fdNew(path);
-    fdSetFdno(fd, fdno);
+    fd = fdNew(fdno, path);
     fd->flags = flags;
     return fd;
 }
 
-static long fdTell(FD_t fd)
+static off_t fdTell(FDSTACK_t fps)
 {
-    return lseek(Fileno(fd), 0, SEEK_CUR);
+    return lseek(fps->fdno, 0, SEEK_CUR);
 }
 
 static const struct FDIO_s fdio_s = {
-  fdRead, fdWrite, fdSeek, fdClose, fdLink, fdFree, fdNew, fdFileno,
-  fdOpen, NULL, fdGetFp, fdFlush, fdTell
+  "fdio", NULL,
+  fdRead, fdWrite, fdSeek, fdClose,
+  fdOpen, NULL, fdFlush, fdTell, fdError, fdStrerr,
 };
 static const FDIO_t fdio = &fdio_s ;
 
@@ -543,21 +513,17 @@ fprintf(stderr, "*** ufdOpen(%s,0x%x,0%o)\n", url, (unsigned)flags, (unsigned)mo
        break;
     }
 
-    if (fd == NULL) return NULL;
-
-    fdSetIo(fd, ufdio);
-    fd->urlType = urlType;
-
-    if (Fileno(fd) < 0) {
-       (void) fdClose(fd);
-       return NULL;
+    if (fd != NULL) {
+       fd->fps->io = ufdio;
+       fd->urlType = urlType;
     }
     return fd;
 }
 
 static const struct FDIO_s ufdio_s = {
-  fdRead, fdWrite, fdSeek, fdClose, fdLink, fdFree, fdNew, fdFileno,
-  ufdOpen, NULL, fdGetFp, fdFlush, fdTell
+  "ufdio", NULL,
+  fdRead, fdWrite, fdSeek, fdClose,
+  ufdOpen, NULL, fdFlush, fdTell, fdError, fdStrerr
 };
 static const FDIO_t ufdio = &ufdio_s ;
 
@@ -565,161 +531,104 @@ static const FDIO_t ufdio = &ufdio_s ;
 /* Support for GZIP library.  */
 #include <zlib.h>
 
-static void * gzdFileno(FD_t fd)
+static FD_t gzdFdopen(FD_t fd, int fdno, const char *fmode)
 {
-    return iotFileno(fd, gzdio);
-}
+    gzFile gzfile = gzdopen(fdno, fmode);
 
-static
-FD_t gzdOpen(const char * path, const char * fmode)
-{
-    FD_t fd;
-    gzFile gzfile;
-    if ((gzfile = gzopen(path, fmode)) == NULL)
+    if (gzfile == NULL)
        return NULL;
-    fd = fdNew(path);
-    fdPop(fd); fdPush(fd, gzdio, gzfile, -1);
-    
-    return fdLink(fd);
-}
 
-static FD_t gzdFdopen(FD_t fd, const char *fmode)
-{
-    int fdno;
-    gzFile gzfile;
-
-    if (fd == NULL || fmode == NULL) return NULL;
-    fdno = fdFileno(fd);
     fdSetFdno(fd, -1);         /* XXX skip the fdio close */
-    if (fdno < 0) return NULL;
-    gzfile = gzdopen(fdno, fmode);
-    if (gzfile == NULL) return NULL;
-
     fdPush(fd, gzdio, gzfile, fdno);           /* Push gzdio onto stack */
-
-    return fdLink(fd);
+    return fd;
 }
 
-static int gzdFlush(FD_t fd)
+static int gzdFlush(FDSTACK_t fps)
 {
-    gzFile gzfile;
-    gzfile = gzdFileno(fd);
+    gzFile gzfile = fps->fp;
     if (gzfile == NULL) return -2;
     return gzflush(gzfile, Z_SYNC_FLUSH);      /* XXX W2DO? */
 }
 
-static ssize_t gzdRead(FD_t fd, void * buf, size_t count)
+static void gzdSetError(FDSTACK_t fps)
 {
-    gzFile gzfile;
+    gzFile gzfile = fps->fp;
+    int zerror = 0;
+    fps->errcookie = gzerror(gzfile, &zerror);
+    if (zerror == Z_ERRNO) {
+       fps->syserrno = errno;
+       fps->errcookie = strerror(fps->syserrno);
+    }
+}
+
+static ssize_t gzdRead(FDSTACK_t fps, void * buf, size_t count)
+{
+    gzFile gzfile = fps->fp;
     ssize_t rc;
 
-    gzfile = gzdFileno(fd);
     if (gzfile == NULL) return -2;     /* XXX can't happen */
 
     rc = gzread(gzfile, buf, count);
-    if (rc < 0) {
-       int zerror = 0;
-       fd->errcookie = gzerror(gzfile, &zerror);
-       if (zerror == Z_ERRNO) {
-           fd->syserrno = errno;
-           fd->errcookie = strerror(fd->syserrno);
-       }
-    }
+    if (rc < 0)
+       gzdSetError(fps);
     return rc;
 }
 
-static ssize_t gzdWrite(FD_t fd, const void * buf, size_t count)
+static ssize_t gzdWrite(FDSTACK_t fps, const void * buf, size_t count)
 {
     gzFile gzfile;
     ssize_t rc;
 
-    gzfile = gzdFileno(fd);
+    gzfile = fps->fp;
     if (gzfile == NULL) return -2;     /* XXX can't happen */
 
     rc = gzwrite(gzfile, (void *)buf, count);
-    if (rc < 0) {
-       int zerror = 0;
-       fd->errcookie = gzerror(gzfile, &zerror);
-       if (zerror == Z_ERRNO) {
-           fd->syserrno = errno;
-           fd->errcookie = strerror(fd->syserrno);
-       }
-    }
+    if (rc < 0)
+       gzdSetError(fps);
     return rc;
 }
 
 /* XXX zlib-1.0.4 has not */
-static int gzdSeek(FD_t fd, off_t pos, int whence)
+static int gzdSeek(FDSTACK_t fps, off_t pos, int whence)
 {
     off_t p = pos;
     int rc;
 #if HAVE_GZSEEK
-    gzFile gzfile;
-
-    if (fd == NULL) return -2;
+    gzFile gzfile = fps->fp;
 
-    gzfile = gzdFileno(fd);
     if (gzfile == NULL) return -2;     /* XXX can't happen */
 
     rc = gzseek(gzfile, p, whence);
-    if (rc < 0) {
-       int zerror = 0;
-       fd->errcookie = gzerror(gzfile, &zerror);
-       if (zerror == Z_ERRNO) {
-           fd->syserrno = errno;
-           fd->errcookie = strerror(fd->syserrno);
-       }
-    }
+    if (rc < 0)
+       gzdSetError(fps);
 #else
     rc = -2;
 #endif
     return rc;
 }
 
-static int gzdClose(FD_t fd)
+static int gzdClose(FDSTACK_t fps)
 {
-    gzFile gzfile;
+    gzFile gzfile = fps->fp;
     int rc;
 
-    gzfile = gzdFileno(fd);
     if (gzfile == NULL) return -2;     /* XXX can't happen */
 
     rc = gzclose(gzfile);
 
-    /* XXX TODO: preserve fd if errors */
-
-    if (fd) {
-       if (rc < 0) {
-           fd->errcookie = "gzclose error";
-           if (rc == Z_ERRNO) {
-               fd->syserrno = errno;
-               fd->errcookie = strerror(fd->syserrno);
-           }
-       }
-    }
-
-    if (_rpmio_debug || rpmIsDebug()) fdstat_print(fd, "GZDIO", stderr);
-    if (rc == 0)
-       fdFree(fd);
-    return rc;
+    return (rc != 0) ? -1 : 0;
 }
 
-static long gzdTell(FD_t fd)
+static off_t gzdTell(FDSTACK_t fps)
 {
     off_t pos = -1;
-    gzFile gzfile = gzdFileno(fd);
+    gzFile gzfile = fps->fp;
 
     if (gzfile != NULL) {
 #if HAVE_GZSEEK
        pos = gztell(gzfile);
-       if (pos < 0) {
-           int zerror = 0;
-           fd->errcookie = gzerror(gzfile, &zerror);
-           if (zerror == Z_ERRNO) {
-               fd->syserrno = errno;
-               fd->errcookie = strerror(fd->syserrno);
-           }
-       }
+       if (pos < 0)
+           gzdSetError(fps);
 #else
        pos = -2;
 #endif    
@@ -727,8 +636,9 @@ static long gzdTell(FD_t fd)
     return pos;
 }
 static const struct FDIO_s gzdio_s = {
-  gzdRead, gzdWrite, gzdSeek, gzdClose, fdLink, fdFree, fdNew, fdFileno,
-  NULL, gzdOpen, gzdFileno, gzdFlush, gzdTell
+  "gzdio", "gzip",
+  gzdRead, gzdWrite, gzdSeek, gzdClose,
+  NULL, gzdFdopen, gzdFlush, gzdTell, zfdError, zfdStrerr
 };
 static const FDIO_t gzdio = &gzdio_s ;
 
@@ -738,133 +648,73 @@ static const FDIO_t gzdio = &gzdio_s ;
 
 #include <bzlib.h>
 
-static void * bzdFileno(FD_t fd)
+static FD_t bzdFdopen(FD_t fd, int fdno, const char * fmode)
 {
-    return iotFileno(fd, bzdio);
-}
+    BZFILE *bzfile = BZ2_bzdopen(fdno, fmode);
 
-static FD_t bzdOpen(const char * path, const char * mode)
-{
-    FD_t fd;
-    BZFILE *bzfile;;
-    if ((bzfile = BZ2_bzopen(path, mode)) == NULL)
+    if (bzfile == NULL)
        return NULL;
-    fd = fdNew(path);
-    fdPop(fd); fdPush(fd, bzdio, bzfile, -1);
-    return fdLink(fd);
-}
 
-static FD_t bzdFdopen(FD_t fd, const char * fmode)
-{
-    int fdno;
-    BZFILE *bzfile;
-
-    if (fd == NULL || fmode == NULL) return NULL;
-    fdno = fdFileno(fd);
     fdSetFdno(fd, -1);         /* XXX skip the fdio close */
-    if (fdno < 0) return NULL;
-    bzfile = BZ2_bzdopen(fdno, fmode);
-    if (bzfile == NULL) return NULL;
-
     fdPush(fd, bzdio, bzfile, fdno);           /* Push bzdio onto stack */
-
-    return fdLink(fd);
+    return fd;
 }
 
-static int bzdFlush(FD_t fd)
+static int bzdFlush(FDSTACK_t fps)
 {
-    return BZ2_bzflush(bzdFileno(fd));
+    return BZ2_bzflush(fps->fp);
 }
 
-static ssize_t bzdRead(FD_t fd, void * buf, size_t count)
+static ssize_t bzdRead(FDSTACK_t fps, void * buf, size_t count)
 {
-    BZFILE *bzfile;
+    BZFILE *bzfile = fps->fp;
     ssize_t rc = 0;
 
-    bzfile = bzdFileno(fd);
     if (bzfile)
        rc = BZ2_bzread(bzfile, buf, count);
     if (rc == -1) {
        int zerror = 0;
-       if (bzfile)
-           fd->errcookie = BZ2_bzerror(bzfile, &zerror);
+       if (bzfile) {
+           fps->errcookie = BZ2_bzerror(bzfile, &zerror);
+       }
     }
     return rc;
 }
 
-static ssize_t bzdWrite(FD_t fd, const void * buf, size_t count)
+static ssize_t bzdWrite(FDSTACK_t fps, const void * buf, size_t count)
 {
-    BZFILE *bzfile;
+    BZFILE *bzfile = fps->fp;
     ssize_t rc;
 
-    bzfile = bzdFileno(fd);
     rc = BZ2_bzwrite(bzfile, (void *)buf, count);
     if (rc == -1) {
        int zerror = 0;
-       fd->errcookie = BZ2_bzerror(bzfile, &zerror);
+       fps->errcookie = BZ2_bzerror(bzfile, &zerror);
     }
     return rc;
 }
 
-static int bzdClose(FD_t fd)
+static int bzdClose(FDSTACK_t fps)
 {
-    BZFILE *bzfile;
-    int rc;
-
-    bzfile = bzdFileno(fd);
+    BZFILE *bzfile = fps->fp;
 
     if (bzfile == NULL) return -2;
-    /* FIX: check rc */
-    BZ2_bzclose(bzfile);
-    rc = 0;    /* XXX FIXME */
-
-    /* XXX TODO: preserve fd if errors */
 
-    if (fd) {
-       if (rc == -1) {
-           int zerror = 0;
-           fd->errcookie = BZ2_bzerror(bzfile, &zerror);
-       }
-    }
+    /* bzclose() doesn't return errors */
+    BZ2_bzclose(bzfile);
 
-    if (_rpmio_debug || rpmIsDebug()) fdstat_print(fd, "BZDIO", stderr);
-    if (rc == 0)
-       fdFree(fd);
-    return rc;
+    return 0;
 }
 
 static const struct FDIO_s bzdio_s = {
-  bzdRead, bzdWrite, NULL, bzdClose, fdLink, fdFree, fdNew, fdFileno,
-  NULL, bzdOpen, bzdFileno, bzdFlush, NULL
+  "bzdio", "bzip2",
+  bzdRead, bzdWrite, NULL, bzdClose,
+  NULL, bzdFdopen, bzdFlush, NULL, zfdError, zfdStrerr
 };
 static const FDIO_t bzdio = &bzdio_s ;
 
 #endif /* HAVE_BZLIB_H */
 
-static const char * getFdErrstr (FD_t fd)
-{
-    const char *errstr = NULL;
-
-    if (fdGetIo(fd) == gzdio) {
-       errstr = fd->errcookie;
-    } else
-#ifdef HAVE_BZLIB_H
-    if (fdGetIo(fd) == bzdio) {
-       errstr = fd->errcookie;
-    } else
-#endif /* HAVE_BZLIB_H */
-#ifdef HAVE_LZMA_H
-    if (fdGetIo(fd) == xzdio || fdGetIo(fd) == lzdio) {
-       errstr = fd->errcookie;
-    } else
-#endif /* HAVE_LZMA_H */
-    {
-       errstr = (fd->syserrno ? strerror(fd->syserrno) : "");
-    }
-
-    return errstr;
-}
-
 /* =============================================================== */
 /* Support for LZMA library.  */
 
@@ -873,6 +723,10 @@ static const char * getFdErrstr (FD_t fd)
 #include <sys/types.h>
 #include <inttypes.h>
 #include <lzma.h>
+/* Multithreading support in stable API since xz 5.2.0 */
+#if LZMA_VERSION >= 50020002
+#define HAVE_LZMA_MT
+#endif
 
 #define kBufferSize (1 << 15)
 
@@ -889,87 +743,138 @@ typedef struct lzfile {
 
 } LZFILE;
 
-static LZFILE *lzopen_internal(const char *path, const char *mode, int fd, int xz)
+static LZFILE *lzopen_internal(const char *mode, int fd, int xz)
 {
-    int level = 7;     /* Use XZ's default compression level if unspecified */
+    int level = LZMA_PRESET_DEFAULT;
     int encoding = 0;
     FILE *fp;
     LZFILE *lzfile;
     lzma_ret ret;
     lzma_stream init_strm = LZMA_STREAM_INIT;
-
+    uint64_t mem_limit = rpmExpandNumeric("%{_xz_memlimit}");
+#ifdef HAVE_LZMA_MT
+    int threads = 0;
+#endif
     for (; *mode; mode++) {
        if (*mode == 'w')
            encoding = 1;
        else if (*mode == 'r')
            encoding = 0;
-       else if (*mode >= '1' && *mode <= '9')
+       else if (*mode >= '0' && *mode <= '9')
            level = *mode - '0';
+       else if (*mode == 'T') {
+           if (isdigit(*(mode+1))) {
+#ifdef HAVE_LZMA_MT
+               threads = atoi(++mode);
+#endif
+               /* skip past rest of digits in string that atoi()
+                * should've processed
+                * */
+               while (isdigit(*++mode));
+           }
+#ifdef HAVE_LZMA_MT
+           else
+               threads = -1;
+#endif
+       }
     }
-    if (fd != -1)
-       fp = fdopen(fd, encoding ? "w" : "r");
-    else
-       fp = fopen(path, encoding ? "w" : "r");
+    fp = fdopen(fd, encoding ? "w" : "r");
     if (!fp)
-       return 0;
+       return NULL;
     lzfile = calloc(1, sizeof(*lzfile));
-    if (!lzfile) {
-       fclose(fp);
-       return 0;
-    }
-    
     lzfile->file = fp;
     lzfile->encoding = encoding;
     lzfile->eof = 0;
     lzfile->strm = init_strm;
     if (encoding) {
        if (xz) {
-           ret = lzma_easy_encoder(&lzfile->strm, level, LZMA_CHECK_SHA256);
+#ifdef HAVE_LZMA_MT
+           if (!threads) {
+#endif
+               ret = lzma_easy_encoder(&lzfile->strm, level, LZMA_CHECK_SHA256);
+#ifdef HAVE_LZMA_MT
+           } else {
+               if (threads == -1)
+                   threads = sysconf(_SC_NPROCESSORS_ONLN);
+               lzma_mt mt_options = {
+                   .flags = 0,
+                   .threads = threads,
+                   .block_size = 0,
+                   .timeout = 0,
+                   .preset = level,
+                   .filters = NULL,
+                   .check = LZMA_CHECK_SHA256 };
+
+#if __WORDSIZE == 32
+               /* In 32 bit environment, required memory easily exceeds memory address
+                * space limit if compressing using multiple threads.
+                * By setting a memory limit, liblzma will automatically adjust number
+                * of threads to avoid exceeding memory.
+                */
+               if (threads > 1) {
+                   struct utsname u;
+                   uint32_t memlimit = (SIZE_MAX>>1) + (SIZE_MAX>>3);
+                   uint64_t memory_usage;
+                   /* While a 32 bit linux kernel will have an address limit of 3GiB
+                    * for processes (which is why set the memory limit to 2.5GiB as a safety
+                    * margin), 64 bit kernels will have a limit of 4GiB for 32 bit binaries.
+                    * Therefore the memory limit should be higher if running on a 64 bit
+                    * kernel, so we increase it to 3,5GiB.
+                    */
+                   uname(&u);
+                   if (strstr(u.machine, "64") || strstr(u.machine, "s390x")
+#if defined(__linux__)
+                                   || ((personality(0xffffffff) & PER_MASK) == PER_LINUX32)
+#endif
+                           )
+                       memlimit += (SIZE_MAX>>2);
+                   /* keep reducing the number of threads until memory usage gets below limit */
+                   while ((memory_usage = lzma_stream_encoder_mt_memusage(&mt_options)) > memlimit) {
+                       /* number of threads shouldn't be able to hit zero with compression
+                        * settings aailable to set through rpm... */
+                       assert(--mt_options.threads != 0);
+                   }
+                   lzma_memlimit_set(&lzfile->strm, memlimit);
+
+                   if (threads != (int)mt_options.threads)
+                       rpmlog(RPMLOG_NOTICE,
+                               "XZ: Adjusted the number of threads from %d to %d to not exceed the memory usage limit of %lu bytes",
+                               threads, mt_options.threads, memlimit);
+               }
+#endif
+
+               ret = lzma_stream_encoder_mt(&lzfile->strm, &mt_options);
+           }
+#endif
        } else {
            lzma_options_lzma options;
            lzma_lzma_preset(&options, level);
            ret = lzma_alone_encoder(&lzfile->strm, &options);
        }
-    } else {   /* lzma_easy_decoder_memusage(level) is not ready yet, use hardcoded limit for now */
-       ret = lzma_auto_decoder(&lzfile->strm, 100<<20, 0);
+    } else {   /* lzma_easy_decoder_memusage(level) is not ready yet, use hardcoded limit for now */
+       ret = lzma_auto_decoder(&lzfile->strm, mem_limit ? mem_limit : 100<<20, 0);
     }
     if (ret != LZMA_OK) {
+       switch (ret) {
+           case LZMA_MEM_ERROR:
+               rpmlog(RPMLOG_ERR, "liblzma: Memory allocation failed");
+               break;
+
+           case LZMA_DATA_ERROR:
+               rpmlog(RPMLOG_ERR, "liblzma: File size limits exceeded");
+               break;
+
+           default:
+               rpmlog(RPMLOG_ERR, "liblzma: <Unknown error (%d), possibly a bug", ret);
+               break;
+       }
        fclose(fp);
        free(lzfile);
-       return 0;
+       return NULL;
     }
     return lzfile;
 }
 
-static LZFILE *xzopen(const char *path, const char *mode)
-{
-    return lzopen_internal(path, mode, -1, 1);
-}
-
-static LZFILE *xzdopen(int fd, const char *mode)
-{
-    if (fd < 0)
-       return 0;
-    return lzopen_internal(0, mode, fd, 1);
-}
-
-static LZFILE *lzopen(const char *path, const char *mode)
-{
-    return lzopen_internal(path, mode, -1, 0);
-}
-
-static LZFILE *lzdopen(int fd, const char *mode)
-{
-    if (fd < 0)
-       return 0;
-    return lzopen_internal(0, mode, fd, 0);
-}
-
-static int lzflush(LZFILE *lzfile)
-{
-    return fflush(lzfile->file);
-}
-
 static int lzclose(LZFILE *lzfile)
 {
     lzma_ret ret;
@@ -1054,170 +959,363 @@ static ssize_t lzwrite(LZFILE *lzfile, void *buf, size_t len)
     }
 }
 
-static void * lzdFileno(FD_t fd)
+static FD_t xzdFdopen(FD_t fd, int fdno, const char * fmode)
 {
-    void * rc = NULL;
-    
-    if (fd == NULL)
-       return NULL;
+    LZFILE *lzfile = lzopen_internal(fmode, fdno, 1);
 
-    for (int i = fd->nfps; i >= 0; i--) {
-       FDSTACK_t * fps = &fd->fps[i];
-       if (fps->io != xzdio && fps->io != lzdio)
-           continue;
-       rc = fps->fp;
-       break;
-    }
-    return rc;
-}
-
-static FD_t xzdOpen(const char * path, const char * mode)
-{
-    FD_t fd;
-    LZFILE *lzfile;
-    if ((lzfile = xzopen(path, mode)) == NULL)
+    if (lzfile == NULL)
        return NULL;
-    fd = fdNew(path);
-    fdPop(fd); fdPush(fd, xzdio, lzfile, -1);
-    return fdLink(fd);
-}
-
-static FD_t xzdFdopen(FD_t fd, const char * fmode)
-{
-    int fdno;
-    LZFILE *lzfile;
 
-    if (fd == NULL || fmode == NULL) return NULL;
-    fdno = fdFileno(fd);
     fdSetFdno(fd, -1);          /* XXX skip the fdio close */
-    if (fdno < 0) return NULL;
-    lzfile = xzdopen(fdno, fmode);
-    if (lzfile == NULL) return NULL;
     fdPush(fd, xzdio, lzfile, fdno);
-    return fdLink(fd);
+    return fd;
 }
 
-static FD_t lzdOpen(const char * path, const char * mode)
+static FD_t lzdFdopen(FD_t fd, int fdno, const char * fmode)
 {
-    FD_t fd;
-    LZFILE *lzfile;
-    if ((lzfile = lzopen(path, mode)) == NULL)
-       return NULL;
-    fd = fdNew(path);
-    fdPop(fd); fdPush(fd, xzdio, lzfile, -1);
-    return fdLink(fd);
-}
+    LZFILE *lzfile = lzopen_internal(fmode, fdno, 0);
 
-static FD_t lzdFdopen(FD_t fd, const char * fmode)
-{
-    int fdno;
-    LZFILE *lzfile;
+    if (lzfile == NULL)
+       return NULL;
 
-    if (fd == NULL || fmode == NULL) return NULL;
-    fdno = fdFileno(fd);
     fdSetFdno(fd, -1);          /* XXX skip the fdio close */
-    if (fdno < 0) return NULL;
-    lzfile = lzdopen(fdno, fmode);
-    if (lzfile == NULL) return NULL;
-    fdPush(fd, xzdio, lzfile, fdno);
-    return fdLink(fd);
+    fdPush(fd, lzdio, lzfile, fdno);
+    return fd;
 }
 
-static int lzdFlush(FD_t fd)
+static int lzdFlush(FDSTACK_t fps)
 {
-    return lzflush(lzdFileno(fd));
+    LZFILE *lzfile = fps->fp;
+    return fflush(lzfile->file);
 }
 
-static ssize_t lzdRead(FD_t fd, void * buf, size_t count)
+static ssize_t lzdRead(FDSTACK_t fps, void * buf, size_t count)
 {
-    LZFILE *lzfile;
+    LZFILE *lzfile = fps->fp;
     ssize_t rc = 0;
 
-    lzfile = lzdFileno(fd);
     if (lzfile)
        rc = lzread(lzfile, buf, count);
     if (rc == -1) {
-       fd->errcookie = "Lzma: decoding error";
+       fps->errcookie = "Lzma: decoding error";
     }
     return rc;
 }
 
-static ssize_t lzdWrite(FD_t fd, const void * buf, size_t count)
+static ssize_t lzdWrite(FDSTACK_t fps, const void * buf, size_t count)
 {
-    LZFILE *lzfile;
+    LZFILE *lzfile = fps->fp;
     ssize_t rc = 0;
 
-    lzfile = lzdFileno(fd);
-
     rc = lzwrite(lzfile, (void *)buf, count);
     if (rc < 0) {
-       fd->errcookie = "Lzma: encoding error";
+       fps->errcookie = "Lzma: encoding error";
     }
     return rc;
 }
 
-static int lzdClose(FD_t fd)
+static int lzdClose(FDSTACK_t fps)
 {
-    LZFILE *lzfile;
+    LZFILE *lzfile = fps->fp;
     int rc;
 
-    lzfile = lzdFileno(fd);
-
     if (lzfile == NULL) return -2;
     rc = lzclose(lzfile);
 
-    /* XXX TODO: preserve fd if errors */
-
-    if (fd) {
-       if (rc == -1) {
-           fd->errcookie = "lzclose error";
-           fd->syserrno = errno;
-           fd->errcookie = strerror(fd->syserrno);
-       }
-    }
-
-    if (_rpmio_debug || rpmIsDebug()) fdstat_print(fd, "XZDIO", stderr);
-    if (rc == 0)
-       fdFree(fd);
     return rc;
 }
 
 static struct FDIO_s xzdio_s = {
-  lzdRead, lzdWrite, NULL, lzdClose, NULL, NULL, NULL, fdFileno,
-  NULL, xzdOpen, lzdFileno, lzdFlush, NULL
+  "xzdio", "xz",
+  lzdRead, lzdWrite, NULL, lzdClose,
+  NULL, xzdFdopen, lzdFlush, NULL, zfdError, zfdStrerr
 };
 static const FDIO_t xzdio = &xzdio_s;
 
 static struct FDIO_s lzdio_s = {
-  lzdRead, lzdWrite, NULL, lzdClose, NULL, NULL, NULL, fdFileno,
-  NULL, lzdOpen, lzdFileno, lzdFlush, NULL
+  "lzdio", "lzma",
+  lzdRead, lzdWrite, NULL, lzdClose,
+  NULL, lzdFdopen, lzdFlush, NULL, zfdError, zfdStrerr
 };
 static const FDIO_t lzdio = &lzdio_s;
 
 #endif /* HAVE_LZMA_H */
 
 /* =============================================================== */
+/* Support for ZSTD library.  */
+#ifdef HAVE_ZSTD
 
-const char *Fstrerror(FD_t fd)
+#include <zstd.h>
+
+typedef struct rpmzstd_s {
+    int flags;                 /*!< open flags. */
+    int fdno;
+    int level;                 /*!< compression level */
+    FILE * fp;
+    void * _stream;             /*!< ZSTD_{C,D}Stream */
+    size_t nb;
+    void * b;
+    ZSTD_inBuffer zib;          /*!< ZSTD_inBuffer */
+    ZSTD_outBuffer zob;         /*!< ZSTD_outBuffer */
+} * rpmzstd;
+
+static rpmzstd rpmzstdNew(int fdno, const char *fmode)
 {
-    if (fd == NULL)
-       return (errno ? strerror(errno) : "");
-    return getFdErrstr(fd);
+    int flags = 0;
+    int level = 3;
+    const char * s = fmode;
+    char stdio[32];
+    char *t = stdio;
+    char *te = t + sizeof(stdio) - 2;
+    int c;
+
+    switch ((c = *s++)) {
+    case 'a':
+       *t++ = (char)c;
+       flags &= ~O_ACCMODE;
+       flags |= O_WRONLY | O_CREAT | O_APPEND;
+       break;
+    case 'w':
+       *t++ = (char)c;
+       flags &= ~O_ACCMODE;
+       flags |= O_WRONLY | O_CREAT | O_TRUNC;
+       break;
+    case 'r':
+       *t++ = (char)c;
+       flags &= ~O_ACCMODE;
+       flags |= O_RDONLY;
+       break;
+    }
+
+    while ((c = *s++) != 0) {
+       switch (c) {
+       case '.':
+           break;
+       case '+':
+           if (t < te) *t++ = c;
+           flags &= ~O_ACCMODE;
+           flags |= O_RDWR;
+           continue;
+           break;
+       default:
+           if (c >= (int)'0' && c <= (int)'9') {
+               level = strtol(s-1, (char **)&s, 10);
+               if (level < 1){
+                   level = 1;
+                   rpmlog(RPMLOG_WARNING, "Invalid compression level for zstd. Using %i instead.\n", 1);
+               }
+               if (level > 19) {
+                   level = 19;
+                   rpmlog(RPMLOG_WARNING, "Invalid compression level for zstd. Using %i instead.\n", 19);
+               }
+           }
+           continue;
+           break;
+       }
+       break;
+    }
+    *t = '\0';
+
+    FILE * fp = fdopen(fdno, stdio);
+    if (fp == NULL)
+       return NULL;
+
+    void * _stream = NULL;
+    size_t nb = 0;
+
+    if ((flags & O_ACCMODE) == O_RDONLY) {     /* decompressing */
+       if ((_stream = (void *) ZSTD_createDStream()) == NULL
+        || ZSTD_isError(ZSTD_initDStream(_stream))) {
+           return NULL;
+       }
+       nb = ZSTD_DStreamInSize();
+    } else {                                   /* compressing */
+       if ((_stream = (void *) ZSTD_createCStream()) == NULL
+        || ZSTD_isError(ZSTD_initCStream(_stream, level))) {
+           return NULL;
+       }
+       nb = ZSTD_CStreamOutSize();
+    }
+
+    rpmzstd zstd = (rpmzstd) xcalloc(1, sizeof(*zstd));
+    zstd->flags = flags;
+    zstd->fdno = fdno;
+    zstd->level = level;
+    zstd->fp = fp;
+    zstd->_stream = _stream;
+    zstd->nb = nb;
+    zstd->b = xmalloc(nb);
+
+    return zstd;
 }
 
-#define        FDIOVEC(_fd, _vec)      \
-  ((fdGetIo(_fd) && fdGetIo(_fd)->_vec) ? fdGetIo(_fd)->_vec : NULL)
+static FD_t zstdFdopen(FD_t fd, int fdno, const char * fmode)
+{
+    rpmzstd zstd = rpmzstdNew(fdno, fmode);
+
+    if (zstd == NULL)
+       return NULL;
+
+    fdSetFdno(fd, -1);         /* XXX skip the fdio close */
+    fdPush(fd, zstdio, zstd, fdno);            /* Push zstdio onto stack */
+    return fd;
+}
+
+static int zstdFlush(FDSTACK_t fps)
+{
+    rpmzstd zstd = (rpmzstd) fps->fp;
+assert(zstd);
+    int rc = -1;
+
+    if ((zstd->flags & O_ACCMODE) == O_RDONLY) { /* decompressing */
+       rc = 0;
+    } else {                                   /* compressing */
+       /* close frame */
+       zstd->zob.dst  = zstd->b;
+       zstd->zob.size = zstd->nb;
+       zstd->zob.pos  = 0;
+       int xx = ZSTD_flushStream(zstd->_stream, &zstd->zob);
+       if (ZSTD_isError(xx))
+           fps->errcookie = ZSTD_getErrorName(xx);
+       else if (zstd->zob.pos != fwrite(zstd->b, 1, zstd->zob.pos, zstd->fp))
+           fps->errcookie = "zstdFlush fwrite failed.";
+       else
+           rc = 0;
+    }
+    return rc;
+}
+
+static ssize_t zstdRead(FDSTACK_t fps, void * buf, size_t count)
+{
+    rpmzstd zstd = (rpmzstd) fps->fp;
+assert(zstd);
+    ZSTD_outBuffer zob = { buf, count, 0 };
+
+    while (zob.pos < zob.size) {
+       /* Re-fill compressed data buffer. */
+       if (zstd->zib.pos >= zstd->zib.size) {
+           zstd->zib.size = fread(zstd->b, 1, zstd->nb, zstd->fp);
+           if (zstd->zib.size == 0)
+               break;          /* EOF */
+           zstd->zib.src  = zstd->b;
+           zstd->zib.pos  = 0;
+       }
+
+       /* Decompress next chunk. */
+       int xx = ZSTD_decompressStream(zstd->_stream, &zob, &zstd->zib);
+       if (ZSTD_isError(xx)) {
+           fps->errcookie = ZSTD_getErrorName(xx);
+           return -1;
+       }
+    }
+    return zob.pos;
+}
+
+static ssize_t zstdWrite(FDSTACK_t fps, const void * buf, size_t count)
+{
+    rpmzstd zstd = (rpmzstd) fps->fp;
+assert(zstd);
+    ZSTD_inBuffer zib = { buf, count, 0 };
+
+    while (zib.pos < zib.size) {
+
+       /* Reset to beginning of compressed data buffer. */
+       zstd->zob.dst  = zstd->b;
+       zstd->zob.size = zstd->nb;
+       zstd->zob.pos  = 0;
+
+       /* Compress next chunk. */
+        int xx = ZSTD_compressStream(zstd->_stream, &zstd->zob, &zib);
+        if (ZSTD_isError(xx)) {
+           fps->errcookie = ZSTD_getErrorName(xx);
+           return -1;
+       }
+
+       /* Write compressed data buffer. */
+        if (zstd->zob.pos > 0) {
+           size_t nw = fwrite(zstd->b, 1, zstd->zob.pos, zstd->fp);
+           if (nw != zstd->zob.pos) {
+               fps->errcookie = "zstdWrite fwrite failed.";
+               return -1;
+           }
+       }
+    }
+    return zib.pos;
+}
+
+static int zstdClose(FDSTACK_t fps)
+{
+    rpmzstd zstd = (rpmzstd) fps->fp;
+assert(zstd);
+    int rc = -2;
+
+    if ((zstd->flags & O_ACCMODE) == O_RDONLY) { /* decompressing */
+       rc = 0;
+       ZSTD_freeDStream(zstd->_stream);
+    } else {                                   /* compressing */
+       /* close frame */
+       zstd->zob.dst  = zstd->b;
+       zstd->zob.size = zstd->nb;
+       zstd->zob.pos  = 0;
+       int xx = ZSTD_endStream(zstd->_stream, &zstd->zob);
+       if (ZSTD_isError(xx))
+           fps->errcookie = ZSTD_getErrorName(xx);
+       else if (zstd->zob.pos != fwrite(zstd->b, 1, zstd->zob.pos, zstd->fp))
+           fps->errcookie = "zstdClose fwrite failed.";
+       else
+           rc = 0;
+       ZSTD_freeCStream(zstd->_stream);
+    }
+
+    if (zstd->fp && fileno(zstd->fp) > 2)
+       (void) fclose(zstd->fp);
+
+    if (zstd->b) free(zstd->b);
+    free(zstd);
+
+    return rc;
+}
+
+static const struct FDIO_s zstdio_s = {
+  "zstdio", "zstd",
+  zstdRead, zstdWrite, NULL, zstdClose,
+  NULL, zstdFdopen, zstdFlush, NULL, zfdError, zfdStrerr
+};
+static const FDIO_t zstdio = &zstdio_s ;
+
+#endif /* HAVE_ZSTD */
+
+/* =============================================================== */
+
+#define        FDIOVEC(_fps, _vec)     \
+  ((_fps) && (_fps)->io) ? (_fps)->io->_vec : NULL
+
+const char *Fstrerror(FD_t fd)
+{
+    const char *err = "";
+
+    if (fd != NULL) {
+       FDSTACK_t fps = fdGetFps(fd);
+       fdio_fstrerr_function_t _fstrerr = FDIOVEC(fps, _fstrerr);
+       if (_fstrerr)
+           err = _fstrerr(fps);
+    } else if (errno){
+       err = strerror(errno);
+    }
+    return err;
+}
 
 ssize_t Fread(void *buf, size_t size, size_t nmemb, FD_t fd)
 {
     ssize_t rc = -1;
 
     if (fd != NULL) {
-       fdio_read_function_t _read = FDIOVEC(fd, read);
+       FDSTACK_t fps = fdGetFps(fd);
+       fdio_read_function_t _read = FDIOVEC(fps, read);
 
        fdstat_enter(fd, FDSTAT_READ);
        do {
-           rc = (_read ? (*_read) (fd, buf, size * nmemb) : -2);
+           rc = (_read ? (*_read) (fps, buf, size * nmemb) : -2);
        } while (rc == -1 && errno == EINTR);
        fdstat_exit(fd, FDSTAT_READ, rc);
 
@@ -1236,11 +1334,12 @@ ssize_t Fwrite(const void *buf, size_t size, size_t nmemb, FD_t fd)
     ssize_t rc = -1;
 
     if (fd != NULL) {
-       fdio_write_function_t _write = FDIOVEC(fd, write);
+       FDSTACK_t fps = fdGetFps(fd);
+       fdio_write_function_t _write = FDIOVEC(fps, write);
        
        fdstat_enter(fd, FDSTAT_WRITE);
        do {
-           rc = (_write ? _write(fd, buf, size * nmemb) : -2);
+           rc = (_write ? _write(fps, buf, size * nmemb) : -2);
        } while (rc == -1 && errno == EINTR);
        fdstat_exit(fd, FDSTAT_WRITE, rc);
 
@@ -1259,10 +1358,11 @@ int Fseek(FD_t fd, off_t offset, int whence)
     int rc = -1;
 
     if (fd != NULL) {
-       fdio_seek_function_t _seek = FDIOVEC(fd, seek);
+       FDSTACK_t fps = fdGetFps(fd);
+       fdio_seek_function_t _seek = FDIOVEC(fps, seek);
 
        fdstat_enter(fd, FDSTAT_SEEK);
-       rc = (_seek ? _seek(fd, offset, whence) : -2);
+       rc = (_seek ? _seek(fps, offset, whence) : -2);
        fdstat_exit(fd, FDSTAT_SEEK, rc);
     }
 
@@ -1281,19 +1381,27 @@ int Fclose(FD_t fd)
 
     fd = fdLink(fd);
     fdstat_enter(fd, FDSTAT_CLOSE);
-    while (fd->nfps >= 0) {
-       fdio_close_function_t _close = FDIOVEC(fd, close);
-       rc = _close ? _close(fd) : -2;
+    for (FDSTACK_t fps = fd->fps; fps != NULL; fps = fdPop(fd)) {
+       if (fps->fdno >= 0) {
+           fdio_close_function_t _close = FDIOVEC(fps, close);
+           rc = _close ? _close(fps) : -2;
+
+           if (ec == 0 && rc)
+               ec = rc;
+       }
+
+       /* Debugging stats for compresed types */
+       if ((_rpmio_debug || rpmIsDebug()) && fps->fdno == -1)
+           fdstat_print(fd, fps->io->ioname, stderr);
 
-       if (fd->nfps == 0)
+       /* Leave freeing the last one after stats */
+       if (fps->prev == NULL)
            break;
-       if (ec == 0 && rc)
-           ec = rc;
-       fdPop(fd);
     }
     fdstat_exit(fd, FDSTAT_CLOSE, rc);
     DBGIO(fd, (stderr, "==>\tFclose(%p) rc %lx %s\n",
          (fd ? fd : NULL), (unsigned long)rc, fdbg(fd)));
+    fdPop(fd);
 
     fdFree(fd);
     return ec;
@@ -1320,14 +1428,17 @@ static void cvtfmode (const char *m,
 
     switch (*m) {
     case 'a':
+       flags &= ~O_ACCMODE;
        flags |= O_WRONLY | O_CREAT | O_APPEND;
        if (--nstdio > 0) *stdio++ = *m;
        break;
     case 'w':
+       flags &= ~O_ACCMODE;
        flags |= O_WRONLY | O_CREAT | O_TRUNC;
        if (--nstdio > 0) *stdio++ = *m;
        break;
     case 'r':
+       flags &= ~O_ACCMODE;
        flags |= O_RDONLY;
        if (--nstdio > 0) *stdio++ = *m;
        break;
@@ -1343,7 +1454,7 @@ static void cvtfmode (const char *m,
        case '.':
            break;
        case '+':
-           flags &= ~(O_RDONLY|O_WRONLY);
+           flags &= ~O_ACCMODE;
            flags |= O_RDWR;
            if (--nstdio > 0) *stdio++ = c;
            continue;
@@ -1357,6 +1468,11 @@ static void cvtfmode (const char *m,
            if (--nstdio > 0) *stdio++ = c;
            continue;
            break;
+       case '?':
+           flags |= RPMIO_DEBUG_IO;
+           if (--nother > 0) *other++ = c;
+           continue;
+           break;
        default:
            if (--nother > 0) *other++ = c;
            continue;
@@ -1372,17 +1488,49 @@ static void cvtfmode (const char *m,
        *f = flags;
 }
 
+static FDIO_t findIOT(const char *name)
+{
+    static FDIO_t fdio_types[] = {
+       &fdio_s,
+       &ufdio_s,
+       &gzdio_s,
+#if HAVE_BZLIB_H
+       &bzdio_s,
+#endif
+#if HAVE_LZMA_H
+       &xzdio_s,
+       &lzdio_s,
+#endif
+#ifdef HAVE_ZSTD
+       &zstdio_s,
+#endif
+       NULL
+    };
+    FDIO_t iot = NULL;
+
+    for (FDIO_t *t = fdio_types; t && *t; t++) {
+       if (rstreq(name, (*t)->ioname) ||
+               ((*t)->name && rstreq(name, (*t)->name))) {
+           iot = (*t);
+           break;
+       }
+    }
+
+    return iot;
+}
+
 FD_t Fdopen(FD_t ofd, const char *fmode)
 {
     char stdio[20], other[20], zstdio[40];
     const char *end = NULL;
-    FDIO_t iof = NULL;
+    FDIO_t iot = NULL;
     FD_t fd = ofd;
+    int fdno = Fileno(ofd);
 
 if (_rpmio_debug)
 fprintf(stderr, "*** Fdopen(%p,%s) %s\n", fd, fmode, fdbg(fd));
 
-    if (fd == NULL || fmode == NULL)
+    if (fd == NULL || fmode == NULL || fdno < 0)
        return NULL;
 
     cvtfmode(fmode, stdio, sizeof(stdio), other, sizeof(other), &end, NULL);
@@ -1396,37 +1544,16 @@ fprintf(stderr, "*** Fdopen(%p,%s) %s\n", fd, fmode, fdbg(fd));
        return fd;
 
     if (end && *end) {
-       if (rstreq(end, "fdio")) {
-           iof = fdio;
-       } else if (rstreq(end, "gzdio") || rstreq(end, "gzip")) {
-           iof = gzdio;
-           fd = gzdFdopen(fd, zstdio);
-#if HAVE_BZLIB_H
-       } else if (rstreq(end, "bzdio") || rstreq(end, "bzip2")) {
-           iof = bzdio;
-           fd = bzdFdopen(fd, zstdio);
-#endif
-#if HAVE_LZMA_H
-       } else if (rstreq(end, "xzdio") || rstreq(end, "xz")) {
-           iof = xzdio;
-           fd = xzdFdopen(fd, zstdio);
-       } else if (rstreq(end, "lzdio") || rstreq(end, "lzma")) {
-           iof = lzdio;
-           fd = lzdFdopen(fd, zstdio);
-#endif
-       } else if (rstreq(end, "ufdio")) {
-           iof = ufdio;
-       }
+       iot = findIOT(end);
     } else if (other[0] != '\0') {
        for (end = other; *end && strchr("0123456789fh", *end); end++)
            {};
-       if (*end == '\0') {
-           iof = gzdio;
-           fd = gzdFdopen(fd, zstdio);
-       }
+       if (*end == '\0')
+           iot = findIOT("gzdio");
     }
-    if (iof == NULL)
-       return fd;
+
+    if (iot && iot->_fdopen)
+       fd = iot->_fdopen(fd, fdno, zstdio);
 
 DBGIO(fd, (stderr, "==> Fdopen(%p,\"%s\") returns fd %p %s\n", ofd, fmode, (fd ? fd : NULL), fdbg(fd)));
     return fd;
@@ -1438,7 +1565,7 @@ FD_t Fopen(const char *path, const char *fmode)
     const char *end = NULL;
     mode_t perms = 0666;
     int flags = 0;
-    FD_t fd;
+    FD_t fd = NULL;
 
     if (path == NULL || fmode == NULL)
        return NULL;
@@ -1449,39 +1576,16 @@ FD_t Fopen(const char *path, const char *fmode)
        return NULL;
 
     if (end == NULL || rstreq(end, "fdio")) {
-if (_rpmio_debug)
-fprintf(stderr, "*** Fopen fdio path %s fmode %s\n", path, fmode);
+       if (_rpmio_debug)
+           fprintf(stderr, "*** Fopen fdio path %s fmode %s\n", path, fmode);
        fd = fdOpen(path, flags, perms);
-       if (fdFileno(fd) < 0) {
-           if (fd) (void) fdClose(fd);
-           return NULL;
-       }
     } else {
-       /* XXX gzdio and bzdio here too */
-
-       switch (urlIsURL(path)) {
-       case URL_IS_HTTPS:
-       case URL_IS_HTTP:
-       case URL_IS_HKP:
-       case URL_IS_PATH:
-       case URL_IS_DASH:
-       case URL_IS_FTP:
-       case URL_IS_UNKNOWN:
-if (_rpmio_debug)
-fprintf(stderr, "*** Fopen ufdio path %s fmode %s\n", path, fmode);
-           fd = ufdOpen(path, flags, perms);
-           if (fd == NULL || !(fdFileno(fd) >= 0))
-               return fd;
-           break;
-       default:
-if (_rpmio_debug)
-fprintf(stderr, "*** Fopen WTFO path %s fmode %s\n", path, fmode);
-           return NULL;
-           break;
-       }
-
+       if (_rpmio_debug)
+           fprintf(stderr, "*** Fopen ufdio path %s fmode %s\n", path, fmode);
+       fd = ufdOpen(path, flags, perms);
     }
 
+    /* Open compressed stream if necessary */
     if (fd)
        fd = Fdopen(fd, fmode);
 
@@ -1495,9 +1599,10 @@ int Fflush(FD_t fd)
 {
     int rc = -1;
     if (fd != NULL) {
-       fdio_fflush_function_t _fflush = FDIOVEC(fd, _fflush);
+       FDSTACK_t fps = fdGetFps(fd);
+       fdio_fflush_function_t _fflush = FDIOVEC(fps, _fflush);
 
-       rc = (_fflush ? _fflush(fd) : -2);
+       rc = (_fflush ? _fflush(fps) : -2);
     }
     return rc;
 }
@@ -1506,42 +1611,25 @@ off_t Ftell(FD_t fd)
 {
     off_t pos = -1;
     if (fd != NULL) {
-       fdio_ftell_function_t _ftell = FDIOVEC(fd, _ftell);
+       FDSTACK_t fps = fdGetFps(fd);
+       fdio_ftell_function_t _ftell = FDIOVEC(fps, _ftell);
 
-       pos = (_ftell ? _ftell(fd) : -2);
+       pos = (_ftell ? _ftell(fps) : -2);
     }
     return pos;
 }
 
 int Ferror(FD_t fd)
 {
-    int i, rc = 0;
+    int rc = 0;
 
     if (fd == NULL) return -1;
-    for (i = fd->nfps; rc == 0 && i >= 0; i--) {
-       FDSTACK_t * fps = &fd->fps[i];
-       int ec;
-       
-       if (fps->io == gzdio) {
-           ec = (fd->syserrno || fd->errcookie != NULL) ? -1 : 0;
-           i--;        /* XXX fdio under gzdio always has fdno == -1 */
-#if HAVE_BZLIB_H
-       } else if (fps->io == bzdio) {
-           ec = (fd->syserrno  || fd->errcookie != NULL) ? -1 : 0;
-           i--;        /* XXX fdio under bzdio always has fdno == -1 */
-#endif
-#if HAVE_LZMA_H
-       } else if (fps->io == xzdio || fps->io == lzdio) {
-           ec = (fd->syserrno  || fd->errcookie != NULL) ? -1 : 0;
-           i--;        /* XXX fdio under xzdio/lzdio always has fdno == -1 */
-#endif
-       } else {
-       /* XXX need to check ufdio/gzdio/bzdio/fdio errors correctly. */
-           ec = (fdFileno(fd) < 0 ? -1 : 0);
-       }
+    for (FDSTACK_t fps = fd->fps; fps != NULL; fps = fps->prev) {
+       fdio_ferror_function_t _ferror = FDIOVEC(fps, _ferror);
+       rc = _ferror(fps);
 
-       if (rc == 0 && ec)
-           rc = ec;
+       if (rc)
+           break;
     }
 DBGIO(fd, (stderr, "==> Ferror(%p) rc %d %s\n", fd, rc, fdbg(fd)));
     return rc;
@@ -1549,11 +1637,13 @@ DBGIO(fd, (stderr, "==> Ferror(%p) rc %d %s\n", fd, rc, fdbg(fd)));
 
 int Fileno(FD_t fd)
 {
-    int i, rc = -1;
+    int rc = -1;
 
     if (fd == NULL) return -1;
-    for (i = fd->nfps ; rc == -1 && i >= 0; i--) {
-       rc = fd->fps[i].fdno;
+    for (FDSTACK_t fps = fd->fps; fps != NULL; fps = fps->prev) {
+       rc = fps->fdno;
+       if (rc != -1)
+           break;
     }
     
 DBGIO(fd, (stderr, "==> Fileno(%p) rc %d %s\n", (fd ? fd : NULL), rc, fdbg(fd)));
@@ -1626,12 +1716,17 @@ exit:
 }
 
 void fdInitDigest(FD_t fd, int hashalgo, rpmDigestFlags flags)
+{
+    return fdInitDigestID(fd, hashalgo, hashalgo, flags);
+}
+
+void fdInitDigestID(FD_t fd, int hashalgo, int id, rpmDigestFlags flags)
 {
     if (fd->digests == NULL) {
        fd->digests = rpmDigestBundleNew();
     }
     fdstat_enter(fd, FDSTAT_DIGEST);
-    rpmDigestBundleAdd(fd->digests, hashalgo, flags);
+    rpmDigestBundleAddID(fd->digests, hashalgo, id, flags);
     fdstat_exit(fd, FDSTAT_DIGEST, (ssize_t) 0);
 }
 
@@ -1644,14 +1739,22 @@ static void fdUpdateDigests(FD_t fd, const void * buf, size_t buflen)
     }
 }
 
-void fdFiniDigest(FD_t fd, int hashalgo,
+void fdFiniDigest(FD_t fd, int id,
                void ** datap, size_t * lenp, int asAscii)
 {
     if (fd && fd->digests) {
        fdstat_enter(fd, FDSTAT_DIGEST);
-       rpmDigestBundleFinal(fd->digests, hashalgo, datap, lenp, asAscii);
+       rpmDigestBundleFinal(fd->digests, id, datap, lenp, asAscii);
        fdstat_exit(fd, FDSTAT_DIGEST, (ssize_t) 0);
     }
 }
 
+DIGEST_CTX fdDupDigest(FD_t fd, int id)
+{
+    DIGEST_CTX ctx = NULL;
 
+    if (fd && fd->digests)
+       ctx = rpmDigestBundleDupCtx(fd->digests, id);
+
+    return ctx;
+}
index 8cebe16caf328c05578344dba4b6816b793a3a06..9bd1086490ffc900ba1bef55b3c04da01fab485c 100644 (file)
@@ -4,6 +4,7 @@
 /** \ingroup rpmio
  * \file rpmio/rpmio.h
  *
+ * RPM I/O API (Fd_t is RPM equivalent to libc's FILE)
  */
 
 #include <sys/types.h>
index 8c9f1a81a6c78ccf6b3f277d1774978884db306d..fbed183b078cb086737664948262a6599245bb9e 100644 (file)
@@ -13,20 +13,24 @@ extern "C" {
 #endif
 
 void fdSetBundle(FD_t fd, rpmDigestBundle bundle);
-rpmDigestBundle fdGetBundle(FD_t fd);
+rpmDigestBundle fdGetBundle(FD_t fd, int create);
 
 /** \ingroup rpmio
  * Attach digest to fd.
  */
 void fdInitDigest(FD_t fd, int hashalgo, rpmDigestFlags flags);
 
+void fdInitDigestID(FD_t fd, int hashalgo, int id, rpmDigestFlags flags);
+
 /** \ingroup rpmio
  */
-void fdFiniDigest(FD_t fd, int hashalgo,
+void fdFiniDigest(FD_t fd, int id,
                void ** datap,
                size_t * lenp,
                int asAscii);
 
+DIGEST_CTX fdDupDigest(FD_t fd, int id);
+
 /**
  * Read an entire file into a buffer.
  * @param fn           file name to read
index 18fdfa01c3c44cc0ad856aadb47117364616db93..4e14de1e53f9a9b3e80e7aa1b8ef7824cb3d07e5 100644 (file)
@@ -1,5 +1,7 @@
 #include "system.h"
 
+#include <pthread.h>
+
 #include <rpm/rpmstring.h>
 #include <rpm/rpmpgp.h>
 #include <rpm/rpmfileutil.h>
@@ -17,17 +19,16 @@ struct rpmPubkey_s {
     pgpKeyID_t keyid;
     pgpDigParams pgpkey;
     int nrefs;
+    pthread_rwlock_t lock;
 };
 
 struct rpmKeyring_s {
     struct rpmPubkey_s **keys;
     size_t numkeys;
     int nrefs;
+    pthread_rwlock_t lock;
 };
 
-static rpmPubkey rpmPubkeyUnlink(rpmPubkey key);
-static rpmKeyring rpmKeyringUnlink(rpmKeyring keyring);
-
 static int keyidcmp(const void *k1, const void *k2)
 {
     const struct rpmPubkey_s *key1 = *(const struct rpmPubkey_s **) k1;
@@ -41,27 +42,30 @@ rpmKeyring rpmKeyringNew(void)
     rpmKeyring keyring = xcalloc(1, sizeof(*keyring));
     keyring->keys = NULL;
     keyring->numkeys = 0;
-    keyring->nrefs = 0;
-    return rpmKeyringLink(keyring);
+    keyring->nrefs = 1;
+    pthread_rwlock_init(&keyring->lock, NULL);
+    return keyring;
 }
 
 rpmKeyring rpmKeyringFree(rpmKeyring keyring)
 {
-    if (keyring == NULL) {
+    if (keyring == NULL)
        return NULL;
-    }
-
-    if (keyring->nrefs > 1) {
-       return rpmKeyringUnlink(keyring);
-    }
 
-    if (keyring->keys) {
-       for (int i = 0; i < keyring->numkeys; i++) {
-           keyring->keys[i] = rpmPubkeyFree(keyring->keys[i]);
+    pthread_rwlock_wrlock(&keyring->lock);
+    if (--keyring->nrefs == 0) {
+       if (keyring->keys) {
+           for (int i = 0; i < keyring->numkeys; i++) {
+               keyring->keys[i] = rpmPubkeyFree(keyring->keys[i]);
+           }
+           free(keyring->keys);
        }
-       free(keyring->keys);
+       pthread_rwlock_unlock(&keyring->lock);
+       pthread_rwlock_destroy(&keyring->lock);
+       free(keyring);
+    } else {
+       pthread_rwlock_unlock(&keyring->lock);
     }
-    free(keyring);
     return NULL;
 }
 
@@ -74,38 +78,36 @@ static rpmPubkey rpmKeyringFindKeyid(rpmKeyring keyring, rpmPubkey key)
 
 int rpmKeyringAddKey(rpmKeyring keyring, rpmPubkey key)
 {
+    int rc = 1; /* assume already seen key */
     if (keyring == NULL || key == NULL)
        return -1;
 
-    /* check if we already have this key */
-    if (rpmKeyringFindKeyid(keyring, key)) {
-       return 1;
+    /* check if we already have this key, but always wrlock for simplicity */
+    pthread_rwlock_wrlock(&keyring->lock);
+    if (!rpmKeyringFindKeyid(keyring, key)) {
+       keyring->keys = xrealloc(keyring->keys,
+                                (keyring->numkeys + 1) * sizeof(rpmPubkey));
+       keyring->keys[keyring->numkeys] = rpmPubkeyLink(key);
+       keyring->numkeys++;
+       qsort(keyring->keys, keyring->numkeys, sizeof(*keyring->keys),
+               keyidcmp);
+       rc = 0;
     }
-    
-    keyring->keys = xrealloc(keyring->keys, (keyring->numkeys + 1) * sizeof(rpmPubkey));
-    keyring->keys[keyring->numkeys] = rpmPubkeyLink(key);
-    keyring->numkeys++;
-    qsort(keyring->keys, keyring->numkeys, sizeof(*keyring->keys), keyidcmp);
+    pthread_rwlock_unlock(&keyring->lock);
 
-    return 0;
+    return rc;
 }
 
 rpmKeyring rpmKeyringLink(rpmKeyring keyring)
 {
     if (keyring) {
+       pthread_rwlock_wrlock(&keyring->lock);
        keyring->nrefs++;
+       pthread_rwlock_unlock(&keyring->lock);
     }
     return keyring;
 }
 
-static rpmKeyring rpmKeyringUnlink(rpmKeyring keyring)
-{
-    if (keyring) {
-       keyring->nrefs--;
-    }
-    return NULL;
-}
-
 rpmPubkey rpmPubkeyRead(const char *filename)
 {
     uint8_t *pkt = NULL;
@@ -131,7 +133,7 @@ rpmPubkey rpmPubkeyNew(const uint8_t *pkt, size_t pktlen)
     if (pkt == NULL || pktlen == 0)
        goto exit;
 
-    if (pgpPubkeyFingerprint(pkt, pktlen, keyid))
+    if (pgpPubkeyKeyID(pkt, pktlen, keyid))
        goto exit;
 
     if (pgpPrtParams(pkt, pktlen, PGPTAG_PUBLIC_KEY, &pgpkey))
@@ -141,12 +143,45 @@ rpmPubkey rpmPubkeyNew(const uint8_t *pkt, size_t pktlen)
     key->pkt = xmalloc(pktlen);
     key->pktlen = pktlen;
     key->pgpkey = pgpkey;
-    key->nrefs = 0;
+    key->nrefs = 1;
     memcpy(key->pkt, pkt, pktlen);
     memcpy(key->keyid, keyid, sizeof(keyid));
+    pthread_rwlock_init(&key->lock, NULL);
 
 exit:
-    return rpmPubkeyLink(key);
+    return key;
+}
+
+rpmPubkey *rpmGetSubkeys(rpmPubkey mainkey, int *count)
+{
+    rpmPubkey *subkeys = NULL;
+    pgpDigParams *pgpsubkeys = NULL;
+    int pgpsubkeysCount = 0;
+    int i;
+
+    if (mainkey && !pgpPrtParamsSubkeys(mainkey->pkt, mainkey->pktlen,
+                       mainkey->pgpkey, &pgpsubkeys, &pgpsubkeysCount)) {
+
+       subkeys = xmalloc(pgpsubkeysCount * sizeof(*subkeys));
+
+       for (i = 0; i < pgpsubkeysCount; i++) {
+           rpmPubkey subkey = xcalloc(1, sizeof(*subkey));
+           subkeys[i] = subkey;
+
+           /* Packets with all subkeys already stored in main key */
+           subkey->pkt = NULL;
+           subkey->pktlen = 0;
+
+           subkey->pgpkey = pgpsubkeys[i];
+           memcpy(subkey->keyid, pgpsubkeys[i]->signid, sizeof(subkey->keyid));
+           subkey->nrefs = 1;
+           pthread_rwlock_init(&subkey->lock, NULL);
+       }
+       free(pgpsubkeys);
+    }
+    *count = pgpsubkeysCount;
+
+    return subkeys;
 }
 
 rpmPubkey rpmPubkeyFree(rpmPubkey key)
@@ -154,31 +189,29 @@ rpmPubkey rpmPubkeyFree(rpmPubkey key)
     if (key == NULL)
        return NULL;
 
-    if (key->nrefs > 1)
-       return rpmPubkeyUnlink(key);
-
-    pgpDigParamsFree(key->pgpkey);
-    free(key->pkt);
-    free(key);
+    pthread_rwlock_wrlock(&key->lock);
+    if (--key->nrefs == 0) {
+       pgpDigParamsFree(key->pgpkey);
+       free(key->pkt);
+       pthread_rwlock_unlock(&key->lock);
+       pthread_rwlock_destroy(&key->lock);
+       free(key);
+    } else {
+       pthread_rwlock_unlock(&key->lock);
+    }
     return NULL;
 }
 
 rpmPubkey rpmPubkeyLink(rpmPubkey key)
 {
     if (key) {
+       pthread_rwlock_wrlock(&key->lock);
        key->nrefs++;
+       pthread_rwlock_unlock(&key->lock);
     }
     return key;
 }
 
-static rpmPubkey rpmPubkeyUnlink(rpmPubkey key)
-{
-    if (key) {
-       key->nrefs--;
-    }
-    return NULL;
-}
-
 pgpDig rpmPubkeyDig(rpmPubkey key)
 {
     pgpDig dig = NULL;
@@ -189,12 +222,15 @@ pgpDig rpmPubkeyDig(rpmPubkey key)
        return NULL;
 
     dig = pgpNewDig();
+
+    pthread_rwlock_rdlock(&key->lock);
     rc = pgpPrtPkts(key->pkt, key->pktlen, dig, 0);
+    pthread_rwlock_unlock(&key->lock);
+
     if (rc == 0) {
        pgpDigParams pubp = pgpDigGetParams(dig, PGPTAG_PUBLIC_KEY);
        if (!pubp || !memcmp(pubp->signid, zeros, sizeof(pubp->signid)) ||
-               !memcmp(pubp->time, zeros, sizeof(pubp->time)) ||
-               pubp->userid == NULL) {
+               pubp->time == 0 || pubp->userid == NULL) {
            rc = -1;
        }
     }
@@ -210,11 +246,23 @@ char * rpmPubkeyBase64(rpmPubkey key)
     char *enc = NULL;
 
     if (key) {
+       pthread_rwlock_rdlock(&key->lock);
        enc = rpmBase64Encode(key->pkt, key->pktlen, -1);
+       pthread_rwlock_unlock(&key->lock);
     }
     return enc;
 }
 
+pgpDigParams rpmPubkeyPgpDigParams(rpmPubkey key)
+{
+    pgpDigParams params= NULL;
+
+    if (key) {
+       params = key->pgpkey;
+    }
+    return params;
+}
+
 static rpmPubkey findbySig(rpmKeyring keyring, pgpDigParams sig)
 {
     rpmPubkey key = NULL;
@@ -239,6 +287,8 @@ static rpmPubkey findbySig(rpmKeyring keyring, pgpDigParams sig)
 
 rpmRC rpmKeyringLookup(rpmKeyring keyring, pgpDig sig)
 {
+    pthread_rwlock_rdlock(&keyring->lock);
+
     rpmRC res = RPMRC_NOKEY;
     pgpDigParams sigp = pgpDigGetParams(sig, PGPTAG_SIGNATURE);
     rpmPubkey key = findbySig(keyring, sigp);
@@ -253,6 +303,7 @@ rpmRC rpmKeyringLookup(rpmKeyring keyring, pgpDig sig)
        res = RPMRC_OK;
     }
 
+    pthread_rwlock_unlock(&keyring->lock);
     return res;
 }
 
@@ -261,6 +312,8 @@ rpmRC rpmKeyringVerifySig(rpmKeyring keyring, pgpDigParams sig, DIGEST_CTX ctx)
     rpmRC rc = RPMRC_FAIL;
 
     if (sig && ctx) {
+       pthread_rwlock_rdlock(&keyring->lock);
+
        pgpDigParams pgpkey = NULL;
        rpmPubkey key = findbySig(keyring, sig);
 
@@ -269,6 +322,8 @@ rpmRC rpmKeyringVerifySig(rpmKeyring keyring, pgpDigParams sig, DIGEST_CTX ctx)
 
        /* We call verify even if key not found for a signature sanity check */
        rc = pgpVerifySignature(pgpkey, sig, ctx);
+
+       pthread_rwlock_unlock(&keyring->lock);
     }
 
     return rc;
index 9fcab5feb63e0abcd9d88bbbe2e73e74b4b4d06c..8aeed8c6c212be080010b02a3bc123281b77b981 100644 (file)
@@ -3,6 +3,8 @@
 
 /** \ingroup rpmkeyring
  * \file rpmio/rpmkeyring.h
+ *
+ * RPM keyring API
  */
 
 #include <rpm/rpmtypes.h>
@@ -64,6 +66,14 @@ rpmKeyring rpmKeyringLink(rpmKeyring keyring);
  */
 rpmPubkey rpmPubkeyNew(const uint8_t *pkt, size_t pktlen);
 
+/** \ingroup rpmkeyring
+ * Return array of subkeys belonging to maikey
+ * param mainkey       main rpmPubkey
+ * param count         count of returned subkeys
+ * @return             an array of subkey's handles
+ */
+rpmPubkey *rpmGetSubkeys(rpmPubkey mainkey, int *count);
+
 /** \ingroup rpmkeyring
  * Create a new rpmPubkey from ASCII-armored pubkey file
  * @param filename     Path to pubkey file
@@ -99,6 +109,13 @@ pgpDig rpmPubkeyDig(rpmPubkey key);
  */
 char * rpmPubkeyBase64(rpmPubkey key);
 
+/** \ingroup rpmkeyring
+ * Return pgp params of key
+ * @param key          Pubkey
+ * @return             pgp params, NULL on error
+ */
+pgpDigParams rpmPubkeyPgpDigParams(rpmPubkey key);
+
 #ifdef __cplusplus
 }
 #endif
index 8023d5c446ff0b5a9a31d31a2aba35b001e0d0b6..223af32aa0f594dd4eab4d3f68f56626f127d572 100644 (file)
@@ -5,11 +5,22 @@
 #include "system.h"
 #include <stdarg.h>
 #include <stdlib.h>
+#include <pthread.h>
+#include <errno.h>
 #include <rpm/rpmlog.h>
+#include <rpm/rpmmacro.h>
 #include "debug.h"
 
-static int nrecs = 0;
-static rpmlogRec recs = NULL;
+typedef struct rpmlogCtx_s * rpmlogCtx;
+struct rpmlogCtx_s {
+    pthread_rwlock_t lock;
+    unsigned mask;
+    int nrecs;
+    rpmlogRec recs;
+    rpmlogCallback cbfunc;
+    rpmlogCallbackData cbdata;
+    FILE *stdlog;
+};
 
 struct rpmlogRec_s {
     int                code;           /* unused */
@@ -17,64 +28,110 @@ struct rpmlogRec_s {
     char * message;            /* log message string */
 };
 
+/* Force log context acquisition through a function */
+static rpmlogCtx rpmlogCtxAcquire(int write)
+{
+    static struct rpmlogCtx_s _globalCtx = { PTHREAD_RWLOCK_INITIALIZER,
+                                            RPMLOG_UPTO(RPMLOG_NOTICE),
+                                            0, NULL, NULL, NULL, NULL };
+    rpmlogCtx ctx = &_globalCtx;
+    int xx;
+
+    /* XXX Silently failing is bad, but we can't very well use log here... */
+    if (write)
+       xx = pthread_rwlock_wrlock(&ctx->lock);
+    else
+       xx = pthread_rwlock_rdlock(&ctx->lock);
+
+    return (xx == 0) ? ctx : NULL;
+}
+
+/* Release log context */
+static rpmlogCtx rpmlogCtxRelease(rpmlogCtx ctx)
+{
+    if (ctx)
+       pthread_rwlock_unlock(&ctx->lock);
+    return NULL;
+}
+
 int rpmlogGetNrecs(void)
 {
+    rpmlogCtx ctx = rpmlogCtxAcquire(0);
+    int nrecs = -1;
+    if (ctx)
+       nrecs = ctx->nrecs;
+    rpmlogCtxRelease(ctx);
     return nrecs;
 }
 
 int rpmlogCode(void)
 {
-    if (recs != NULL && nrecs > 0)
-       return recs[nrecs-1].code;
-    return -1;
-}
+    int code = -1;
+    rpmlogCtx ctx = rpmlogCtxAcquire(0);
+    
+    if (ctx && ctx->recs != NULL && ctx->nrecs > 0)
+       code = ctx->recs[ctx->nrecs-1].code;
 
+    rpmlogCtxRelease(ctx);
+    return code;
+}
 
 const char * rpmlogMessage(void)
 {
-    if (recs != NULL && nrecs > 0)
-       return recs[nrecs-1].message;
-    return _("(no error)");
+    const char *msg = _("(no error)");
+    rpmlogCtx ctx = rpmlogCtxAcquire(0);
+
+    if (ctx && ctx->recs != NULL && ctx->nrecs > 0)
+       msg = ctx->recs[ctx->nrecs-1].message;
+
+    rpmlogCtxRelease(ctx);
+    return msg;
 }
 
 const char * rpmlogRecMessage(rpmlogRec rec)
 {
-    assert(rec != NULL);
-    return (rec->message);
+    return (rec != NULL) ? rec->message : NULL;
 }
 
 rpmlogLvl rpmlogRecPriority(rpmlogRec rec)
 {
-    assert(rec != NULL);
-    return (rec->pri);
+    return (rec != NULL) ? rec->pri : (rpmlogLvl)-1;
 }
 
 void rpmlogPrint(FILE *f)
 {
-    int i;
+    rpmlogCtx ctx = rpmlogCtxAcquire(0);
+
+    if (ctx == NULL)
+       return;
 
     if (f == NULL)
        f = stderr;
 
-    if (recs)
-    for (i = 0; i < nrecs; i++) {
-       rpmlogRec rec = recs + i;
+    for (int i = 0; i < ctx->nrecs; i++) {
+       rpmlogRec rec = ctx->recs + i;
        if (rec->message && *rec->message)
            fprintf(f, "    %s", rec->message);
     }
+
+    rpmlogCtxRelease(ctx);
 }
 
 void rpmlogClose (void)
 {
-    int i;
+    rpmlogCtx ctx = rpmlogCtxAcquire(1);
 
-    if (recs)
-    for (i = 0; i < nrecs; i++) {
-       rpmlogRec rec = recs + i;
+    if (ctx == NULL)
+       return;
+
+    for (int i = 0; i < ctx->nrecs; i++) {
+       rpmlogRec rec = ctx->recs + i;
        rec->message = _free(rec->message);
     }
-    recs = _free(recs);
-    nrecs = 0;
+    ctx->recs = _free(ctx->recs);
+    ctx->nrecs = 0;
+
+    rpmlogCtxRelease(ctx);
 }
 
 void rpmlogOpen (const char *ident, int option,
@@ -82,65 +139,51 @@ void rpmlogOpen (const char *ident, int option,
 {
 }
 
-static unsigned rpmlogMask = RPMLOG_UPTO( RPMLOG_NOTICE );
-
 #ifdef NOTYET
 static unsigned rpmlogFacility = RPMLOG_USER;
 #endif
 
 int rpmlogSetMask (int mask)
 {
-    int omask = rpmlogMask;
-    if (mask)
-        rpmlogMask = mask;
-    return omask;
-}
+    rpmlogCtx ctx = rpmlogCtxAcquire(mask ? 1 : 0);
 
-static rpmlogCallback _rpmlogCallback = NULL;
-static rpmlogCallbackData _rpmlogCallbackData = NULL;
+    int omask = -1;
+    if (ctx) {
+       omask = ctx->mask;
+       if (mask)
+           ctx->mask = mask;
+    }
 
-rpmlogCallback rpmlogSetCallback(rpmlogCallback cb, rpmlogCallbackData data)
-{
-    rpmlogCallback ocb = _rpmlogCallback;
-    _rpmlogCallback = cb;
-    _rpmlogCallbackData = data;
-    return ocb;
+    rpmlogCtxRelease(ctx);
+    return omask;
 }
 
-static FILE * _stdlog = NULL;
-
-static int rpmlogDefault(rpmlogRec rec)
+rpmlogCallback rpmlogSetCallback(rpmlogCallback cb, rpmlogCallbackData data)
 {
-    FILE *msgout = (_stdlog ? _stdlog : stderr);
+    rpmlogCtx ctx = rpmlogCtxAcquire(1);
 
-    switch (rec->pri) {
-    case RPMLOG_INFO:
-    case RPMLOG_NOTICE:
-        msgout = (_stdlog ? _stdlog : stdout);
-        break;
-    case RPMLOG_EMERG:
-    case RPMLOG_ALERT:
-    case RPMLOG_CRIT:
-    case RPMLOG_ERR:
-    case RPMLOG_WARNING:
-    case RPMLOG_DEBUG:
-    default:
-        break;
+    rpmlogCallback ocb = NULL;
+    if (ctx) {
+       ocb = ctx->cbfunc;
+       ctx->cbfunc = cb;
+       ctx->cbdata = data;
     }
 
-    (void) fputs(rpmlogLevelPrefix(rec->pri), msgout);
-
-    (void) fputs(rec->message, msgout);
-    (void) fflush(msgout);
-
-    return (rec->pri <= RPMLOG_CRIT ? RPMLOG_EXIT : 0);
+    rpmlogCtxRelease(ctx);
+    return ocb;
 }
 
-
 FILE * rpmlogSetFile(FILE * fp)
 {
-    FILE * ofp = _stdlog;
-    _stdlog = fp;
+    rpmlogCtx ctx = rpmlogCtxAcquire(1);
+
+    FILE * ofp = NULL;
+    if (ctx) {
+       ofp = ctx->stdlog;
+       ctx->stdlog = fp;
+    }
+
+    rpmlogCtxRelease(ctx);
     return ofp;
 }
 
@@ -155,6 +198,38 @@ static const char * const rpmlogMsgPrefix[] = {
     "D: ",             /*!< RPMLOG_DEBUG */
 };
 
+#define ANSI_COLOR_BLACK       "\x1b[30m"
+#define ANSI_COLOR_RED         "\x1b[31m"
+#define ANSI_COLOR_GREEN       "\x1b[32m"
+#define ANSI_COLOR_YELLOW      "\x1b[33m"
+#define ANSI_COLOR_BLUE                "\x1b[34m"
+#define ANSI_COLOR_MAGENTA     "\x1b[35m"
+#define ANSI_COLOR_CYAN                "\x1b[36m"
+#define ANSI_COLOR_WHITE       "\x1b[37m"
+
+#define ANSI_BRIGHT_BLACK      "\x1b[30;1m"
+#define ANSI_BRIGHT_RED                "\x1b[31;1m"
+#define ANSI_BRIGHT_GREEN      "\x1b[32;1m"
+#define ANSI_BRIGHT_YELLOW     "\x1b[33;1m"
+#define ANSI_BRIGHT_BLUE       "\x1b[34;1m"
+#define ANSI_BRIGHT_MAGENTA    "\x1b[35;1m"
+#define ANSI_BRIGHT_CYAN       "\x1b[36;1m"
+#define ANSI_BRIGHT_WHITE      "\x1b[37;1m"
+
+#define ANSI_COLOR_BOLD                "\x1b[1m"
+#define ANSI_COLOR_RESET       "\x1b[0m"
+
+static const char *rpmlogMsgPrefixColor[] = {
+    ANSI_BRIGHT_RED,   /*!< RPMLOG_EMERG */
+    ANSI_BRIGHT_RED,   /*!< RPMLOG_ALERT */
+    ANSI_BRIGHT_RED,   /*!< RPMLOG_CRIT */
+    ANSI_BRIGHT_RED,   /*!< RPMLOG_ERR */
+    ANSI_BRIGHT_MAGENTA,/*!< RPMLOG_WARNING */
+    "",                        /*!< RPMLOG_NOTICE */
+    "",                        /*!< RPMLOG_INFO */
+    ANSI_BRIGHT_BLUE,  /*!< RPMLOG_DEBUG */
+};
+
 const char * rpmlogLevelPrefix(rpmlogLvl pri)
 {
     const char * prefix = "";
@@ -163,46 +238,174 @@ const char * rpmlogLevelPrefix(rpmlogLvl pri)
     return prefix;
 }
 
+static const char * rpmlogLevelColor(rpmlogLvl pri)
+{
+    return rpmlogMsgPrefixColor[pri&0x7];
+}
+
+enum {
+    COLOR_NO = 0,
+    COLOR_AUTO = 1,
+    COLOR_ALWAYS = 2,
+};
+
+static int getColorConfig(void)
+{
+    int rc = COLOR_NO;
+    char * color = rpmExpand("%{?_color_output}%{!?_color_output:auto}", NULL);
+    if (rstreq(color, "auto"))
+       rc = COLOR_AUTO;
+    else if (rstreq(color, "always"))
+       rc = COLOR_ALWAYS;
+    free(color);
+    return rc;
+}
+
+static int rpmlogDefault(FILE *stdlog, rpmlogRec rec)
+{
+    static const char fubar[] =
+       "Error occurred during writing of a log message";
+    FILE *msgout = (stdlog ? stdlog : stderr);
+    static __thread int color = -1;
+    const char * colorOn = NULL;
+
+    if (color < 0)
+       color = getColorConfig();
+
+    if (color == COLOR_ALWAYS ||
+           (color == COLOR_AUTO && isatty(fileno(msgout))))
+       colorOn = rpmlogLevelColor(rec->pri);
+
+    switch (rec->pri) {
+    case RPMLOG_INFO:
+    case RPMLOG_NOTICE:
+       msgout = (stdlog ? stdlog : stdout);
+       break;
+    case RPMLOG_EMERG:
+    case RPMLOG_ALERT:
+    case RPMLOG_CRIT:
+    case RPMLOG_ERR:
+    case RPMLOG_WARNING:
+    case RPMLOG_DEBUG:
+       if (colorOn && *colorOn)
+           if (fputs(rpmlogLevelColor(rec->pri), msgout) == EOF
+            && errno != EPIPE)
+               perror(fubar);
+       break;
+    default:
+       break;
+    }
+
+    if (fputs(rpmlogLevelPrefix(rec->pri), msgout) == EOF && errno != EPIPE)
+       perror(fubar);
+
+    switch (rec->pri) {
+    case RPMLOG_INFO:
+    case RPMLOG_NOTICE:
+       break;
+    case RPMLOG_EMERG:
+    case RPMLOG_ALERT:
+    case RPMLOG_CRIT:
+    case RPMLOG_ERR:
+    case RPMLOG_WARNING:
+       if (colorOn && *colorOn) {
+           if (fputs(ANSI_COLOR_RESET, msgout) == EOF && errno != EPIPE)
+               perror(fubar);
+           if (fputs(ANSI_COLOR_BOLD, msgout) == EOF && errno != EPIPE)
+               perror(fubar);
+       }
+    case RPMLOG_DEBUG:
+    default:
+       break;
+    }
+
+    if (rec->message)
+       (void) fputs(rec->message, msgout);
+
+    switch (rec->pri) {
+    case RPMLOG_INFO:
+    case RPMLOG_NOTICE:
+       break;
+    case RPMLOG_EMERG:
+    case RPMLOG_ALERT:
+    case RPMLOG_CRIT:
+    case RPMLOG_ERR:
+    case RPMLOG_WARNING:
+    case RPMLOG_DEBUG:
+       if (colorOn && *colorOn)
+           if (fputs(ANSI_COLOR_RESET, msgout) == EPIPE && errno != EPIPE)
+               perror(fubar);
+       break;
+    default:
+       break;
+    }
+
+    (void) fflush(msgout);
+
+    return (rec->pri <= RPMLOG_CRIT ? RPMLOG_EXIT : 0);
+}
+
 /* FIX: rpmlogMsgPrefix[] dependent, not unqualified */
 /* FIX: rpmlogMsgPrefix[] may be NULL */
-static void dolog (struct rpmlogRec_s *rec)
+static void dolog(struct rpmlogRec_s *rec, int saverec)
 {
+    static pthread_mutex_t serialize = PTHREAD_MUTEX_INITIALIZER;
+
     int cbrc = RPMLOG_DEFAULT;
     int needexit = 0;
+    FILE *clog = NULL;
+    rpmlogCallbackData *cbdata = NULL;
+    rpmlogCallback cbfunc = NULL;
+    rpmlogCtx ctx = rpmlogCtxAcquire(saverec);
+
+    if (ctx == NULL)
+       return;
 
     /* Save copy of all messages at warning (or below == "more important"). */
-    if (rec->pri <= RPMLOG_WARNING) {
-       recs = xrealloc(recs, (nrecs+2) * sizeof(*recs));
-       recs[nrecs].code = rec->code;
-       recs[nrecs].pri = rec->pri;
-       recs[nrecs].message = xstrdup(rec->message);
-       recs[nrecs+1].code = 0;
-       recs[nrecs+1].message = NULL;
-       ++nrecs;
+    if (saverec) {
+       ctx->recs = xrealloc(ctx->recs, (ctx->nrecs+2) * sizeof(*ctx->recs));
+       ctx->recs[ctx->nrecs].code = rec->code;
+       ctx->recs[ctx->nrecs].pri = rec->pri;
+       ctx->recs[ctx->nrecs].message = xstrdup(rec->message);
+       ctx->recs[ctx->nrecs+1].code = 0;
+       ctx->recs[ctx->nrecs+1].message = NULL;
+       ctx->nrecs++;
     }
-
-    if (_rpmlogCallback) {
-       cbrc = _rpmlogCallback(rec, _rpmlogCallbackData);
-       needexit += cbrc & RPMLOG_EXIT;
-    }
-
-    if (cbrc & RPMLOG_DEFAULT) {
-       cbrc = rpmlogDefault(rec);
-       needexit += cbrc & RPMLOG_EXIT;
+    cbfunc = ctx->cbfunc;
+    cbdata = ctx->cbdata;
+    clog = ctx->stdlog;
+
+    /* Free the context for callback and actual log output */
+    ctx = rpmlogCtxRelease(ctx);
+
+    /* Always serialize callback and output to avoid interleaved messages. */
+    if (pthread_mutex_lock(&serialize) == 0) {
+       if (cbfunc) {
+           cbrc = cbfunc(rec, cbdata);
+           needexit += cbrc & RPMLOG_EXIT;
+       }
+
+       if (cbrc & RPMLOG_DEFAULT) {
+           cbrc = rpmlogDefault(clog, rec);
+           needexit += cbrc & RPMLOG_EXIT;
+       }
+       pthread_mutex_unlock(&serialize);
     }
     
     if (needexit)
        exit(EXIT_FAILURE);
+
 }
 
 void rpmlog (int code, const char *fmt, ...)
 {
     unsigned pri = RPMLOG_PRI(code);
     unsigned mask = RPMLOG_MASK(pri);
+    int saverec = (pri <= RPMLOG_WARNING);
     va_list ap;
     int n;
 
-    if ((mask & rpmlogMask) == 0)
+    if ((mask & rpmlogSetMask(0)) == 0)
        return;
 
     va_start(ap, fmt);
@@ -222,9 +425,8 @@ void rpmlog (int code, const char *fmt, ...)
        rec.pri = pri;
        rec.message = msg;
 
-       dolog(&rec);
+       dolog(&rec, saverec);
 
        free(msg);
     }
 }
-
index 0766086f4b55db032ab821894439d65ec00c8028..6b0d8f70a2e56a9cdd39429596e74dc5576f4301 100644 (file)
@@ -42,33 +42,6 @@ typedef enum rpmlogLvl_e {
 #define        RPMLOG_PRI(p)   ((p) & RPMLOG_PRIMASK)
 #define        RPMLOG_MAKEPRI(fac, pri)        ((((unsigned)(fac)) << 3) | (pri))
 
-#ifdef RPMLOG_NAMES
-#define        _RPMLOG_NOPRI   0x10    /* the "no priority" priority */
-                               /* mark "facility" */
-#define        _RPMLOG_MARK    RPMLOG_MAKEPRI(RPMLOG_NFACILITIES, 0)
-typedef struct _rpmcode {
-       const char      *c_name;
-       int             c_val;
-} RPMCODE;
-
-RPMCODE rpmprioritynames[] =
-  {
-    { "alert", RPMLOG_ALERT },
-    { "crit",  RPMLOG_CRIT },
-    { "debug", RPMLOG_DEBUG },
-    { "emerg", RPMLOG_EMERG },
-    { "err",   RPMLOG_ERR },
-    { "error", RPMLOG_ERR },           /* DEPRECATED */
-    { "info",  RPMLOG_INFO },
-    { "none",  _RPMLOG_NOPRI },        /* INTERNAL */
-    { "notice",        RPMLOG_NOTICE },
-    { "panic", RPMLOG_EMERG },         /* DEPRECATED */
-    { "warn",  RPMLOG_WARNING },       /* DEPRECATED */
-    { "warning",RPMLOG_WARNING },
-    { NULL, -1 }
-  };
-#endif
-
 /** \ingroup rpmlog
  * facility codes
  */
@@ -104,35 +77,6 @@ typedef     enum rpmlogFac_e {
 #define        RPMLOG_FAC(p)   (((p) & RPMLOG_FACMASK) >> 3)
 
 
-#ifdef RPMLOG_NAMES
-RPMCODE facilitynames[] =
-  {
-    { "auth",  RPMLOG_AUTH },
-    { "authpriv",RPMLOG_AUTHPRIV },
-    { "cron",  RPMLOG_CRON },
-    { "daemon",        RPMLOG_DAEMON },
-    { "ftp",   RPMLOG_FTP },
-    { "kern",  RPMLOG_KERN },
-    { "lpr",   RPMLOG_LPR },
-    { "mail",  RPMLOG_MAIL },
-    { "mark",  _RPMLOG_MARK },         /* INTERNAL */
-    { "news",  RPMLOG_NEWS },
-    { "security",RPMLOG_AUTH },                /* DEPRECATED */
-    { "syslog",        RPMLOG_SYSLOG },
-    { "user",  RPMLOG_USER },
-    { "uucp",  RPMLOG_UUCP },
-    { "local0",        RPMLOG_LOCAL0 },
-    { "local1",        RPMLOG_LOCAL1 },
-    { "local2",        RPMLOG_LOCAL2 },
-    { "local3",        RPMLOG_LOCAL3 },
-    { "local4",        RPMLOG_LOCAL4 },
-    { "local5",        RPMLOG_LOCAL5 },
-    { "local6",        RPMLOG_LOCAL6 },
-    { "local7",        RPMLOG_LOCAL7 },
-    { NULL, -1 }
-  };
-#endif
-
 /*
  * arguments to setlogmask.
  */
index 96f4dc1ca036d52e8996ab662395cc07954d2ddc..c96fb6b6740f1ec43bc4710b985159f5317798c6 100644 (file)
@@ -60,6 +60,9 @@ struct rpmluapb_s {
 
 static rpmlua globalLuaState = NULL;
 
+static char *(*nextFileFunc)(void *) = NULL;
+static void *nextFileFuncParam = NULL;
+
 static int luaopen_rpm(lua_State *L);
 static int rpm_print(lua_State *L);
 
@@ -80,7 +83,7 @@ rpmlua rpmluaNew()
        {"posix", luaopen_posix},
        {"rex", luaopen_rex},
        {"rpm", luaopen_rpm},
-       /*{"os",        luaopen_rpm_os},*/
+       {"os",  luaopen_rpm_os},
        {NULL, NULL},
     };
     
@@ -94,12 +97,6 @@ rpmlua rpmluaNew()
        lua_call(L, 1, 0);
        lua_settop(L, 0);
     }
-    /* Disable os and io standard libraries */
-    lua_pushnil (L);
-    lua_setglobal(L, "os");
-    lua_pushnil (L);
-    lua_setglobal(L, "io");
-
 #ifndef LUA_GLOBALSINDEX
     lua_pushglobaltable(L);
 #endif
@@ -218,6 +215,12 @@ static int pushvar(lua_State *L, rpmluavType type, void *value)
     return ret;
 }
 
+void rpmluaSetNextFileFunc(char *(*func)(void *), void *funcParam)
+{
+    nextFileFunc = func;
+    nextFileFuncParam = funcParam;
+}
+
 void rpmluaSetVar(rpmlua _lua, rpmluav var)
 {
     INITSTATE(_lua, lua);
@@ -532,13 +535,15 @@ int rpmluaRunScript(rpmlua _lua, const char *script, const char *name)
     int ret = 0;
     if (name == NULL)
        name = "<lua>";
+    if (script == NULL)
+       script = "";
     if (luaL_loadbuffer(L, script, strlen(script), name) != 0) {
        rpmlog(RPMLOG_ERR, _("invalid syntax in lua script: %s\n"),
                 lua_tostring(L, -1));
        lua_pop(L, 1);
        ret = -1;
     } else if (lua_pcall(L, 0, 0, 0) != 0) {
-       rpmlog(RPMLOG_WARNING, _("lua script failed: %s\n"),
+       rpmlog(RPMLOG_ERR, _("lua script failed: %s\n"),
                 lua_tostring(L, -1));
        lua_pop(L, 1);
        ret = -1;
@@ -662,7 +667,9 @@ static int rpm_b64decode(lua_State *L)
 static int rpm_expand(lua_State *L)
 {
     const char *str = luaL_checkstring(L, 1);
-    char *val = rpmExpand(str, NULL);
+    char *val = NULL;
+    if (rpmExpandMacros(NULL, str, &val, 0) < 0)
+       return luaL_error(L, "error expanding macro");
     lua_pushstring(L, val);
     free(val);
     return 1;
@@ -671,16 +678,42 @@ static int rpm_expand(lua_State *L)
 static int rpm_define(lua_State *L)
 {
     const char *str = luaL_checkstring(L, 1);
-    (void) rpmDefineMacro(NULL, str, 0);
+    if (rpmDefineMacro(NULL, str, 0))
+       return luaL_error(L, "error defining macro");
+    return 0;
+}
+
+static int rpm_undefine(lua_State *L)
+{
+    const char *str = luaL_checkstring(L, 1);
+    rpmPopMacro(NULL, str);
     return 0;
 }
 
+static int rpm_load(lua_State *L)
+{
+    const char *str = luaL_checkstring(L, 1);
+    int rc = rpmLoadMacroFile(NULL, str);
+    lua_pushnumber(L, rc);
+    return 1;
+}
+
 static int rpm_interactive(lua_State *L)
 {
     _rpmluaInteractive(L);
     return 0;
 }
 
+static int rpm_next_file(lua_State *L)
+{
+    if (nextFileFunc)
+       lua_pushstring(L, nextFileFunc(nextFileFuncParam));
+    else
+       lua_pushstring(L, NULL);
+
+    return 1;
+}
+
 typedef struct rpmluaHookData_s {
     lua_State *L;
     int funcRef;
@@ -867,10 +900,13 @@ static const luaL_Reg rpmlib[] = {
     {"b64decode", rpm_b64decode},
     {"expand", rpm_expand},
     {"define", rpm_define},
+    {"undefine", rpm_undefine},
+    {"load", rpm_load},
     {"register", rpm_register},
     {"unregister", rpm_unregister},
     {"call", rpm_call},
     {"interactive", rpm_interactive},
+    {"next_file", rpm_next_file},
     {NULL, NULL}
 };
 
index 7298ed57d00a85949f00daffe7a69628e9ab336a..935b892bc7dd87e640fd4ba4eea2c7dced861788 100644 (file)
@@ -62,6 +62,8 @@ void rpmluaSetData(rpmlua lua, const char *key, const void *data);
 char *rpmluaPopPrintBuffer(rpmlua lua);
 void rpmluaPushPrintBuffer(rpmlua lua);
 
+void rpmluaSetNextFileFunc(char *(*func)(void *), void *funcParam);
+
 void rpmluaGetVar(rpmlua lua, rpmluav var);
 void rpmluaSetVar(rpmlua lua, rpmluav var);
 void rpmluaDelVar(rpmlua lua, const char *key, ...);
index 765c78c6dd6f08d68bbc653f388d2770334a5d32..a31beb76a24007c3d071f1c98b93b8d0b3d60bab 100644 (file)
@@ -3,6 +3,8 @@
 
 /** \ingroup rpmio
  * \file rpmio/rpmmacro.h
+ *
+ * Macro API
  */
 
 #include <stdio.h>
@@ -43,6 +45,10 @@ extern const char * macrofiles;
 #define        RMIL_OLDSPEC    -1
 #define        RMIL_GLOBAL     0
 
+/* Deprecated compatibility wrappers */
+#define addMacro(_mc, _n, _o, _b, _l) rpmPushMacro(_mc, _n, _o, _b, _l)
+#define delMacro(_mc, _n) rpmPopMacro(_mc, _n)
+
 /** \ingroup rpmmacro
  * Print macros to file stream.
  * @param mc           macro context (NULL uses global context).
@@ -53,37 +59,35 @@ void        rpmDumpMacroTable       (rpmMacroContext mc,
 
 /** \ingroup rpmmacro
  * Expand macro into buffer.
- * @deprecated Use rpmExpand().
- * @todo Eliminate from API.
- * @param spec         cookie (unused)
  * @param mc           macro context (NULL uses global context).
- * @retval sbuf                input macro to expand, output expansion
- * @param slen         size of buffer
- * @return             0 on success
+ * @param sbuf         input macro to expand
+ * @param obuf         macro expansion (malloc'ed)
+ * @param flags                flags (currently unused)
+ * @return             negative on failure
  */
-int    expandMacros    (void * spec, rpmMacroContext mc,
-                               char * sbuf,
-                               size_t slen);
+int    rpmExpandMacros (rpmMacroContext mc, const char * sbuf,
+                               char ** obuf, int flags);
 
 /** \ingroup rpmmacro
- * Add macro to context.
- * @deprecated Use rpmDefineMacro().
+ * Push macro to context.
  * @param mc           macro context (NULL uses global context).
  * @param n            macro name
- * @param o            macro paramaters
+ * @param o            macro parameters
  * @param b            macro body
  * @param level                macro recursion level (0 is entry API)
+ * @return             0 on success
  */
-void   addMacro        (rpmMacroContext mc, const char * n,
+int    rpmPushMacro    (rpmMacroContext mc, const char * n,
                                const char * o,
                                const char * b, int level);
 
 /** \ingroup rpmmacro
- * Delete macro from context.
+ * Pop macro from context.
  * @param mc           macro context (NULL uses global context).
  * @param n            macro name
+ * @return             0 on success
  */
-void   delMacro        (rpmMacroContext mc, const char * n);
+int    rpmPopMacro     (rpmMacroContext mc, const char * n);
 
 /** \ingroup rpmmacro
  * Define macro in context.
index e70cf706bdea7cb2fd19d01a6de6a5df11541def..15cce2275cb80c5a1354c25cff29a2c495f331f4 100644 (file)
@@ -248,6 +248,19 @@ static void pgpPrtVal(const char * pre, pgpValTbl vs, uint8_t val)
     fprintf(stderr, "%s(%u)", pgpValStr(vs, val), (unsigned)val);
 }
 
+static void pgpPrtTime(const char * pre, const uint8_t *p, size_t plen)
+{
+    if (!_print) return;
+    if (pre && *pre)
+       fprintf(stderr, "%s", pre);
+    if (plen == 4) {
+       time_t t = pgpGrab(p, plen);
+       fprintf(stderr, " %-24.24s(0x%08x)", ctime(&t), (unsigned)t);
+    } else {
+       pgpPrtHex("", p+1, plen-1);
+    }
+}
+
 /** \ingroup rpmpgp
  * Return hex formatted representation of a multiprecision integer.
  * @param p            bytes
@@ -384,15 +397,24 @@ unsigned int pgpCRC(const uint8_t *octets, size_t len)
     return crc & 0xffffff;
 }
 
+static int pgpVersion(const uint8_t *h, size_t hlen, uint8_t *version)
+{
+    if (hlen < 1)
+       return -1;
+
+    *version = h[0];
+    return 0;
+}
+
 static int pgpPrtSubType(const uint8_t *h, size_t hlen, pgpSigType sigtype, 
                         pgpDigParams _digp)
 {
     const uint8_t *p = h;
-    size_t plen, i;
+    size_t plen = 0, i;
 
     while (hlen > 0) {
        i = pgpLen(p, hlen, &plen);
-       if (i == 0 || i + plen > hlen)
+       if (i == 0 || plen < 1 || i + plen > hlen)
            break;
 
        p += i;
@@ -423,23 +445,22 @@ static int pgpPrtSubType(const uint8_t *h, size_t hlen, pgpSigType sigtype,
            if (!(_digp->saved & PGPDIG_SAVED_TIME) &&
                (sigtype == PGPSIGTYPE_POSITIVE_CERT || sigtype == PGPSIGTYPE_BINARY || sigtype == PGPSIGTYPE_TEXT || sigtype == PGPSIGTYPE_STANDALONE))
            {
+               if (plen-1 != sizeof(_digp->time))
+                   break;
                _digp->saved |= PGPDIG_SAVED_TIME;
-               memcpy(_digp->time, p+1, sizeof(_digp->time));
+               _digp->time = pgpGrab(p+1, sizeof(_digp->time));
            }
        case PGPSUBTYPE_SIG_EXPIRE_TIME:
        case PGPSUBTYPE_KEY_EXPIRE_TIME:
-           if ((plen - 1) == 4) {
-               time_t t = pgpGrab(p+1, plen-1);
-               if (_print)
-                  fprintf(stderr, " %-24.24s(0x%08x)", ctime(&t), (unsigned)t);
-           } else
-               pgpPrtHex("", p+1, plen-1);
+           pgpPrtTime(" ", p+1, plen-1);
            break;
 
        case PGPSUBTYPE_ISSUER_KEYID:   /* issuer key ID */
            if (!(_digp->saved & PGPDIG_SAVED_ID) &&
                (sigtype == PGPSIGTYPE_POSITIVE_CERT || sigtype == PGPSIGTYPE_BINARY || sigtype == PGPSIGTYPE_TEXT || sigtype == PGPSIGTYPE_STANDALONE))
            {
+               if (plen-1 != sizeof(_digp->signid))
+                   break;
                _digp->saved |= PGPDIG_SAVED_ID;
                memcpy(_digp->signid, p+1, sizeof(_digp->signid));
            }
@@ -499,11 +520,15 @@ static int pgpPrtSigParams(pgpTag tag, uint8_t pubkey_algo, uint8_t sigtype,
     int i;
     pgpDigAlg sigalg = pgpSignatureNew(pubkey_algo);
 
-    for (i = 0; p < pend && i < sigalg->mpis; i++, p += pgpMpiLen(p)) {
+    for (i = 0; i < sigalg->mpis && p + 2 <= pend; i++) {
+       int mpil = pgpMpiLen(p);
+       if (p + mpil > pend)
+           break;
        if (sigtype == PGPSIGTYPE_BINARY || sigtype == PGPSIGTYPE_TEXT) {
-           if (sigalg->setmpi(sigalg, i, p, pend))
+           if (sigalg->setmpi(sigalg, i, p))
                break;
        }
+       p += mpil;
     }
 
     /* Does the size and number of MPI's match our expectations? */
@@ -519,18 +544,33 @@ static int pgpPrtSigParams(pgpTag tag, uint8_t pubkey_algo, uint8_t sigtype,
     return rc;
 }
 
+static int pgpGet(const uint8_t *s, size_t nbytes, const uint8_t *send,
+                 unsigned int *valp)
+{
+    int rc = -1;
+
+    if (s + nbytes <= send) {
+       *valp = pgpGrab(s, nbytes);
+       rc = 0;
+    }
+
+    return rc;
+}
+
 static int pgpPrtSig(pgpTag tag, const uint8_t *h, size_t hlen,
                     pgpDigParams _digp)
 {
-    uint8_t version = h[0];
+    uint8_t version = 0;
     uint8_t * p;
-    size_t plen;
-    int rc;
+    unsigned int plen;
+    int rc = 1;
+
+    if (pgpVersion(h, hlen, &version))
+       return rc;
 
     switch (version) {
     case 3:
     {   pgpPktSigV3 v = (pgpPktSigV3)h;
-       time_t t;
 
        if (hlen <= sizeof(*v) || v->hashlen != 5)
            return 1;
@@ -540,9 +580,7 @@ static int pgpPrtSig(pgpTag tag, const uint8_t *h, size_t hlen,
        pgpPrtVal(" ", pgpHashTbl, v->hash_algo);
        pgpPrtVal(" ", pgpSigTypeTbl, v->sigtype);
        pgpPrtNL();
-       t = pgpGrab(v->time, sizeof(v->time));
-       if (_print)
-           fprintf(stderr, " %-24.24s(0x%08x)", ctime(&t), (unsigned)t);
+       pgpPrtTime(" ", v->time, sizeof(v->time));
        pgpPrtNL();
        pgpPrtHex(" signer keyid", v->signid, sizeof(v->signid));
        plen = pgpGrab(v->signhash16, sizeof(v->signhash16));
@@ -554,7 +592,7 @@ static int pgpPrtSig(pgpTag tag, const uint8_t *h, size_t hlen,
            _digp->hashlen = v->hashlen;
            _digp->sigtype = v->sigtype;
            _digp->hash = memcpy(xmalloc(v->hashlen), &v->sigtype, v->hashlen);
-           memcpy(_digp->time, v->time, sizeof(_digp->time));
+           _digp->time = pgpGrab(v->time, sizeof(v->time));
            memcpy(_digp->signid, v->signid, sizeof(_digp->signid));
            _digp->pubkey_algo = v->pubkey_algo;
            _digp->hash_algo = v->hash_algo;
@@ -577,7 +615,8 @@ static int pgpPrtSig(pgpTag tag, const uint8_t *h, size_t hlen,
        pgpPrtNL();
 
        p = &v->hashlen[0];
-       plen = pgpGrab(v->hashlen, sizeof(v->hashlen));
+       if (pgpGet(v->hashlen, sizeof(v->hashlen), h + hlen, &plen))
+           return 1;
        p += sizeof(v->hashlen);
 
        if ((p + plen) > (h + hlen))
@@ -591,7 +630,8 @@ static int pgpPrtSig(pgpTag tag, const uint8_t *h, size_t hlen,
            return 1;
        p += plen;
 
-       plen = pgpGrab(p,2);
+       if (pgpGet(p, 2, h + hlen, &plen))
+           return 1;
        p += 2;
 
        if ((p + plen) > (h + hlen))
@@ -601,7 +641,8 @@ static int pgpPrtSig(pgpTag tag, const uint8_t *h, size_t hlen,
            return 1;
        p += plen;
 
-       plen = pgpGrab(p,2);
+       if (pgpGet(p, 2, h + hlen, &plen))
+           return 1;
        pgpPrtHex(" signhash16", p, 2);
        pgpPrtNL();
 
@@ -620,6 +661,7 @@ static int pgpPrtSig(pgpTag tag, const uint8_t *h, size_t hlen,
        rc = pgpPrtSigParams(tag, v->pubkey_algo, v->sigtype, p, h, hlen, _digp);
     }  break;
     default:
+       rpmlog(RPMLOG_WARNING, _("Unsupported version of key: V%d\n"), version);
        rc = 1;
        break;
     }
@@ -650,9 +692,13 @@ static int pgpPrtPubkeyParams(uint8_t pubkey_algo,
     int i;
     pgpDigAlg keyalg = pgpPubkeyNew(pubkey_algo);
 
-    for (i = 0; p < pend && i < keyalg->mpis; i++, p += pgpMpiLen(p)) {
-       if (keyalg->setmpi(keyalg, i, p, pend))
+    for (i = 0; i < keyalg->mpis && p + 2 <= pend; i++) {
+       int mpil = pgpMpiLen(p);
+       if (p + mpil > pend)
+           break;
+       if (keyalg->setmpi(keyalg, i, p))
            break;
+       p += mpil;
     }
 
     /* Does the size and number of MPI's match our expectations? */
@@ -660,7 +706,9 @@ static int pgpPrtPubkeyParams(uint8_t pubkey_algo,
        rc = 0;
 
     /* We can't handle more than one key at a time */
-    if (rc == 0 && keyp->alg == NULL && keyp->tag == PGPTAG_PUBLIC_KEY)
+    if (rc == 0 && keyp->alg == NULL && (keyp->tag == PGPTAG_PUBLIC_KEY ||
+       keyp->tag == PGPTAG_PUBLIC_SUBKEY))
+
        keyp->alg = keyalg;
     else
        pgpDigAlgFree(keyalg);
@@ -671,11 +719,13 @@ static int pgpPrtPubkeyParams(uint8_t pubkey_algo,
 static int pgpPrtKey(pgpTag tag, const uint8_t *h, size_t hlen,
                     pgpDigParams _digp)
 {
-    uint8_t version = *h;
+    uint8_t version = 0;
     const uint8_t * p = NULL;
-    time_t t;
     int rc = 1;
 
+    if (pgpVersion(h, hlen, &version))
+       return rc;
+
     /* We only permit V4 keys, V3 keys are long long since deprecated */
     switch (version) {
     case 4:
@@ -684,14 +734,13 @@ static int pgpPrtKey(pgpTag tag, const uint8_t *h, size_t hlen,
        if (hlen > sizeof(*v)) {
            pgpPrtVal("V4 ", pgpTagTbl, tag);
            pgpPrtVal(" ", pgpPubkeyTbl, v->pubkey_algo);
-           t = pgpGrab(v->time, sizeof(v->time));
-           if (_print)
-               fprintf(stderr, " %-24.24s(0x%08x)", ctime(&t), (unsigned)t);
+           pgpPrtTime(" ", v->time, sizeof(v->time));
            pgpPrtNL();
 
-           if (_digp->tag == tag) {
+           /* If _digp->hash is not NULL then signature is already loaded */
+           if (_digp->hash == NULL) {
                _digp->version = v->version;
-               memcpy(_digp->time, v->time, sizeof(_digp->time));
+               _digp->time = pgpGrab(v->time, sizeof(v->time));
                _digp->pubkey_algo = v->pubkey_algo;
            }
 
@@ -699,6 +748,8 @@ static int pgpPrtKey(pgpTag tag, const uint8_t *h, size_t hlen,
            rc = pgpPrtPubkeyParams(v->pubkey_algo, p, h, hlen, _digp);
        }
     }  break;
+    default:
+       rpmlog(RPMLOG_WARNING, _("Unsupported version of key: V%d\n"), h[0]);
     }
     return rc;
 }
@@ -716,14 +767,19 @@ static int pgpPrtUserID(pgpTag tag, const uint8_t *h, size_t hlen,
     return 0;
 }
 
-static int getFingerprint(const uint8_t *h, size_t hlen, pgpKeyID_t keyid)
+int pgpPubkeyFingerprint(const uint8_t *h, size_t hlen,
+                         uint8_t **fp, size_t *fplen)
 {
     int rc = -1; /* assume failure */
     const uint8_t *se;
     const uint8_t *pend = h + hlen;
+    uint8_t version = 0;
+
+    if (pgpVersion(h, hlen, &version))
+       return rc;
 
     /* We only permit V4 keys, V3 keys are long long since deprecated */
-    switch (h[0]) {
+    switch (version) {
     case 4:
       {        pgpPktKeyV4 v = (pgpPktKeyV4) (h);
        int mpis = -1;
@@ -747,8 +803,8 @@ static int getFingerprint(const uint8_t *h, size_t hlen, pgpKeyID_t keyid)
        /* Does the size and number of MPI's match our expectations? */
        if (se == pend && mpis == 0) {
            DIGEST_CTX ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
-           uint8_t * d = NULL;
-           size_t dlen;
+           uint8_t *d = NULL;
+           size_t dlen = 0;
            int i = se - h;
            uint8_t in[3] = { 0x99, (i >> 8), i };
 
@@ -756,42 +812,42 @@ static int getFingerprint(const uint8_t *h, size_t hlen, pgpKeyID_t keyid)
            (void) rpmDigestUpdate(ctx, h, i);
            (void) rpmDigestFinal(ctx, (void **)&d, &dlen, 0);
 
-           if (d) {
-               memcpy(keyid, (d + (dlen-8)), 8);
-               free(d);
+           if (dlen == 20) {
                rc = 0;
+               *fp = d;
+               *fplen = dlen;
+           } else {
+               free(d);
            }
        }
 
       }        break;
+    default:
+       rpmlog(RPMLOG_WARNING, _("Unsupported version of key: V%d\n"), version);
+    }
+    return rc;
+}
+
+static int getKeyID(const uint8_t *h, size_t hlen, pgpKeyID_t keyid)
+{
+    uint8_t *fp = NULL;
+    size_t fplen = 0;
+    int rc = pgpPubkeyFingerprint(h, hlen, &fp, &fplen);
+    if (fp && fplen > 8) {
+       memcpy(keyid, (fp + (fplen-8)), 8);
+       free(fp);
     }
     return rc;
 }
 
-int pgpPubkeyFingerprint(const uint8_t * pkt, size_t pktlen, pgpKeyID_t keyid)
+int pgpPubkeyKeyID(const uint8_t * pkt, size_t pktlen, pgpKeyID_t keyid)
 {
     struct pgpPkt p;
 
     if (decodePkt(pkt, pktlen, &p))
        return -1;
     
-    return getFingerprint(p.body, p.blen, keyid);
-}
-
-int pgpExtractPubkeyFingerprint(const char * b64pkt, pgpKeyID_t keyid)
-{
-    uint8_t * pkt;
-    size_t pktlen;
-    int rc = -1; /* assume failure */
-
-    if (rpmBase64Decode(b64pkt, (void **)&pkt, &pktlen) == 0) {
-       if (pgpPubkeyFingerprint(pkt, pktlen, keyid) == 0) {
-           /* if there ever was a bizarre return code for success... */
-           rc = 8;
-       }
-       free(pkt);
-    }
-    return rc;
+    return getKeyID(p.body, p.blen, keyid);
 }
 
 static int pgpPrtPkt(struct pgpPkt *p, pgpDigParams _digp)
@@ -803,8 +859,8 @@ static int pgpPrtPkt(struct pgpPkt *p, pgpDigParams _digp)
        rc = pgpPrtSig(p->tag, p->body, p->blen, _digp);
        break;
     case PGPTAG_PUBLIC_KEY:
-       /* Get the public key fingerprint. */
-       if (!getFingerprint(p->body, p->blen, _digp->signid))
+       /* Get the public key Key ID. */
+       if (!getKeyID(p->body, p->blen, _digp->signid))
            _digp->saved |= PGPDIG_SAVED_ID;
        else
            memset(_digp->signid, 0, sizeof(_digp->signid));
@@ -813,12 +869,14 @@ static int pgpPrtPkt(struct pgpPkt *p, pgpDigParams _digp)
     case PGPTAG_USER_ID:
        rc = pgpPrtUserID(p->tag, p->body, p->blen, _digp);
        break;
+    case PGPTAG_RESERVED:
+       rc = -1;
+       break;
     case PGPTAG_COMMENT:
     case PGPTAG_COMMENT_OLD:
     case PGPTAG_PUBLIC_SUBKEY:
     case PGPTAG_SECRET_KEY:
     case PGPTAG_SECRET_SUBKEY:
-    case PGPTAG_RESERVED:
     case PGPTAG_PUBLIC_SESSION_KEY:
     case PGPTAG_SYMMETRIC_SESSION_KEY:
     case PGPTAG_COMPRESSED_DATA:
@@ -903,6 +961,8 @@ int pgpDigParamsCmp(pgpDigParams p1, pgpDigParams p2)
     int rc = 1; /* assume different, eg if either is NULL */
     if (p1 && p2) {
        /* XXX Should we compare something else too? */
+       if (p1->tag != p2->tag)
+           goto exit;
        if (p1->hash_algo != p2->hash_algo)
            goto exit;
        if (p1->pubkey_algo != p2->pubkey_algo)
@@ -913,6 +973,8 @@ int pgpDigParamsCmp(pgpDigParams p1, pgpDigParams p2)
            goto exit;
        if (memcmp(p1->signid, p2->signid, sizeof(p1->signid)) != 0)
            goto exit;
+       if (p1->userid && p2->userid && strcmp(p1->userid, p2->userid) != 0)
+           goto exit;
 
        /* Parameters match ... at least for our purposes */
        rc = 0;
@@ -937,36 +999,128 @@ unsigned int pgpDigParamsAlgo(pgpDigParams digp, unsigned int algotype)
     return algo;
 }
 
+static pgpDigParams pgpDigParamsNew(uint8_t tag)
+{
+    pgpDigParams digp = xcalloc(1, sizeof(*digp));
+    digp->tag = tag;
+    return digp;
+}
+
+static int hashKey(DIGEST_CTX hash, const struct pgpPkt *pkt, int exptag)
+{
+    int rc = -1;
+    if (pkt->tag == exptag) {
+       uint8_t head[] = {
+           0x99,
+           (pkt->blen >> 8),
+           (pkt->blen     ),
+       };
+
+       rpmDigestUpdate(hash, head, 3);
+       rpmDigestUpdate(hash, pkt->body, pkt->blen);
+       rc = 0;
+    }
+    return rc;
+}
+
+static int pgpVerifySelf(pgpDigParams key, pgpDigParams selfsig,
+                       const struct pgpPkt *all, int i)
+{
+    int rc = -1;
+    DIGEST_CTX hash = NULL;
+
+    switch (selfsig->sigtype) {
+    case PGPSIGTYPE_SUBKEY_BINDING:
+       hash = rpmDigestInit(selfsig->hash_algo, 0);
+       if (hash) {
+           rc = hashKey(hash, &all[0], PGPTAG_PUBLIC_KEY);
+           if (!rc)
+               rc = hashKey(hash, &all[i-1], PGPTAG_PUBLIC_SUBKEY);
+       }
+       break;
+    default:
+       /* ignore types we can't handle */
+       rc = 0;
+       break;
+    }
+
+    if (hash && rc == 0)
+       rc = pgpVerifySignature(key, selfsig, hash);
+
+    rpmDigestFinal(hash, NULL, NULL, 0);
+
+    return rc;
+}
+
 int pgpPrtParams(const uint8_t * pkts, size_t pktlen, unsigned int pkttype,
                 pgpDigParams * ret)
 {
     const uint8_t *p = pkts;
     const uint8_t *pend = pkts + pktlen;
     pgpDigParams digp = NULL;
-    struct pgpPkt pkt;
+    pgpDigParams selfsig = NULL;
+    int i = 0;
+    int alloced = 16; /* plenty for normal cases */
+    struct pgpPkt *all = xmalloc(alloced * sizeof(*all));
     int rc = -1; /* assume failure */
+    int expect = 0;
+    int prevtag = 0;
 
     while (p < pend) {
-       if (decodePkt(p, (pend - p), &pkt))
+       struct pgpPkt *pkt = &all[i];
+       if (decodePkt(p, (pend - p), pkt))
            break;
 
        if (digp == NULL) {
-           if (pkttype && pkt.tag != pkttype) {
+           if (pkttype && pkt->tag != pkttype) {
                break;
            } else {
-               digp = xcalloc(1, sizeof(*digp));
-               digp->tag = pkt.tag;
+               digp = pgpDigParamsNew(pkt->tag);
            }
        }
 
-       if (pgpPrtPkt(&pkt, digp))
+       if (expect) {
+           if (pkt->tag != expect)
+               break;
+           selfsig = pgpDigParamsNew(pkt->tag);
+       }
+
+       if (pgpPrtPkt(pkt, selfsig ? selfsig : digp))
            break;
 
-       p += (pkt.body - pkt.head) + pkt.blen;
+       if (selfsig) {
+           /* subkeys must be followed by binding signature */
+           if (prevtag == PGPTAG_PUBLIC_SUBKEY) {
+               if (selfsig->sigtype != PGPSIGTYPE_SUBKEY_BINDING)
+                   break;
+           }
+
+           int xx = pgpVerifySelf(digp, selfsig, all, i);
+
+           selfsig = pgpDigParamsFree(selfsig);
+           if (xx)
+               break;
+           expect = 0;
+       }
+
+       if (pkt->tag == PGPTAG_PUBLIC_SUBKEY)
+           expect = PGPTAG_SIGNATURE;
+       prevtag = pkt->tag;
+
+       i++;
+       p += (pkt->body - pkt->head) + pkt->blen;
+       if (pkttype == PGPTAG_SIGNATURE)
+           break;
+
+       if (alloced <= i) {
+           alloced *= 2;
+           all = xrealloc(all, alloced * sizeof(*all));
+       }
     }
 
-    rc = (digp && (p == pend)) ? 0 : -1;
+    rc = (digp && (p == pend) && expect == 0) ? 0 : -1;
 
+    free(all);
     if (ret && rc == 0) {
        *ret = digp;
     } else {
@@ -975,6 +1129,63 @@ int pgpPrtParams(const uint8_t * pkts, size_t pktlen, unsigned int pkttype,
     return rc;
 }
 
+int pgpPrtParamsSubkeys(const uint8_t *pkts, size_t pktlen,
+                       pgpDigParams mainkey, pgpDigParams **subkeys,
+                       int *subkeysCount)
+{
+    const uint8_t *p = pkts;
+    const uint8_t *pend = pkts + pktlen;
+    pgpDigParams *digps = NULL;
+    int count = 0;
+    int alloced = 10;
+    struct pgpPkt pkt;
+    int rc, i;
+
+    digps = xmalloc(alloced * sizeof(*digps));
+
+    while (p < pend) {
+       if (decodePkt(p, (pend - p), &pkt))
+           break;
+
+       p += (pkt.body - pkt.head) + pkt.blen;
+
+       if (pkt.tag == PGPTAG_PUBLIC_SUBKEY) {
+           if (count == alloced) {
+               alloced <<= 1;
+               digps = xrealloc(digps, alloced * sizeof(*digps));
+           }
+
+           digps[count] = xcalloc(1, sizeof(**digps));
+           digps[count]->tag = PGPTAG_PUBLIC_SUBKEY;
+           /* Copy UID from main key to subkey */
+           digps[count]->userid = xstrdup(mainkey->userid);
+
+           if (getKeyID(pkt.body, pkt.blen, digps[count]->signid)) {
+               pgpDigParamsFree(digps[count]);
+               continue;
+           }
+
+           if (pgpPrtKey(pkt.tag, pkt.body, pkt.blen, digps[count])) {
+               pgpDigParamsFree(digps[count]);
+               continue;
+           }
+           count++;
+       }
+    }
+    rc = (p == pend) ? 0 : -1;
+
+    if (rc == 0) {
+       *subkeys = xrealloc(digps, count * sizeof(*digps));
+       *subkeysCount = count;
+    } else {
+       for (i = 0; i < count; i++)
+           pgpDigParamsFree(digps[i]);
+       free(digps);
+    }
+
+    return rc;
+}
+
 int pgpPrtPkts(const uint8_t * pkts, size_t pktlen, pgpDig dig, int printing)
 {
     int rc;
@@ -1230,6 +1441,29 @@ pgpArmor pgpParsePkts(const char *armor, uint8_t ** pkt, size_t * pktlen)
     return ec;
 }
 
+int pgpPubKeyCertLen(const uint8_t *pkts, size_t pktslen, size_t *certlen)
+{
+    const uint8_t *p = pkts;
+    const uint8_t *pend = pkts + pktslen;
+    struct pgpPkt pkt;
+
+    while (p < pend) {
+       if (decodePkt(p, (pend - p), &pkt))
+           return -1;
+
+       if (pkt.tag == PGPTAG_PUBLIC_KEY && pkts != p) {
+           *certlen = p - pkts;
+           return 0;
+       }
+
+       p += (pkt.body - pkt.head) + pkt.blen;
+    }
+
+    *certlen = pktslen;
+
+    return 0;
+}
+
 char * pgpArmorWrap(int atype, const unsigned char * s, size_t ns)
 {
     char *buf = NULL, *val = NULL;
index d45465636e5cda2d2690596afb2801797a711157..d37a2e92cbaa7768aec733db4a2ba90d8ad9b012 100644 (file)
@@ -244,14 +244,16 @@ typedef enum pgpCompressAlgo_e {
        4          - Reserved for double-width SHA (experimental)
        5          - MD2                                    "MD2"
        6          - Reserved for TIGER/192                 "TIGER192"
-       7          - Reserved for HAVAL (5 pass, 160-bit)
-       "HAVAL-5-160"
+       7          - Reserved for HAVAL (5 pass, 160-bit)    "HAVAL-5-160"
+       8          - SHA-256                                "SHA256"
+       9          - SHA-384                                "SHA384"
+       10         - SHA-512                                "SHA512"
+       11         - SHA-224                                "SHA224"
        100 to 110 - Private/Experimental algorithm.
 \endverbatim
  *
  * Implementations MUST implement SHA-1. Implementations SHOULD
  * implement MD5.
- * @todo Add SHA256.
  */
 typedef enum pgpHashAlgo_e {
     PGPHASHALGO_MD5            =  1,   /*!< MD5 */
@@ -970,23 +972,23 @@ char * pgpHexStr(const uint8_t *p, size_t plen);
 
 /** \ingroup rpmpgp
  * Calculate OpenPGP public key fingerprint.
- * @todo V3 non-RSA public keys not implemented.
  * @param pkt          OpenPGP packet (i.e. PGPTAG_PUBLIC_KEY)
  * @param pktlen       OpenPGP packet length (no. of bytes)
- * @retval keyid       public key fingerprint
- * @return             0 on sucess, else -1
+ * @retval fp          public key fingerprint
+ * @retval fplen       public key fingerprint length
+ * @return             0 on success, else -1
  */
 int pgpPubkeyFingerprint(const uint8_t * pkt, size_t pktlen,
-               pgpKeyID_t keyid);
+                        uint8_t **fp, size_t *fplen);
 
 /** \ingroup rpmpgp
-* Extract OpenPGP public key fingerprint from base64 encoded packet.
-* @todo V3 non-RSA public keys not implemented.
-* @param b64pkt        base64 encoded openpgp packet
-* @retval keyid                public key fingerprint
-* @return              8 (no. of bytes) on success, < 0 on error
-*/
-int pgpExtractPubkeyFingerprint(const char * b64pkt, pgpKeyID_t keyid);
+ * Calculate OpenPGP public key Key ID
+ * @param pkt          OpenPGP packet (i.e. PGPTAG_PUBLIC_KEY)
+ * @param pktlen       OpenPGP packet length (no. of bytes)
+ * @retval keyid       public key Key ID
+ * @return             0 on success, else -1
+ */
+int pgpPubkeyKeyID(const uint8_t * pkt, size_t pktlen, pgpKeyID_t keyid);
 
 /** \ingroup rpmpgp
  * Parse a OpenPGP packet(s).
@@ -999,6 +1001,18 @@ int pgpExtractPubkeyFingerprint(const char * b64pkt, pgpKeyID_t keyid);
 int pgpPrtParams(const uint8_t *pkts, size_t pktlen, unsigned int pkttype,
                 pgpDigParams * ret);
 
+/** \ingroup rpmpgp
+ * Parse subkey parameters from OpenPGP packet(s).
+ * @param pkts         OpenPGP packet(s)
+ * @param pktlen       OpenPGP packet(s) length (no. of bytes)
+ * @param mainkey      parameters of main key
+ * @param subkeys      array of subkey parameters (alloced)
+ * @param subkeysCount count of subkeys
+ * @return             -1 on error, 0 on success
+ */
+int pgpPrtParamsSubkeys(const uint8_t *pkts, size_t pktlen,
+                       pgpDigParams mainkey, pgpDigParams **subkeys,
+                       int *subkeysCount);
 /** \ingroup rpmpgp
  * Print/parse a OpenPGP packet(s).
  * @param pkts         OpenPGP packet(s)
@@ -1027,6 +1041,20 @@ pgpArmor pgpReadPkts(const char * fn, uint8_t ** pkt, size_t * pktlen);
  */
 pgpArmor pgpParsePkts(const char *armor, uint8_t ** pkt, size_t * pktlen);
 
+/** \ingroup rpmpgp
+ * Return a length of the first public key certificate in a buffer given
+ * by pkts that contains one or more certificates. A public key certificate
+ * consits of packets like Public key packet, User ID packet and so on.
+ * In a buffer every certificate starts with Public key packet and it ends
+ * with the start of the next certificate or with the end of the buffer.
+ *
+ * @param pkts         pointer to a buffer with certificates
+ * @param pktslen      length of the buffer with certificates
+ * @param certlen      length of the first certificate in the buffer
+ * @return             0 on success
+ */
+int pgpPubKeyCertLen(const uint8_t *pkts, size_t pktslen, size_t *certlen);
+
 /** \ingroup rpmpgp
  * Wrap a OpenPGP packets in ascii armor for transport.
  * @param atype                type of armor
@@ -1187,7 +1215,8 @@ rpmDigestBundle rpmDigestBundleNew(void);
 rpmDigestBundle rpmDigestBundleFree(rpmDigestBundle bundle);
 
 /** \ingroup rpmpgp
- * Add a new type of digest to a bundle.
+ * Add a new type of digest to a bundle. Same as calling
+ * rpmDigestBundleAddID() with algo == id value.
  * @param bundle       digest bundle
  * @param algo         type of digest
  * @param flags                bit(s) to control digest operation
@@ -1196,6 +1225,17 @@ rpmDigestBundle rpmDigestBundleFree(rpmDigestBundle bundle);
 int rpmDigestBundleAdd(rpmDigestBundle bundle, int algo,
                        rpmDigestFlags flags);
 
+/** \ingroup rpmpgp
+ * Add a new type of digest to a bundle.
+ * @param bundle       digest bundle
+ * @param algo         type of digest
+ * @param id           id of digest (arbitrary, must be > 0)
+ * @param flags                bit(s) to control digest operation
+ * @return             0 on success
+ */
+int rpmDigestBundleAddID(rpmDigestBundle bundle, int algo, int id,
+                        rpmDigestFlags flags);
+
 /** \ingroup rpmpgp
  * Update contexts within bundle with next plain text buffer.
  * @param bundle       digest bundle
@@ -1209,22 +1249,22 @@ int rpmDigestBundleUpdate(rpmDigestBundle bundle, const void *data, size_t len);
  * Return digest from a bundle and destroy context, see rpmDigestFinal().
  *
  * @param bundle       digest bundle
- * @param algo         type of digest to return
+ * @param id           id of digest to return
  * @retval datap       address of returned digest
  * @retval lenp                address of digest length
  * @param asAscii      return digest as ascii string?
  * @return             0 on success
  */
-int rpmDigestBundleFinal(rpmDigestBundle bundle,
-        int algo, void ** datap, size_t * lenp, int asAscii);
+int rpmDigestBundleFinal(rpmDigestBundle bundle, int id,
+                        void ** datap, size_t * lenp, int asAscii);
 
 /** \ingroup rpmpgp
  * Duplicate a digest context from a bundle.
  * @param bundle       digest bundle
- * @param algo         type of digest to dup
+ * @param id           id of digest to dup
  * @return             duplicated digest context
  */
-DIGEST_CTX rpmDigestBundleDupCtx(rpmDigestBundle bundle, int algo);
+DIGEST_CTX rpmDigestBundleDupCtx(rpmDigestBundle bundle, int id);
 
 #ifdef __cplusplus
 }
index bfd4db004c34c07e889c48a927e68289ccbc8d93..1bbdd0a6debefcb9d75d673e15fd040dc29d020f 100644 (file)
 #include <sys/signal.h>
 #include <errno.h>
 #include <stdio.h>
-
-#define        ADD_REF(__tbl)  (__tbl)->active++
-#define        SUB_REF(__tbl)  --(__tbl)->active
+#include <stdlib.h>
+#include <string.h>
 
 #include <rpm/rpmsq.h>
+#include <rpm/rpmlog.h>
 
 #include "debug.h"
 
-static sigset_t rpmsqCaught;
+static __thread int disableInterruptSafety;
+static __thread sigset_t rpmsqCaught;
+static __thread sigset_t rpmsqActive;
 
 typedef struct rpmsig_s * rpmsig;
 
+static void rpmsqIgn(int signum, siginfo_t *info, void *context)
+{
+}
+
+static void rpmsqTerm(int signum, siginfo_t *info, void *context)
+{
+    if (info->si_pid == 0) {
+       rpmlog(RPMLOG_DEBUG,
+               "exiting on signal %d (killed by death, eh?)\n", signum);
+    } else {
+       int lvl = (signum == SIGPIPE) ? RPMLOG_DEBUG : RPMLOG_WARNING;
+       rpmlog(lvl,
+               _("exiting on signal %d from pid %d\n"), signum, info->si_pid);
+    }
+    /* exit 128 + signum for compatibility with bash(1) */
+    exit(128 + signum);
+}
+
 static struct rpmsig_s {
     int signum;
+    rpmsqAction_t defhandler;
     rpmsqAction_t handler;
-    int active;
+    siginfo_t siginfo;
     struct sigaction oact;
 } rpmsigTbl[] = {
-    { SIGINT,  rpmsqAction },
-#define        rpmsigTbl_sigint        (&rpmsigTbl[0])
-    { SIGQUIT, rpmsqAction },
-#define        rpmsigTbl_sigquit       (&rpmsigTbl[1])
-    { SIGHUP,  rpmsqAction },
-#define        rpmsigTbl_sighup        (&rpmsigTbl[3])
-    { SIGTERM, rpmsqAction },
-#define        rpmsigTbl_sigterm       (&rpmsigTbl[4])
-    { SIGPIPE, rpmsqAction },
-#define        rpmsigTbl_sigpipe       (&rpmsigTbl[5])
-    { -1,      NULL },
+    { SIGINT,  rpmsqTerm,      NULL },
+    { SIGQUIT, rpmsqTerm,      NULL },
+    { SIGHUP,  rpmsqTerm,      NULL },
+    { SIGTERM, rpmsqTerm,      NULL },
+    { SIGPIPE, rpmsqTerm,      NULL },
+    { -1,      NULL,           NULL },
 };
 
+static int rpmsigGet(int signum, struct rpmsig_s **sig)
+{
+    for (rpmsig tbl = rpmsigTbl; tbl->signum >= 0; tbl++) {
+       if (tbl->signum == signum) {
+           *sig = tbl;
+           return 1;
+       }
+    }
+    return 0;
+}
+
 int rpmsqIsCaught(int signum)
 {
     return sigismember(&rpmsqCaught, signum);
 }
 
-#ifdef SA_SIGINFO
-void rpmsqAction(int signum, siginfo_t * info, void * context)
-#else
-void rpmsqAction(int signum)
-#endif
+static void rpmsqHandler(int signum, siginfo_t * info, void * context)
 {
     int save = errno;
-    rpmsig tbl;
 
-    for (tbl = rpmsigTbl; tbl->signum >= 0; tbl++) {
-       if (tbl->signum != signum)
-           continue;
-
-       (void) sigaddset(&rpmsqCaught, signum);
-       break;
+    if (sigismember(&rpmsqActive, signum)) {
+       if (!sigismember(&rpmsqCaught, signum)) {
+           rpmsig sig = NULL;
+           if (rpmsigGet(signum, &sig)) {
+               (void) sigaddset(&rpmsqCaught, signum);
+               memcpy(&sig->siginfo, info, sizeof(*info));
+           }
+       }
     }
+
     errno = save;
 }
 
-int rpmsqEnable(int signum, rpmsqAction_t handler)
+rpmsqAction_t rpmsqSetAction(int signum, rpmsqAction_t handler)
 {
-    int tblsignum = (signum >= 0 ? signum : -signum);
-    struct sigaction sa;
-    rpmsig tbl;
-    int ret = -1;
+    rpmsig sig = NULL;
+    rpmsqAction_t oh = RPMSQ_ERR;
 
-    for (tbl = rpmsigTbl; tbl->signum >= 0; tbl++) {
-       if (tblsignum != tbl->signum)
-           continue;
+    if (rpmsigGet(signum, &sig)) {
+       oh = sig->handler;
+       sig->handler = (handler == RPMSQ_IGN) ? rpmsqIgn : handler;
+    }
+    return oh;
+}
 
-       if (signum >= 0) {                      /* Enable. */
-           if (ADD_REF(tbl) <= 0) {
-               (void) sigdelset(&rpmsqCaught, tbl->signum);
+int rpmsqActivate(int state)
+{
+    sigset_t newMask, oldMask;
+
+    if (disableInterruptSafety)
+      return 0;
+
+    (void) sigfillset(&newMask);
+    (void) pthread_sigmask(SIG_BLOCK, &newMask, &oldMask);
+
+    if (state) {
+       struct sigaction sa;
+       for (rpmsig tbl = rpmsigTbl; tbl->signum >= 0; tbl++) {
+           sigdelset(&rpmsqCaught, tbl->signum);
+           memset(&tbl->siginfo, 0, sizeof(tbl->siginfo));
+
+           /* XXX Don't set a signal handler if already SIG_IGN */
+           sigaction(tbl->signum, NULL, &tbl->oact);
+           if (tbl->oact.sa_handler == SIG_IGN)
+               continue;
+
+           sigemptyset (&sa.sa_mask);
+           sa.sa_flags = SA_SIGINFO;
+           sa.sa_sigaction = rpmsqHandler;
+           if (sigaction(tbl->signum, &sa, &tbl->oact) == 0)
+               sigaddset(&rpmsqActive, tbl->signum);
+       }
+    } else {
+       for (rpmsig tbl = rpmsigTbl; tbl->signum >= 0; tbl++) {
+           if (!sigismember(&rpmsqActive, tbl->signum))
+               continue;
+           if (sigaction(tbl->signum, &tbl->oact, NULL) == 0) {
+               sigdelset(&rpmsqActive, tbl->signum);
+               sigdelset(&rpmsqCaught, tbl->signum);
+               memset(&tbl->siginfo, 0, sizeof(tbl->siginfo));
+           }
+       }
+    }
+    pthread_sigmask(SIG_SETMASK, &oldMask, NULL);
+    return 0;
+}
 
-               /* XXX Don't set a signal handler if already SIG_IGN */
-               (void) sigaction(tbl->signum, NULL, &tbl->oact);
-               if (tbl->oact.sa_handler == SIG_IGN)
-                   continue;
+int rpmsqPoll(void)
+{
+    sigset_t newMask, oldMask;
+    int n = 0;
+
+    /* block all signals while processing the queue */
+    (void) sigfillset(&newMask);
+    (void) pthread_sigmask(SIG_BLOCK, &newMask, &oldMask);
+
+    for (rpmsig tbl = rpmsigTbl; tbl->signum >= 0; tbl++) {
+       /* honor blocked signals in polling too */
+       if (sigismember(&oldMask, tbl->signum))
+           continue;
+       if (sigismember(&rpmsqCaught, tbl->signum)) {
+           rpmsqAction_t handler = (tbl->handler != NULL) ? tbl->handler :
+                                                            tbl->defhandler;
+           /* delete signal before running handler to prevent recursing */
+           sigdelset(&rpmsqCaught, tbl->signum);
+           handler(tbl->signum, &tbl->siginfo, NULL);
+           memset(&tbl->siginfo, 0, sizeof(tbl->siginfo));
+           n++;
+       }
+    }
+    pthread_sigmask(SIG_SETMASK, &oldMask, NULL);
+    return n;
+}
 
-               (void) sigemptyset (&sa.sa_mask);
-#ifdef SA_SIGINFO
-               sa.sa_flags = SA_SIGINFO;
-#else
-               sa.sa_flags = 0;
+int rpmsqBlock(int op)
+{
+    static __thread sigset_t oldMask;
+    static __thread int blocked = 0;
+    sigset_t newMask;
+    int ret = 0;
+
+    if (op == SIG_BLOCK) {
+       blocked++;
+       if (blocked == 1) {
+           sigfillset(&newMask);
+           sigdelset(&newMask, SIGABRT);
+           sigdelset(&newMask, SIGBUS);
+           sigdelset(&newMask, SIGFPE);
+           sigdelset(&newMask, SIGILL);
+           sigdelset(&newMask, SIGSEGV);
+           sigdelset(&newMask, SIGTSTP);
+#ifdef HWASAN_BUILD
+           sigdelset(&newMask, SIGTRAP);
 #endif
-               sa.sa_sigaction = (handler != NULL ? handler : tbl->handler);
-               if (sigaction(tbl->signum, &sa, &tbl->oact) < 0) {
-                   SUB_REF(tbl);
-                   break;
-               }
-               tbl->active = 1;                /* XXX just in case */
-               if (handler != NULL)
-                   tbl->handler = handler;
-           }
-       } else {                                /* Disable. */
-           if (SUB_REF(tbl) <= 0) {
-               if (sigaction(tbl->signum, &tbl->oact, NULL) < 0)
-                   break;
-               tbl->active = 0;                /* XXX just in case */
-               tbl->handler = (handler != NULL ? handler : rpmsqAction);
-           }
+           ret = pthread_sigmask(SIG_BLOCK, &newMask, &oldMask);
+       }
+    } else if (op == SIG_UNBLOCK) {
+       blocked--;
+       if (blocked == 0) {
+           ret = pthread_sigmask(SIG_SETMASK, &oldMask, NULL);
+           rpmsqPoll();
+       } else if (blocked < 0) {
+           blocked = 0;
+           ret = -1;
        }
-       ret = tbl->active;
-       break;
     }
+
     return ret;
 }
 
+/** \ingroup rpmio
+ * 
+ * By default, librpm will trap various unix signals such as SIGINT and SIGTERM,
+ * in order to avoid process exit while locks are held or a transaction is being
+ * performed.  However, there exist tools that operate on non-running roots (traditionally
+ * build systems such as mock), as well as deployment tools such as rpm-ostree.
+ *
+ * These tools are more robust against interruption - typically they
+ * will just throw away the partially constructed root.  This function
+ * is designed for use by those tools, so an operator can happily
+ * press Control-C.
+ *
+ * It's recommended to call this once only at process startup if this
+ * behavior is desired (and to then avoid using librpm against "live"
+ * databases), because currently signal handlers will not be retroactively
+ * applied if a database is open.
+ */
+void rpmsqSetInterruptSafety(int on)
+{
+  disableInterruptSafety = !on;
+}
index 00a1a72cfa79fb57dd77a2bcd8f64a0bc20b34e1..23206457c2b865e85afdd34d0b6dad22a5883002 100644 (file)
@@ -4,6 +4,7 @@
 /** \ingroup rpmio
  * \file rpmio/rpmsq.h
  *
+ * Signal Queue API
  */
 #include <rpm/rpmsw.h>
 #include <signal.h>
@@ -18,11 +19,14 @@ extern "C" {
  * @param info         (siginfo_t) signal info
  * @param context      signal context
  */
-#ifdef SA_SIGINFO
 typedef void (*rpmsqAction_t) (int signum, siginfo_t * info, void * context);
-#else
-typedef void (*rpmsqAction_t) (int signum);
-#endif
+
+/** \ingroup rpmsq
+ *  SIG_DFL, SIG_IGN and SIG_ERR counterparts
+ */
+#define RPMSQ_DFL      ((rpmsqAction_t)0)
+#define RPMSQ_IGN      ((rpmsqAction_t)1)
+#define RPMSQ_ERR      ((rpmsqAction_t)-1)
 
 /** \ingroup rpmsq
  * Test if given signal has been caught (while signals blocked).
@@ -33,24 +37,36 @@ typedef void (*rpmsqAction_t) (int signum);
 int rpmsqIsCaught(int signum);
 
 /** \ingroup rpmsq
- * Default signal handler.
+ * Activate (or disable) the signal queue.
+ * @param state                1 to enable, 0 to disable
+ * @return             0 on success, negative on error
+ */
+int rpmsqActivate(int state);
+
+/** \ingroup rpmsq
+ * Set or delete a signal handler for a signal.
  * @param signum       signal number
- * @param info         (siginfo_t) signal info
- * @param context      signal context
+ * @param handler      signal handler or NULL to delete
+ * @return             previous handler, RPMSQ_ERR on error
  */
-#ifdef SA_SIGINFO
-void rpmsqAction(int signum, siginfo_t * info, void * context);
-#else
-void rpmsqAction(int signum);
-#endif
+rpmsqAction_t rpmsqSetAction(int signum, rpmsqAction_t handler);
 
 /** \ingroup rpmsq
- * Enable or disable a signal handler.
- * @param signum       signal to enable (or disable if negative)
- * @param handler      sa_sigaction handler (or NULL to use rpmsqHandler())
- * @return             no. of refs, -1 on error
+ * Block or unblock (almost) all signals.
+ * The operation is "reference counted" so the calls can be nested,
+ * and signals are only unblocked when the reference count falls to zero.
+ * @param op           SIG_BLOCK/SIG_UNBLOCK
+ * @return             0 on success, -1 on error
  */
-int rpmsqEnable(int signum, rpmsqAction_t handler);
+int rpmsqBlock(int op);
+
+/** \ingroup rpmsq
+ * Poll for caught signals, executing their handlers.
+ * @return             no. active signals found
+ */
+int rpmsqPoll(void);
+
+void rpmsqSetInterruptSafety(int on);
 
 #ifdef __cplusplus
 }
index 742afaa221f400634abc436a6b9538d09dfed265..30a57eb1004d1cd03e32e13b0cd80521629d3c20 100644 (file)
@@ -27,7 +27,7 @@ struct poolHash_s {
 };
 
 struct rpmstrPool_s {
-    char ** offs;              /* pointers into data area */
+    const char ** offs;                /* pointers into data area */
     rpmsid offs_size;          /* largest offset index */;
     rpmsid offs_alloced;       /* offsets allocation size */
 
@@ -35,6 +35,7 @@ struct rpmstrPool_s {
     size_t chunks_size;                /* current chunk */
     size_t chunks_allocated;   /* allocated size of the chunks array */
     size_t chunk_allocated;    /* size of the current chunk */
+    size_t chunk_used;         /* usage of the current chunk */
 
     poolHash hash;             /* string -> sid hash table */
     int frozen;                        /* are new id additions allowed? */
@@ -137,7 +138,7 @@ static void poolHashAddHEntry(rpmstrPool pool, const char * key, unsigned int ke
 {
     poolHash ht = pool->hash;
 
-    /* keep load factor inbetween 0.25 and 0.5 */
+    /* keep load factor between 0.25 and 0.5 */
     if (2*(ht->keyCount) > ht->numBuckets) {
         poolHashResize(pool, ht->numBuckets * 2);
     }
@@ -219,7 +220,7 @@ static void rpmstrPoolRehash(rpmstrPool pool)
        pool->hash = poolHashFree(pool->hash);
 
     pool->hash = poolHashCreate(sizehint);
-    for (int i = 1; i < pool->offs_size; i++)
+    for (int i = 1; i <= pool->offs_size; i++)
        poolHashAddEntry(pool, rpmstrPoolStr(pool, i), i);
 }
 
@@ -234,8 +235,8 @@ rpmstrPool rpmstrPoolCreate(void)
     pool->chunks = xcalloc(pool->chunks_allocated, sizeof(*pool->chunks));
     pool->chunks_size = 1;
     pool->chunk_allocated = STRDATA_CHUNK;
-    pool->offs[1] = xcalloc(1, pool->chunk_allocated);
-    pool->chunks[pool->chunks_size] = pool->offs[1];
+    pool->chunks[pool->chunks_size] = xcalloc(1, pool->chunk_allocated);
+    pool->offs[1] = pool->chunks[pool->chunks_size];
 
     rpmstrPoolRehash(pool);
     pool->nrefs = 1;
@@ -296,43 +297,40 @@ static rpmsid rpmstrPoolPut(rpmstrPool pool, const char *s, size_t slen, unsigne
 {
     char *t = NULL;
     size_t ssize = slen + 1;
-    size_t chunk_used;
 
     pool->offs_size += 1;
-    /* need one extra for end of string */
-    /* and one extra to mark the end of the chunk */
-    if (pool->offs_alloced <= pool->offs_size + 2) {
+    if (pool->offs_alloced <= pool->offs_size) {
        pool->offs_alloced += STROFFS_CHUNK;
        pool->offs = xrealloc(pool->offs,
                              pool->offs_alloced * sizeof(*pool->offs));
     }
 
-    chunk_used = pool->offs[pool->offs_size] - pool->chunks[pool->chunks_size];
-    if (ssize + 1 > pool->chunk_allocated - chunk_used) {
-       /* check size of ->chunks */
+    /* Do we need a new chunk to store the string? */
+    if (ssize > pool->chunk_allocated - pool->chunk_used) {
        pool->chunks_size += 1;
+       /* Grow chunks array if needed */
        if (pool->chunks_size >= pool->chunks_allocated) {
            pool->chunks_allocated += pool->chunks_allocated;
            pool->chunks = xrealloc(pool->chunks,
                                pool->chunks_allocated * sizeof(*pool->chunks));
        }
 
-       /* Check if string is bigger than chunks */
+       /* Ensure the string fits in the new chunk we're about to allocate */
        if (ssize > pool->chunk_allocated) {
            pool->chunk_allocated = 2 * ssize;
        }
 
-       /* Dummy entry for end of last string*/
-       pool->offs_size += 1;
-
-       pool->offs[pool->offs_size] = xcalloc(1, pool->chunk_allocated);
-       pool->chunks[pool->chunks_size] = pool->offs[pool->offs_size];
+       pool->chunks[pool->chunks_size] = xcalloc(1, pool->chunk_allocated);
+       pool->chunk_used = 0;
     }
 
-    t = memcpy(pool->offs[pool->offs_size], s, slen);
+    /* Copy the string into current chunk, ensure termination */
+    t = memcpy(pool->chunks[pool->chunks_size] + pool->chunk_used, s, slen);
     t[slen] = '\0';
-    pool->offs[pool->offs_size+1] = t + ssize;
+    pool->chunk_used += ssize;
 
+    /* Actually add the string to the pool */
+    pool->offs[pool->offs_size] = t;
     poolHashAddHEntry(pool, t, hash, pool->offs_size);
 
     return pool->offs_size;
@@ -406,8 +404,8 @@ const char * rpmstrPoolStr(rpmstrPool pool, rpmsid sid)
 size_t rpmstrPoolStrlen(rpmstrPool pool, rpmsid sid)
 {
     size_t slen = 0;
-    if (pool && sid <= pool->offs_size) {
-       slen = pool->offs[sid+1] - pool->offs[sid] - 1;
+    if (pool && sid > 0 && sid <= pool->offs_size) {
+       slen = strlen(pool->offs[sid]);
     }
     return slen;
 }
index 0db07bb40e5e034706efc72d805f0c4d75a0dd75..11c946973b8ae84813987d016001f5cc97df825e 100644 (file)
@@ -1,6 +1,13 @@
 #ifndef _RPMSTRPOOL_H
 #define _RPMSTRPOOL_H
 
+/** \ingroup rpmstrpool
+ * \file rpmio/rpmstrpool.h
+ *
+ * String pools manipulation helper functions
+ *
+ */
+
 #include <rpm/rpmtypes.h>
 
 #ifdef __cplusplus
@@ -80,11 +87,11 @@ const char * rpmstrPoolStr(rpmstrPool pool, rpmsid sid);
 
 /** \ingroup rpmstrpool
  * Return length of a string by its pool id. The result is equal to
- * calling strlen() on a string retrieved through rpmstrPoolStr() but
- * runs in constant time regardless of the length of the string.
+ * calling strlen() on a string retrieved through rpmstrPoolStr(), but
+ * the pool might be able to optimize the calculation.
  * @param pool         string pool
  * @param sid          pool id of a string
- * @return             length of the string
+ * @return             length of the string, 0 for invalid pool or id
  */
 size_t rpmstrPoolStrlen(rpmstrPool pool, rpmsid sid);
 
index 7c285e7848b9f7854b53ddd679823442823ef4b3..61d6fe317823603b66a69991d066b20acce9e2f6 100644 (file)
@@ -3,6 +3,8 @@
 
 /** \ingroup rpmio
  * \file rpmio/rpmsw.h
+ *
+ * Statistics API
  */
 
 #include <unistd.h>
index e820e95e72c9f56ca76bed8b8a89602c03dea240..588c95df1a4525313d7230d6838d92ecb756200d 100644 (file)
@@ -3,6 +3,8 @@
 
 /** \ingroup rpmio
  * \file rpmio/rpmurl.h
+ *
+ * A couple utils for URL Manipulation
  */
 
 #ifdef __cplusplus
index 68a21f980b0f98f45ab58eb06b4c7060e40a41cc..9e8a25d0f6c981730e9a72b2cb795f82884383ad 100644 (file)
@@ -3,8 +3,9 @@
 
 #include <unistd.h>
 
-/*
- * Miscellanous utility macros:
+/** \file rpmio/rpmutil.h
+ *
+ * Miscellaneous utility macros:
  * - portability wrappers for various gcc extensions like __attribute__()
  * - ...
  *
diff --git a/rpmio/stubs.c b/rpmio/stubs.c
deleted file mode 100644 (file)
index 694306e..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * \file rpmio/stubs.c
- */
-
-/* XXX Portable shared libraries require rpmlib to contain these functions. */
-
-#include "system.h"
-
-#if !defined(HAVE_STPCPY)
-#include "misc/stpcpy.c"
-#endif
-
-#if !defined(HAVE_STPNCPY)
-#include "misc/stpncpy.c"
-#endif
-
-#include "misc/fnmatch.h"
-#include "misc/fnmatch.c"
index fa4e4d865ebe03ab5490a6b3bb8e06cfc8eabd2c..2b60a729ec1e383449a2d458472095b327f33c6a 100644 (file)
--- a/rpmkeys.c
+++ b/rpmkeys.c
@@ -5,10 +5,6 @@
 #include "cliutils.h"
 #include "debug.h"
 
-#if !defined(__GLIBC__) && !defined(__APPLE__)
-char ** environ = NULL;
-#endif
-
 enum modes {
     MODE_CHECKSIG      = (1 << 0),
     MODE_IMPORTKEY     = (1 << 1),
@@ -49,10 +45,14 @@ static struct poptOption optionsTable[] = {
 int main(int argc, char *argv[])
 {
     int ec = EXIT_FAILURE;
-    poptContext optCon = rpmcliInit(argc, argv, optionsTable);
+    poptContext optCon = NULL;
     rpmts ts = rpmtsCreate();
     ARGV_const_t args = NULL;
+
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
     
+    optCon = rpmcliInit(argc, argv, optionsTable);
+
     if (argc < 2) {
        printUsage(optCon, stderr, 0);
        goto exit;
index 92656e2709e42fde1472dff94470010082fe29f9..f8ce35f2285f5a1b48a346e0c30d4fbd48c2614b 100644 (file)
@@ -61,27 +61,25 @@ rpm alias --obsoletes       --qf \
 rpm    alias --provides        --qf \
   "[%|VERBOSE?{%{PROVIDEFLAGS:deptype}: }:{}|%{PROVIDENEVRS}\n]" \
        --POPTdesc=$"list capabilities that this package provides"
+rpm    alias -P --provides
 
 rpm    alias --requires        --qf \
   "[%|VERBOSE?{%{REQUIREFLAGS:deptype}: }:{}|%{REQUIRENEVRS}\n]" \
        --POPTdesc=$"list capabilities required by package(s)"
 rpm    alias -R --requires
 
-rpm    alias --suggests        --qf \
-  "[%|SUGGESTSFLAGS:depflag_strong?{}:{%{SUGGESTSNAME} %{SUGGESTSFLAGS:depflags} %{SUGGESTSVERSION}\n}|]" \
-       --POPTdesc=$"list capabilities this package suggests"
-
-rpm    alias --recommends      --qf \
-  "[%|SUGGESTSFLAGS:depflag_strong?{%{SUGGESTSNAME} %{SUGGESTSFLAGS:depflags} %{SUGGESTSVERSION}\n}|]" \
-       --POPTdesc=$"list capabilities this package recommends"
-
-rpm    alias --enhances        --qf \
-  "[%|ENHANCESFLAGS:depflag_strong?{}:{%{ENHANCESNAME} %{ENHANCESFLAGS:depflags} %{ENHANCESVERSION}\n}|]" \
-       --POPTdesc=$"list capabilities this package enhances"
-
-rpm    alias --supplements     --qf \
-  "[%|ENHANCESFLAGS:depflag_strong?{%{ENHANCESNAME} %{ENHANCESFLAGS:depflags} %{ENHANCESVERSION}\n}|]" \
-       --POPTdesc=$"list capabilities this package supplements"
+rpm    alias --recommends      --qf \
+  "[%|VERBOSE?{%{RECOMMENDFLAGS:deptype}: }:{}|%{RECOMMENDNEVRS}\n]" \
+       --POPTdesc=$"list capabilities recommended by package(s)"
+rpm    alias --suggests        --qf \
+  "[%|VERBOSE?{%{SUGGESTFLAGS:deptype}: }:{}|%{SUGGESTNEVRS}\n]" \
+       --POPTdesc=$"list capabilities suggested by package(s)"
+rpm    alias --supplements     --qf \
+  "[%|VERBOSE?{%{SUPPLEMENTFLAGS:deptype}: }:{}|%{SUPPLEMENTNEVRS}\n]" \
+       --POPTdesc=$"list capabilities supplemented by package(s)"
+rpm    alias --enhances        --qf \
+  "[%|VERBOSE?{%{ENHANCEFLAGS:deptype}: }:{}|%{ENHANCENEVRS}\n]" \
+       --POPTdesc=$"list capabilities enhanced by package(s)"
 
 rpm    alias --info --qf '\
 Name        : %{NAME}\n\
@@ -101,16 +99,17 @@ Relocations : %|PREFIXES?{[%{PREFIXES} ]}:{(not relocatable)}|\n\
 %|PACKAGER?{Packager    : %{PACKAGER}\n}|\
 %|VENDOR?{Vendor      : %{VENDOR}\n}|\
 %|URL?{URL         : %{URL}\n}|\
-%|VCS?{VCS         : %{VCS}\n}|\
 %|BUGURL?{Bug URL     : %{BUGURL}\n}|\
 Summary     : %{SUMMARY}\n\
-Description :\n%{DESCRIPTION}\n\
-Distribution: %{DISTRIBUTION}\n' \
+Description :\n%{DESCRIPTION}\n' \
        --POPTdesc=$"list descriptive information from package(s)"
 
 rpm    alias --changelog --qf '[* %{CHANGELOGTIME:day} %{CHANGELOGNAME}\n%{CHANGELOGTEXT}\n\n]' \
        --POPTdesc=$"list change logs for this package"
 
+rpm    alias --changes --qf '[* %{CHANGELOGTIME:date} %{CHANGELOGNAME}\n%{CHANGELOGTEXT}\n\n]' \
+       --POPTdesc=$"list changes for this package with full time stamps"
+
 rpm    alias --xml --qf '[%{*:xml}\n]' \
        --POPTdesc=$"list metadata in xml"
 
@@ -120,8 +119,16 @@ rpm        alias --triggerscripts --qf '\
 rpm    alias --triggers --triggerscripts \
        --POPTdesc=$"list trigger scriptlets from package(s)"
 
+rpm    alias --filetriggerscripts --qf '\
+[filetrigger%{FILETRIGGERTYPE} scriptlet (using %{FILETRIGGERSCRIPTPROG}) -- \
+%{FILETRIGGERCONDS}\n%{FILETRIGGERSCRIPTS}\n]\
+[transfiletrigger%{TRANSFILETRIGGERTYPE} scriptlet (using %{TRANSFILETRIGGERSCRIPTPROG}) -- \
+%{TRANSFILETRIGGERCONDS}\n%{TRANSFILETRIGGERSCRIPTS}\n]'
+rpm    alias --filetriggers --filetriggerscripts \
+       --POPTdesc=$"list filetrigger scriptlets from package(s)"
+
 rpm    alias --last --qf '%|INSTALLTIME?{%{INSTALLTIME}}:{000000000}| %{NVRA} %|INSTALLTIME?{%{INSTALLTIME:date}}:{(not installed)}|\n' \
-       --pipe "sort -r -n | sed 's,^[0-9]\+ ,,' | awk '{printf(\"%-45s %-s\n\", $1, substr($0,length($1)+2))}' " \
+       --pipe "LC_NUMERIC=C sort -r -n | sed 's,^[0-9]\+ ,,' | awk '{printf(\"%-45s %-s\n\", $1, substr($0,length($1)+2))}' " \
        --POPTdesc=$"list package(s) by install time, most recent first"
 
 rpm    alias --dupes   --qf '%|SOURCERPM?{%{name}.%{arch}}:{%|ARCH?{%{name}}:{%{name}-%{version}}|}|\n' --pipe "sort | uniq -d" \
@@ -131,28 +138,26 @@ rpm       alias --filesbypkg --qf '[%-25{=NAME} %{FILENAMES}\n]' \
        --POPTdesc=$"list all files from each package"
 
 rpm    alias --fileclass --qf '[%{FILENAMES}\t%{FILECLASS}\n]' \
-       --POPTdesc=$"list file names with classes"
+       --POPTdesc=$"list file names with their classes"
 
 rpm    alias --filecolor --qf '[%{FILENAMES}\t%{FILECOLORS}\n]' \
-       --POPTdesc=$"list file names with colors"
-
-rpm     alias --fscontext --qf '[%{FILENAMES}\n]' \
-        --pipe "xargs ls --scontext | awk '{printf(\"%s %s\n\", $2, $1)}'" \
-        --POPTdesc=$"list file names with security context from file system"
+       --POPTdesc=$"list file names with their colors"
 
 rpm    alias --fileprovide --qf '[%{FILENAMES}\t%{FILEPROVIDE}\n]' \
-       --POPTdesc=$"list file names with provides"
+       --POPTdesc=$"list file names with their provides"
 
 rpm    alias --filerequire --qf '[%{FILENAMES}\t%{FILEREQUIRE}\n]' \
        --POPTdesc=$"list file names with requires"
 
 rpm    alias --filecaps --qf '[%{FILENAMES}\t%|FILECAPS?{%{FILECAPS}}|\n]' \
-       --POPTdesc=$"list file names with POSIX1.e capabilities"
+       --POPTdesc=$"list file names with their POSIX1.e capabilities"
 
 # colon separated i18n domains to use as PO catalogue lookaside for
 # retrieving header group/description/summary.
 rpm alias --i18ndomains --define '_i18ndomains !#:+'
 
+rpm alias --color --define '_color_output !#:+'
+
 #==============================================================================
 #      [--ftpport <port>]      "port number of ftp server (or proxy)"
 rpm    alias --ftpport         --define '_httpport !#:+'
@@ -162,11 +167,14 @@ rpm       alias --ftpproxy        --define '_httpproxy !#:+'
 rpm    alias --httpport        --define '_httpport !#:+'
 #      [--httpproxy <host>]    "hostname or IP of http proxy"
 rpm    alias --httpproxy       --define '_httpproxy !#:+'
+#      [--trace]               "trace macro expansion"
+rpm    alias --trace           --eval '%trace'
 
 # Minimally preserve commonly used switches from cli split-up
 rpm    exec --addsign          rpmsign --addsign
 rpm    exec --delsign          rpmsign --delsign
 rpm    exec --resign           rpmsign --resign
+#rpm   exec --signfiles        rpmsign --signfiles
 rpm    exec --checksig         rpmkeys --checksig
 rpm    exec -K                 rpmkeys --checksig
 rpm    exec --import           rpmkeys --import
@@ -192,8 +200,10 @@ rpmbuild alias --buildpolicy --define '__os_install_post %{_rpmconfigdir}/brp-!#
        --POPTargs=$"<policy>"
 # Minimally preserve rpmbuild's --sign functionality
 rpmbuild alias --sign \
-       --pipe "grep '.*: .*\.rpm$'|cut -d: -f2|xargs -r rpm --addsign" \
-       --POPTdesc=$"generate GPG signature"
+       --pipe 'rpm --addsign `grep ".*: .*\.rpm$"|cut -d: -f2` < "/dev/"`ps -p $$ -o tty | tail -n 1`' \
+       --POPTdesc=$"generate GPG signature (deprecated, use command rpmsign instead)"
+#      [--trace]               "trace macro expansion"
+rpmbuild alias --trace         --eval '%trace'
 
 rpmsign alias --key-id  --define '_gpg_name !#:+' \
        --POPTdesc=$"key id/name to sign with" \
@@ -218,5 +228,7 @@ rpmspec     alias --buildconflicts  --srpm --conflicts \
        --POPTdesc=$"list capabilities conflicting with build of this package"
 rpmspec        alias --buildrequires   --srpm --requires \
        --POPTdesc=$"list capabilities required to build this package"
+#      [--trace]               "trace macro expansion"
+rpmspec alias --trace          --eval '%trace'
 # \endverbatim
 #*/
diff --git a/rpmqv.c b/rpmqv.c
index da5f2ca1328384026b383e35ba756611a37a75a4..f029d81920c1314c2d96e621023a11cf0082590f 100644 (file)
--- a/rpmqv.c
+++ b/rpmqv.c
@@ -1,5 +1,4 @@
 #include "system.h"
-const char *__progname;
 
 #include <rpm/rpmcli.h>
 #include <rpm/rpmlib.h>                        /* RPMSIGTAG, rpmReadPackageFile .. */
@@ -88,12 +87,14 @@ int main(int argc, char *argv[])
     int i;
 #endif
 
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
+
     optCon = rpmcliInit(argc, argv, optionsTable);
 
     /* Set the major mode based on argv[0] */
 #ifdef IAM_RPMQV
-    if (rstreq(__progname, "rpmquery"))        bigMode = MODE_QUERY;
-    if (rstreq(__progname, "rpmverify")) bigMode = MODE_VERIFY;
+    if (rstreq(xgetprogname(), "rpmquery"))    bigMode = MODE_QUERY;
+    if (rstreq(xgetprogname(), "rpmverify")) bigMode = MODE_VERIFY;
 #endif
 
 #if defined(IAM_RPMQV)
@@ -135,7 +136,8 @@ int main(int argc, char *argv[])
 #ifdef IAM_RPMEIU
   if (bigMode == MODE_UNKNOWN || (bigMode & MODES_IE))
     {  int iflags = (ia->installInterfaceFlags &
-               (INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL));
+                       (INSTALL_UPGRADE|INSTALL_FRESHEN|
+                        INSTALL_INSTALL|INSTALL_REINSTALL));
        int eflags = (ia->installInterfaceFlags & INSTALL_ERASE);
 
        if (iflags & eflags)
@@ -310,6 +312,8 @@ int main(int argc, char *argv[])
        verifyFlags &= ~qva->qva_flags;
        qva->qva_flags = (rpmQueryFlags) verifyFlags;
 
+       rpmtsSetFlags(ts, rpmtsFlags(ts) | (ia->transFlags & RPMTRANS_FLAG_NOPLUGINS));
+
        if (!poptPeekArg(optCon) && !(qva->qva_source == RPMQV_ALL))
            argerror(_("no arguments given for verify"));
        ec = rpmcliVerify(ts, qva, (ARGV_const_t) poptGetArgs(optCon));
@@ -325,7 +329,7 @@ int main(int argc, char *argv[])
     case MODE_ERASE:
 #endif
     case MODE_UNKNOWN:
-       if (poptPeekArg(optCon) != NULL || argc <= 1 || rpmIsVerbose()) {
+       if (poptPeekArg(optCon) != NULL || argc <= 1) {
            printUsage(optCon, stderr, 0);
            ec = argc;
        }
@@ -350,5 +354,7 @@ int main(int argc, char *argv[])
 
     rpmcliFini(optCon);
 
+    rpmlog(RPMLOG_DEBUG, "Exit status: %d\n", ec);
+
     return RETVAL(ec);
 }
index a4b6e1e3457cde59a3af3761c179ffdf2aac2b5d..b211bd2c54442484b39664575c51a726f7435b44 100644 (file)
--- a/rpmrc.in
+++ b/rpmrc.in
 # "fat" binary with both archs, for Darwin
 optflags: fat -O2 -g -arch i386 -arch ppc
 
-optflags: i386 -O2 -g -m32 -march=i486 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
-optflags: i486 -O2 -g -m32 -march=i486 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
-optflags: i586 -O2 -g -m32 -march=i586 -mtune=i686 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
-optflags: i686 -O2 -g -m32 -march=i686 -mtune=i686 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: i386 -O2 -g -m32 -march=i486 -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: i486 -O2 -g -m32 -march=i486 -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: i586 -O2 -g -m32 -march=i586 -mtune=i686 -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: i686 -O2 -g -m32 -march=i686 -mtune=i686 -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
 optflags: pentium3 -O2 -g -m32 -march=pentium3
 optflags: pentium4 -O2 -g -m32 -march=pentium4
 optflags: athlon -O2 -g -m32 -march=athlon
 optflags: geode -Os -g -m32 -march=geode
-optflags: ia64 -O2 -g -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
-optflags: x86_64 -O2 -g -m64 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: ia64 -O2 -g -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: x86_64 -O2 -g -m64 -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
 optflags: amd64 -O2 -g
 optflags: ia32e -O2 -g
 
@@ -41,14 +41,14 @@ optflags: sparc64v -O2 -g -m64 -mtune=niagara
 
 optflags: m68k -O2 -g -fomit-frame-pointer
 
-optflags: ppc -O2 -g -m32 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: ppc -O2 -g -m32 -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
 optflags: ppc8260 -O2 -g -m32
 optflags: ppc8560 -O2 -g -m32
 optflags: ppc32dy4 -O2 -g -m32
 optflags: ppciseries -O2 -g -m32
 optflags: ppcpseries -O2 -g -m32
-optflags: ppc64 -O2 -g -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
-optflags: ppc64p7 -O3 -mtune=power7 -mcpu=power7 -g -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: ppc64 -O2 -g -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: ppc64p7 -O3 -mtune=power7 -mcpu=power7 -g -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
 
 optflags: parisc -O2 -g -mpa-risc-1-0
 optflags: hppa -O2 -g -mpa-risc-1-0
@@ -59,16 +59,29 @@ optflags: hppa2.0 -O2 -g -mpa-risc-1-0
 
 optflags: mips -O2 -g
 optflags: mipsel -O2 -g
+optflags: mips64 -O2 -g
+optflags: mips64el -O2 -g
+
+optflags: mipsr6 -O2 -g
+optflags: mipsr6el -O2 -g
+optflags: mips64r6 -O2 -g
+optflags: mips64r6el -O2 -g
 
 optflags: armv3l -O2 -g -march=armv3
 optflags: armv4b -O2 -g -march=armv4
 optflags: armv4l -O2 -g -march=armv4
 optflags: armv4tl -O2 -g -march=armv4t
+optflags: armv5tl -O2 -g -march=armv5t
 optflags: armv5tel -O2 -g -march=armv5te
 optflags: armv5tejl -O2 -g -march=armv5te
 optflags: armv6l -O2 -g -march=armv6
+optflags: armv6hl -O2 -g -march=armv6 -mfloat-abi=hard -mfpu=vfp
+
 optflags: armv7l -O2 -g -march=armv7-a -mtune=cortex-a8 -mlittle-endian  -mfpu=vfpv3 -mfloat-abi=softfp -D__SOFTFP__
 optflags: armv7hl -O2 -g -march=armv7-a -mfloat-abi=hard -mthumb -mabi=aapcs-linux
+optflags: armv7hnl -O2 -g -march=armv7-a -mfloat-abi=hard -mfpu=neon
+
+optflags: m68k -O2 -g -fomit-frame-pointer
 
 optflags: atarist -O2 -g -fomit-frame-pointer
 optflags: atariste -O2 -g -fomit-frame-pointer
@@ -78,13 +91,16 @@ optflags: atariclone -O2 -g -fomit-frame-pointer
 optflags: milan -O2 -g -fomit-frame-pointer
 optflags: hades -O2 -g -fomit-frame-pointer
 
-optflags: s390 -O2 -g -m31 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
-optflags: s390x -O2 -g -m64 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: s390 -O2 -g -m31 -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+optflags: s390x -O2 -g -m64 -fmessage-length=0 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
 
 optflags: sh3 -O2 -g
 optflags: sh4 -O2 -g -mieee
 optflags: sh4a -O2 -g -mieee
 
+optflags: aarch64 -O2 -g
+optflags: riscv64 -O2 -g
+
 #############################################################
 # Architecture colors
 
@@ -96,6 +112,7 @@ archcolor: sparc64 2
 archcolor: sparcv9 2
 archcolor: ppc 1
 archcolor: ppc64 2
+archcolor: ppc64le 2
 
 archcolor: armv3l 1
 archcolor: armv4b 1
@@ -105,6 +122,19 @@ archcolor: armv5tel 1
 archcolor: armv5tejl 1
 archcolor: armv6l 1
 archcolor: armv7l 1
+archcolor: armv7hl 1
+
+archcolor: mips 1
+archcolor: mipsel 1
+archcolor: mips64 2
+archcolor: mips64el 2
+
+archcolor: mipsr6 1
+archcolor: mipsr6el 1
+archcolor: mips64r6 2
+archcolor: mips64r6el 2
+
+archcolor: m68k 1
 
 archcolor: m68kmint 1
 
@@ -118,6 +148,9 @@ archcolor: x86_64 2
 archcolor: sh3 1
 archcolor: sh4 1
 
+archcolor: aarch64 2
+
+archcolor: riscv64 2
 #############################################################
 # Canonical arch names and numbers
 
@@ -155,6 +188,7 @@ arch_canon:   sparcv9: sparcv9      3
 arch_canon:    sparcv9v: sparcv9v      3
 # This is really a place holder for MIPS.
 arch_canon:    mips:   mips    4
+arch_canon:    mipsel: mipsel  4
 
 arch_canon:    ppc:    ppc     5
 arch_canon:    ppc8260:        ppc8260 5
@@ -168,16 +202,20 @@ arch_canon:       IP:     sgi     7
 arch_canon:     rs6000:        rs6000  8
 arch_canon:     ia64:  ia64    9
 
-arch_canon:    mipsel: mipsel  11
+arch_canon:    mips64:         mips64          11
+arch_canon:    mips64el:       mips64el        11
 
 arch_canon:    armv3l: armv3l  12
 arch_canon:     armv4b:        armv4b  12
 arch_canon:     armv4l:        armv4l  12
+arch_canon:     armv5tl: armv5tl       12
 arch_canon:     armv5tel: armv5tel     12
 arch_canon:     armv5tejl: armv5tejl   12
 arch_canon:     armv6l: armv6l         12
+arch_canon:     armv6hl: armv6hl       12
 arch_canon:     armv7l: armv7l         12
 arch_canon:     armv7hl: armv7hl       12
+arch_canon:     armv7hnl: armv7hnl     12
 
 arch_canon:    m68kmint: m68kmint      13
 arch_canon:    atarist: m68kmint       13
@@ -193,6 +231,7 @@ arch_canon: i370: i370      14
 arch_canon:    s390x: s390x    15
 
 arch_canon:    ppc64:  ppc64   16
+arch_canon:    ppc64le:        ppc64le 16
 arch_canon:    ppc64pseries: ppc64pseries  16
 arch_canon:    ppc64iseries: ppc64iseries  16
 arch_canon:    ppc64p7: ppc64p7  16
@@ -202,6 +241,14 @@ arch_canon:        sh3: sh3        17
 arch_canon:    sh4: sh4        17
 arch_canon:    sh4a: sh4a      17
 arch_canon:    xtensa: xtensa  18
+arch_canon:    aarch64: aarch64 19
+arch_canon:    mipsr6: mipsr6  20
+arch_canon:    mipsr6el: mipsr6el      20
+arch_canon:    mips64r6: mips64r6      21
+arch_canon:    mips64r6el: mips64r6el  21
+
+arch_canon:    riscv: riscv64  22
+arch_canon:    riscv64: riscv64        22
 
 #############################################################
 # Canonical OS names and numbers
@@ -279,18 +326,34 @@ buildarchtranslate: ppcpseries: ppc
 buildarchtranslate: ppc64iseries: ppc64
 buildarchtranslate: ppc64pseries: ppc64
 buildarchtranslate: ppc64p7: ppc64
-buildarchtranslate: powerpc64: ppc64
+buildarchtranslate: ppc64le: ppc64le
 
 buildarchtranslate: armv3l: armv3l
 buildarchtranslate: armv4b: armv4b
 buildarchtranslate: armv4l: armv4l
 buildarchtranslate: armv4tl: armv4tl
+buildarchtranslate: armv5tl: armv5tl
 buildarchtranslate: armv5tel: armv5tel
 buildarchtranslate: armv5tejl: armv5tejl
 buildarchtranslate: armv6l: armv6l
+buildarchtranslate: armv6hl: armv6hl
 buildarchtranslate: armv7l: armv7l
 buildarchtranslate: armv7hl: armv7hl
 
+buildarchtranslate: armv7hnl: armv7hnl
+
+buildarchtranslate: mips: mips
+buildarchtranslate: mipsel: mipsel
+buildarchtranslate: mips64: mips64
+buildarchtranslate: mips64el: mips64el
+
+buildarchtranslate: mipsr6: mipsr6
+buildarchtranslate: mipsr6el: mipsr6el
+buildarchtranslate: mips64r6: mips64r6
+buildarchtranslate: mips64r6el: mips64r6el
+
+buildarchtranslate: m68k: m68k
+
 buildarchtranslate: atarist: m68kmint
 buildarchtranslate: atariste: m68kmint
 buildarchtranslate: ataritt: m68kmint
@@ -312,6 +375,7 @@ buildarchtranslate: sh3: sh3
 buildarchtranslate: sh4: sh4
 buildarchtranslate: sh4a: sh4
 
+
 buildarchtranslate: parisc: hppa
 buildarchtranslate: hppa2.0: hppa
 buildarchtranslate: hppa64: hppa
@@ -320,6 +384,9 @@ buildarchtranslate: armv5l: armv4l
 buildarchtranslate: armv5tel: armv4l
 buildarchtranslate: armv5b: armv4b
 buildarchtranslate: armv5teb: armv4b
+buildarchtranslate: aarch64: aarch64
+buildarchtranslate: riscv: riscv64
+buildarchtranslate: riscv64: riscv64
 
 #############################################################
 # Architecture compatibility
@@ -359,6 +426,7 @@ arch_compat: rs6000: noarch fat
 arch_compat: ppc64pseries: ppc64
 arch_compat: ppc64iseries: ppc64
 arch_compat: ppc64p7: ppc64
+arch_compat: ppc64le: noarch fat
 
 arch_compat: sun4c: sparc
 arch_compat: sun4d: sparc
@@ -373,6 +441,13 @@ arch_compat: sparc: noarch
 
 arch_compat: mips: noarch
 arch_compat: mipsel: noarch
+arch_compat: mips64: mips
+arch_compat: mips64el: mipsel
+
+arch_compat: mipsr6: noarch
+arch_compat: mipsr6el: noarch
+arch_compat: mips64r6: mipsr6
+arch_compat: mips64r6el: mipsr6el
 
 arch_compat: hppa2.0: hppa1.2
 arch_compat: hppa1.2: hppa1.1
@@ -388,11 +463,16 @@ arch_compat: armv7hl: armv7l
 arch_compat: armv7l: armv6l
 arch_compat: armv6l: armv5tejl
 arch_compat: armv5tejl: armv5tel
-arch_compat: armv5tel: armv5l
-arch_compat: armv5l: armv4tl
+arch_compat: armv5tel: armv5tl
+arch_compat: armv5tl: armv4tl
 arch_compat: armv4tl: armv4l
 arch_compat: armv4l: armv3l
 arch_compat: armv3l: noarch
+arch_compat: armv7hnl: armv7hl
+arch_compat: armv7hl: armv6hl
+arch_compat: armv6hl: noarch
+
+arch_compat: m68k: noarch
 
 arch_compat: atarist: m68kmint noarch
 arch_compat: atariste: m68kmint noarch
@@ -416,6 +496,10 @@ arch_compat: sh3: noarch
 arch_compat: sh4: noarch
 arch_compat: sh4a: sh4
 
+arch_compat: aarch64: noarch
+
+arch_compat: riscv: noarch
+arch_compat: riscv64: noarch
 os_compat:   IRIX64: IRIX
 os_compat: solaris2.7: solaris2.3 solaris2.4 solaris2.5 solaris2.6
 os_compat: solaris2.6: solaris2.3 solaris2.4 solaris2.5
@@ -447,6 +531,12 @@ os_compat: Darwin: MacOSX
 
 buildarch_compat: ia64: noarch
 
+buildarch_compat: aarch64: noarch
+
+
+buildarch_compat: riscv: noarch
+buildarch_compat: riscv64: noarch
+
 buildarch_compat: athlon: i686
 buildarch_compat: geode: i586
 buildarch_compat: pentium4: pentium3
@@ -483,23 +573,36 @@ buildarch_compat: ppciseries: noarch
 buildarch_compat: ppcpseries: noarch
 buildarch_compat: ppc: noarch fat
 buildarch_compat: ppc64: noarch fat
+buildarch_compat: ppc64le: noarch fat
 buildarch_compat: ppc64pseries: ppc64
 buildarch_compat: ppc64iseries: ppc64
 buildarch_compat: ppc64p7: ppc64
 
 buildarch_compat: mips: noarch
 buildarch_compat: mipsel: noarch
+buildarch_compat: mips64: noarch
+buildarch_compat: mips64el: noarch
+
+buildarch_compat: mipsr6: noarch
+buildarch_compat: mipsr6el: noarch
+buildarch_compat: mips64r6: noarch
+buildarch_compat: mips64r6el: noarch
 
 buildarch_compat: armv4b: noarch
 buildarch_compat: armv7hl: armv7l
 buildarch_compat: armv7l: armv6l
 buildarch_compat: armv6l: armv5tejl
-buildarch_compat: armv5tejl: armv5tel
-buildarch_compat: armv5tel: armv4tl
+buildarch_compat: armv5tejl: armv5tel armv5tl
+buildarch_compat: armv5tel: armv4tl armv5tl
+buildarch_compat: armv5tl: armv4tl
 buildarch_compat: armv4tl: armv4l
 buildarch_compat: armv4l: armv3l
 buildarch_compat: armv3l: noarch
 
+buildarch_compat: armv7hnl: armv7hl
+buildarch_compat: armv7hl: armv6hl
+buildarch_compat: armv6hl: noarch
+
 buildarch_compat: hppa2.0: hppa1.2
 buildarch_compat: hppa1.2: hppa1.1
 buildarch_compat: hppa1.1: hppa1.0
index e29864e0b67e97e345af9c8d271044ae23af3b9d..ae86f666df4d1bede4e4c68288c5bd6b2923a98e 100644 (file)
--- a/rpmsign.c
+++ b/rpmsign.c
@@ -1,6 +1,7 @@
 #include "system.h"
 #include <errno.h>
 #include <sys/wait.h>
+#include <termios.h>
 
 #include <popt.h>
 #include <rpm/rpmcli.h>
@@ -8,17 +9,21 @@
 #include "cliutils.h"
 #include "debug.h"
 
-#if !defined(__GLIBC__) && !defined(__APPLE__)
-char ** environ = NULL;
-#endif
-
 enum modes {
+    MODE_NONE    = 0,
     MODE_ADDSIGN = (1 << 0),
     MODE_RESIGN  = (1 << 1),
     MODE_DELSIGN = (1 << 2),
 };
 
-static int mode = 0;
+static int mode = MODE_NONE;
+
+#ifdef WITH_IMAEVM
+static int signfiles = 0, fskpass = 0;
+static char * fileSigningKey = NULL;
+#endif
+
+static struct rpmSignArgs sargs = {NULL, 0, 0};
 
 static struct poptOption signOptsTable[] = {
     { "addsign", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_ADDSIGN,
@@ -27,6 +32,15 @@ static struct poptOption signOptsTable[] = {
        N_("sign package(s) (identical to --addsign)"), NULL },
     { "delsign", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_DELSIGN,
        N_("delete package signatures"), NULL },
+#ifdef WITH_IMAEVM
+    { "signfiles", '\0', POPT_ARG_NONE, &signfiles, 0,
+       N_("sign package(s) files"), NULL},
+    { "fskpath", '\0', POPT_ARG_STRING, &fileSigningKey, 0,
+       N_("use file signing key <key>"),
+       N_("<key>") },
+    { "fskpass", '\0', POPT_ARG_NONE, &fskpass, 0,
+       N_("prompt for file signing key password"), NULL},
+#endif
     POPT_TABLEEND
 };
 
@@ -41,67 +55,46 @@ static struct poptOption optionsTable[] = {
     POPT_TABLEEND
 };
 
-static int checkPassPhrase(const char * passPhrase)
+#ifdef WITH_IMAEVM
+static char *get_fskpass(void)
 {
-    int passPhrasePipe[2];
-    int pid, status;
-    int rc;
-    int xx;
-
-    if (passPhrase == NULL)
-       return -1;
-
-    passPhrasePipe[0] = passPhrasePipe[1] = 0;
-    xx = pipe(passPhrasePipe);
-    if (!(pid = fork())) {
-       char * cmd, * gpg_path;
-       char *const *av;
-       int fdno;
-
-       xx = close(STDIN_FILENO);
-       xx = close(STDOUT_FILENO);
-       xx = close(passPhrasePipe[1]);
-       if ((fdno = open("/dev/null", O_RDONLY)) != STDIN_FILENO) {
-           xx = dup2(fdno, STDIN_FILENO);
-           xx = close(fdno);
-       }
-       if ((fdno = open("/dev/null", O_WRONLY)) != STDOUT_FILENO) {
-           xx = dup2(fdno, STDOUT_FILENO);
-           xx = close(fdno);
-       }
-       xx = dup2(passPhrasePipe[0], 3);
-
-       unsetenv("MALLOC_CHECK_");
-       gpg_path = rpmExpand("%{?_gpg_path}", NULL);
-
-       if (!rstreq(gpg_path, ""))
-           setenv("GNUPGHOME", gpg_path, 1);
-       
-       cmd = rpmExpand("%{?__gpg_check_password_cmd}", NULL);
-       rc = poptParseArgvString(cmd, NULL, (const char ***)&av);
-       if (!rc)
-           rc = execve(av[0], av+1, environ);
-
-       fprintf(stderr, _("Could not exec %s: %s\n"), "gpg",
-                   strerror(errno));
-       _exit(EXIT_FAILURE);
+    struct termios flags, tmp_flags;
+    int passlen = 64;
+    char *password = xmalloc(passlen);
+    char *pwd = NULL;
+
+    tcgetattr(fileno(stdin), &flags);
+    tmp_flags = flags;
+    tmp_flags.c_lflag &= ~ECHO;
+    tmp_flags.c_lflag |= ECHONL;
+
+    if (tcsetattr(fileno(stdin), TCSANOW, &tmp_flags) != 0) {
+       perror("tcsetattr");
+       goto exit;
     }
 
-    xx = close(passPhrasePipe[0]);
-    xx = write(passPhrasePipe[1], passPhrase, strlen(passPhrase));
-    xx = write(passPhrasePipe[1], "\n", 1);
-    xx = close(passPhrasePipe[1]);
+    printf("PEM password: ");
+    pwd = fgets(password, passlen, stdin);
 
-    (void) waitpid(pid, &status, 0);
+    if (tcsetattr(fileno(stdin), TCSANOW, &flags) != 0) {
+       perror("tcsetattr");
+       pwd = NULL;
+       goto exit;
+    }
 
-    return ((WIFEXITED(status) && WEXITSTATUS(status) == 0)) ? 0 : 1;
+exit:
+    if (pwd)
+       pwd[strlen(pwd) - 1] = '\0';  /* remove newline */
+    else
+       free(password);
+    return pwd;
 }
+#endif
 
 /* TODO: permit overriding macro setup on the command line */
-static int doSign(poptContext optCon)
+static int doSign(poptContext optCon, struct rpmSignArgs *sargs)
 {
     int rc = EXIT_FAILURE;
-    char * passPhrase = NULL;
     char * name = rpmExpand("%{?_gpg_name}", NULL);
 
     if (rstreq(name, "")) {
@@ -109,22 +102,42 @@ static int doSign(poptContext optCon)
        goto exit;
     }
 
-    /* XXX FIXME: eliminate obsolete getpass() usage */
-    passPhrase = getpass(_("Enter pass phrase: "));
-    passPhrase = (passPhrase != NULL) ? rstrdup(passPhrase) : NULL;
-    if (checkPassPhrase(passPhrase) == 0) {
-       const char *arg;
-       fprintf(stderr, _("Pass phrase is good.\n"));
-       rc = 0;
-       while ((arg = poptGetArg(optCon)) != NULL) {
-           rc += rpmPkgSign(arg, NULL, passPhrase);
+#ifdef WITH_IMAEVM
+    if (fileSigningKey) {
+       rpmPushMacro(NULL, "_file_signing_key", NULL, fileSigningKey, RMIL_GLOBAL);
+    }
+
+    if (signfiles) {
+       char *fileSigningKeyPassword = NULL;
+       char *key = rpmExpand("%{?_file_signing_key}", NULL);
+       if (rstreq(key, "")) {
+           fprintf(stderr, _("You must set \"%%_file_signing_key\" in your macro file or on the command line with --fskpath\n"));
+           goto exit;
        }
-    } else {
-       fprintf(stderr, _("Pass phrase check failed or gpg key expired\n"));
+
+       if (fskpass) {
+           fileSigningKeyPassword = get_fskpass();
+       }
+
+       if (fileSigningKeyPassword) {
+           rpmPushMacro(NULL, "_file_signing_key_password", NULL,
+                       fileSigningKeyPassword, RMIL_CMDLINE);
+           memset(fileSigningKeyPassword, 0, strlen(fileSigningKeyPassword));
+           free(fileSigningKeyPassword);
+       }
+
+       sargs->signfiles = 1;
+       free(key);
+    }
+#endif
+
+    const char *arg;
+    rc = 0;
+    while ((arg = poptGetArg(optCon)) != NULL) {
+       rc += rpmPkgSign(arg, sargs);
     }
 
 exit:
-    free(passPhrase);
     free(name);
     return rc;
 }
@@ -132,9 +145,13 @@ exit:
 int main(int argc, char *argv[])
 {
     int ec = EXIT_FAILURE;
-    poptContext optCon = rpmcliInit(argc, argv, optionsTable);
+    poptContext optCon = NULL;
     const char *arg;
     
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
+
+    optCon = rpmcliInit(argc, argv, optionsTable);
+
     if (argc <= 1) {
        printUsage(optCon, stderr, 0);
        goto exit;
@@ -144,17 +161,26 @@ int main(int argc, char *argv[])
        argerror(_("no arguments given"));
     }
 
+#ifdef WITH_IMAEVM
+    if (fileSigningKey && !signfiles) {
+       argerror(_("--fskpath may only be specified when signing files"));
+    }
+#endif
+
     switch (mode) {
     case MODE_ADDSIGN:
     case MODE_RESIGN:
-       ec = doSign(optCon);
+       ec = doSign(optCon, &sargs);
        break;
     case MODE_DELSIGN:
        ec = 0;
        while ((arg = poptGetArg(optCon)) != NULL) {
-           ec += rpmPkgDelSign(arg);
+           ec += rpmPkgDelSign(arg, &sargs);
        }
        break;
+    case MODE_NONE:
+       printUsage(optCon, stderr, 0);
+       break;
     default:
        argerror(_("only one major mode may be specified"));
        break;
index 2027ffabf179e378ff535fe84b2ffd4760a81a2c..86e3285adde9e1c1a5333d6d939826c505a97b03 100644 (file)
--- a/rpmspec.c
+++ b/rpmspec.c
@@ -1,5 +1,4 @@
 #include "system.h"
-const char *__progname;
 
 #include <rpm/rpmcli.h>
 #include <rpm/rpmbuild.h>
@@ -28,10 +27,10 @@ static struct poptOption specOptsTable[] = {
        N_("query spec file(s)"), NULL },
     { "rpms", 0, POPT_ARG_VAL, &source, RPMQV_SPECRPMS,
        N_("operate on binary rpms generated by spec (default)"), NULL },
+    { "builtrpms", 0, POPT_ARG_VAL, &source, RPMQV_SPECBUILTRPMS,
+       N_("operate on binary rpms that would be built from spec"), NULL },
     { "srpm", 0, POPT_ARG_VAL, &source, RPMQV_SPECSRPM,
        N_("operate on source rpm generated by spec"), NULL },
-    { "target", 0, POPT_ARG_STRING, &target, 0,
-       N_("override target platform"), NULL },
     { "queryformat", 0, POPT_ARG_STRING, &queryformat, 0,
        N_("use the following query format"), "QUERYFORMAT" },
     { "qf", 0, (POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN), &queryformat, 0,
@@ -60,6 +59,8 @@ int main(int argc, char *argv[])
     poptContext optCon;
     int ec = 0;
 
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
+
     optCon = rpmcliInit(argc, argv, optionsTable);
 
     if (rpmcliPipeOutput && initPipe())
index 39bdb37a618ce87e5b4e592c314099dbbd24f4fe..d0949c55efa16a070c916396d659f13c0dd42019 100644 (file)
@@ -1,6 +1,7 @@
 # Makefile for rpm scripts.
 
 include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
 
 CLEANFILES =
 
@@ -10,16 +11,20 @@ EXTRA_DIST = \
        brp-strip-shared brp-strip-static-archive \
        check-files check-prereqs \
        check-buildroot check-rpaths check-rpaths-worker \
+       debuginfo.prov \
        find-debuginfo.sh find-lang.sh \
-       perldeps.pl perl.prov perl.req pythondeps.sh osgideps.pl \
+       perl.prov perl.req pythondeps.sh pythondistdeps.py \
+       python-macro-helper \
        rpmdb_loadcvt rpm.daily rpm.log rpm.supp rpm2cpio.sh \
-       tcl.req tgpg vpkg-provides.sh \
+       tgpg vpkg-provides.sh \
+       find-requires find-provides \
        find-requires.php find-provides.php \
-       find-php-provides find-php-requires \
+       find-requires.ksyms find-provides.ksyms \
        mono-find-requires mono-find-provides \
        ocaml-find-requires.sh ocaml-find-provides.sh \
-       pkgconfigdeps.sh libtooldeps.sh \
+       pkgconfigdeps.sh libtooldeps.sh metainfo.prov \
        fontconfig.prov desktop-file.prov script.req \
+       sysvinitdeps.sh \
        macros.perl macros.php macros.python
 
 rpmconfig_SCRIPTS = \
@@ -29,13 +34,18 @@ rpmconfig_SCRIPTS = \
        brp-strip-shared brp-strip-static-archive \
        check-files check-prereqs \
        check-buildroot check-rpaths check-rpaths-worker \
-       find-lang.sh \
-       perl.prov perl.req perldeps.pl pythondeps.sh osgideps.pl \
+       debuginfo.prov \
+       find-lang.sh find-requires find-provides \
+       perl.prov perl.req pythondeps.sh pythondistdeps.py \
+       python-macro-helper \
+       find-requires.ksyms find-provides.ksyms \
+       metainfo.prov \
        mono-find-requires mono-find-provides \
        pkgconfigdeps.sh libtooldeps.sh \
        ocaml-find-requires.sh ocaml-find-provides.sh \
        fontconfig.prov desktop-file.prov script.req \
-       rpmdb_loadcvt rpm2cpio.sh tcl.req tgpg 
+       sysvinitdeps.sh \
+       rpmdb_loadcvt rpm2cpio.sh tgpg 
 
 rpmconfig_DATA = \
        rpm.daily rpm.log rpm.supp \
index 247779e3cd736770cd763a8df7cb4dda1e98a938..e6b69a9e424d5d7f841e92052a8ee2c09e00b251 100755 (executable)
@@ -8,13 +8,13 @@ fi
 cd "$RPM_BUILD_ROOT"
 
 # Compress man pages
-COMPRESS="gzip -9 -n"
-COMPRESS_EXT=.gz
+COMPRESS=${COMPRESS:-gzip -9 -n}
+COMPRESS_EXT=${COMPRESS_EXT:-.gz}
 
 for d in ./usr/man/man* ./usr/man/*/man* ./usr/info \
        ./usr/share/man/man* ./usr/share/man/*/man* ./usr/share/info \
        ./usr/kerberos/man ./usr/X11R6/man/man* ./usr/lib/perl5/man/man* \
-       ./usr/share/doc/*/man/man* ./usr/lib/*/man/man*
+       ./usr/share/doc/*/man/man* ./usr/lib/*/man/man* ./usr/share/fish/man/man*
 do
     [ -d $d ] || continue
     for f in `find $d -type f ! -name dir`
index 333ef94823b7f2813890cb37dbbe2b5a2ad57674..894fa3459e459e84547896a30f2025a282286e6e 100644 (file)
@@ -6,12 +6,6 @@ if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then
        exit 0
 fi
 
-# If we don't have a python interpreter, avoid changing anything.
-default_python=${1:-/usr/bin/python}
-if [ ! -x "$default_python" ]; then
-       exit 0
-fi
-
 # Figure out how deep we need to descend.  We could pick an insanely high
 # number and hope it's enough, but somewhere, somebody's sure to run into it.
 depth=`(find "$RPM_BUILD_ROOT" -type f -name "*.py" -print0 ; echo /) | \
@@ -20,35 +14,64 @@ if [ -z "$depth" -o "$depth" -le "1" ]; then
        exit 0
 fi
 
+function python_bytecompile()
+{
+    local options=$1
+    local python_binary=$2
+    local exclude=$3
+    local python_libdir=$4
+    local depth=$5
+    local real_libdir=$6
+
+cat << EOF | $python_binary $options
+import compileall, sys, os, re
+
+python_libdir = "$python_libdir"
+depth = $depth
+real_libdir = "$real_libdir"
+build_root = "$RPM_BUILD_ROOT"
+exclude = r"$exclude"
+
+class Filter:
+    def search(self, path):
+        ret = not os.path.realpath(path).startswith(build_root)
+        if exclude:
+            ret = ret or re.search(exclude, path)
+        return ret
+
+sys.exit(not compileall.compile_dir(python_libdir, depth, real_libdir, force=1, rx=Filter(), quiet=1))
+EOF
+}
+
 # .pyc/.pyo files embed a "magic" value, identifying the ABI version of Python
 # bytecode that they are for.
 #
-# The files below RPM_BUILD_ROOT could be targetting multiple versions of
+# The files below RPM_BUILD_ROOT could be targeting multiple versions of
 # python (e.g. a single build that emits several subpackages e.g. a
 # python26-foo subpackage, a python31-foo subpackage etc)
 #
 # Support this by assuming that below each /usr/lib/python$VERSION/, all
 # .pyc/.pyo files are to be compiled for /usr/bin/python$VERSION.
 # 
-# For example, below /usr/lib/python2.6/, we're targetting /usr/bin/python2.6
-# and below /usr/lib/python3.1/, we're targetting /usr/bin/python3.1
+# For example, below /usr/lib/python2.6/, we're targeting /usr/bin/python2.6
+# and below /usr/lib/python3.1/, we're targeting /usr/bin/python3.1
 
 shopt -s nullglob
-for python_libdir in "$RPM_BUILD_ROOT"/usr/lib{,64}/python[0-9].[0-9]/ ;
+for python_libdir in `find "$RPM_BUILD_ROOT" -type d|grep -E "/usr/lib(64)?/python[0-9]\.[0-9]$"`;
 do
        python_binary=/usr/bin/$(basename $python_libdir)
        real_libdir=${python_libdir/$RPM_BUILD_ROOT/}
        echo "Bytecompiling .py files below $python_libdir using $python_binary"
 
        # Generate normal (.pyc) byte-compiled files.
-       $python_binary -c 'import compileall, sys; sys.exit(not compileall.compile_dir("'"$python_libdir"'", '"$depth"', "'"$real_libdir"'", force=1, quiet=1))'
+       python_bytecompile "" "$python_binary" "" "$python_libdir" "$depth" "$real_libdir"
        if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then
                # One or more of the files had a syntax error
                exit 1
        fi
 
        # Generate optimized (.pyo) byte-compiled files.
-       $python_binary -O -c 'import compileall, sys; sys.exit(not compileall.compile_dir("'"$python_libdir"'", '"$depth"', "'"$real_libdir"'", force=1, quiet=1))'
+       python_bytecompile "-O" "$python_binary" "" "$python_libdir" "$depth" "$real_libdir"
        if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then
                # One or more of the files had a syntax error
                exit 1
@@ -57,17 +80,22 @@ done
 
 
 # Handle other locations in the filesystem using the default python
-# implementation:
+# implementation - if we  have a default python interpreter
+
+default_python=${1:-/usr/bin/python}
+if [ ! -x "$default_python" ]; then
+       exit 0
+fi
 
 # Generate normal (.pyc) byte-compiled files.
-$default_python -c 'import compileall, re, sys; sys.exit (not compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]"'"), quiet=1))'
+python_bytecompile "" $default_python "/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]|/usr/share/doc" "$RPM_BUILD_ROOT" "$depth" "/"
 if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then
        # One or more of the files had a syntax error
        exit 1
 fi
 
 # Generate optimized (.pyo) byte-compiled files.
-$default_python -O -c 'import compileall, re, sys; sys.exit(not compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]"'"), quiet=1))' > /dev/null
+python_bytecompile "-O" $default_python "/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]|/usr/share/doc" "$RPM_BUILD_ROOT" "$depth" "/"
 if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then
        # One or more of the files had a syntax error
        exit 1
index f8871998292436de96be20e96cc26dcccd37119d..949c9c32d26765de634512bab9987d7095e78486 100755 (executable)
@@ -5,15 +5,21 @@ if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then
        exit 0
 fi
 
-# Hardlink identical *.pyc and *.pyo, originally from PLD's rpm-build-macros
-# Modified to use sha1sum instead of cmp to avoid a diffutils dependency.
-find "$RPM_BUILD_ROOT" -type f -name "*.pyc" | while read pyc ; do
-       pyo="${pyc%c}o"
-       if [ -f "$pyo" ] ; then
-               csha="$(sha1sum -b "$pyc" | cut -d' ' -f 1)" && \
-               osha="$(sha1sum -b "$pyo" | cut -d' ' -f 1)" && \
-               if [ "$csha" = "$osha" ] ; then
-                       ln -f "$pyc" "$pyo"
-               fi
-       fi
+hardlink_if_same() {
+       if cmp -s "$1" "$2" ; then
+               ln -f "$1" "$2"
+               return 0
+       fi
+       return 1
+}
+
+# Hardlink identical *.pyc, *.pyo, and *.opt-[12].pyc.
+# Originally from PLD's rpm-build-macros
+find "$RPM_BUILD_ROOT" -type f -name "*.pyc" -not -name "*.opt-[12].pyc" | while read pyc ; do
+       hardlink_if_same "$pyc" "${pyc%c}o"
+       o1pyc="${pyc%pyc}opt-1.pyc"
+       hardlink_if_same "$pyc" "$o1pyc"
+       o2pyc="${pyc%pyc}opt-2.pyc"
+       hardlink_if_same "$pyc" "$o2pyc" || hardlink_if_same "$o1pyc" "$o2pyc"
 done
+exit 0
index 20e7c508f17b13a44a46fc94add619823b1bfc2e..e2fdc8d0f11ba0caa27ed7bce913343445433664 100755 (executable)
@@ -16,6 +16,6 @@ for f in `find "$RPM_BUILD_ROOT" -type f \( -perm -0100 -or -perm -0010 -or -per
         grep -v "^${RPM_BUILD_ROOT}/\?usr/lib/debug"  | \
        grep -v ' shared object,' | \
        grep -v '/lib/modules/' | \
-       sed -n -e 's/^\(.*\):[  ]*ELF.*, not stripped/\1/p'`; do
+       sed -n -e 's/^\(.*\):[  ]*ELF.*, not stripped.*/\1/p'`; do
        $STRIP -g "$f" || :
 done
index e06ee4bf4039a91d84baa022dba59ceca6ce4923..51d10d5b3d3147d8e81d2ea3429620d1bd1e812a 100644 (file)
@@ -20,6 +20,6 @@ esac
 for f in `find "$RPM_BUILD_ROOT" -type f -a -exec file {} \; | \
         grep -v "^${RPM_BUILD_ROOT}/\?usr/lib/debug"  | \
        grep ' shared object,' | \
-       sed -n -e 's/^\(.*\):[  ]*ELF.*, not stripped/\1/p'`; do
+       sed -n -e 's/^\(.*\):[  ]*ELF.*, not stripped.*/\1/p'`; do
        $STRIP --strip-unneeded "$f"
 done
index eb2f478dbaeb77f7d2be062bb93c3e66e79a32c8..a9eeaed90e7a7f8b9b625c174cb9dde694d5e383 100755 (executable)
@@ -6,26 +6,27 @@
 #
 # filon@pld.org.pl
 
-RPM_BUILD_ROOT=$1
+# Get build root
+RPM_BUILD_ROOT="${1}"
 
-if [ ! -d "$RPM_BUILD_ROOT" ] ; then
+# Handle the case where ${RPM_BUILD_ROOT} is undefined, not a directory, etc.
+if [ ! -d "${RPM_BUILD_ROOT}" ] ; then
        cat > /dev/null
+       if [ -e "${RPM_BUILD_ROOT}" ] ; then
+               echo "Error: \`${RPM_BUILD_ROOT}' is not a directory" 1>&2
+       fi
        exit 1
 fi
 
-[ "$TMPDIR" ] || TMPDIR=/tmp
-FILES_DISK=`mktemp $TMPDIR/rpmXXXXXX`
-FILES_RPM=`mktemp $TMPDIR/rpmXXXXXX`
-
-find "$RPM_BUILD_ROOT" -type f -o -type l | LC_ALL=C sort > $FILES_DISK
-LC_ALL=C sort > $FILES_RPM
+# Create temporary file listing files in the manifest
+[ -n "$TMPDIR" ] || TMPDIR="/tmp"
+FILES_DISK=`mktemp "${TMPDIR}/rpmXXXXXX"`
 
-diff -d "$FILES_DISK" "$FILES_RPM" | grep "^< " | cut -c3- | 
-while read f; do
-       if test "$RPM_BUILD_ROOT/usr/share/info/dir" != "$f" ; then
-               echo $f | sed -e "s#^$RPM_BUILD_ROOT#   #g"
-       fi
-done
+# Ensure temporary file is cleaned up when we exit
+trap "rm -f \"${FILES_DISK}\"" 0 2 3 5 10 13 15
 
-rm -f $FILES_DISK
-rm -f $FILES_RPM
+# Find non-directory files in the build root and compare to the manifest.
+# TODO: regex chars in last sed(1) expression should be escaped
+# Exclude /usr/share/info/dir from check-files.
+find "${RPM_BUILD_ROOT}" -type f -o -type l | LC_ALL=C sort > "${FILES_DISK}"
+LC_ALL=C sort | diff -d "${FILES_DISK}" - | sed -n -e 's|^< '"${RPM_BUILD_ROOT}"'/usr/share/info/dir$||' -e 's|^< '"${RPM_BUILD_ROOT}"'\(.*\)$|   \1|gp'
index 7ea4fb48a5cca1e9d61a279f0a4644ad25fb4aa1..7ea8643fef091b8976bee26a5e54beeb6d547250 100755 (executable)
@@ -59,7 +59,7 @@ function showHint()
 *
 * Examples:
 * - to ignore standard and empty RPATHs, execute 'rpmbuild' like
-*   \$ QA_RPATHS=\$[ 0x0001|0x0010 ] rpmbuild my-package.src.rpm
+*   \$ QA_RPATHS=\$(( 0x0001|0x0010 )) rpmbuild my-package.src.rpm
 * - to check existing files, set \$RPM_BUILD_ROOT and execute check-rpaths like
 *   \$ RPM_BUILD_ROOT=<top-dir> /usr/lib/rpm/check-rpaths
 *  
old mode 100644 (file)
new mode 100755 (executable)
index 4d99257..a8636c9
@@ -1,12 +1,14 @@
 #!/bin/sh
 
-while read instfile ; do
-    case $instfile in
-       */usr/lib/debug/.build-id/*.debug)
-           if [ -f "$instfile" ] ; then
-               BUILDID=$(echo $instfile | sed -ne 's|.*/usr/lib/debug/.build-id/\([0-9a-f]*\)/\([0-9a-f]*\)\.debug|\1\2|p')
-               echo "debuginfo(build-id) = $BUILDID"
-           fi
-           ;;
-    esac
+while read instfile; do
+  case "$instfile" in
+    */usr/lib/debug/.build-id/*.debug)
+      if [ -f "$instfile" ]; then
+        BUILDID=$(echo "$instfile" | sed -ne 's|.*/usr/lib/debug/.build-id/\([0-9a-f]\+\)/\([0-9a-f]\+\)\.debug|\1\2|p')
+        if [ -n "$BUILDID" ]; then
+          echo "debuginfo(build-id) = $BUILDID"
+        fi
+      fi
+      ;;
+  esac
 done
index 5b159ae9a3232462e7e25dceb4d04638d45d64b1..54b72801a3a1a3f3c5c7ce36096423d899782b21 100755 (executable)
@@ -11,6 +11,8 @@ while read instfile ; do
        *.desktop)
                if ! grep -q '^Type=Application$' "$instfile"; then continue; fi
                if ! grep -q '^Exec=' "$instfile"; then continue; fi
+               echo "application()"
+               echo "application(${instfile##*/applications/})"
                mime=`grep '^MimeType=' "$instfile" | cut -d'=' -f2`
                IFS=';'
                for type in $mime ; do
old mode 100644 (file)
new mode 100755 (executable)
index c73f06b..51bc61a
@@ -2,15 +2,34 @@
 #find-debuginfo.sh - automagically generate debug info and file list
 #for inclusion in an rpm spec file.
 #
-# Usage: find-debuginfo.sh [--strict-build-id] [-g] [-r]
+# Usage: find-debuginfo.sh [--strict-build-id] [--strip-disable] [--strip-option] [-g] [-r] [-m] [-i] [-n]
+#                         [--keep-section SECTION] [--remove-section SECTION]
+#                         [-j N]
 #                         [-o debugfiles.list]
+#                         [-S debugsourcefiles.list]
+#                         [--run-dwz] [--dwz-low-mem-die-limit N]
+#                         [--dwz-max-die-limit N]
+#                         [--build-id-seed SEED]
+#                         [--unique-debug-suffix SUFFIX]
+#                         [--unique-debug-src-base BASE]
 #                         [[-l filelist]... [-p 'pattern'] -o debuginfo.list]
 #                         [builddir]
 #
-# The -g flag says to use strip -g instead of full strip on DSOs.
+# The -g flag says to use strip -g instead of full strip on DSOs or EXEs.
+# The -r flag says to use eu-strip --reloc-debug-sections.
+# Use --keep-section SECTION or --remove-section SECTION to explicitly
+# keep a (non-allocated) section in the main executable or explicitly
+# remove it into the .debug file. SECTION is an extended wildcard pattern.
+# Both options can be given more than once.
+#
 # The --strict-build-id flag says to exit with failure status if
 # any ELF binary processed fails to contain a build-id note.
-# The -r flag says to use eu-strip --reloc-debug-sections.
+# The -m flag says to include a .gnu_debugdata section in the main binary.
+# The -i flag says to include a .gdb_index section in the .debug file.
+# The -n flag says to not recompute the build-id.
+#
+# The -j N option will spawn N processes to do the debuginfo extraction
+# in parallel.
 #
 # A single -o switch before any -l or -p switches simply renames
 # the primary output file from debugfiles.list to something else.
 # The -p argument is an grep -E -style regexp matching the a file name,
 # and must not use anchors (^ or $).
 #
+# The --run-dwz flag instructs find-debuginfo.sh to run the dwz utility
+# if available, and --dwz-low-mem-die-limit and --dwz-max-die-limit
+# provide detailed limits.  See dwz(1) -l and -L option for details.
+#
+# If --build-id-seed SEED is given then debugedit is called to
+# update the build-ids it finds adding the SEED as seed to recalculate
+# the build-id hash.  This makes sure the build-ids in the ELF files
+# are unique between versions and releases of the same package.
+# (Use --build-id-seed "%{VERSION}-%{RELEASE}".)
+#
+# If --unique-debug-suffix SUFFIX is given then the debug files created
+# for <FILE> will be named <FILE>-<SUFFIX>.debug.  This makes sure .debug
+# are unique between package version, release and architecture.
+# (Use --unique-debug-suffix "-%{VERSION}-%{RELEASE}.%{_arch}".)
+#
+# If --unique-debug-src-base BASE is given then the source directory
+# will be called /usr/debug/src/<BASE>.  This makes sure the debug source
+# directories are unique between package version, release and architecture.
+# (Use --unique-debug-src-base "%{name}-%{VERSION}-%{RELEASE}.%{_arch}".)
+#
 # All file names in switches are relative to builddir (. if not given).
 #
 
-# With -g arg, pass it to strip on libraries.
+# Figure out where we are installed so we can call other helper scripts.
+lib_rpm_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+# With -g arg, pass it to strip on libraries or executables.
 strip_g=false
 
 # with -r arg, pass --reloc-debug-sections to eu-strip.
 strip_r=false
 
+# keep or remove arguments to eu-strip.
+keep_remove_args=
+
+# with -m arg, add minimal debuginfo to binary.
+include_minidebug=false
+
+# with -i arg, add GDB index to .debug file.
+include_gdb_index=false
+
 # Barf on missing build IDs.
 strict=false
 
+# With --strip-disable arg, no strip
+strip_disable=false
+
+# With --strip-option arg, this will be used as arg. of eu-strip
+strip_option=
+
+# With --strip-option arg for ko file, this will be used as arg. of eu-strip
+strip_ko_option=
+
+# Do not recompute build IDs.
+no_recompute_build_id=false
+
+# DWZ parameters.
+run_dwz=false
+dwz_low_mem_die_limit=
+dwz_max_die_limit=
+
+# build id seed given by the --build-id-seed option
+build_id_seed=
+
+# Arch given by --unique-debug-arch
+unique_debug_suffix=
+
+# Base given by --unique-debug-src-base
+unique_debug_src_base=
+
+# Number of parallel jobs to spawn
+n_jobs=1
+
 BUILDDIR=.
 out=debugfiles.list
+srcout=
 nout=0
 while [ $# -gt 0 ]; do
   case "$1" in
   --strict-build-id)
     strict=true
     ;;
+  --run-dwz)
+    run_dwz=true
+    ;;
+  --dwz-low-mem-die-limit)
+    dwz_low_mem_die_limit=$2
+    shift
+    ;;
+  --dwz-max-die-limit)
+    dwz_max_die_limit=$2
+    shift
+    ;;
+  --build-id-seed)
+    build_id_seed=$2
+    shift
+    ;;
+  --unique-debug-suffix)
+    unique_debug_suffix=$2
+    shift
+    ;;
+  --unique-debug-src-base)
+    unique_debug_src_base=$2
+    shift
+    ;;
+  --strip-disable)
+    strip_disable=true
+    ;;
+  *--strip-option*)
+    strip_option=$(echo $1 | sed 's/--strip-option=//')
+    ;;
+  *--strip-ko-option*)
+    strip_ko_option=$(echo $1 | sed 's/--strip-ko-option=//')
+   ;;
   -g)
     strip_g=true
     ;;
+  -m)
+    include_minidebug=true
+    ;;
+  -n)
+    no_recompute_build_id=true
+    ;;
+  -i)
+    include_gdb_index=true
+    ;;
   -o)
     if [ -z "${lists[$nout]}" -a -z "${ptns[$nout]}" ]; then
       out=$2
@@ -63,6 +185,29 @@ while [ $# -gt 0 ]; do
   -r)
     strip_r=true
     ;;
+  --keep-section)
+    keep_remove_args="${keep_remove_args} --keep-section $2"
+    shift
+    ;;
+  --remove-section)
+    keep_remove_args="${keep_remove_args} --remove-section $2"
+    shift
+    ;;
+  -j)
+    n_jobs=$2
+    shift
+    ;;
+  -j*)
+    n_jobs=${1#-j}
+    ;;
+  --jobs)
+    n_jobs=$2
+    shift
+    ;;
+  -S)
+    srcout=$2
+    shift
+    ;;
   *)
     BUILDDIR=$1
     shift
@@ -72,6 +217,11 @@ while [ $# -gt 0 ]; do
   shift
 done
 
+if test -n "$build_id_seed" -a "$no_recompute_build_id" = "true"; then
+  echo >&2 "*** ERROR: --build-id-seed (unique build-ids) and -n (do not recompute build-id) cannot be used together"
+  exit 2
+fi
+
 i=0
 while ((i < nout)); do
   outs[$i]="$BUILDDIR/${outs[$i]}"
@@ -86,30 +236,93 @@ done
 LISTFILE="$BUILDDIR/$out"
 SOURCEFILE="$BUILDDIR/debugsources.list"
 LINKSFILE="$BUILDDIR/debuglinks.list"
+ELFBINSFILE="$BUILDDIR/elfbins.list"
 
 > "$SOURCEFILE"
 > "$LISTFILE"
 > "$LINKSFILE"
+> "$ELFBINSFILE"
 
 debugdir="${RPM_BUILD_ROOT}/usr/lib/debug"
 
 strip_to_debug()
 {
+  local g=
   local r=
+
+
+  if test "$strip_disable" = true ; then
+      exit
+  fi
+
   $strip_r && r=--reloc-debug-sections
+  $strip_g && case "$(file -bi "$2")" in
+  application/x-sharedlib*) g=-g ;;
+  application/x-executable*) g=-g ;;
+  esac
+
   case $2 in
       *.ko)
-         # don't attempt to create a minimal backtrace binary for
-         # kernel modules as this just causes the stripping process
-         # to be skipped entirely
-         eu-strip --remove-comment $r -f "$1" "$2" || exit
-         ;;
+          # don't attempt to create a minimal backtrace binary for
+          # kernel modules as this just causes the stripping process
+          # to be skipped entirely
+          eu-strip --remove-comment $r $strip_ko_option -f "$1" "$2" || exit
+          ;;
       *)
-         eu-strip --remove-comment -g -f "$1" "$2" || exit
+          # Support an alternative way to choose between strip (binutils) and
+          # eu-strip (elfutils) to handle a large shared object (e.g. chromium)
+          if [ "$STRIP_DEFAULT_PACKAGE" != "binutils" ]; then
+              eu-strip --remove-comment $g $strip_option -f "$1" "$2" || exit
+          else
+              cp "$2" "$1"
+              strip --remove-section=.comment $g $strip_option "$2" || exit
+              objcopy --add-gnu-debuglink="$1" "$2" || exit
+          fi
   esac
   chmod 444 "$1" || exit
 }
 
+add_minidebug()
+{
+  local debuginfo="$1"
+  local binary="$2"
+
+  local dynsyms=`mktemp`
+  local funcsyms=`mktemp`
+  local keep_symbols=`mktemp`
+  local mini_debuginfo=`mktemp`
+
+  # In the minisymtab we don't need the .debug_ sections (already removed
+  # by -S) but also not other non-allocated PROGBITS, NOTE or NOBITS sections.
+  # List and remove them explicitly. We do want to keep the allocated,
+  # symbol and NOBITS sections so cannot use --keep-only because that is
+  # too aggressive. Field $2 is the section name, $3 is the section type
+  # and $8 are the section flags.
+  local remove_sections=`readelf -W -S "$debuginfo" \
+       | awk '{ if (index($2,".debug_") != 1 \
+                    && ($3 == "PROGBITS" || $3 == "NOTE" || $3 == "NOBITS") \
+                    && index($8,"A") == 0) \
+                  printf "--remove-section "$2" " }'`
+
+  # Extract the dynamic symbols from the main binary, there is no need to also have these
+  # in the normal symbol table
+  nm -D "$binary" --format=posix --defined-only | awk '{ print $1 }' | sort > "$dynsyms"
+  # Extract all the text (i.e. function) symbols from the debuginfo
+  # Use format sysv to make sure we can match against the actual ELF FUNC
+  # symbol type. The binutils nm posix format symbol type chars are
+  # ambigous for architectures that might use function descriptors.
+  nm "$debuginfo" --format=sysv --defined-only | awk -F \| '{ if ($4 ~ "FUNC") print $1 }' | sort > "$funcsyms"
+  # Keep all the function symbols not already in the dynamic symbol table
+  comm -13 "$dynsyms" "$funcsyms" > "$keep_symbols"
+  # Copy the full debuginfo, keeping only a minumal set of symbols and removing some unnecessary sections
+  objcopy -S $remove_sections --keep-symbols="$keep_symbols" "$debuginfo" "$mini_debuginfo" &> /dev/null
+  #Inject the compressed data into the .gnu_debugdata section of the original binary
+  xz "$mini_debuginfo"
+  mini_debuginfo="${mini_debuginfo}.xz"
+  objcopy --add-section .gnu_debugdata="$mini_debuginfo" "$binary"
+  rm -f "$dynsyms" "$funcsyms" "$keep_symbols" "$mini_debuginfo"
+}
+
 # Make a relative symlink to $1 called $3$2
 shopt -s extglob
 link_relative()
@@ -142,91 +355,23 @@ debug_link()
   # this should correspond to what brp-symlink is doing
   case $t in
       /usr*)
-         link_relative "$t" "$l" "$RPM_BUILD_ROOT"
-         ;;
+          link_relative "$t" "$l" "$RPM_BUILD_ROOT"
+          ;;
       *)
-         mkdir -p "$(dirname "$RPM_BUILD_ROOT$l")" && \
-             ln -snf "$t" "$RPM_BUILD_ROOT$l"
-         ;;
+          if [ ! -e $t ]; then
+              link_relative "$t" "$l" "$RPM_BUILD_ROOT"
+          else
+              mkdir -p "$(dirname "$RPM_BUILD_ROOT$l")" && \
+                  ln -snf "$t" "$RPM_BUILD_ROOT$l"
+          fi
+          ;;
   esac
 }
 
-# Provide .2, .3, ... symlinks to all filename instances of this build-id.
-make_id_dup_link()
-{
-  # See https://bugzilla.redhat.com/show_bug.cgi?id=641377 for the reasoning, 
-  # but it has seveal drawbacks as we would need to split the .1 suffixes into 
-  # different subpackages and it's about impossible to predict the number
-  # -> perhaps later
-  return
-  local id="$1" file="$2" idfile
-
-  local n=1
-  while true; do
-    idfile=".build-id/${id:0:2}/${id:2}.$n"
-    [ $# -eq 3 ] && idfile="${idfile}$3"
-    if [ ! -L "$RPM_BUILD_ROOT/usr/lib/debug/$idfile" ]; then
-      break
-    fi
-    n=$[$n+1]
-  done
-  debug_link "$file" "/$idfile"
-}
-
-# Compare two binaries but ignore the .note.gnu.build-id section
-elfcmp()
-{
-  local tmp1=$(mktemp -t ${1##*/}.XXXXXX)
-  local tmp2=$(mktemp -t ${2##*/}.XXXXXX)
-
-  objcopy -R .note.gnu.build-id -R .gnu_debuglink $1 $tmp1
-  objcopy -R .note.gnu.build-id -R .gnu_debuglink $2 $tmp2
-  cmp -s $tmp1 $tmp2
-  local res=$?
-  rm -f $tmp1 $tmp2
-  return $res
-}
-
-# Make a build-id symlink for id $1 with suffix $3 to file $2.
-make_id_link()
-{
-  local id="$1" file="$2"
-  local idfile=".build-id/${id:0:2}/${id:2}"
-  [ $# -eq 3 ] && idfile="${idfile}$3"
-  local root_idfile="$RPM_BUILD_ROOT/usr/lib/debug/$idfile"
-
-  if [ ! -L "$root_idfile" ]; then
-    debug_link "$file" "/$idfile"
-    return
-  fi
-
-  make_id_dup_link "$@"
-
-  [ $# -eq 3 ] && return 0
-
-  local other=$(readlink -m "$root_idfile")
-  other=${other#$RPM_BUILD_ROOT}
-  if cmp -s "$RPM_BUILD_ROOT$other" "$RPM_BUILD_ROOT$file" ||
-     elfcmp "$RPM_BUILD_ROOT$other" "$RPM_BUILD_ROOT$file" ; then
-    # Two copies.  Maybe one has to be setuid or something.
-    echo >&2 "*** WARNING: identical binaries are copied, not linked:"
-    echo >&2 "        $file"
-    echo >&2 "   and  $other"
-  else
-    # This is pathological, break the build.
-    echo >&2 "*** ERROR: same build ID in nonidentical files!"
-    echo >&2 "        $file"
-    echo >&2 "   and  $other"
-    exit 2
-  fi
-}
-
 get_debugfn()
 {
   dn=$(dirname "${1#$RPM_BUILD_ROOT}")
-# Do not strip existing .debug suffixes
-  bn=$(basename "$1").debug
-
+  bn=$(basename "$1")${unique_debug_suffix}.debug
   debugdn=${debugdir}${dn}
   debugfn=${debugdn}/${bn}
 }
@@ -236,61 +381,92 @@ set -o pipefail
 strict_error=ERROR
 $strict || strict_error=WARNING
 
-# Strip ELF binaries (and no static libraries)
-find $RPM_BUILD_ROOT ! -path "${debugdir}/*.debug" -type f \( -perm +111 -or -name "*.so*" -or -name "*.ko" \) ! -name "*.a" -print0 | sort -z |
+temp=$(mktemp -d ${TMPDIR:-/tmp}/find-debuginfo.XXXXXX)
+trap 'rm -rf "$temp"' EXIT
+
+# Build a list of unstripped ELF files and their hardlinks
+touch "$temp/primary"
+find "$RPM_BUILD_ROOT" ! -path "${debugdir}/*.debug" -type f \( -perm /111 -or -name "*.so*" -or -name "*.ko" \) ! -name "*.a" -print0 | sort -z |
 xargs --no-run-if-empty -0 stat -c '%h %D_%i %n' |
 while read nlinks inum f; do
   case $(objdump -h $f 2>/dev/null | egrep -o '(debug[\.a-z_]*|gnu.version)') in
     *debuglink*) continue ;;
     *debug*) ;;
     *gnu.version*)
-       echo "WARNING: "`echo $f | sed -e "s,^$RPM_BUILD_ROOT/*,/,"`" is already stripped!"
-       continue
-       ;;
+      echo "WARNING: "`echo $f | sed -e "s,^$RPM_BUILD_ROOT/*,/,"`" is already stripped!"
+      continue
+      ;;
     *) continue ;;
   esac
-  get_debugfn "$f"
-  [ -f "${debugfn}" ] && continue
-
-  # If this file has multiple links, keep track and make
-  # the corresponding .debug files all links to one file too.
+  # double check that we really have an ELF file,
+  # to handle monodevelop-debugger-gdb and monodevelop-debugger-mdb
+  ftype=`/usr/bin/file $f | cut -d: -f2-`
+  case $ftype in
+    *ELF*) ;;
+    *)
+       echo "$f is not an ELF file, skipping"
+       continue
+       ;;
+  esac
   if [ $nlinks -gt 1 ]; then
-    eval linked=\$linked_$inum
-    if [ -n "$linked" ]; then
-      eval id=\$linkedid_$inum
-      make_id_dup_link "$id" "$dn/$(basename $f)"
-      make_id_dup_link "$id" "/usr/lib/debug$dn/$bn" .debug
-      link=$debugfn
-      get_debugfn "$linked"
-      echo "hard linked $link to $debugfn"
-      mkdir -p "$(dirname "$link")" && ln -nf "$debugfn" "$link"
+    var=seen_$inum
+    if test -n "${!var}"; then
+      echo "$inum $f" >>"$temp/linked"
       continue
     else
-      eval linked_$inum=\$f
-      echo "file $f has $[$nlinks - 1] other hard links"
+      read "$var" < <(echo 1)
     fi
   fi
+  echo "$nlinks $inum $f" >>"$temp/primary"
+done
+
+# Strip ELF binaries
+do_file()
+{
+  local nlinks=$1 inum=$2 f=$3 id link linked
+
+  get_debugfn "$f"
+  [ -f "${debugfn}" ] && return
 
   echo "extracting debug info from $f"
-  id=$($(DEBUGEDIT=$(which debugedit 2>/dev/null); \
-      echo ${DEBUGEDIT:-/usr/lib/rpm/debugedit}) -b "$RPM_BUILD_DIR" \
-      -d /usr/src/debug -i -l "$SOURCEFILE" "$f") || exit
-  if [ $nlinks -gt 1 ]; then
-    eval linkedid_$inum=\$id
+  # See also cpio SOURCEFILE copy. Directories must match up.
+  debug_base_name="$RPM_BUILD_DIR"
+  debug_dest_name="/usr/src/debug"
+  if [ ! -z "$unique_debug_src_base" ]; then
+    debug_base_name="$BUILDDIR"
+    debug_dest_name="/usr/src/debug/${unique_debug_src_base}"
   fi
+  no_recompute=
+  if [ "$no_recompute_build_id" = "true" ]; then
+    no_recompute="-n"
+  fi
+  mode=$(stat -c %a "$f")
+  chmod +w "$f"
+  id=$(${lib_rpm_dir}/debugedit -b "$debug_base_name" -d "$debug_dest_name" \
+                             $no_recompute -i \
+                             ${build_id_seed:+--build-id-seed="$build_id_seed"} \
+                             -l "$SOURCEFILE" "$f") || exit
   if [ -z "$id" ]; then
     echo >&2 "*** ${strict_error}: No build ID note found in $f"
     $strict && exit 2
   fi
 
-  [ -x /usr/bin/gdb-add-index ] && /usr/bin/gdb-add-index "$f" > /dev/null 2>&1
+  # Add .gdb_index if requested.
+  if $include_gdb_index; then
+    if type gdb-add-index >/dev/null 2>&1; then
+      gdb-add-index "$f"
+    else
+      echo >&2 "*** ERROR: GDB index requested, but no gdb-add-index installed"
+      exit 2
+    fi
+  fi
 
   # A binary already copied into /usr/lib/debug doesn't get stripped,
   # just has its file names collected and adjusted.
   case "$dn" in
   /usr/lib/debug/*)
-    [ -z "$id" ] || make_id_link "$id" "$dn/$(basename $f)"
-    continue ;;
+    chmod $mode "$f"
+    return ;;
   esac
 
   mkdir -p "${debugdn}"
@@ -313,6 +489,9 @@ while read nlinks inum f; do
          if test "$NO_DEBUGINFO_STRIP_DEBUG" = true ; then
              strip_option=
          fi
+          if test "$strip_disable" = true ; then
+              strip_option=
+          fi
          objcopy --add-gnu-debuglink=$debugfn -R .comment -R .GCC.command.line $strip_option $f
          chmod $mode $f
       ) || :
@@ -326,11 +505,123 @@ while read nlinks inum f; do
       fi
   fi
 
-  if [ -n "$id" ]; then
-    make_id_link "$id" "$dn/$(basename $f)"
-    make_id_link "$id" "/usr/lib/debug$dn/$bn" .debug
+  # strip -g implies we have full symtab, don't add mini symtab in that case.
+  # It only makes sense to add a minisymtab for executables and shared
+  # libraries. Other executable ELF files (like kernel modules) don't need it.
+  if [ "$include_minidebug" = "true" -a "$strip_g" = "false" ]; then
+    skip_mini=true
+    case "$(file -bi "$f")" in
+      application/x-sharedlib*) skip_mini=false ;;
+      application/x-executable*) skip_mini=false ;;
+    esac
+    $skip_mini || add_minidebug "${debugfn}" "$f"
   fi
-done || exit
+
+  echo "./${f#$RPM_BUILD_ROOT}" >> "$ELFBINSFILE"
+
+  # If this file has multiple links, make the corresponding .debug files
+  # all links to one file too.
+  if [ $nlinks -gt 1 ]; then
+    grep "^$inum " "$temp/linked" | while read inum linked; do
+      link=$debugfn
+      get_debugfn "$linked"
+      echo "hard linked $link to $debugfn"
+      mkdir -p "$(dirname "$debugfn")" && ln -nf "$link" "$debugfn"
+    done
+  fi
+}
+
+# 16^6 - 1 or about 16 million files
+FILENUM_DIGITS=6
+run_job()
+{
+  local jobid=$1 filenum
+  local SOURCEFILE=$temp/debugsources.$jobid ELFBINSFILE=$temp/elfbins.$jobid
+
+  >"$SOURCEFILE"
+  >"$ELFBINSFILE"
+  # can't use read -n <n>, because it reads bytes one by one, allowing for
+  # races
+  while :; do
+    filenum=$(dd bs=$(( FILENUM_DIGITS + 1 )) count=1)
+    if test -z "$filenum"; then
+      break
+    fi
+    do_file $(sed -n "$(( 0x$filenum )) p" "$temp/primary")
+  done
+  echo 0 >"$temp/res.$jobid"
+}
+
+n_files=$(wc -l <"$temp/primary")
+if [ $n_jobs -gt $n_files ]; then
+  n_jobs=$n_files
+fi
+if [ $n_jobs -le 1 ]; then
+  while read nlinks inum f; do
+    do_file "$nlinks" "$inum" "$f"
+  done <"$temp/primary"
+else
+  for ((i = 1; i <= n_files; i++)); do
+    printf "%0${FILENUM_DIGITS}x\\n" $i
+  done | (
+    exec 3<&0
+    for ((i = 0; i < n_jobs; i++)); do
+      # The shell redirects stdin to /dev/null for background jobs. Work
+      # around this by duplicating fd 0
+      run_job $i <&3 &
+    done
+    wait
+  )
+  for f in "$temp"/res.*; do
+    res=$(< "$f")
+    if [ "$res" !=  "0" ]; then
+      exit 1
+    fi
+  done
+  cat "$temp"/debugsources.* >"$SOURCEFILE"
+  cat "$temp"/elfbins.* >"$ELFBINSFILE"
+fi
+
+# Invoke the DWARF Compressor utility.
+if $run_dwz \
+   && [ -d "${RPM_BUILD_ROOT}/usr/lib/debug" ]; then
+  readarray dwz_files < <(cd "${RPM_BUILD_ROOT}/usr/lib/debug"; find -type f -name \*.debug | LC_ALL=C sort)
+  if [ ${#dwz_files[@]} -gt 0 ]; then
+    dwz_multifile_name="${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}-${RPM_PACKAGE_RELEASE}.${RPM_ARCH}"
+    dwz_multifile_suffix=
+    dwz_multifile_idx=0
+    while [ -f "${RPM_BUILD_ROOT}/usr/lib/debug/.dwz/${dwz_multifile_name}${dwz_multifile_suffix}" ]; do
+      let ++dwz_multifile_idx
+      dwz_multifile_suffix=".${dwz_multifile_idx}"
+    done
+    dwz_multfile_name="${dwz_multifile_name}${dwz_multifile_suffix}"
+    dwz_opts="-h -q -r"
+    [ ${#dwz_files[@]} -gt 1 ] \
+      && dwz_opts="${dwz_opts} -m .dwz/${dwz_multifile_name}"
+    mkdir -p "${RPM_BUILD_ROOT}/usr/lib/debug/.dwz"
+    [ -n "${dwz_low_mem_die_limit}" ] \
+      && dwz_opts="${dwz_opts} -l ${dwz_low_mem_die_limit}"
+    [ -n "${dwz_max_die_limit}" ] \
+      && dwz_opts="${dwz_opts} -L ${dwz_max_die_limit}"
+    if type dwz >/dev/null 2>&1; then
+      ( cd "${RPM_BUILD_ROOT}/usr/lib/debug" && dwz $dwz_opts ${dwz_files[@]} )
+    else
+      echo >&2 "*** ERROR: DWARF compression requested, but no dwz installed"
+      exit 2
+    fi
+    # Remove .dwz directory if empty
+    rmdir "${RPM_BUILD_ROOT}/usr/lib/debug/.dwz" 2>/dev/null
+    if [ -f "${RPM_BUILD_ROOT}/usr/lib/debug/.dwz/${dwz_multifile_name}" ]; then
+      id="`readelf -Wn "${RPM_BUILD_ROOT}/usr/lib/debug/.dwz/${dwz_multifile_name}" \
+            2>/dev/null | sed -n 's/^.* Build ID: \([0-9a-f]\+\)/\1/p'`"
+    fi
+
+    # dwz invalidates .gnu_debuglink CRC32 in the main files.
+    cat "$ELFBINSFILE" |
+    (cd "$RPM_BUILD_ROOT"; \
+     xargs -d '\n' ${lib_rpm_dir}/sepdebugcrcfix usr/lib/debug)
+  fi
+fi
 
 # We used to make a .debug symlink for each symlink whose target
 # has a .debug file to that file.  This is not necessary because
@@ -338,14 +629,47 @@ done || exit
 # Creating those links anyway results in debuginfo packages for
 # devel packages just because of the .so symlinks in them.
 
+## For each symlink whose target has a .debug file,
+## make a .debug symlink to that file.
+#find "$RPM_BUILD_ROOT" ! -path "${debugdir}/*" -type l -print |
+#while read f
+#do
+#  t=$(readlink -m "$f").debug
+#  f=${f#$RPM_BUILD_ROOT}
+#  t=${t#$RPM_BUILD_ROOT}
+#  if [ -f "$debugdir$t" ]; then
+#    echo "symlinked /usr/lib/debug$t to /usr/lib/debug${f}.debug"
+#    debug_link "/usr/lib/debug$t" "${f}.debug"
+#  fi
+#done
+
 if [ -s "$SOURCEFILE" ]; then
-  mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug"
-  LC_ALL=C sort -z -u "$SOURCEFILE" | grep -E -v -z '(<internal>|<built-in>)$' |
-  (cd "$RPM_BUILD_DIR"; cpio -pd0mL "${RPM_BUILD_ROOT}/usr/src/debug")
-  # stupid cpio creates new directories in mode 0700, fixup
-  find "${RPM_BUILD_ROOT}/usr/src/debug" -type d -print0 |
-  xargs --no-run-if-empty -0 chmod a+rx
-  find "${RPM_BUILD_ROOT}/usr/src/debug" -type f -print0 |
+  # See also debugedit invocation. Directories must match up.
+  debug_base_name="$RPM_BUILD_DIR"
+  debug_dest_name="/usr/src/debug"
+  if [ ! -z "$unique_debug_src_base" ]; then
+    debug_base_name="$BUILDDIR"
+    debug_dest_name="/usr/src/debug/${unique_debug_src_base}"
+  fi
+
+  mkdir -p "${RPM_BUILD_ROOT}${debug_dest_name}"
+  # Filter out anything compiler generated which isn't a source file.
+  # e.g. <internal>, <built-in>, <__thread_local_inner macros>.
+  # Some compilers generate them as if they are part of the working
+  # directory (which is why we match against ^ or /).
+
+  # Get package name from directory and then filter out all files not
+  # starting with this name
+  #remove old patch: 6428714ec2f4a0aa2b3c3b2e1b81c2cedf06e8c6
+  #pn=$(basename "$BUILDDIR")
+  LC_ALL=C sort -z -u "$SOURCEFILE" | grep -E -v -z '(^|/)<[a-z _-]+>$' |
+  #grep -E -z "^${pn}" |
+  (cd "${debug_base_name}"; cpio -pd0mL "${RPM_BUILD_ROOT}${debug_dest_name}")
+  # stupid cpio creates new directories in mode 0700,
+  # and non-standard modes may be inherented from original directories, fixup
+  find "${RPM_BUILD_ROOT}${debug_dest_name}" -type d -print0 |
+  xargs --no-run-if-empty -0 chmod 0755
+  find "${RPM_BUILD_ROOT}${debug_dest_name}" -type f -print0 |
   xargs --no-run-if-empty -0 chmod a+r
 fi
 
@@ -357,14 +681,18 @@ if [ -d "${RPM_BUILD_ROOT}/usr/lib" -o -d "${RPM_BUILD_ROOT}/usr/src" ]; then
 
   (cd "${RPM_BUILD_ROOT}/usr"
    test ! -d lib/debug || find lib/debug ! -type d
+   test ! -d src/debug -o -n "$srcout" || find src/debug -mindepth 1 -maxdepth 1
   ) | sed 's,^,/usr/,' >> "$LISTFILE"
 fi
 
-: > "$SOURCEFILE"
-if [ -d "${RPM_BUILD_ROOT}/usr/src" ]; then
-  (cd "${RPM_BUILD_ROOT}/usr"
-   test ! -d src/debug || find src/debug -mindepth 1 -maxdepth 1
-  ) | sed 's,^,/usr/,' >> "$SOURCEFILE"
+if [ -n "$srcout" ]; then
+  srcout="$BUILDDIR/$srcout"
+  > "$srcout"
+  if [ -d "${RPM_BUILD_ROOT}/usr/src/debug" ]; then
+    (cd "${RPM_BUILD_ROOT}/usr"
+     find src/debug -mindepth 1 -maxdepth 1
+    ) | sed 's,^,/usr/,' >> "$srcout"
+  fi
 fi
 
 # Append to $1 only the lines from stdin not already in the file.
index 413fb353a83d7100600e4ea770076d098b3743de..28c8c47e7e14374093afe26c191cb18188d7264f 100755 (executable)
@@ -11,7 +11,7 @@
 #in tact and are included with any redistribution of this file or any
 #work based on this file.
 
-# 2004-06-20 Arkadiusz Miśkiewicz <arekm@pld-linux.org>
+# 2004-06-20 Arkadiusz Mi?kiewicz <arekm@pld-linux.org>
 #   * merge PLD changes, kde, all-name (mkochano,pascalek@PLD)
 # 1999-10-19 Artur Frysiak <wiget@pld-linux.org>
 #   * added support for GNOME help files
diff --git a/scripts/find-php-provides b/scripts/find-php-provides
deleted file mode 100644 (file)
index 02e0c42..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-cd `rpm --eval %{_builddir}`
-
-filelist=`sed "s/['\"]/\\\&/g"`
-if [ -f __rpm_noautoprovfiles ] ; then
-       for i in `cat __rpm_noautoprovfiles`; do
-               filelist=`echo $filelist | sed "s![[:space:]]*$i[[:space:]]*!!g"`
-       done
-fi
-
-
-echo $filelist|/usr/lib/rpm/find-provides
-provides_php=`echo $filelist | xargs /usr/lib/rpm/php.prov`
-if [ -f __rpm_noautoprov ] ; then
-       for i in `cat __rpm_noautoprov`; do
-               provides_php=`echo $provides_php | sed "s!\<$i[[:space:]]*!!g"`
-       done
-fi
-
-echo "$provides_php"
diff --git a/scripts/find-php-requires b/scripts/find-php-requires
deleted file mode 100644 (file)
index 9d08151..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-cd `rpm --eval %{_builddir}`
-
-filelist=`sed "s/['\"]/\\\&/g"`
-if [ -f __rpm_noautoreqfiles ] ; then
-       for i in `cat __rpm_noautoreqfiles`; do
-               filelist=`echo $filelist | sed "s![[:space:]]*$i[[:space:]]*!!g"`
-       done
-fi
-
-requires="`echo $filelist | /usr/lib/rpm/find-requires`"
-requires_php="`echo $filelist | xargs /usr/lib/rpm/php.req`"
-
-if [ -f __rpm_noautoreq ] ; then
-       for i in `cat __rpm_noautoreq`; do
-               requires_php=`echo $requires_php | sed "s!\<$i[[:space:]]*!!g"`
-       done
-fi
-
-requires_php_t="$requires_php"
-if [ -f __rpm_noautoreqdep ] ; then
-       for i in `cat __rpm_noautoreqdep`; do
-               requires_php_t=`echo $requires_php_t | sed "s!\<$i[[:space:]]*!!g"`
-       done
-fi
-
-requires_mod="`LC_ALL=C rpm -q --whatprovides --qf "%{NAME}\n"  $requires_php_t 2>/dev/null`"
-echo "$requires
-$requires_php
-$requires_mod"| grep -v "no package provides" | sort -u
diff --git a/scripts/find-provides b/scripts/find-provides
new file mode 100755 (executable)
index 0000000..817f5ee
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+/usr/lib/rpm/rpmdeps --define="_use_internal_dependency_generator 1" --provides
diff --git a/scripts/find-provides.ksyms b/scripts/find-provides.ksyms
new file mode 100755 (executable)
index 0000000..e485c3b
--- /dev/null
@@ -0,0 +1,81 @@
+#! /bin/bash
+
+IFS=$'\n'
+
+is_opensuse=false
+
+if test "$1" = "--opensuse"; then
+    if test "$2" -gt 0; then
+        is_opensuse=true
+    fi
+    shift 2
+fi
+
+if ! $is_opensuse; then
+    trap 'rm -f "$tmp"' EXIT
+    tmp=$(mktemp)
+fi
+
+
+while read f; do
+    test -e "$f" || continue
+    is_module=""
+    case "$f" in
+    *.debug)
+        continue
+        ;;
+    */boot/vmlinu[xz]-*)
+        flavor=${f##*/vmlinu[xz]-}
+        flavor=${flavor%.gz}
+        echo "kernel-uname-r = $flavor"
+        version=${flavor}
+        flavor=${flavor##*-}
+        ;;
+    */lib/modules/*/*.ko | */lib/modules/*/*.ko.gz | */boot/vmlinu[xz]*)
+        is_module="1"
+        ;;
+    *)
+        continue
+    esac
+    if $is_opensuse; then
+        continue
+    fi
+    unzip=false
+    case "$f" in
+    *.gz | */boot/vmlinuz*)
+        unzip=true
+    esac
+    if $unzip && gzip -cd "$f" >"$tmp"; then
+        f=$tmp
+    fi
+    if test -z "$flavor" -a -n "$is_module" ; then
+        flavor=$(/sbin/modinfo -F vermagic "$f")
+        flavor=${flavor%% *}
+        version=${flavor}
+        flavor=${flavor##*-}
+    fi
+    if test -z "$flavor"; then
+        echo "warning: cannot determine kernel flavor from $(/sbin/modinfo -F vermagic "$f" 2>&1)" >&2
+        continue
+    fi
+    objdir=$(readlink /lib/modules/$version/build)
+    objdir_build=$RPM_BUILD_ROOT$(readlink $RPM_BUILD_ROOT/lib/modules/$version/build)
+    for i in $objdir_build $objdir ; do
+            ksym_provides=$i/scripts/mod/ksym-provides
+            [ -x $ksym_provides ] && break
+    done
+    if [ -x $ksym_provides ] ; then
+            $ksym_provides $flavor $f
+    else
+            major=${version%%.*}
+            sub=${version#*.}
+            sub=${sub%%.*}
+            if [ "$major" -ge 4 -a "$sub" -ge 10 ] ; then
+                    echo "error: cannot determine ksym provides of $f - missing ksym-povides tool." >&2
+            else
+                    nm "$f" \
+                            | sed -r -ne "s/^0*([0-9a-f]+) A __crc_(.+)/ksym($flavor:\\2) = \\1/p"
+            fi
+    fi
+done \
+| sort -u
diff --git a/scripts/find-requires b/scripts/find-requires
new file mode 100755 (executable)
index 0000000..fa5bc88
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+/usr/lib/rpm/rpmdeps --define="_use_internal_dependency_generator 1" --requires
diff --git a/scripts/find-requires.ksyms b/scripts/find-requires.ksyms
new file mode 100755 (executable)
index 0000000..bc5c9b3
--- /dev/null
@@ -0,0 +1,29 @@
+#! /bin/bash
+
+IFS=$'\n'
+
+is_opensuse=false
+
+if test "$1" = "--opensuse"; then
+    if test "$2" -gt 0; then
+        is_opensuse=true
+    fi
+    shift 2
+fi
+
+if ! $is_opensuse && ! test -e /sbin/modprobe; then
+    cat > /dev/null
+    exit 0
+fi
+
+for f in $(grep -E '/lib/modules/.+\.ko$' | grep -v '/lib/modules/[^/]*/kernel/'); do
+    flavor=${f#*/lib/modules/}
+    flavor=${flavor%%/*}
+    if $is_opensuse; then
+        echo "kernel-uname-r = $flavor"
+        continue
+    fi
+    flavor=${flavor##*-}
+    /sbin/modprobe --dump-modversions "$f" \
+           | sed -r -ne "s/^0x0*([0-9a-f]+)[[:blank:]]+(.+)/ksym($flavor:\\2) = \\1/p"
+done | sort -u
index d9b0c21485eb6d5fbdac146f1b3a9e1e8260bd52..a8cd1209e28a95c62bc5816d96e412b590d5ae7b 100644 (file)
@@ -14,11 +14,8 @@ find $1 \( -name "*$2" -o -name ".*$2" \) -print | sort |
 while read f; do
     U="${GENDIFF_DIFF_ARGS}"
     [ "`basename $f`" = "ChangeLog$2" ] && U="${GENDIFF_DIFF_CHANGELOG_ARGS}"
-    diffcmd="${DIFF} ${U} /dev/null ${f%$2}"
-#    ${DIFF} ${U} $f `echo $f | sed s/$2\$//`
-    if [ -r "$f" ]; then
-        diffcmd="${DIFF} ${U} ${f} ${f%$2}"
-    fi
-    echo "${diffcmd}"
-    ${diffcmd}
+    F=/dev/null
+    [ -r "${f}" ] && F="${f}"
+    echo "${DIFF} ${U} ${F} ${f%$2}"
+    ${DIFF} ${U} "${F}" "${f%$2}"
 done
index d8937c829b6269df6c6587cfeae0729bb995b42a..af86789c47d4bc35e8168219e0d42ab84d7dd4ac 100644 (file)
@@ -13,7 +13,7 @@ case $1 in
     do
        case "$possible" in
        *.la)
-           if grep -iq '^# Generated by ltmain.sh' "$possible" 2> /dev/null ; then
+           if grep -Eiq '^# Generated by (libtool|ltmain.sh)' "$possible" 2> /dev/null ; then
                possible="`echo ${possible} | sed -e s,${RPM_BUILD_ROOT}/,/,`"
                echo "libtool($possible)"
            fi
index 0370411702019e15a78a6c9bbcebcf02f7568d32..bdeb863b7429d233097bdcfd68cb132add6bcf6c 100644 (file)
@@ -2,9 +2,6 @@
 # To make use of these macros insert the following line into your spec file:
 # %include %{_rpmconfigdir}/macros.perl
 
-%define                __find_requires %{_rpmconfigdir}/find-perl-requires
-%define                __find_provides %{_rpmconfigdir}/find-perl-provides
-
 %define                perl_sitelib    %(eval "`perl -V:installsitelib`"; echo $installsitelib)
 %define                perl_sitearch   %(eval "`perl -V:installsitearch`"; echo $installsitearch)
 %define                perl_archlib    %(eval "`perl -V:installarchlib`"; echo $installarchlib)
index cf20728b05a63791339dd21af06fdb764ff4581d..861c6f501abd4b37c8e2aaf86290474afc32fe15 100644 (file)
@@ -2,8 +2,5 @@
 # To make use of these macros insert the following line into your spec file:
 # %include %{_rpmconfigdir}/macros.php
 
-%define                __find_requires %{_rpmconfigdir}/find-php-requires
-%define                __find_provides %{_rpmconfigdir}/find-php-provides
-
 %define                php_pear_dir    %{_datadir}/pear
 
index ea1f200fce21d4625ba06128ddc727c23fc8b392..9f33ad1a38f40038e246fef518c2d767c3d9b162 100644 (file)
@@ -7,7 +7,8 @@
 
 # directories
 %define py_prefix      %(echo `python -c "import sys; sys.stdout.write(sys.prefix)"`)
-%define py_libdir      %{py_prefix}/lib/python%{py_ver}
+%define py_lib      %(echo `python -c "import sys; sys.stdout.write(sys.lib)"`)
+%define py_libdir      %{py_prefix}/%{py_lib}/python%{py_ver}
 %define py_incdir      /usr/include/python%{py_ver}
 %define py_sitedir     %{py_libdir}/site-packages
 %define py_dyndir      %{py_libdir}/lib-dynload
diff --git a/scripts/metainfo.prov b/scripts/metainfo.prov
new file mode 100755 (executable)
index 0000000..33c41a8
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+#
+# Transform appdata/metainfo xml file into RPM metainfo(filename) provides
+#
+# Author: Michael Schroeder <mls@suse.de>
+# Modified by Neal Gompa <ngompa13@gmail.com> to generate metainfo instead of appdata
+# Based on other provides scripts from RPM
+
+OLD_IFS="$IFS"
+while read instfile ; do
+       case "$instfile" in
+       *.appdata.xml|*.metainfo.xml)
+               echo "metainfo()"
+               echo "metainfo(${instfile##*/})"
+               ;;
+       esac
+done
+IFS=$OLD_IFS
+
diff --git a/scripts/osgideps.pl b/scripts/osgideps.pl
deleted file mode 100644 (file)
index ab92b65..0000000
+++ /dev/null
@@ -1,388 +0,0 @@
-#!/usr/bin/perl
-#
-# osgideps.pl -- Analyze dependencies of OSGi bundles.
-#
-# Kyu Lee (initial idea)
-# Alphonse Van Assche <alcapcom@fedoraproject.org> (current maintainer)
-#
-# $Id: osgideps.pl,v 1.0 2009/06/08 12:12:12 mej Exp $
-
-use Getopt::Long;
-use File::Temp qw/ tempdir /;
-use threads;
-use Thread::Queue;
-
-$MANIFEST_NAME = "META-INF/MANIFEST.MF";
-
-# parse options
-my ( $show_provides, $show_requires, $show_system_bundles, $debug );
-my $result = GetOptions(
-       "provides" => \$show_provides,
-       "requires" => \$show_requires,
-       "system" => \$show_system_bundles,
-       "debug" => \$debug
-);
-exit(1) if ( not $result );
-
-# run selected function
-@allfiles = <STDIN>;
-if ($show_provides) {
-       getProvides(@allfiles);
-}
-if ($show_requires) {
-       getRequires(@allfiles);
-}
-if ($show_system_bundles) {
-       getSystemBundles(@allfiles);
-}
-exit(0);
-
-# this function print provides of OSGi aware files
-sub getProvides {
-       
-       my $queue = Thread::Queue->new;
-       foreach $file (@_) {
-               $queue->enqueue($file);
-       }
-
-       my @workers;
-       push @workers, threads->create('getProvidesWorker');
-       push @workers, threads->create('getProvidesWorker');
-       push @workers, threads->create('getProvidesWorker');
-       push @workers, threads->create('getProvidesWorker');
-
-       map { $_->join } @workers;
-       
-       sub getProvidesWorker {
-               while ( my $file = $queue->dequeue_nb ) {
-                       chomp($file);
-                       # we don't follow symlinks for provides
-                       next if ( -f $file && -r _ && -l _ );
-                       $file =~ s/[^[:print:]]//g;
-                       if ( $file =~ m/$MANIFEST_NAME$/ || $file =~ m/\.jar$/ ) {
-                               if ( $file =~ m/\.jar$/ ) {
-                                       if ( `zipinfo -1 $file 2> /dev/null | grep -e \^$MANIFEST_NAME` eq "$MANIFEST_NAME\n" ) {
-                                               # extract MANIFEST.MF file from jar to temporary directory
-                                               $tmpdir = tempdir( CLEANUP => 1 );                                              
-                                               `unzip -d $tmpdir -qqo $file $MANIFEST_NAME`;
-                                               open( MANIFEST, "$tmpdir/$MANIFEST_NAME" );
-                                       }
-                               } else {
-                                       open( MANIFEST, "$file" );
-                               }
-                               my $bundleName = "";
-                               my $version = "";
-                               # parse Bundle-SymbolicName, Bundle-Version and Export-Package attributes
-                               while (<MANIFEST>) {
-                                       # get rid of non-print chars (some manifest files contain weird chars)
-                                       s/[^[:print]]//g;
-                                       if ( m/(^(Bundle-SymbolicName): )(.*)$/ ) {
-                                               $bundleName = "$3" . "\n";
-                                               while (<MANIFEST>) {
-                                                       if ( m/^[[:upper:]][[:alpha:]]+-[[:upper:]][[:alpha:]]+: .*/ ) {
-                                                               $len = length $_;
-                                                               seek MANIFEST, $len * -1, 1;
-                                                               last;
-                                                       }
-                                                       $bundleName .= "$_";
-                                               }
-                                               $bundleName =~ s/\s+//g;
-                                               $bundleName =~ s/;.*//g;
-                                       }
-                                       if ( m/(^Bundle-Version: )(.*)/ ) {
-                                               $version = $2;
-                                       }
-                                       if ( m/(^(Export-Package): )(.*)$/ ) {
-                                               my $bunlist = "$3" . "\n";
-                                               while (<MANIFEST>) {
-                                                       if ( m/^[[:upper:]][[:alpha:]]+-[[:upper:]][[:alpha:]]+: .*/ ) {
-                                                               $len = length $_;
-                                                               seek MANIFEST, $len * -1, 1;
-                                                               last;
-                                                       }
-                                                       $bunlist .= "$_";
-                                               }
-                                               push @bundlelist, parsePkgString($bunlist, $file);
-                                       }
-                               }       
-       
-                               # skip this jar if no bundle name exists
-                               if ( !$bundleName eq "" ) {
-                                       if ( !$version eq "" ) {
-                                               $version = parseVersion($version);
-                                               push @bundlelist, { FILE => "$file", NAME => "$bundleName", VERSION => "$version" };
-                                       } else {        
-                                               push @bundlelist, { FILE => "$file", NAME => "$bundleName", VERSION => "" };
-                                       }
-                               }
-                               `rm -rf $tmpdir`;
-                       }
-               }
-               if ( !$debug ) { @bundlelist = prepareOSGiBundlesList(@bundlelist); }
-               $list = "";
-               for $bundle (@bundlelist) {
-                       if ( !$debug ) {
-                               $list .= "osgi(" . $bundle->{NAME} . ")" . $bundle->{VERSION} . "\n";
-                       } else {
-                               $list .= $bundle->{FILE} . " osgi(" . $bundle->{NAME} . ")" . $bundle->{VERSION} . "\n";
-                       }
-               }
-               print $list;
-       }
-}
-
-# this function print requires of OSGi aware files
-sub getRequires {
-
-       my $queue = Thread::Queue->new;
-       foreach $file (@_) {
-               $queue->enqueue($file);
-       }
-
-       my @workers;
-       push @workers, threads->create('getRequiresWorker');
-       push @workers, threads->create('getRequiresWorker');
-       push @workers, threads->create('getRequiresWorker');
-       push @workers, threads->create('getRequiresWorker');
-
-       map { $_->join } @workers;
-       
-       sub getRequiresWorker {
-               while ( my $file = $queue->dequeue_nb ) {
-                       next if ( -f $file && -r _ );
-                       $file =~ s/[^[:print:]]//g;
-                       if ( $file =~ m/$MANIFEST_NAME$/ || $file =~ m/\.jar$/ ) {
-                               # we explicitly requires symlinked jars
-                               # _that_reside_outside_the_package_
-                               if (-l $file) {
-                                       $exist = 0;
-                                       $lnksrc = `readlink -qen $file`;
-                                       foreach $exfile ( @allfiles ) {
-                                               $exfile =~ s/[^[:print:]]//g;
-                                               if ( $lnksrc =~ m/$exfile$/ ) {                                                 
-                                                       $exist = 1;
-                                                       last;
-                                               }
-                                       }
-                                       print "$lnksrc\n" if (!$exist);
-                                       next;
-                               }        
-                               
-                               if ( $file =~ m/\.jar$/ ) {
-                                       if ( `zipinfo -1 $file 2> /dev/null | grep -e \^$MANIFEST_NAME` eq "$MANIFEST_NAME\n" ) {
-                                               # extract MANIFEST.MF file from jar to temporary directory
-                                               $tmpdir = tempdir( CLEANUP => 1 );
-                                               `unzip -d $tmpdir -qqo $file $MANIFEST_NAME`;
-                                               open( MANIFEST, "$tmpdir/$MANIFEST_NAME" );
-                                       }
-                               } else {
-                                       open( MANIFEST, "$file" );
-                               }
-                               while (<MANIFEST>) {
-                                       if ( m/(^(Require-Bundle|Import-Package): )(.*)$/ ) {
-                                               my $bunlist = "$3" . "\n";
-                                               while (<MANIFEST>) {
-                                                       if (m/^[[:upper:]][[:alpha:]]+-[[:upper:]][[:alpha:]]+: .*/ ) {
-                                                               $len = length $_;
-                                                               seek MANIFEST, $len * -1, 1;
-                                                               last;
-                                                       }
-                                                       $bunlist .= "$_";
-                                               }
-                                               push @bundlelist, parsePkgString($bunlist, $file);
-                                       }
-                                       # we also explicitly require symlinked jars define by 
-                                       # Bundle-ClassPath attribut
-                                       if ( m/(^(Bundle-ClassPath): )(.*)$/ ) {
-                                               $bunclp = "$3" . "\n";
-                                               while (<MANIFEST>) {
-                                                       if ( m/^[[:upper:]][[:alpha:]]+-[[:upper:]][[:alpha:]]+: .*/ ) {
-                                                               $len = length $_;
-                                                               seek MANIFEST, $len * -1, 1;
-                                                               last;
-                                                       }
-                                                       $bunclp .= "$_";
-                                               }
-                                               $bunclp =~ s/\ //g;
-                                               $bunclp =~ s/\n//g;
-                                               $bunclp =~ s/[^[:print:]]//g;
-                                               $dir = `dirname $file`;
-                                               $dir =~ s/\n//g;
-                                               @jars = split /,/, $bunclp;
-                                               for $jarfile (@jars) {
-                                                       $jarfile = "$dir\/\.\.\/$jarfile";
-                                                       $jarfile = readlink $jarfile;
-                                                       if ( !$jarfile eq "" ) {                                                        
-                                                               print "$jarfile" . "\n";
-                                                       }
-                                               }
-                                       }
-                               }
-                               `rm -rf $tmpdir`;
-                       }
-               }
-               if ( !$debug ) { @bundlelist = prepareOSGiBundlesList(@bundlelist); }
-               $list = "";
-               for $bundle (@bundlelist) {
-                       # replace '=' by '>=' because qualifiers are set on provides 
-                       # but not on requires.
-                       $bundle->{VERSION} =~ s/\ =/\ >=/g;
-                       if ( !$debug ) {
-                               $list .= "osgi(" . $bundle->{NAME} . ")" . $bundle->{VERSION} . "\n";
-                       } else {
-                               $list .= $bundle->{FILE} . " osgi(" . $bundle->{NAME} . ")" . $bundle->{VERSION} . "\n";
-                       }
-               }
-               print $list;
-       }
-}
-
-# this function print system bundles of OSGi profile files.
-sub getSystemBundles {
-       foreach $file (@_) {
-               if ( ! -f $file || ! -r _ ) {
-                       print "'$file' file not found or cannot be read!";
-                       next;
-               } else {
-                       open( PROFILE, "$file" );
-                       while (<PROFILE>) {
-                               if ( $file =~ m/\.profile$/ ) {
-                                       if (m/(^(org\.osgi\.framework\.system\.packages)[=|\ ]+)(.*)$/) {
-                                               $syspkgs = "$3" . "\n";
-                                               while (<PROFILE>) {
-                                                       if (m/^[a-z]/) {
-                                                               $len = length $_;
-                                                               seek MANIFEST, $len * -1, 1;
-                                                               last;
-                                                       }
-                                                       $syspkgs .= "$_";
-                                               }
-                                               $syspkgs =~ s/\s+//g;
-                                               $syspkgs =~ s/\\//g;
-                                               @bundles = split /,/, $syspkgs;
-                                               foreach $bundle (@bundles) {
-                                                       print "osgi(" . $bundle . ")\n";
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-}
-
-sub parsePkgString {
-       my $bunstr = $_[0];
-       my $file = $_[1];
-       my @return;
-       $bunstr =~ s/ //g;
-       $bunstr =~ s/\n//g;
-       $bunstr =~ s/[^[:print:]]//g;
-       $bunstr =~ s/("[[:alnum:]|\-|\_|\.|\(|\)|\[|\]]+)(,)([[:alnum:]|\-|\_|\.|\(|\)|\[|\]]+")/$1 $3/g;
-       # remove uses bundle from Export-Package attribute
-       $bunstr =~ s/uses:="[[:alnum:]|\-|\_|\.|\(|\)|\[|\]|,]+"//g;
-       # remove optional dependencies
-       $bunstr =~ s/,.*;resolution:=optional//g;
-       # remove x-friends
-       $bunstr =~ s/;x-friends:="[[:alnum:]|\-|\_|\.|\(|\)|\[|\]|,]+"//g;
-       # remove signatures 
-       $bunstr =~ s/Name:.*SHA1-Digest:.*//g;
-       @reqcomp = split /,/, $bunstr;
-       foreach $reqelement (@reqcomp) {
-               @reqelementfrmnt = split /;/, $reqelement;
-               $name = "";
-               $version = "";
-               $name = $reqelementfrmnt[0];
-               $name =~ s/\"//g;
-               # ignoring OSGi 'system.bundle' 
-               next if ( $name =~ m/^system\.bundle$/ );
-               for $i ( 1 .. $#reqelementfrmnt ) {
-                       if ( $reqelementfrmnt[$i] =~ m/(^(bundle-|)version=")(.*)(")/ ) {
-                               $version = $3;
-                               last;
-                       }
-               }
-               $version = parseVersion($version);
-               push @return, { FILE => "$file", NAME => "$name", VERSION => "$version" };
-       }
-       return @return;
-}
-
-sub parseVersion {
-       my $ver = $_[0];
-       if ( $ver eq "" ) { return ""; }
-       if ( $ver =~ m/(^[\[|\(])(.+)\ (.+)([\]|\)]$)/ ) {
-               if ( $1 eq "\[" ) {
-                       $ver = " >= $2";
-               } else {
-                       $ver = " > $2";
-               }
-       } else {
-               $ver = " = $ver";
-       }
-       # we always return a full OSGi version to be able to match 1.0
-       # and 1.0.0 as equal in RPM.
-       ( $major, $minor, $micro, $qualifier ) = split( '\.', $ver );
-       if ( !defined($minor) || !$minor ) {
-               $minor = 0;
-       }
-       if ( !defined($micro) || !$micro ) {
-               $micro = 0;
-       }
-       if ( !defined($qualifier) || !$qualifier ) {
-               $qualifier = "";
-       } else {
-               $qualifier = "." . $qualifier;
-       }
-       $ver = $major . "." . $minor . "." . $micro . $qualifier;
-       return $ver;
-}
-
-# this function put the max version on each bundles to be able to remove
-# duplicate deps with 'sort -u' command.
-sub prepareOSGiBundlesList {
-       foreach $bundle (@_) {
-               foreach $cmp (@_) {
-                       if ( $bundle->{NAME} eq $cmp->{NAME} ) {
-                               $result = compareVersion( $bundle->{VERSION}, $cmp->{VERSION} );
-                               if ( $result < 0 ) {
-                                       $bundle->{VERSION} = $cmp->{VERSION};
-                               }
-                       }
-               }
-       }
-       return @_; 
-}
-
-# this function returns a negative integer, zero, or a positive integer if 
-# $ver1 is less than, equal to, or greater than $ver2.
-#
-# REMEMBER: we mimic org.osgi.framework.Version#compareTo method but
-# *at this time* we don't take care of the qualifier part of the version.
-sub compareVersion {
-       my $ver1 = $_[0];
-       my $ver2 = $_[1];
-       
-       $ver1 = "0.0.0" if ( $ver1 eq "" );
-       $ver2 = "0.0.0" if ( $ver2 eq "" );
-
-       $ver1 =~ m/([0-9]+)(\.)([0-9]+)(\.)([0-9]+)/;
-       $major1 = $1;
-       $minor1 = $3;
-       $micro1 = $5;
-
-       $ver2 =~ m/([0-9]+)(\.)([0-9]+)(\.)([0-9]+)/;
-       $major2 = $1;
-       $minor2 = $3;
-       $micro2 = $5;
-
-       $result = $major1 - $major2;
-       return $result if ( $result != 0 );
-       
-       $result = $minor1 - $minor2;
-       return $result if ( $result != 0 );
-       
-       $result = $micro1 - $micro2;
-       return $result if ( $result != 0 );
-       
-       return $result;
-}
index a6d8856e8e2f9c7715ebe4cb88407527ec459d94..bcd70185e35db4e7dfc8a92edf2a764737197a97 100755 (executable)
@@ -19,7 +19,7 @@
 
 # a simple script to print the proper name for perl libraries.
 
-# To save development time I do not parse the perl grammmar but
+# To save development time I do not parse the perl grammar but
 # instead just lex it looking for what I want.  I take special care to
 # ignore comments and pod's.
 
@@ -47,6 +47,7 @@
 
 if ("@ARGV") {
   foreach (@ARGV) {
+    next if !/\.pm$/;
     process_file($_);
   }
 } else {
@@ -55,6 +56,7 @@ if ("@ARGV") {
   # contents of the file.
 
   foreach (<>) {
+    next if !/\.pm$/;
     process_file($_);
   }
 }
@@ -65,7 +67,7 @@ foreach $module (sort keys %require) {
     print "perl($module)\n";
   } else {
 
-    # I am not using rpm3.0 so I do not want spaces arround my
+    # I am not using rpm3.0 so I do not want spaces around my
     # operators. Also I will need to change the processing of the
     # $RPM_* variable when I upgrade.
 
@@ -114,7 +116,7 @@ sub process_file {
       $inover = 0;
     }
 
-    if ($incomment || $inover) {
+    if ($incomment || $inover || m/^\s*#/) {
        next;
     }
 
@@ -127,9 +129,9 @@ sub process_file {
     # package name so we report all namespaces except some common
     # false positives as if they were provided packages (really ugly).
 
-    if (m/^\s*package\s+([_:a-zA-Z0-9]+)\s*;/) {
+    if (m/^\s*package\s+([_:a-zA-Z0-9]+)\s*(?:v?([0-9_.]+)\s*)?[;{]/) {
       $package = $1;
-      undef $version;
+      $version = $2;
       if ($package eq 'main') {
         undef $package;
       } else {
@@ -137,7 +139,7 @@ sub process_file {
         # the package definition is broken up over multiple blocks.
         # In that case, don't stomp a previous $VERSION we might have
         # found.  (See BZ#214496.)
-        $require{$package} = undef unless (exists $require{$package});
+        $require{$package} = $version unless (exists $require{$package});
       }
     }
 
@@ -164,13 +166,13 @@ sub process_file {
 
       if (m/\$Revision: (\d+[.0-9]+)/) {
         $version = $1;
-      } elsif (m/['"]?(\d+[.0-9]+)['"]?/) {
+      } elsif (m/=\s*['"]?(\d+[._0-9]+)['"]?/) {
 
         # look for a static number hard coded in the script
 
         $version = $1;
       }
-      $require{$package} ||= $version;
+      $require{$package} = $version;
     }
 
     # Allow someone to have a variable that defines virtual packages
index cd2cbded4a840980ae9e740b5be8582df6fdb5be..52bd30196f9f9e31d11eccd4de1f06f3df820f9b 100755 (executable)
@@ -104,8 +104,8 @@ sub process_file {
 
     # skip the "= <<" block
 
-    if (m/^\s*\$(?:.*)\s*=\s*<<\s*(["'`])(.+?)\1/ ||
-        m/^\s*\$(.*)\s*=\s*<<(\w+)\s*;/) {
+    if (m/^\s*(?:my\s*)?\$(?:.*)\s*=\s*<<\s*(["'`])(.+?)\1/ ||
+        m/^\s*(?:my\s*)?\$(.*)\s*=\s*<<(\w+)\s*;/) {
       $tag = $2;
       while (<FILE>) {
         chomp;
@@ -158,6 +158,36 @@ sub process_file {
 
     my $modver_re = qr/[.0-9]+/;
 
+    #
+    # The (require|use) match further down in this subroutine will match lines
+    # within a multi-line print or return statements.  So, let's skip over such
+    # statements whose content should not be loading modules anyway. -BEF-
+    #
+    if (m/print(?:\s+|\s+\S+\s+)\<\<\s*(["'`])(.+?)\1/ ||
+        m/print(\s+|\s+\S+\s+)\<\<(\w+)/ ||
+       m/return(\s+)\<\<(\w+)/ ) {
+
+        my $tag = $2;
+        while (<FILE>) {
+            chomp;
+            ( $_ eq $tag ) && last;
+        }
+        $_ = <FILE>;
+    }
+
+    # Skip multiline print and assign statements
+    if ( m/\$\S+\s*=\s*(")([^"\\]|(\\.))*$/ ||
+         m/\$\S+\s*=\s*(')([^'\\]|(\\.))*$/ ||
+         m/print\s+(")([^"\\]|(\\.))*$/ ||
+         m/print\s+(')([^'\\]|(\\.))*$/ ) {
+
+        my $quote = $1;
+        while (<FILE>) {
+          m/^([^\\$quote]|(\\.))*$quote/ && last;
+        }
+        $_ = <FILE>;
+    }
+
     if (
 
 # ouch could be in a eval, perhaps we do not want these since we catch
diff --git a/scripts/perldeps.pl b/scripts/perldeps.pl
deleted file mode 100755 (executable)
index bffad67..0000000
+++ /dev/null
@@ -1,1116 +0,0 @@
-#!/usr/bin/perl -Tw
-#
-# perldeps.pl -- Analyze dependencies of Perl packages
-#
-# Michael Jennings
-# 7 November 2005
-#
-# $Id: perldeps.pl,v 1.6 2006/04/04 20:12:03 mej Exp $
-#
-
-use strict;
-use Config;
-use File::Basename;
-use File::Find;
-use Getopt::Long;
-use POSIX;
-
-############### Debugging stolen from Mezzanine::Util ###############
-my $DEBUG = 0;
-
-# Debugging output
-sub
-dprintf(@)
-{
-    my ($f, $l, $s, $format);
-    my @params = @_;
-
-    return if (! $DEBUG);
-    $format = shift @params;
-    if (!scalar(@params)) {
-        return dprint($format);
-    }
-    (undef, undef, undef, $s) = caller(1);
-    if (!defined($s)) {
-        $s = "MAIN";
-    }
-    (undef, $f, $l) = caller(0);
-    $f =~ s/^.*\/([^\/]+)$/$1/;
-    $s =~ s/^\w+:://g;
-    $s .= "()" if ($s =~ /^\w+$/);
-    $f = "" if (!defined($f));
-    $l = "" if (!defined($l));
-    $format = "" if (!defined($format));
-    for (my $i = 0; $i < scalar(@params); $i++) {
-        if (!defined($params[$i])) {
-            $params[$i] = "<undef>";
-        }
-    }
-    printf("[$f/$l/$s] $format", @params);
-}
-
-sub
-dprint(@)
-{
-    my ($f, $l, $s);
-    my @params = @_;
-
-    return if (! $DEBUG);
-    (undef, undef, undef, $s) = caller(1);
-    if (!defined($s)) {
-        $s = "MAIN";
-    }
-    (undef, $f, $l) = caller(0);
-    $f =~ s/^.*\/([^\/]+)$/$1/;
-    $s =~ s/\w+:://g;
-    $s .= "()" if ($s =~ /^\w+$/);
-    $f = "" if (!defined($f));
-    $l = "" if (!defined($l));
-    $s = "" if (!defined($s));
-    for (my $i = 0; $i < scalar(@params); $i++) {
-        if (!defined($params[$i])) {
-            $params[$i] = "<undef>";
-        }
-    }
-    print "[$f/$l/$s] ", @params;
-}
-
-############### Module::ScanDeps Code ###############
-use constant dl_ext  => ".$Config{dlext}";
-use constant lib_ext => $Config{lib_ext};
-use constant is_insensitive_fs => (
-    -s $0 
-        and (-s lc($0) || -1) == (-s uc($0) || -1)
-        and (-s lc($0) || -1) == -s $0
-);
-
-my $CurrentPackage = '';
-my $SeenTk;
-
-# Pre-loaded module dependencies
-my %Preload = (
-    'AnyDBM_File.pm'  => [qw( SDBM_File.pm )],
-    'Authen/SASL.pm'  => 'sub',
-    'Bio/AlignIO.pm'  => 'sub',
-    'Bio/Assembly/IO.pm'  => 'sub',
-    'Bio/Biblio/IO.pm'  => 'sub',
-    'Bio/ClusterIO.pm'  => 'sub',
-    'Bio/CodonUsage/IO.pm'  => 'sub',
-    'Bio/DB/Biblio.pm'  => 'sub',
-    'Bio/DB/Flat.pm'  => 'sub',
-    'Bio/DB/GFF.pm'  => 'sub',
-    'Bio/DB/Taxonomy.pm'  => 'sub',
-    'Bio/Graphics/Glyph.pm'  => 'sub',
-    'Bio/MapIO.pm'  => 'sub',
-    'Bio/Matrix/IO.pm'  => 'sub',
-    'Bio/Matrix/PSM/IO.pm'  => 'sub',
-    'Bio/OntologyIO.pm'  => 'sub',
-    'Bio/PopGen/IO.pm'  => 'sub',
-    'Bio/Restriction/IO.pm'  => 'sub',
-    'Bio/Root/IO.pm'  => 'sub',
-    'Bio/SearchIO.pm'  => 'sub',
-    'Bio/SeqIO.pm'  => 'sub',
-    'Bio/Structure/IO.pm'  => 'sub',
-    'Bio/TreeIO.pm'  => 'sub',
-    'Bio/LiveSeq/IO.pm'  => 'sub',
-    'Bio/Variation/IO.pm'  => 'sub',
-    'Crypt/Random.pm' => sub {
-        _glob_in_inc('Crypt/Random/Provider', 1);
-    },
-    'Crypt/Random/Generator.pm' => sub {
-        _glob_in_inc('Crypt/Random/Provider', 1);
-    },
-    'DBI.pm' => sub {
-        grep !/\bProxy\b/, _glob_in_inc('DBD', 1);
-    },
-    'DBIx/SearchBuilder.pm' => 'sub',
-    'DBIx/ReportBuilder.pm' => 'sub',
-    'Device/ParallelPort.pm' => 'sub',
-    'Device/SerialPort.pm' => [ qw(
-        termios.ph asm/termios.ph sys/termiox.ph sys/termios.ph sys/ttycom.ph
-    ) ],
-    'ExtUtils/MakeMaker.pm' => sub {
-        grep /\bMM_/, _glob_in_inc('ExtUtils', 1);
-    },
-    'File/Basename.pm' => [qw( re.pm )],
-    'File/Spec.pm'     => sub {
-        require File::Spec;
-        map { my $name = $_; $name =~ s!::!/!g; "$name.pm" } @File::Spec::ISA;
-    },
-    'HTTP/Message.pm' => [ qw(
-        URI/URL.pm          URI.pm
-    ) ],
-    'IO.pm' => [ qw(
-        IO/Handle.pm        IO/Seekable.pm      IO/File.pm
-        IO/Pipe.pm          IO/Socket.pm        IO/Dir.pm
-    ) ],
-    'IO/Socket.pm'     => [qw( IO/Socket/UNIX.pm )],
-    'LWP/UserAgent.pm' => [ qw(
-        URI/URL.pm          URI/http.pm         LWP/Protocol/http.pm
-        LWP/Protocol/https.pm
-    ), _glob_in_inc("LWP/Authen", 1) ],
-    'Locale/Maketext/Lexicon.pm'    => 'sub',
-    'Locale/Maketext/GutsLoader.pm' => [qw( Locale/Maketext/Guts.pm )],
-    'Mail/Audit.pm'                => 'sub',
-    'Math/BigInt.pm'                => 'sub',
-    'Math/BigFloat.pm'              => 'sub',
-    'Module/Build.pm'               => 'sub',
-    'Module/Pluggable.pm'           => sub {
-        _glob_in_inc("$CurrentPackage/Plugin", 1);
-    },
-    'MIME/Decoder.pm'               => 'sub',
-    'Net/DNS/RR.pm'                 => 'sub',
-    'Net/FTP.pm'                    => 'sub',
-    'Net/SSH/Perl.pm'               => 'sub',
-    'PDF/API2/Resource/Font.pm'     => 'sub',
-    'PDF/API2/Basic/TTF/Font.pm'    => sub {
-        _glob_in_inc('PDF/API2/Basic/TTF', 1);
-    },
-    'PDF/Writer.pm'                 => 'sub',
-    'POE'                           => [ qw(
-        POE/Kernel.pm POE/Session.pm
-    ) ],
-    'POE/Kernel.pm'                    => [
-        map "POE/Resource/$_.pm", qw(
-            Aliases Events Extrefs FileHandles
-            SIDs Sessions Signals Statistics
-        )
-    ],
-    'Parse/AFP.pm'                  => 'sub',
-    'Parse/Binary.pm'               => 'sub',
-    'Regexp/Common.pm'              => 'sub',
-    'SOAP/Lite.pm'                  => sub {
-        (($] >= 5.008 ? ('utf8.pm') : ()), _glob_in_inc('SOAP/Transport', 1));
-    },
-    'SQL/Parser.pm' => sub {
-        _glob_in_inc('SQL/Dialects', 1);
-    },
-    'SVN/Core.pm' => sub {
-        _glob_in_inc('SVN', 1),
-        map "auto/SVN/$_->{name}", _glob_in_inc('auto/SVN'),
-    },
-    'SVK/Command.pm' => sub {
-        _glob_in_inc('SVK', 1);
-    },
-    'SerialJunk.pm' => [ qw(
-        termios.ph asm/termios.ph sys/termiox.ph sys/termios.ph sys/ttycom.ph
-    ) ],
-    'Template.pm'      => 'sub',
-    'Term/ReadLine.pm' => 'sub',
-    'Tk.pm'            => sub {
-        $SeenTk = 1;
-        qw( Tk/FileSelect.pm Encode/Unicode.pm );
-    },
-    'Tk/Balloon.pm'     => [qw( Tk/balArrow.xbm )],
-    'Tk/BrowseEntry.pm' => [qw( Tk/cbxarrow.xbm Tk/arrowdownwin.xbm )],
-    'Tk/ColorEditor.pm' => [qw( Tk/ColorEdit.xpm )],
-    'Tk/FBox.pm'        => [qw( Tk/folder.xpm Tk/file.xpm )],
-    'Tk/Toplevel.pm'    => [qw( Tk/Wm.pm )],
-    'URI.pm'            => sub {
-        grep !/.\b[_A-Z]/, _glob_in_inc('URI', 1);
-    },
-    'Win32/EventLog.pm'    => [qw( Win32/IPC.pm )],
-    'Win32/Exe.pm'         => 'sub',
-    'Win32/TieRegistry.pm' => [qw( Win32API/Registry.pm )],
-    'Win32/SystemInfo.pm'  => [qw( Win32/cpuspd.dll )],
-    'XML/Parser.pm'        => sub {
-        _glob_in_inc('XML/Parser/Style', 1),
-        _glob_in_inc('XML/Parser/Encodings', 1),
-    },
-    'XML/Parser/Expat.pm' => sub {
-        ($] >= 5.008) ? ('utf8.pm') : ();
-    },
-    'XML/SAX.pm' => [qw( XML/SAX/ParserDetails.ini ) ],
-    'XMLRPC/Lite.pm' => sub {
-        _glob_in_inc('XMLRPC/Transport', 1),;
-    },
-    'diagnostics.pm' => sub {
-        _find_in_inc('Pod/perldiag.pod')
-          ? 'Pod/perldiag.pl'
-          : 'pod/perldiag.pod';
-    },
-    'utf8.pm' => [
-        'utf8_heavy.pl', do {
-            my $dir = 'unicore';
-            my @subdirs = qw( To );
-            my @files = map "$dir/lib/$_->{name}", _glob_in_inc("$dir/lib");
-
-            if (@files) {
-                # 5.8.x
-                push @files, (map "$dir/$_.pl", qw( Exact Canonical ));
-            }
-            else {
-                # 5.6.x
-                $dir = 'unicode';
-                @files = map "$dir/Is/$_->{name}", _glob_in_inc("$dir/Is")
-                  or return;
-                push @subdirs, 'In';
-            }
-
-            foreach my $subdir (@subdirs) {
-                foreach (_glob_in_inc("$dir/$subdir")) {
-                    push @files, "$dir/$subdir/$_->{name}";
-                }
-            }
-            @files;
-        }
-    ],
-    'charnames.pm' => [
-        _find_in_inc('unicore/Name.pl') ? 'unicore/Name.pl' : 'unicode/Name.pl'
-    ],
-);
-
-my $Keys = 'files|keys|recurse|rv|skip|first|execute|compile';
-sub scan_deps {
-    my %args = (
-        rv => {},
-        (@_ and $_[0] =~ /^(?:$Keys)$/o) ? @_ : (files => [@_], recurse => 1)
-    );
-
-    scan_deps_static(\%args);
-
-    if ($args{execute} or $args{compile}) {
-        scan_deps_runtime(
-            rv      => $args{rv},
-            files   => $args{files},
-            execute => $args{execute},
-            compile => $args{compile},
-            skip    => $args{skip}
-        );
-    }
-
-    return ($args{rv});
-}
-
-sub scan_deps_static {
-    my ($args) = @_;
-    my ($files, $keys, $recurse, $rv, $skip, $first, $execute, $compile) =
-      @$args{qw( files keys recurse rv skip first execute compile )};
-
-    $rv   ||= {};
-    $skip ||= {};
-
-    foreach my $file (@{$files}) {
-        my $key = shift @{$keys};
-        next if $skip->{$file}++;
-        next if is_insensitive_fs()
-          and $file ne lc($file) and $skip->{lc($file)}++;
-
-        local *FH;
-        open FH, $file or die "Cannot open $file: $!";
-
-        $SeenTk = 0;
-
-        # Line-by-line scanning
-        LINE:
-        while (<FH>) {
-            chomp(my $line = $_);
-            foreach my $pm (scan_line($line)) {
-                last LINE if $pm eq '__END__';
-
-                if ($pm eq '__POD__') {
-                    while (<FH>) { last if (/^=cut/) }
-                    next LINE;
-                }
-
-                $pm = 'CGI/Apache.pm' if /^Apache(?:\.pm)$/;
-
-                add_deps(
-                    used_by => $key,
-                    rv      => $rv,
-                    modules => [$pm],
-                    skip    => $skip
-                );
-
-                my $preload = $Preload{$pm} or next;
-                if ($preload eq 'sub') {
-                    $pm =~ s/\.p[mh]$//i;
-                    $preload = [ _glob_in_inc($pm, 1) ];
-                }
-                elsif (UNIVERSAL::isa($preload, 'CODE')) {
-                    $preload = [ $preload->($pm) ];
-                }
-
-                add_deps(
-                    used_by => $key,
-                    rv      => $rv,
-                    modules => $preload,
-                    skip    => $skip
-                );
-            }
-        }
-        close FH;
-
-        # }}}
-    }
-
-    # Top-level recursion handling {{{
-    while ($recurse) {
-        my $count = keys %$rv;
-        my @files = sort grep -T $_->{file}, values %$rv;
-        scan_deps_static({
-            files   => [ map $_->{file}, @files ],
-            keys    => [ map $_->{key},  @files ],
-            rv      => $rv,
-            skip    => $skip,
-            recurse => 0,
-        }) or ($args->{_deep} and return);
-        last if $count == keys %$rv;
-    }
-
-    # }}}
-
-    return $rv;
-}
-
-sub scan_deps_runtime {
-    my %args = (
-        perl => $^X,
-        rv   => {},
-        (@_ and $_[0] =~ /^(?:$Keys)$/o) ? @_ : (files => [@_], recurse => 1)
-    );
-    my ($files, $rv, $execute, $compile, $skip, $perl) =
-      @args{qw( files rv execute compile skip perl )};
-
-    $files = (ref($files)) ? $files : [$files];
-
-    my ($inchash, $incarray, $dl_shared_objects) = ({}, [], []);
-    if ($compile) {
-        my $file;
-
-        foreach $file (@$files) {
-            ($inchash, $dl_shared_objects, $incarray) = ({}, [], []);
-            _compile($perl, $file, $inchash, $dl_shared_objects, $incarray);
-
-            my $rv_sub = _make_rv($inchash, $dl_shared_objects, $incarray);
-            _merge_rv($rv_sub, $rv);
-        }
-    }
-    elsif ($execute) {
-        my $excarray = (ref($execute)) ? $execute : [@$files];
-        my $exc;
-        my $first_flag = 1;
-        foreach $exc (@$excarray) {
-            ($inchash, $dl_shared_objects, $incarray) = ({}, [], []);
-            _execute(
-                $perl, $exc, $inchash, $dl_shared_objects, $incarray,
-                $first_flag
-            );
-            $first_flag = 0;
-        }
-
-        my $rv_sub = _make_rv($inchash, $dl_shared_objects, $incarray);
-        _merge_rv($rv_sub, $rv);
-    }
-
-    return ($rv);
-}
-
-sub scan_line {
-    my $line = shift;
-    my %found;
-
-    return '__END__' if $line =~ /^__(?:END|DATA)__$/;
-    return '__POD__' if $line =~ /^=\w/;
-
-    $line =~ s/\s*#.*$//;
-    $line =~ s/[\\\/]+/\//g;
-
-    foreach (split(/;/, $line)) {
-        if (/^\s*package\s+(\w+);/) {
-            $CurrentPackage = $1;
-            $CurrentPackage =~ s{::}{/}g;
-            return;
-        }
-        return if /^\s*(use|require)\s+[\d\._]+/;
-
-        if (my ($libs) = /\b(?:use\s+lib\s+|(?:unshift|push)\W+\@INC\W+)(.+)/)
-        {
-            my $archname =
-              defined($Config{archname}) ? $Config{archname} : '';
-            my $ver = defined($Config{version}) ? $Config{version} : '';
-            foreach (grep(/\w/, split(/["';() ]/, $libs))) {
-                unshift(@INC, "$_/$ver")           if -d "$_/$ver";
-                unshift(@INC, "$_/$archname")      if -d "$_/$archname";
-                unshift(@INC, "$_/$ver/$archname") if -d "$_/$ver/$archname";
-            }
-            next;
-        }
-
-        $found{$_}++ for scan_chunk($_);
-    }
-
-    return sort keys %found;
-}
-
-sub scan_chunk {
-    my $chunk = shift;
-
-    # Module name extraction heuristics {{{
-    my $module = eval {
-        $_ = $chunk;
-
-        return [ 'base.pm',
-            map { s{::}{/}g; "$_.pm" }
-              grep { length and !/^q[qw]?$/ } split(/[^\w:]+/, $1) ]
-          if /^\s* use \s+ base \s+ (.*)/sx;
-
-        return [ 'Class/Autouse.pm',
-            map { s{::}{/}g; "$_.pm" }
-              grep { length and !/^:|^q[qw]?$/ } split(/[^\w:]+/, $1) ]
-          if /^\s* use \s+ Class::Autouse \s+ (.*)/sx
-              or /^\s* Class::Autouse \s* -> \s* autouse \s* (.*)/sx;
-
-        return [ 'POE.pm',
-            map { s{::}{/}g; "POE/$_.pm" }
-              grep { length and !/^q[qw]?$/ } split(/[^\w:]+/, $1) ]
-          if /^\s* use \s+ POE \s+ (.*)/sx;
-
-        return [ 'encoding.pm',
-            map { _find_encoding($_) }
-              grep { length and !/^q[qw]?$/ } split(/[^\w:]+/, $1) ]
-          if /^\s* use \s+ encoding \s+ (.*)/sx;
-
-        return $1 if /(?:^|\s)(?:use|no|require)\s+([\w:\.\-\\\/\"\']+)/;
-        return $1
-          if /(?:^|\s)(?:use|no|require)\s+\(\s*([\w:\.\-\\\/\"\']+)\s*\)/;
-
-        if (   s/(?:^|\s)eval\s+\"([^\"]+)\"/$1/
-            or s/(?:^|\s)eval\s*\(\s*\"([^\"]+)\"\s*\)/$1/)
-        {
-            return $1 if /(?:^|\s)(?:use|no|require)\s+([\w:\.\-\\\/\"\']*)/;
-        }
-
-        return "File/Glob.pm" if /<[^>]*[^\$\w>][^>]*>/;
-        return "DBD/$1.pm"    if /\b[Dd][Bb][Ii]:(\w+):/;
-        if (/(?:(:encoding)|\b(?:en|de)code)\(\s*['"]?([-\w]+)/) {
-            my $mod = _find_encoding($2);
-            return [ 'PerlIO.pm', $mod ] if $1 and $mod;
-            return $mod if $mod;
-        }
-        return $1 if /(?:^|\s)(?:do|require)\s+[^"]*"(.*?)"/;
-        return $1 if /(?:^|\s)(?:do|require)\s+[^']*'(.*?)'/;
-        return $1 if /[^\$]\b([\w:]+)->\w/ and $1 ne 'Tk';
-        return $1 if /\b(\w[\w:]*)::\w+\(/;
-
-        if ($SeenTk) {
-            my @modules;
-            while (/->\s*([A-Z]\w+)/g) {
-                push @modules, "Tk/$1.pm";
-            }
-            while (/->\s*Scrolled\W+([A-Z]\w+)/g) {
-                push @modules, "Tk/$1.pm";
-                push @modules, "Tk/Scrollbar.pm";
-            }
-            return \@modules;
-        }
-        return;
-    };
-
-    # }}}
-
-    return unless defined($module);
-    return wantarray ? @$module : $module->[0] if ref($module);
-
-    $module =~ s/^['"]//;
-    return unless $module =~ /^\w/;
-
-    $module =~ s/\W+$//;
-    $module =~ s/::/\//g;
-    return if $module =~ /^(?:[\d\._]+|'.*[^']|".*[^"])$/;
-
-    $module .= ".pm" unless $module =~ /\./;
-    return $module;
-}
-
-sub _find_encoding {
-    return unless $] >= 5.008 and eval { require Encode; %Encode::ExtModule };
-
-    my $mod = $Encode::ExtModule{ Encode::find_encoding($_[0])->name }
-      or return;
-    $mod =~ s{::}{/}g;
-    return "$mod.pm";
-}
-
-sub _add_info {
-    my ($rv, $module, $file, $used_by, $type) = @_;
-    return unless defined($module) and defined($file);
-
-    $rv->{$module} ||= {
-        file => $file,
-        key  => $module,
-        type => $type,
-    };
-
-    push @{ $rv->{$module}{used_by} }, $used_by
-      if defined($used_by)
-      and $used_by ne $module
-      and !grep { $_ eq $used_by } @{ $rv->{$module}{used_by} };
-}
-
-sub add_deps {
-    my %args =
-      ((@_ and $_[0] =~ /^(?:modules|rv|used_by)$/)
-        ? @_
-        : (rv => (ref($_[0]) ? shift(@_) : undef), modules => [@_]));
-
-    my $rv   = $args{rv}   || {};
-    my $skip = $args{skip} || {};
-    my $used_by = $args{used_by};
-
-    foreach my $module (@{ $args{modules} }) {
-        next if exists $rv->{$module};
-
-        my $file = _find_in_inc($module) or next;
-        next if $skip->{$file};
-        next if is_insensitive_fs() and $skip->{lc($file)};
-
-        my $type = 'module';
-        $type = 'data' unless $file =~ /\.p[mh]$/i;
-        _add_info($rv, $module, $file, $used_by, $type);
-
-        if ($module =~ /(.*?([^\/]*))\.p[mh]$/i) {
-            my ($path, $basename) = ($1, $2);
-
-            foreach (_glob_in_inc("auto/$path")) {
-                next if $skip->{$_->{file}};
-                next if is_insensitive_fs() and $skip->{lc($_->{file})};
-                next if $_->{file} =~ m{\bauto/$path/.*/};  # weed out subdirs
-                next if $_->{name} =~ m/(?:^|\/)\.(?:exists|packlist)$/;
-                my $ext = lc($1) if $_->{name} =~ /(\.[^.]+)$/;
-                next if $ext eq lc(lib_ext());
-                my $type = 'shared' if $ext eq lc(dl_ext());
-                $type = 'autoload' if $ext eq '.ix' or $ext eq '.al';
-                $type ||= 'data';
-
-                _add_info($rv, "auto/$path/$_->{name}", $_->{file}, $module,
-                    $type);
-            }
-        }
-    }
-
-    return $rv;
-}
-
-sub _find_in_inc {
-    my $file = shift;
-
-    # absolute file names
-    return $file if -f $file;
-
-    foreach my $dir (grep !/\bBSDPAN\b/, @INC) {
-        return "$dir/$file" if -f "$dir/$file";
-    }
-    return;
-}
-
-sub _glob_in_inc {
-    my $subdir  = shift;
-    my $pm_only = shift;
-    my @files;
-
-    require File::Find;
-
-    foreach my $dir (map "$_/$subdir", grep !/\bBSDPAN\b/, @INC) {
-        next unless -d $dir;
-        File::Find::find({
-                "wanted" => sub {
-                    my $name = $File::Find::name;
-                    $name =~ s!^\Q$dir\E/!!;
-                    return if $pm_only and lc($name) !~ /\.p[mh]$/i;
-                    push @files, $pm_only
-                        ? "$subdir/$name"
-                        : {             file => $File::Find::name,
-                                        name => $name,
-                                    }
-                    if -f;
-                },
-                "untaint" => 1,
-                "untaint_skip" => 1,
-                "untaint_pattern" => qr|^([-+@\w./]+)$|
-                }, $dir
-        );
-    }
-
-    return @files;
-}
-
-# App::Packer compatibility functions
-
-sub new {
-    my ($class, $self) = @_;
-    return bless($self ||= {}, $class);
-}
-
-sub set_file {
-    my $self = shift;
-    foreach my $script (@_) {
-        my $basename = $script;
-        $basename =~ s/.*\///;
-        $self->{main} = {
-            key  => $basename,
-            file => $script,
-        };
-    }
-}
-
-sub set_options {
-    my $self = shift;
-    my %args = @_;
-    foreach my $module (@{ $args{add_modules} }) {
-        $module =~ s/::/\//g;
-        $module .= '.pm' unless $module =~ /\.p[mh]$/i;
-        my $file = _find_in_inc($module) or next;
-        $self->{files}{$module} = $file;
-    }
-}
-
-sub calculate_info {
-    my $self = shift;
-    my $rv   = scan_deps(
-        keys  => [ $self->{main}{key}, sort keys %{ $self->{files} }, ],
-        files => [ $self->{main}{file},
-            map { $self->{files}{$_} } sort keys %{ $self->{files} },
-        ],
-        recurse => 1,
-    );
-
-    my $info = {
-        main => {  file     => $self->{main}{file},
-            store_as => $self->{main}{key},
-        },
-    };
-
-    my %cache = ($self->{main}{key} => $info->{main});
-    foreach my $key (sort keys %{ $self->{files} }) {
-        my $file = $self->{files}{$key};
-
-        $cache{$key} = $info->{modules}{$key} = {
-            file     => $file,
-            store_as => $key,
-            used_by  => [ $self->{main}{key} ],
-        };
-    }
-
-    foreach my $key (sort keys %{$rv}) {
-        my $val = $rv->{$key};
-        if ($cache{ $val->{key} }) {
-            push @{ $info->{ $val->{type} }->{ $val->{key} }->{used_by} },
-              @{ $val->{used_by} };
-        }
-        else {
-            $cache{ $val->{key} } = $info->{ $val->{type} }->{ $val->{key} } =
-              {        file     => $val->{file},
-                store_as => $val->{key},
-                used_by  => $val->{used_by},
-              };
-        }
-    }
-
-    $self->{info} = { main => $info->{main} };
-
-    foreach my $type (sort keys %{$info}) {
-        next if $type eq 'main';
-
-        my @val;
-        if (UNIVERSAL::isa($info->{$type}, 'HASH')) {
-            foreach my $val (sort values %{ $info->{$type} }) {
-                @{ $val->{used_by} } = map $cache{$_} || "!!$_!!",
-                  @{ $val->{used_by} };
-                push @val, $val;
-            }
-        }
-
-        $type = 'modules' if $type eq 'module';
-        $self->{info}{$type} = \@val;
-    }
-}
-
-sub get_files {
-    my $self = shift;
-    return $self->{info};
-}
-
-# scan_deps_runtime utility functions
-
-sub _compile {
-    my ($perl, $file, $inchash, $dl_shared_objects, $incarray) = @_;
-
-    my $fname = File::Temp::mktemp("$file.XXXXXX");
-    my $fhin  = FileHandle->new($file) or die "Couldn't open $file\n";
-    my $fhout = FileHandle->new("> $fname") or die "Couldn't open $fname\n";
-
-    my $line = do { local $/; <$fhin> };
-    $line =~ s/use Module::ScanDeps::DataFeed.*?\n//sg;
-    $line =~ s/^(.*?)((?:[\r\n]+__(?:DATA|END)__[\r\n]+)|$)/
-use Module::ScanDeps::DataFeed '$fname.out';
-sub {
-$1
-}
-$2/s;
-    $fhout->print($line);
-    $fhout->close;
-    $fhin->close;
-
-    system($perl, $fname);
-
-    _extract_info("$fname.out", $inchash, $dl_shared_objects, $incarray);
-    unlink("$fname");
-    unlink("$fname.out");
-}
-
-sub _execute {
-    my ($perl, $file, $inchash, $dl_shared_objects, $incarray, $firstflag) = @_;
-
-    $DB::single = $DB::single = 1;
-
-    my $fname = _abs_path(File::Temp::mktemp("$file.XXXXXX"));
-    my $fhin  = FileHandle->new($file) or die "Couldn't open $file";
-    my $fhout = FileHandle->new("> $fname") or die "Couldn't open $fname";
-
-    my $line = do { local $/; <$fhin> };
-    $line =~ s/use Module::ScanDeps::DataFeed.*?\n//sg;
-    $line = "use Module::ScanDeps::DataFeed '$fname.out';\n" . $line;
-    $fhout->print($line);
-    $fhout->close;
-    $fhin->close;
-
-    File::Path::rmtree( ['_Inline'], 0, 1); # XXX hack
-    system($perl, $fname) == 0 or die "SYSTEM ERROR in executing $file: $?";
-
-    _extract_info("$fname.out", $inchash, $dl_shared_objects, $incarray);
-    unlink("$fname");
-    unlink("$fname.out");
-}
-
-sub _make_rv {
-    my ($inchash, $dl_shared_objects, $inc_array) = @_;
-
-    my $rv = {};
-    my @newinc = map(quotemeta($_), @$inc_array);
-    my $inc = join('|', sort { length($b) <=> length($a) } @newinc);
-
-    require File::Spec;
-
-    my $key;
-    foreach $key (keys(%$inchash)) {
-        my $newkey = $key;
-        $newkey =~ s"^(?:(?:$inc)/?)""sg if File::Spec->file_name_is_absolute($newkey);
-
-        $rv->{$newkey} = {
-            'used_by' => [],
-            'file'    => $inchash->{$key},
-            'type'    => _gettype($inchash->{$key}),
-            'key'     => $key
-        };
-    }
-
-    my $dl_file;
-    foreach $dl_file (@$dl_shared_objects) {
-        my $key = $dl_file;
-        $key =~ s"^(?:(?:$inc)/?)""s;
-
-        $rv->{$key} = {
-            'used_by' => [],
-            'file'    => $dl_file,
-            'type'    => 'shared',
-            'key'     => $key
-        };
-    }
-
-    return $rv;
-}
-
-sub _extract_info {
-    my ($fname, $inchash, $dl_shared_objects, $incarray) = @_;
-
-    use vars qw(%inchash @dl_shared_objects @incarray);
-    my $fh = FileHandle->new($fname) or die "Couldn't open $fname";
-    my $line = do { local $/; <$fh> };
-    $fh->close;
-
-    eval $line;
-
-    $inchash->{$_} = $inchash{$_} for keys %inchash;
-    @$dl_shared_objects = @dl_shared_objects;
-    @$incarray          = @incarray;
-}
-
-sub _gettype {
-    my $name = shift;
-    my $dlext = quotemeta(dl_ext());
-
-    return 'autoload' if $name =~ /(?:\.ix|\.al|\.bs)$/i;
-    return 'module'   if $name =~ /\.p[mh]$/i;
-    return 'shared'   if $name =~ /\.$dlext$/i;
-    return 'data';
-}
-
-sub _merge_rv {
-    my ($rv_sub, $rv) = @_;
-
-    my $key;
-    foreach $key (keys(%$rv_sub)) {
-        my %mark;
-        if ($rv->{$key} and _not_dup($key, $rv, $rv_sub)) {
-            warn "different modules for file: $key: were found" .
-                 "(using the version) after the '=>': ".
-                 "$rv->{$key}{file} => $rv_sub->{$key}{file}\n";
-
-            $rv->{$key}{used_by} = [
-                grep (!$mark{$_}++,
-                    @{ $rv->{$key}{used_by} },
-                    @{ $rv_sub->{$key}{used_by} })
-            ];
-            @{ $rv->{$key}{used_by} } = grep length, @{ $rv->{$key}{used_by} };
-            $rv->{$key}{file} = $rv_sub->{$key}{file};
-        }
-        elsif ($rv->{$key}) {
-            $rv->{$key}{used_by} = [
-                grep (!$mark{$_}++,
-                    @{ $rv->{$key}{used_by} },
-                    @{ $rv_sub->{$key}{used_by} })
-            ];
-            @{ $rv->{$key}{used_by} } = grep length, @{ $rv->{$key}{used_by} };
-        }
-        else {
-            $rv->{$key} = {
-                used_by => [ @{ $rv_sub->{$key}{used_by} } ],
-                file    => $rv_sub->{$key}{file},
-                key     => $rv_sub->{$key}{key},
-                type    => $rv_sub->{$key}{type}
-            };
-
-            @{ $rv->{$key}{used_by} } = grep length, @{ $rv->{$key}{used_by} };
-        }
-    }
-}
-
-sub _not_dup {
-    my ($key, $rv1, $rv2) = @_;
-    (_abs_path($rv1->{$key}{file}) ne _abs_path($rv2->{$key}{file}));
-}
-
-sub _abs_path {
-    return join(
-        '/',
-        Cwd::abs_path(File::Basename::dirname($_[0])),
-        File::Basename::basename($_[0]),
-    );
-}
-
-#####################################################
-### Actual perldeps.pl code starts here.
-
-# Print usage information
-sub
-print_usage_info($)
-{
-    my $code = shift || 0;
-    my ($leader, $underbar);
-
-    print "\n";
-    $leader = "$0 Usage Information";
-    $underbar = $leader;
-    $underbar =~ s/./-/g;
-    print "$leader\n$underbar\n";
-    print "\n";
-    print "  Syntax:   $0 [ options ] [ path(s)/file(s) ]\n";
-    print "\n";
-    print "    -h --help                        Show this usage information\n";
-    print "    -v --version                     Show version and copyright\n";
-    print "    -d --debug                       Turn on debugging\n";
-    print "    -p --provides                    Find things provided by path(s)/file(s)\n";
-    print "    -r --requires                    Find things required by path(s)/file(s)\n";
-    #print "                                     \n";
-    print "\nNOTE:  Path(s)/file(s) can also be specified on STDIN.  Default is \@INC.\n\n";
-    exit($code);
-}
-
-# Locate perl modules (*.pm) in given locations.
-sub
-find_perl_modules(@)
-{
-    my @locations = @_;
-    my %modules;
-
-    foreach my $loc (@locations) {
-        if (-f $loc) {
-            # It's a file.  Assume it's a Perl module.
-            #print "Found module:  $loc.\n";
-            $modules{$loc} = 1;
-        } elsif (-d $loc) {
-            my @tmp;
-
-            # Recurse the directory tree looking for all modules inside it.
-            &File::Find::find({
-                "wanted" => sub {
-                    if ((-s _) && (substr($File::Find::fullname, -3, 3) eq ".pm")) {
-                        push @tmp, $File::Find::fullname;
-                    }
-                },
-                "follow_fast" => 1,
-                "no_chdir" => 1,
-                "untaint" => 1,
-                "untaint_skip" => 1,
-                "untaint_pattern" => qr|^([-+@\w./]+)$|
-                }, $loc);
-
-            # @tmp is now a list with all non-empty *.pm files in and under $loc.
-            # Untaint and save in %modules hash.
-            foreach my $module (@tmp) {
-                if ($module =~ /^([-+@\w.\/]+)$/) {
-                    $modules{$1} = 1;
-                    #print "Found module:  $1\n";
-                }
-            }
-        } else {
-            # Something wicked this way comes.
-            print STDERR "$0:  Error:  Don't know what to do with location \"$loc\"\n";
-        }
-    }
-    return keys(%modules);
-}
-
-# Generate an RPM-style "Provides:" list for the given modules.
-sub
-find_provides(@)
-{
-    my @modules = @_;
-    my @prov;
-
-    foreach my $mod (@modules) {
-        my (@contents, @pkgs);
-        my $mod_path;
-        local *MOD;
-
-        $mod_path = dirname($mod);
-        if (!open(MOD, $mod)) {
-            warn "Unable to read module $mod -- $!\n";
-            next;
-        }
-        @contents = <MOD>;
-        if (!close(MOD)) {
-            warn "Unable to close module $mod -- $!\n";
-        }
-
-        if (!scalar(grep { $_ eq $mod_path } @INC)) {
-            push @INC, $mod_path;
-        }
-        foreach my $line (grep { $_ =~ /^\s*package\s+/ } @contents) {
-            if ($line =~ /^\s*package\s+([^\;\s]+)\s*\;/) {
-                push @pkgs, $1;
-            }
-        }
-
-        # Now we have a list of packages.  Load up the modules and get their versions.
-        foreach my $pkg (@pkgs) {
-            my $ret;
-            local ($SIG{"__WARN__"}, $SIG{"__DIE__"});
-
-            # Make sure eval() can't display warnings/errors.
-            $SIG{"__DIE__"} = $SIG{"__WARN__"} = sub {0;};
-            $ret = eval("no strict ('vars', 'subs', 'refs'); use $pkg (); return $pkg->VERSION || 0.0;");
-            if ($@) {
-                dprint "Unable to parse version number from $pkg -- $@.  Assuming 0.\n";
-                $ret = 0;
-            }
-
-            if (! $ret) {
-                $ret = 0;
-            }
-            push @prov, "perl($pkg) = $ret";
-        }
-    }
-    printf("Provides:  %s\n", join(", ", sort(@prov)));
-}
-
-# Generate an RPM-style "Requires:" list for the given modules.
-sub
-find_requires(@)
-{
-    my @modules = @_;
-    my @reqs;
-    my $reqs;
-
-    $reqs = &scan_deps("files" => \@modules, "recurse" => 0);
-    foreach my $key (grep { $reqs->{$_}{"type"} eq "module" } sort(keys(%{$reqs}))) {
-        if (substr($key, -3, 3) eq ".pm") {
-            $key = substr($key, 0, -3);
-        }
-        $key =~ s!/!::!g;
-        push @reqs, "perl($key)";
-    }
-    printf("Requires:  %s\n", join(", ", @reqs));
-}
-
-sub
-main()
-{
-    my $VERSION = '1.0';
-    my (@locations, @modules);
-    my %OPTION;
-
-    # For taint checks
-    delete @ENV{("IFS", "CDPATH", "ENV", "BASH_ENV")};
-    $ENV{"PATH"} = "/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/ucb";
-    foreach my $shell ("/bin/bash", "/usr/bin/ksh", "/bin/ksh", "/bin/sh", "/sbin/sh") {
-        if (-f $shell) {
-            $ENV{"SHELL"} = $shell;
-            last;
-        }
-    }
-
-    $ENV{"LANG"} = "C" if (! $ENV{"LANG"});
-    umask 022;
-    select STDERR; $| = 1;
-    select STDOUT; $| = 1;
-
-    Getopt::Long::Configure("no_getopt_compat", "bundling", "no_ignore_case");
-    Getopt::Long::GetOptions(\%OPTION, "debug|d!", "help|h", "version|v", "provides|p", "requires|r");
-
-    # Post-parse the options stuff
-    select STDOUT; $| = 1;
-    if ($OPTION{"version"}) {
-        # Do not edit this variable.  It is updated automatically by CVS when you commit
-        my $rcs_info = 'CVS Revision $Revision: 1.6 $ created on $Date: 2006/04/04 20:12:03 $ by $Author: mej $ ';
-
-        $rcs_info =~ s/\$\s*Revision: (\S+) \$/$1/;
-        $rcs_info =~ s/\$\s*Date: (\S+) (\S+) \$/$1 at $2/;
-        $rcs_info =~ s/\$\s*Author: (\S+) \$ /$1/;
-        print "\n";
-       print "perldeps.pl $VERSION by Michael Jennings <mej\@eterm.org>\n";
-        print "Copyright (c) 2005-2006, Michael Jennings\n";
-        print "  ($rcs_info)\n";
-        print "\n";
-       return 0;
-    } elsif ($OPTION{"help"}) {
-       &print_usage_info(0);   # Never returns
-    }
-
-    push @locations, @ARGV;
-    if (!scalar(@ARGV) && !(-t STDIN)) {
-        @locations = <STDIN>;
-    }
-    if (!scalar(@locations)) {
-        @locations = @INC;
-    }
-
-    if (!($OPTION{"provides"} || $OPTION{"requires"})) {
-       &print_usage_info(-1);   # Never returns
-    }
-
-    # Catch bogus warning messages like "A thread exited while 2 threads were running"
-    $SIG{"__DIE__"} = $SIG{"__WARN__"} = sub {0;};
-
-    @modules = &find_perl_modules(@locations);
-    if ($OPTION{"provides"}) {
-        &find_provides(@modules);
-    }
-    if ($OPTION{"requires"}) {
-        &find_requires(@modules);
-    }
-    return 0;
-}
-
-exit &main();
index 270dd745ba38259ac364316a233b36aa40ecfbc7..ef4581856f7edf7bcba801f0894ba3ed2ae642ba 100755 (executable)
@@ -16,6 +16,9 @@ $pkgconfig --atleast-pkgconfig-version="0.24" || {
     exit 0
 }
 
+# Under pkgconf, disables dependency resolver
+export PKG_CONFIG_MAXIMUM_TRAVERSE_DEPTH=1
+
 case $1 in
 -P|--provides)
     while read filename ; do
diff --git a/scripts/python-macro-helper b/scripts/python-macro-helper
new file mode 100755 (executable)
index 0000000..4bc8f55
--- /dev/null
@@ -0,0 +1,27 @@
+
+
+from distutils.sysconfig import get_python_lib
+from platform import python_version_tuple
+import sys
+
+
+if __name__ == "__main__":
+
+    if len(sys.argv) < 2:
+        sys.stderr.write("Usage: %s <command>\n" % sys.argv[0])
+        sys.exit(1)
+    
+    if sys.argv[1] == "version":
+        sys.stdout.write(".".join(python_version_tuple()[:2]))
+        sys.exit(0)
+
+    if sys.argv[1] == "sitelib":
+        sys.stdout.write(get_python_lib())
+        sys.exit(0)
+
+    if sys.argv[1] == "sitearch":
+        sys.stdout.write(get_python_lib(1))
+        sys.exit(0)
+
+    sys.stderr.write("Unknown command: %s\n" % sys.argv[1])
+    sys.exit(1)
diff --git a/scripts/pythondistdeps.py b/scripts/pythondistdeps.py
new file mode 100755 (executable)
index 0000000..b442af1
--- /dev/null
@@ -0,0 +1,240 @@
+
+# -*- coding: utf-8 -*-
+#
+# Copyright 2010 Per Øyvind Karlsen <proyvind@moondrake.org>
+# Copyright 2015 Neal Gompa <ngompa13@gmail.com>
+#
+# This program is free software. It may be redistributed and/or modified under
+# the terms of the LGPL version 2.1 (or later).
+#
+# RPM python dependency generator, using .egg-info/.egg-link/.dist-info data
+#
+
+from __future__ import print_function
+from getopt import getopt
+from os.path import basename, dirname, isdir, sep
+from sys import argv, stdin, version
+from distutils.sysconfig import get_python_lib
+from warnings import warn
+
+
+opts, args = getopt(
+    argv[1:], 'hPRrCEMmLl:',
+    ['help', 'provides', 'requires', 'recommends', 'conflicts', 'extras', 'majorver-provides', 'majorver-only', 'legacy-provides' , 'legacy'])
+
+Provides = False
+Requires = False
+Recommends = False
+Conflicts = False
+Extras = False
+Provides_PyMajorVer_Variant = False
+PyMajorVer_Deps = False
+legacy_Provides = False
+legacy = False
+
+for o, a in opts:
+    if o in ('-h', '--help'):
+        print('-h, --help\tPrint help')
+        print('-P, --provides\tPrint Provides')
+        print('-R, --requires\tPrint Requires')
+        print('-r, --recommends\tPrint Recommends')
+        print('-C, --conflicts\tPrint Conflicts')
+        print('-E, --extras\tPrint Extras ')
+        print('-M, --majorver-provides\tPrint extra Provides with Python major version only')
+        print('-m, --majorver-only\tPrint Provides/Requires with Python major version only')
+        print('-L, --legacy-provides\tPrint extra legacy pythonegg Provides')
+        print('-l, --legacy\tPrint legacy pythonegg Provides/Requires instead')
+        exit(1)
+    elif o in ('-P', '--provides'):
+        Provides = True
+    elif o in ('-R', '--requires'):
+        Requires = True
+    elif o in ('-r', '--recommends'):
+        Recommends = True
+    elif o in ('-C', '--conflicts'):
+        Conflicts = True
+    elif o in ('-E', '--extras'):
+        Extras = True
+    elif o in ('-M', '--majorver-provides'):
+        Provides_PyMajorVer_Variant = True
+    elif o in ('-m', '--majorver-only'):
+        PyMajorVer_Deps = True
+    elif o in ('-L', '--legacy-provides'):
+        legacy_Provides = True
+    elif o in ('-l', '--legacy'):
+        legacy = True
+
+if Requires:
+    py_abi = True
+else:
+    py_abi = False
+py_deps = {}
+if args:
+    files = args
+else:
+    files = stdin.readlines()
+
+for f in files:
+    f = f.strip()
+    lower = f.lower()
+    name = 'python(abi)'
+    # add dependency based on path, versioned if within versioned python directory
+    if py_abi and (lower.endswith('.py') or lower.endswith('.pyc') or lower.endswith('.pyo')):
+        if name not in py_deps:
+            py_deps[name] = []
+        purelib = get_python_lib(standard_lib=1, plat_specific=0).split(version[:3])[0]
+        platlib = get_python_lib(standard_lib=1, plat_specific=1).split(version[:3])[0]
+        for lib in (purelib, platlib):
+            if lib in f:
+                spec = ('==', f.split(lib)[1].split(sep)[0])
+                if spec not in py_deps[name]:
+                    py_deps[name].append(spec)
+
+    # XXX: hack to workaround RPM internal dependency generator not passing directories
+    lower_dir = dirname(lower)
+    if lower_dir.endswith('.egg') or \
+            lower_dir.endswith('.egg-info') or \
+            lower_dir.endswith('.dist-info'):
+        lower = lower_dir
+        f = dirname(f)
+    # Determine provide, requires, conflicts & recommends based on egg/dist metadata
+    if lower.endswith('.egg') or \
+            lower.endswith('.egg-info') or \
+            lower.endswith('.dist-info'):
+        # This import is very slow, so only do it if needed
+        from pkg_resources import Distribution, FileMetadata, PathMetadata
+        dist_name = basename(f)
+        if isdir(f):
+            path_item = dirname(f)
+            metadata = PathMetadata(path_item, f)
+        else:
+            path_item = f
+            metadata = FileMetadata(f)
+        dist = Distribution.from_location(path_item, dist_name, metadata)
+        # Check if py_version is defined in the metadata file/directory name
+        if not dist.py_version:
+            # Try to parse the Python version from the path the metadata
+            # resides at (e.g. /usr/lib/pythonX.Y/site-packages/...)
+            import re
+            res = re.search(r"/python(?P<pyver>\d+\.\d)/", path_item)
+            if res:
+                dist.py_version = res.group('pyver')
+            else:
+                warn("Version for {!r} has not been found".format(dist), RuntimeWarning)
+                continue
+        if Provides_PyMajorVer_Variant or PyMajorVer_Deps or legacy_Provides or legacy:
+            # Get the Python major version
+            pyver_major = dist.py_version.split('.')[0]
+        if Provides:
+            # If egg/dist metadata says package name is python, we provide python(abi)
+            if dist.key == 'python':
+                name = 'python(abi)'
+                if name not in py_deps:
+                    py_deps[name] = []
+                py_deps[name].append(('==', dist.py_version))
+            if not legacy or not PyMajorVer_Deps:
+                name = 'python{}dist({})'.format(dist.py_version, dist.key)
+                if name not in py_deps:
+                    py_deps[name] = []
+            if Provides_PyMajorVer_Variant or PyMajorVer_Deps:
+                pymajor_name = 'python{}dist({})'.format(pyver_major, dist.key)
+                if pymajor_name not in py_deps:
+                    py_deps[pymajor_name] = []
+            if legacy or legacy_Provides:
+                legacy_name = 'pythonegg({})({})'.format(pyver_major, dist.key)
+                if legacy_name not in py_deps:
+                    py_deps[legacy_name] = []
+            if dist.version:
+                spec = ('==', dist.version)
+                if spec not in py_deps[name]:
+                    if not legacy:
+                        py_deps[name].append(spec)
+                    if Provides_PyMajorVer_Variant:
+                        py_deps[pymajor_name].append(spec)
+                    if legacy or legacy_Provides:
+                        py_deps[legacy_name].append(spec)
+        if Requires or (Recommends and dist.extras):
+            name = 'python(abi)'
+            # If egg/dist metadata says package name is python, we don't add dependency on python(abi)
+            if dist.key == 'python':
+                py_abi = False
+                if name in py_deps:
+                    py_deps.pop(name)
+            elif py_abi and dist.py_version:
+                if name not in py_deps:
+                    py_deps[name] = []
+                spec = ('==', dist.py_version)
+                if spec not in py_deps[name]:
+                    py_deps[name].append(spec)
+            deps = dist.requires()
+            if Recommends:
+                depsextras = dist.requires(extras=dist.extras)
+                if not Requires:
+                    for dep in reversed(depsextras):
+                        if dep in deps:
+                            depsextras.remove(dep)
+                deps = depsextras
+            # add requires/recommends based on egg/dist metadata
+            for dep in deps:
+                if legacy:
+                    name = 'pythonegg({})({})'.format(pyver_major, dep.key)
+                else:
+                    if PyMajorVer_Deps:
+                        name = 'python{}dist({})'.format(pyver_major, dep.key)
+                    else:
+                        name = 'python{}dist({})'.format(dist.py_version, dep.key)
+                for spec in dep.specs:
+                    if spec[0] != '!=':
+                        if name not in py_deps:
+                            py_deps[name] = []
+                        if spec not in py_deps[name]:
+                            py_deps[name].append(spec)
+                if not dep.specs:
+                    py_deps[name] = []
+        # Unused, for automatic sub-package generation based on 'extras' from egg/dist metadata
+        # TODO: implement in rpm later, or...?
+        if Extras:
+            deps = dist.requires()
+            extras = dist.extras
+            print(extras)
+            for extra in extras:
+                print('%%package\textras-{}'.format(extra))
+                print('Summary:\t{} extra for {} python package'.format(extra, dist.key))
+                print('Group:\t\tDevelopment/Python')
+                depsextras = dist.requires(extras=[extra])
+                for dep in reversed(depsextras):
+                    if dep in deps:
+                        depsextras.remove(dep)
+                deps = depsextras
+                for dep in deps:
+                    for spec in dep.specs:
+                        if spec[0] == '!=':
+                            print('Conflicts:\t{} {} {}'.format(dep.key, '==', spec[1]))
+                        else:
+                            print('Requires:\t{} {} {}'.format(dep.key, spec[0], spec[1]))
+                print('%%description\t{}'.format(extra))
+                print('{} extra for {} python package'.format(extra, dist.key))
+                print('%%files\t\textras-{}\n'.format(extra))
+        if Conflicts:
+            # Should we really add conflicts for extras?
+            # Creating a meta package per extra with recommends on, which has
+            # the requires/conflicts in stead might be a better solution...
+            for dep in dist.requires(extras=dist.extras):
+                name = dep.key
+                for spec in dep.specs:
+                    if spec[0] == '!=':
+                        if name not in py_deps:
+                            py_deps[name] = []
+                        spec = ('==', spec[1])
+                        if spec not in py_deps[name]:
+                            py_deps[name].append(spec)
+names = list(py_deps.keys())
+names.sort()
+for name in names:
+    if py_deps[name]:
+        # Print out versioned provides, requires, recommends, conflicts
+        for spec in py_deps[name]:
+            print('{} {} {}'.format(name, spec[0], spec[1]))
+    else:
+        # Print out unversioned provides, requires, recommends, conflicts
+        print(name)
index cb93ead8ae5fb78e58778b2d806df2411e1e45f1..daa8613ef67f9e35be162f5b20412cae79d88c4c 100755 (executable)
@@ -1,41 +1,54 @@
-#!/bin/sh
-
-# Prevent gawk >= 4.0.x from getting funny ideas wrt UTF in printf()
-LANG=C
-
-pkg=$1
-if [ "$pkg" = "" -o ! -e "$pkg" ]; then
-    echo "no package supplied" 1>&2
-   exit 1
-fi
-
-leadsize=96
-o=`expr $leadsize + 8`
-set `od -j $o -N 8 -t u1 $pkg`
-il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
-dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
-# echo "sig il: $il dl: $dl"
-
-sigsize=`expr 8 + 16 \* $il + $dl`
-o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
-set `od -j $o -N 8 -t u1 $pkg`
-il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
-dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
-# echo "hdr il: $il dl: $dl"
-
-hdrsize=`expr 8 + 16 \* $il + $dl`
-o=`expr $o + $hdrsize`
-
-comp=`dd if="$pkg" ibs=$o skip=1 count=1 2>/dev/null \
-      | dd bs=3 count=1 2>/dev/null`
-
-gz="`echo . | awk '{ printf("%c%c", 0x1f, 0x8b); }'`"
-lzma="`echo . | awk '{ printf("%cLZ", 0xff); }'`"
-xz="`echo . | awk '{ printf("%c7z", 0xfd); }'`"
-case "$comp" in
-    BZh)      dd if="$pkg" ibs=$o skip=1 2>/dev/null | bunzip2 ;;
-    "$gz"*)   dd if="$pkg" ibs=$o skip=1 2>/dev/null | gunzip ;;
-    "$xz"*)   dd if="$pkg" ibs=$o skip=1 2>/dev/null | xzcat ;;
-    "$lzma"*) dd if="$pkg" ibs=$o skip=1 2>/dev/null | unlzma ;;
-    *)        echo "Unrecognized rpm file: $pkg"; exit 1 ;;
+#!/bin/sh -efu
+
+fatal() {
+       echo "$*" >&2
+       exit 1
+}
+
+pkg="$1"
+[ -n "$pkg" -a -e "$pkg" ] ||
+       fatal "No package supplied"
+
+_dd() {
+       local o="$1"; shift
+       dd if="$pkg" skip="$o" iflag=skip_bytes $*
+}
+
+calcsize() {
+       offset=$(($1 + 8))
+
+       local i b b0 b1 b2 b3 b4 b5 b6 b7
+
+       i=0
+       while [ $i -lt 8 ]; do
+               b="$(_dd $(($offset + $i)) bs=1 count=1)"
+               [ -z "$b" ] &&
+                       b="0" ||
+                       b="$(exec printf '%u\n' "'$b")"
+               eval "b$i=\$b"
+               i=$(($i + 1))
+       done
+
+       rsize=$((8 + ((($b0 << 24) + ($b1 << 16) + ($b2 << 8) + $b3) << 4) + ($b4 << 24) + ($b5 << 16) + ($b6 << 8) + $b7))
+       offset=$(($offset + $rsize))
+}
+
+case "$(_dd 0 bs=8 count=1)" in
+       "$(printf '\355\253\356\333')"*) ;; # '\xed\xab\xee\xdb'
+       *) fatal "File doesn't look like rpm: $pkg" ;;
+esac
+
+calcsize 96
+sigsize=$rsize
+
+calcsize $(($offset + (8 - ($sigsize % 8)) % 8))
+hdrsize=$rsize
+
+case "$(_dd $offset bs=3 count=1)" in
+       "$(printf '\102\132')"*) _dd $offset | bunzip2 ;; # '\x42\x5a'
+       "$(printf '\037\213')"*) _dd $offset | gunzip  ;; # '\x1f\x8b'
+       "$(printf '\375\067')"*) _dd $offset | xzcat   ;; # '\xfd\x37'
+       "$(printf '\135\000')"*) _dd $offset | unlzma  ;; # '\x5d\x00'
+       "$(printf '\050\265')"*) _dd $offset | unzstd  ;; # '\x28\xb5'
+       *) fatal "Unrecognized rpm file: $pkg" ;;
 esac
diff --git a/scripts/rpm_fulldb_update b/scripts/rpm_fulldb_update
deleted file mode 100644 (file)
index eb49836..0000000
+++ /dev/null
@@ -1,386 +0,0 @@
-#!/usr/bin/perl
-
-# A perl script to be run from cron which creates an rpm database of
-# all your binary RPMS.  This database contains the most recent
-# version of every branch of each package found in the package
-# repositories.  The database is useful for querying since it is as if
-# you have installed all these packages into your system.  You can
-# find which packages hold a file or which packages satify a
-# dependency.  We are only load the information from the packages and
-# do not save the contents of the packages into the file system.
-
-# Branch is a Version Control concept and is coded into the packages
-# rpm version by convention.  We build the same packages for many
-# different projects.  Each project works on its own branch and may
-# have different source code for the same rpm.  The branch name is
-# encouded in the version number of the package followed by a '.'.
-# The full database needs to have the most recent copy of each package
-# on each branch. For example rpm package version "3.43" would be the
-# "43" release of the branch "3" and rpm package version "potato.91"
-# would be the "91" release of the "potato" branch.
-
-# written by Ken Estes kestes@staff.mail.com
-
-
-use File::Basename;
-use File::stat;
-
-
-
-# An rpm_package is a hash of:
-#     $package{'fqn'}="perl-5.00502-3"
-#     $package{'rpm_file'}="$RPMS_DIR/".
-#                "./sparc/perl-5.00502-3.solaris2.6-sparc.rpm"
-#     $package{'srpm_file'}="$SRPMS_DIR/".
-#                           "./perl-5.00502-3.src.rpm"
-#     $package{'name'}="perl"
-#     $package{'version'}="5.00502"
-#     $package{'release'}="3"
-
-# fqn is "fully qualified name"
-
-# the packages are stored in the datastructure
-#      $BY_NAME{$name}{$branch}{$version}{$release};
-
-
-
-sub set_static_vars {
-
-# This functions sets all the static variables which are often
-# configuration parameters.  Since it only sets variables to static
-# quantites it can not fail at run time. Some of these variables are
-# adjusted by parse_args() but asside from that none of these
-# variables are ever written to. All global variables are defined here
-# so we have a list of them and a comment of what they are for.
-
-  $VERSION = ( qw$Revision: 1.2 $ )[1]; 
-
-  @ORIG_ARGV = @ARGV;
-
-  # The pattern for parsing fqn into ($name, $version, $release).
-  # This is difficult to parse since some hyphens are significant and
-  # others are not, some packages have alphabetic characters in the
-  # version number.
-
-  $PACKAGE_PAT ='(.*)-([^-]+)-([^-]+).solaris2.6-\w*.rpm';
-
-  # packages which will end up in the database match this pattern
-  # currently we are not retricting the packages which go into the
-  # database.
-
-  $PICKLIST_PAT = '.';
-
-  # the list of  directories where rpms are stored
-  @RPM_ARCHIVES = ('/export/rpms/redhat',);
-
-  # the full path name of the database we are creating.
-
-  $RPM_DB_DIR = "/export/rpms/redhat/repository.rpmdb";
-
-  # set a known path.
-  
-  # the correct path has not been finalized yet, but this is close.
-  
-  $ENV{'PATH'}= (
-                '/usr/local/bin'.
-                ':/usr/bin'.
-                ':/bin'.
-                '');
-  
-  # taint perl requires we clean up these bad environmental
-  # variables.
-  
-  delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
-  
-  return 1;
-} #set_static_vars
-
-
-
-
-sub get_env {
-
-# this function sets variables similar to set_static variables.  This
-# function may fail only if the OS is in a very strange state.  after
-# we leave this function we should be all set up to give good error
-# handling, should things fail.
-
-  $| = 1; 
-  $PID = $$; 
-  $PROGRAM = basename($0); 
-  $TIME = time();
-  $LOCALTIME = localtime($main::TIME); 
-  $START_TIME = $TIME;
-
-  {
-    my ($sec,$min,$hour,$mday,$mon,
-       $year,$wday,$yday,$isdst) =
-         localtime(time());
-    
-    # convert confusing perl time vars to what users expect
-    
-    $year += 1900;
-    $mon++;
-    
-    $DATE_STR = sprintf("%02u%02u%02u", $year, $mon, $mday, );
-    $TIME_STR = sprintf("%02u%02u", $hour, $min);
-  }
-  # a unique id for cache file generation
-  $UID = "$DATE_STR.$TIME_STR.$PID";
-
-  return 1;
-} # get_env
-
-
-
-sub parse_fqn {
-
-  # This is difficult to parse since some hyphens are significant and
-  # others are not, some packages have alphabetic characters in the
-  # version number. 
-
-  # Also remember that the format of the file is dependent on how RPM
-  # is configured so this may not be portable to all RPM users.
-
-  (!("@_" =~ m/^$PACKAGE_PAT$/)) &&
-    die("rpm_package_name: '@_' is not in a valid format");
-  
-  return ($1, $2, $3);
-}
-
-
-sub new_rpm_package {
-
-# An rpm_package is a hash of:
-#     $package{'fqn'}="perl-5.00502-3"
-#     $package{'rpm_file'}="$RPMS_DIR/".
-#                "./sparc/perl-5.00502-3.solaris2.6-sparc.rpm"
-#     $package{'srpm_file'}="$SRPMS_DIR/".
-#                           "./perl-5.00502-3.src.rpm"
-#     $package{'name'}="perl"
-#     $package{'version'}="5.00502"
-#     $package{'release'}="3"
-
-  my ($rpm_file) = @_;
-  my $error = '';  
-  my($name, $version, $release) = main::parse_fqn(basename($rpm_file));
-
-  my ($package) = ();
-  
-  $package->{'fqn'}="$name-$version-$release";
-  $package->{'name'}=$name;
-  $package->{'version'}=$version;
-  $package->{'release'}=$release;
-  $package->{'rpm_file'}=$rpm_file;
-
-  # these are needed to do proper sorting of major/minor numbers in
-  # the version of the package
-
-  $package->{'version_cmp'}=[split(/\./, $version)];
-  $package->{'release_cmp'}=[split(/\./, $release)]; 
-
-  # our packages have a naming convention where then branch name is
-  # the first part of the version.
-
-  $package->{'branch'}= @{ $package->{'version_cmp'} }[0];
-
-  return $package;
-}
-
-
-# return the most recent version of package for a given package name/branch pair
-
-sub get_latest_fqn {
-  my ($name, $branch) =(@_);
-
-  my @out = ();
-
-  foreach $version ( keys %{ $BY_NAME{$name}{$branch} }) {
-    foreach $release ( keys %{ $BY_NAME{$name}{$branch}{$version} }) {
-
-      push @out, $BY_NAME{$name}{$branch}{$version}{$release};
-
-    }
-  }
-
-  # the $BY_NAME datastructure is fairly good but the list can not be
-  # sorted right. Sort again using the Schwartzian Transform as
-  # discribed in perlfaq4
-
-  my @sorted = sort {
-
-    # compare the versions but make no assumptions
-    # about how many elements there are
-    
-    my $i=0;
-    my @a_version = @{ $a->{'version_cmp'} }; 
-    my @b_version = @{ $b->{'version_cmp'} };
-    while ( 
-          ($#a_version > $i) && 
-          ($#b_version > $i) && 
-          ($a_version[$i] == $b_version[$i]) 
-         ) {
-      $i++;
-    }
-    
-    my $j = 0;
-    my @a_release = @{ $a->{'release_cmp'} }; 
-    my @b_release = @{ $b->{'release_cmp'} };
-    while ( 
-          ($#a_release > $j) && 
-          ($#b_release > $j) &&
-          ($a_release[$j] == $b_release[$j])
-         ) {
-      $j++;
-    }
-    
-    return (
-           ($b_version[$i] <=> $a_version[$i])
-           ||
-           ($b_release[$j] <=> $a_release[$j])
-          );
-  }
-  @out;
-
-  return @sorted[0];
-}
-
-
-# traverse the package repositories and create a data structure of all
-# the packages we find.
-
-sub parse_package_names {
-  my $db_dir = basename($RPM_DB_DIR);
-  foreach $archive (@RPM_ARCHIVES) {
-    
-    open(FILES, "-|") || 
-      exec("find", $archive, "-print") ||
-       die("Could not run find. $!\n");
-
-    while ($filename = <FILES>) { 
-
-      # we want only the binary rpm files of interest
-
-      ($filename =~ m/\.rpm$/) || next;
-      ($filename =~ m/\.src\.rpm$/) && next;
-      ($filename =~ m/$PICKLIST_PAT/) || next;
-
-      # do not mistake database files for packages
-
-      ($filename =~ m!/$db_dir/!) && next;
-
-      chomp $filename;
-
-      $pkg = new_rpm_package($filename);
-      $BY_NAME{$pkg->{'name'}}{$pkg->{'branch'}}{$pkg->{'version'}}{$pkg->{'release'}} = $pkg;
-
-    }
-
-    close(FILES) || 
-      die("Could not close find. $!\n");
-    
-  }
-
-  return %BY_NAME;
-}
-
-
-
-# traverse the data structure of all the packages and load the most
-# recent version from each branch into the database.  We are only
-# loading the information from the package not saving the files into
-# the file system.
-
-sub create_new_db {
-
-
-  my $uid = $<;
-  
-  # eventually there will be a builder id who will run this code but
-  # for now.
-  
-  ($uid == 0 ) && 
-    die("Must not run this program as root\n");
-  
-  # set up to load the database
-
-  {
-
-    my $tmp_db = "$RPM_DB_DIR.$UID";
-    
-    system("mkdir", "-p", $tmp_db, );
-    ($?) && 
-      die("$0: System error: $! \n");
-    
-    system("rpm", "--initdb",
-          "--dbpath", $tmp_db, );
-    ($?) && 
-      die("$0: System error: $! \n");
-    
-    open(README, ">$tmp_db/README") ||
-      die("Could not open $tmp_db/README. $! \n");
-    print README <<EOF;
-#
-# This directory is updated daily by a cron job. 
-# program: $0
-# version: $VERSION
-# updated ran at: $LOCALTIME
-
-# This directory contains an rpm database which has been loaded with
-# the most recent version of every package in our archive.  It is
-# intended to be used for queries to find packages. Example:
-
-# rpm --dbpath /net/master-mm/export/rpms/redhat/rpmfulldb 
-#      -q --whatprovides 'java(com.iname.site.context.LoginContext)'
-
-
-# rpm --dbpath /net/master-mm/export/rpms/redhat/rpmfulldb 
-#      -qf /usr/local/bin/rpmdiff
-
-
-EOF
-    close(README) ||
-      die("Could not close $tmp_db/README. $! \n");
-  }
-
-  # load the database with the packages we want.
-
-  foreach $pkg_name (keys %BY_NAME) {
-    foreach $branch (keys %{ $BY_NAME{$pkg_name} }) {
-      $pkg_file = get_latest_fqn($pkg_name, $branch)->{'rpm_file'};
-
-      system("rpm", "-i", "--nodeps", "--noscripts", "--justdb", 
-            "--dbpath", $tmp_db, 
-            $pkg_file);
-      ($?) && 
-       die("$0: System error: $! \n");
-    }
-  }
-
-  # do the update as close to atomically as is practicale.
-
-  system("rm", "-rf", $RPM_DB_DIR,);
-  ($?) && 
-    die("$0: System error: $! \n");
-  
-  rename($tmp_db, $RPM_DB_DIR,) || 
-    die("Could not rename file: $tmp_db => $RPM_DB_DIR. $! \n");
-
-  return ;
-}
-
-
-
-
-
-#       Main        
-{
-  set_static_vars();
-  get_env();
-
-  my %by_name=parse_package_names();
-  create_new_db(%by_name);
-
-  exit 0;
-}
-
diff --git a/scripts/rpmsync b/scripts/rpmsync
deleted file mode 100644 (file)
index 528c15e..0000000
+++ /dev/null
@@ -1,1625 +0,0 @@
-#!/usr/bin/perl
-
-
-# rpmsync - written by Ken Estes kestes@staff.mail.com
-
-# $Revision: 1.2 $
-# $Date: 2001/09/15 13:49:39 $
-# $Author: jbj $
-# $Source: /home/boston/jkeating/rpmcvs/cvs/devel/rpm/scripts/rpmsync,v $
-# $Name:  $
-
-use Fcntl;
-use File::Basename;
-use Getopt::Long;
-use IO::Socket;
-use IPC::Open3;
-use POSIX;
-use Symbol;
-use Sys::Hostname;
-use Sys::Syslog;
-
-
-# An rpm_package is a hash of:
-#     $package{'fqn'}="perl-5.00502-3"
-#     $package{'rpm_file'}="$RPMS_DIR/".
-#                "./sparc/perl-5.00502-3.solaris2.6-sparc.rpm"
-#     $package{'srpm_file'}="$SRPMS_DIR/".
-#                           "./perl-5.00502-3.src.rpm"
-#     $package{'name'}="perl"
-#     $package{'version'}="5.00502"
-#     $package{'release'}="3"
-
-# fqn is "fully qualified name"
-
-# The state of the system is a orderd list (topologically sorted by
-# dependendencies) of fqn's. The list may contain additional RPM flags
-# to be used on a particular list entry.
-
-# we are going to compare two states the actual state of the machine
-# %INSTALLED_BY_NAME this is indexed by package names and gives a list
-# of rpm_package objects which are installed currently on the machine.
-# Each entry is a list of the packages with the given name which are
-# installed.
-
-# The keys of the hash %LISTED_BY_FQN are the fqn's which are listed
-# in the manifest package list.
-
-
-# Here are a bunch of interesting RPM error messages:
-# rpm: --oldpackage may only be used during upgrades 
-
-sub usage {
-my $usage = <<"EOF";
-Usage:
-       $PROGRAM --update | --force |--force_and_verify | --rollback | --test
-               [--log_file file] [--manifest_file file]
-               [--script_file file]
-               [--skip_check] [--verbose] [--silent] 
-               [--help] [--version]
-
-
-Required Aguments:
-
-
---test         test what an update would change.  Compare the installed 
-               packges with the packages listed in the manifest file.  
-               This option will show what commands would be executed if 
-               we were to run an update without actually changing anything.
-               When an --update finishes it automatically runs --test 
-               and exits with error if there is any work not
-               completed.  This command has nothing to do with the 
-               '--verify' (-V) option to rpm.
-
---update       Update the packages installed on the system with the newer 
-               versions listed in the manifest file.  This will not reinstall
-               packages which are listed and already installed but are 
-               corrupted or were installed with the wrong set of arguments.  
-               It will erase packages which are installed on the system but 
-               not listed in the package list.  All packages must have a 
-               later version number then the previous packages.
-
---rollback     Rollback a previously installed update.  This command 
-               requires that the pervious manfest file be reinstalled.  All 
-               update commands are run in the reverse order from the --update,
-               this ensures that the packages are undone exactly as they were
-               installed.
-
---force                Ensure that the packages installed on the machine are 
-               exactly those packages listed in the manifest file and that no
-               installed files are currpted.  First each package in the 
-               manifest file is installed using --force (even if it is already
-               installed) then each package which is installed but not listed
-               in the manifest list is removed from the machine.
-
---force_and_verify  This command behaves as if you ran this program first with
-                    --force then ran rpm -Va.  The program will exit with 
-                    error if either of these steps fail.  This allows you to 
-                    perform unsafe operations (changing the name of a package
-                    in a manifest list via a force) in a relatively safe 
-                    manner.
-
-
-Optional Aguments:
-
-
---rpm_args     Specify additional arguments to pass to rpm for all package
-               operations.  This option is used by both the update and erase
-               commands.  This option can appear more then once on the
-               command line and the concatination of all options will be sent
-               to rpm.  This option should not be need somtimes it is useful,
-               in an emergency, to install packges with broken dependencies
-               or packages with duplicate files.  This is a quick way of 
-               getting the --nodeps and --force and any other needed 
-               arguments to rpm. 
-
---log_file     specify a log file different from the default:
-                        $LOG_FILE
-
---manifest_file        specify a manifest file different from the default:
-                        $MANIFEST_FILE
-
---skip_check   turn off internal sanity checks used by this script.  This
-               is not related to the --check option or to rpm -V.
-
---script_file   do not run any commands on this machine instead create a 
-               shell file which can be used to install all the packages 
-               in the manifest.  This script is useful during machine 
-               creation.  To use this option you must specify 
-               --update or --force.
-
---verbose      provide verbose output, only useful for debugging 
-               this program.
-
---silent       Do not send any output to stdout/stderr messages will 
-               still go to $LOG_FILE or syslog
-
---help         show this usage page.
-
---version      print the version number of this program.
-
-
-This program is used to ensure that the RPM packages installed on a
-system match the list of packages in a manifest.  The package list
-looks like the output of 'rpm -qa' but is required to be in a
-tolological order.  If special flags are needed for particular
-packages (like --nodeps or --force or --oldpackage or --noscriopts or
---root <dir> or --relocate oldpath=newpath or --rcfile <file>) they
-can be added on the line after package name with a space separating
-the two.  Shell style comments (starting with \# and lasting till the
-next \\n) are legal in the package list.  The default package list
-file is $MANIFEST_FILE.
-
-It is expected that most updates will use the --update command with
---force saved for those rare situations where the machine is known to
-be in a very bad state or there are installed packages which are
-currupted.
-
-
-
-Examples:
-
-
-rpmsync --help
-rpmsync --version
-rpmsync --update
-rpmsync --force
-rpmsync --test
-
-rpmsync --force --rpm_args nodeps
-
-rpmsync --update --rpm_args nodeps  --rpm_args noscripts \\
-       --skip_check --verbose
-
-rpmsync --update --script_file /tmp/rpmpkg.bootstrap.sh
-
-EOF
-
-print $usage;
-exit 0;
-}
-
-
-
-
-
-sub new_rpm_package {
-
-# An rpm_package is a hash of:
-#     $package{'fqn'}="perl-5.00502-3"
-#     $package{'rpm_file'}="$RPMS_DIR/".
-#                "./sparc/perl-5.00502-3.solaris2.6-sparc.rpm"
-#     $package{'srpm_file'}="$SRPMS_DIR/".
-#                           "./perl-5.00502-3.src.rpm"
-#     $package{'name'}="perl"
-#     $package{'version'}="5.00502"
-#     $package{'release'}="3"
-
-  my ($fqn, $error_context) = @_;
-  my $error = '';  
-  my($name, $version, $release) = main::parse_fqn($fqn, $error_context);
-
-  my ($rpm_file, $install_script_file) = 
-    main::which_binary_package_path($name, $version, $release);
-  ($rpm_file) ||
-    ($error .= "Could not find binary file for package: '$fqn'\n");
-  
-#  my ($srpm_file) = main::which_source_package_path($name, $version, $release);
-#  ($srpm_file) || 
-#    ($error .= "Could not find source file for package: '$fqn'\n");
-  
-  if ($error) {
-    if (!$SKIP_CHECK) {
-      die($error);
-    } else {
-      warn($error);
-    }
-  }
-
-  my ($package) = ();
-  
-  $package->{'fqn'}=$fqn;
-  $package->{'name'}=$name;
-  $package->{'version'}=$version;
-  $package->{'release'}=$release;
-  $package->{'rpm_file'}=$rpm_file;
-  $package->{'install_script_file'}=$install_script_file;
-  $package->{'srpm_file'}=$srpm_file;
-  
-  return bless($package, $class);
-}
-
-
-sub is_installed {
-
-# returns true iff the package passed in is in fact installed on the
-# machine.
-
-  my ($required_pkg) = @_;
-  my $installed_pkgs = $INSTALLED_BY_NAME{$required_pkg->{'name'}};
-  # look for the right version/release of this package
-  foreach $installed_pkg ( @{ $installed_pkgs } ) {
-    ($installed_pkg->{'fqn'} eq $required_pkg->{'fqn'}) && 
-      return 1;
-  }
-  
-  return 0;
-}
-
-
-
-sub clean_up {
-
-# any cleanup actions to be performed on exit should go here
-
-  closelog();
-  close(STDERR);
-  close(STDOUT);
-
-  return 1;
-} # clean_up
-
-
-
-sub fatal_error {
-  my  @error = @_;
-
-  foreach $_ (split("\n",join('',@error))) {
-    (!$SILENT) && print STDERR ("$PROGRAM (fatal): $_\n");
-    print LOG ("[$LOCALTIME] (fatal): $_\n");
-  }
-  syslog('crit', "fatal error at: ".localtime(time()));
-  clean_up();
-  die("[$LOCALTIME] $PROGRAM: fatal error at: ".localtime(time()) );
-}
-
-
-sub log_error {
-  my  @error = @_;
-
-  foreach $_ (split("\n",join('',@error))) {
-    (!$SILENT) && print STDERR ("$PROGRAM (warn): $_\n");
-    print LOG ("[$LOCALTIME] (warn): $_\n");
-  }
-
-}
-
-
-sub info_error {
-  my  @error = @_;
-
-  foreach $_ (split("\n",join('',@error))) {
-    (!$SILENT) && print STDERR ("$PROGRAM (info): $_\n");
-    print LOG ("[$LOCALTIME] (info): $_\n");
-  }
-
-}
-
-
-sub which_binary_package_path {
-
-# this line will depend on the 'rpmfilename: ' in the rpmrc file in
-# the future we will need to try 'noos' as well as noarch, it is not
-# implemented in our RPM version.
-
-  my ($name, $version, $release) = @_;
-  
-  foreach $dir ( split(':', $SEARCH_PATH) ) {
-    foreach $arch ($ARCH, 'noarch', '') {
-      foreach $os ($OS, 'noos', '') {
-       
-    my $filename = '';
-    my $install_script_filename = '';
-    
-    $filename = eval "return \"$BINARY_PACKAGE_FILE_PAT\";";
-    $install_script_filename = $filename;
-    $install_script_filename =~ s/^$dir/\$REPOSITORY/;
-    ( -f $filename ) && ( -s $filename ) && ( -r $filename ) 
-      && return ($filename, $install_script_filename);    
-    ;
-  }
-    }
-  } 
-  return ;
-}
-
-
-sub which_source_package_path {
-
-# Each binary rpm package encodes the name of the source file which it
-# came from.  This is important since some sources generate several
-# binary packages (emacs, vim, perl), given one of those packages it
-# would be hard to find the source file name just doing regular
-# expressions on the name.  We extract this information using an rpm
-# query.
-
-  my ($name, $version, $release) = @_;
-  
-  $binary_package_file =  (which_binary_package_path(@_))[0];
-
-  $binary_package_file || return ;
-
-  # this command would be better
-  # rpm -qp --queryformat '[%{SOURCERPM}\n]' 
-
-  my ($wait_status, $log_out, $log_err) = 
-    system3('cmd_vec' => [$SYS_CMDS{'rpm'}, '-qip', $binary_package_file],);
-
-  my ($source_rpm_file) = grep (/Source RPM: /, split(/\n+/, $log_out ));
-  
-  ( $source_rpm_file =~ m/Source RPM:\s([-.\w]+)/ ) ||
-    return ;
-  
-  $source_rpm_file = $1;
-
-  foreach $dir ( split(':', $SEARCH_PATH) ) {
-    my $filename = '';
-    
-    $filename = eval "return \"$SOURCE_PACKAGE_FILE_PAT\";";
-    ( -f $filename ) && ( -s $filename ) && ( -r $filename ) 
-      && return $filename;    
-  }
-  
-  return ;
-}
-
-
-sub parse_fqn {
-
-  # This is difficult to parse since some hyphens are significant and
-  # others are not, some packages have alphabetic characters in the
-  # version number. 
-
-  # Also remember that the format of the file is dependent on how RPM
-  # is configured so this may not be portable to all RPM users.
-  my ($fqn, $error_context) = @_;
-
-  (!("$fqn" =~ m/^$PACKAGE_PAT$/)) &&
-    die("package name '$fqn' is not in a valid format, $error_context");
-  
-  return ($1, $2, $3);
-}
-
-
-
-sub system3 {
-
-# Lanuch a new child and wait for it to die.  This is like a call to
-# system but we get the stdout and stderr in addition to $?.
-
-# call the function like this 
-
-# my  ($wait_status, $log_out, $log_err) = 
-# open3(
-#     'cmd_vec' => [],
-#     'stdin_str' => '',
-#     'log_cmds'=> '';
-#     'ingore_error' => ''
-#      );
-
-# cmd_vec is a command to run in execv format.  It is a list not a
-# string since we want the safe version of exec
-
-# stdin_str is a string to pass on the standard in to the child program.
-
-# If log_cmds is set then the command will be sent to syslog and the
-# log file.  All output from the command is also sent to the log file.
-
-# open3 signals all errors through a die so will I.  If the command
-# exits with nonzero wait_status then system3 calls die.  This feature
-# can be turned of fby setting ignore_errors.
-
-# the system3 function returns:
-
-# wait_status: the wait_status of the child process
-
-# log_out: the stdout that the child process wrote.
-
-# log_err: the stderr the child process wrote.
-
-  my (%args) = @_;
-
-  my ($log_cmds, $ignore_error, $cmd_ref, $stdin) = @_;
-
-#  if ( ! ( (-x $args{'cmd_vec'}->[0]) && (-f $args{'cmd_vec'}->[0]) ) ) {
-#    die ("Command not exectuable: '$args{'cmd_vec'}->[0]',\n");
-#  }      
-  
-  my $info ="executing: '@{ $args{'cmd_vec'} }',\n";
-  
-  if ($args{'log_cmds'} || ($VERBOSE) ) {
-    warn($info);
-  }
-  
-  # start the process
-  
-  my $fh_in  = gensym(); 
-  my $fh_out = gensym(); 
-  my $fh_err = gensym(); 
-
-  ($fh_in && $fh_out && $fh_err) || 
-    die ("Could not create new symbol, 'gensym()' object.\n");
-  
-  my $child_pid = IPC::Open3::open3(
-                                   $fh_in,
-                                   $fh_out,
-                                   $fh_err,
-                                   @{$args{'cmd_vec'}}
-                                   );
-  
-  # this check should be redundant but better safe then sorry
-  
-  ($child_pid) || 
-      die ("Open3() did not start: '@{$cmd}'. $!\n");
-  
-    if ($args{'stdin_str'}) {
-
-      # we should not have a deadlock with this syswrite since this
-      # process writes and then the child reads.  It is hard to
-      # imagine how this could fail and the machine still be in a
-      # reasonable shape.
-
-      my $write_len = length($args{'stdin_str'})+1;
-      my $rc = syswrite ($fh_in, 
-                        $args{'stdin_str'}."\n", $write_len);
-      
-      (defined ($rc) && ( $rc == $write_len ) ) ||
-       die("Syswrite to child stdin failed. ".
-           "Could not write: '$write_len' ".
-           "only wrote: '$rc' characters. ".
-           "Trying to write to stdin: '$stdin'. ".
-           ": $!\n");
-    }
-
-
-  close($fh_in) || 
-    die("Could not close child stdin: $!\n");
-  
-  main::nonblock($fh_out);
-  main::nonblock($fh_err);
-  
-  my $log_out = undef;
-  my $log_err = undef; 
-
-  my $reaped_pid = -1;
-  my $wait_status = 0;
-
-  # wait for child to die, but keep clearing out stdout and stderr
-  # buffers for process so we do not deadlock.  
-
-  # WE seem to be loosing childrens signals occasionally, so actively
-  # check if the child is alive.
-
-  while ($reaped_pid != $child_pid) {    
-
-    sleep(1);
-    
-    $reaped_pid = waitpid(-1, &WNOHANG | POSIX::WUNTRACED);
-    
-    if ($reaped_pid == $child_pid) {
-      
-      ($wait_status = $?);
-      
-      # child signaled but did not exit
-      # set to the same pid as 'no child waiting'
-      
-      (WIFSTOPPED($wait_status)) &&
-       ($reaped_pid = -1);
-    }
-    
-    my $data_out = '';
-    my $data_err = '';
-    my $rc = '';
-    
-    # do the reading after reaping so we are sure that we exit the
-    # loop only after draining the sockets.
-    
-    # I do not think we need to log $rc errors as they happen
-    # frequently and nothing seems wrong:
-    #      Resource temporarily unavailable file_handle
-    
-    do {
-      $rc = sysread($fh_out, $data_out, POSIX::BUFSIZ, 0);
-      $log_out .= $data_out;
-    } until ($rc <= 0);
-
-    do {
-      $rc = sysread($fh_err, $data_err, POSIX::BUFSIZ, 0);
-      $log_err .= $data_err;
-    } until ($rc <= 0);
-
-    ($data_err) && warn($data_err);   
-
-  } # while pid
-
-  # the reads are at the bottom of the loop so we do not need to do
-  # any more reading of the filehandles.
-
-  close($fh_out) || 
-      &$log_error("Could not close child stdout: $!\n");    
-  
-  close($fh_err) || 
-      &$log_error("Could not close child stderr: $!\n");
-  
-  my @info = (
-             "command results: \n",
-             "  wait_status: $wait_status\n",
-             "  stdout: '\n",
-             # turn string into a list and indent each element
-             (map {"    $_\n"} (split /\n+/, $log_out)),
-             "  stdout: '\n",
-             "  stderr: '\n",
-             # turn string into a list and indent each element
-             (map {"    $_\n"} (split /\n+/, $log_err)),
-             "  stderr: '\n",
-            );
-  
-  if ( (!$args{'ignore_error'}) && ($wait_status) ) {
-    print "\n\n";
-    die("Cmd exited with error:\n",
-       "\t@{$args{'cmd_vec'}}\n",
-       @info);
-  }
-
-  if ( ($VERBOSE) ||
-       ( ($args{'log_cmds'})  &&
-        ($wait_status || $log_out || $log_err) ) ) {
-    warn(@info);
-  }
-  
-  return ($wait_status, $log_out, $log_err);
-} # system3
-
-
-sub get_rpm_info {
-  my (@rpm_args) = @_;
-
-  update_time();
-  my (@rpm_info) = '';
-
-  my ($wait_status, $log_out, $log_err) = 
-    system3('cmd_vec' => [$SYS_CMDS{'rpm'}, '-qa'],);
-
-  (@rpm_info) = split(/\n+/, $log_out);
-
-  %INSTALLED_BY_NAME=();
-  my $lineno =0;
-  foreach $fqn (@rpm_info) {
-    $lineno++;
-    chomp $fqn;
-    my ($pkg) = new_rpm_package($fqn, "System Info lineno: $lineno");
-    push @{ $INSTALLED_BY_NAME{$pkg->{'name'}} }, $pkg;
-  }
-  
-  return ; 
-}
-
-
-sub remove_extra_packages {
-
-  # arguments are not used but allowed for symetry with other
-  # functions
-
-  my(@pkg_list) = @_;
-  
-  get_rpm_info();
-
-  # Remove packages installed on the machine but not not in the
-  # manifest.  This is important as we sometimes change the package
-  # names while upgrading them and if we did not remove all packages
-  # which are not listed these packages would remain.
-
-  # We also need to remove old versions of just upgraded packages.
-  # Currently we have a problem, some old packages are not being
-  # removed when we do an rpm update.  Since we are currently only
-  # installing one version of each package, remove all other versions
-  # then what was required.
-
-
-  # We would like to remove all packages in reverse topological order.
-  # I have no way of finding out what that order is, so I use a single
-  # command which removes all pacakges.  RPM will figure out the
-  # correct order at run time.  This will cause us to reach the
-  # command line limit if the list of packages to remove is large
-  # enough.
-
-  my @extra_packages = ();
-  
-  foreach $pkgname ( keys %INSTALLED_BY_NAME ) { 
-    foreach $pkg (@{ $INSTALLED_BY_NAME{$pkgname} }) {
-      
-      ($LISTED_BY_FQN{$pkg->{'fqn'}}) && next;
-      
-      push @extra_packages, $pkg->{'fqn'};
-    }
-  }
-
-  if (@extra_packages) {
-    my ($wait_status, $log_out, $log_err) = 
-      system3(
-             'cmd_vec' => [$SYS_CMDS{'rpm'}, '-e', @RPM_ARGS,
-                         @extra_packages],
-             'log_cmds'=> 1,
-            );
-  }
-
-  return ;
-}
-
-
-# update the installation with packages
-
-sub update_packages {
-  my(@pkg_list) = @_;
-  
-  get_rpm_info();
-
-  
-  # first just test and see if this upgrade could work.
-  # this may blowup some OS maximal argument size limit
-
-#  my ($wait_status, $log_out, $log_err) = 
-#    system3(
-#          'cmd_vec' => [$SYS_CMDS{'rpm'}, "--test", '-U', 
-#                        @RPM_ARGS,
-#                        @upgrade_list],
-#          'log_cmds'=> 1,
-#         );
-  
-  
-  foreach $pkg (@pkg_list) {
-    
-    (is_installed($pkg)) && next;
-    
-    my ($wait_status, $log_out, $log_err) = 
-      system3(
-             'cmd_vec' => [ 
-                           $SYS_CMDS{'rpm'}, '-U',
-                           @{ $pkg->{'rpm_flags'} }, @RPM_ARGS, 
-                           $pkg->{'rpm_file'} ],
-             'log_cmds'=> 1,
-            );
-  } # each $fqn
-  
-  return ;
-} # update
-
-
-
-# rollback the previous update installation
-
-sub rollback_packages {
-  my(@pkg_list) = @_;
-  
-  get_rpm_info();
-
-  
-  # first just test and see if this upgrade could work.
-  # this may blowup some OS maximal argument size limit
-
-#  my ($wait_status, $log_out, $log_err) = 
-#    system3(
-#          'cmd_vec' => [$SYS_CMDS{'rpm'}, "--test", '-U', 
-#                        @RPM_ARGS,
-#                        @upgrade_list],
-#          'log_cmds'=> 1,
-#         );
-  
-  
-  foreach $pkg (reverse @pkg_list) {
-
-    (is_installed($pkg)) && next;
-    
-    my ($wait_status, $log_out, $log_err) = 
-      system3(
-             'cmd_vec' => [
-                           $SYS_CMDS{'rpm'}, '-U', '--oldpackage',
-                           @{ $pkg->{'rpm_flags'} }, @RPM_ARGS,
-                           $pkg->{'rpm_file'}
-                          ],
-             'log_cmds'=> 1,
-            );
-    
-  } # each $fqn
-
-  return ;
-} # rollback
-
-
-# force ALL the packages to be reinstalled
-
-sub force_packages {
-  my(@pkg_list) = @_;
-
-  # force all the packages in the list to be reinstalled
-
-  # first just test and see if this upgrade could work.
-  # this may blowup some maximal argument size
-  
-#  my ($wait_status, $log_out, $log_err) = 
-#    system3(
-#          'cmd_vec' => [$SYS_CMDS{'rpm'}, "--test", '-U', '--force', 
-#                        @pkg_list],
-#          'log_cmds'=> 1,
-#         );
-  
-  
-  foreach $pkg (@pkg_list) {
-    my ($wait_status, $log_out, $log_err) = 
-      system3(
-             'cmd_vec' => [
-                           $SYS_CMDS{'rpm'}, '-U', '--force', '--oldpackage', 
-                           @{ $pkg->{'rpm_flags'} }, @RPM_ARGS,
-                           $pkg->{rpm_file}
-                          ],
-             'log_cmds'=> 1,
-            );
-  } 
-  
-  return ;
-} # force 
-
-
-
-# check that the verify command exits without error.
-
-sub verify_packages {
-
-  my ($wait_status, $log_out, $log_err) = 
-    system3(
-           'cmd_vec' => [
-                         $SYS_CMDS{'rpm'}, '-Va',
-                        ],
-           'log_cmds'=> 1,
-          );
-
-  return ;
-} # verify
-
-
-
-sub create_scriptfile {
-  my(@pkg_list) = @_;
-
-  my $num_pkgs = scalar(@pkg_list);
-
-  if ($FORCE) {
-    @args = ('-U', '--force');    
-  } elsif ($UPDATE) {
-    @args = ('-U', );
-  } else {
-    die("Scripts can only be created for --update or --force")
-  }
-
-  my $out = '';
-
-  $out =<<EOF
-
-# This file automatically generated by program: $0
-# version: $main::VERSION
-# on host: $main::HOSTNAME
-# localtime: $main::LOCALTIME
-# 
-# This install file automatically installs
-#    manifest file $MANIFEST_FILE
-
-    $SYS_CMDS{'rpm'} --rebuilddb
-
-EOF
-;
-
-  foreach $pkg (@pkg_list) {
-    my @cmd = (
-              $SYS_CMDS{'rpm'}, @args, 
-              @{ $pkg->{'rpm_flags'} }, @RPM_ARGS,
-              $pkg->{install_script_file}
-             );
-
-    $out .=<<EOF;
-
-    @cmd
-    if [ \$\? \-ne 0 ]; then
-      echo \>\&2 "\$0: Error running: @cmd"
-      exit 1;
-    fi
-
-EOF
-
-  } 
-
-  
-  $out .=<<EOF;
-
-  # check that the install for accuracy
-
-  $SYS_CMDS{'rpm'} --rebuilddb;
-
-  $SYS_CMDS{'rpm'} -Va;
-  if [ \$\? \-ne 0 ]; then
-    echo \>\&2 "\$0: Error installing Packages";
-    echo \>\&2 "\$0: 'rpm -Va' reports errors";
-    exit 1;
-  fi
-
-    num_installed_pkgs=\` $SYS_CMDS{'rpm'} -qa | wc \-\l | sed "s/[^0-9]//g" \`;
-    if [ \$num_installed_pkgs \-ne $num_pkgs ]; then
-      echo \>\&2 "\$0: Error installing Packages";
-      echo \>\&2 "\$0: rpm -qa gives \$num_installed_pkgs packages installed";
-      echo \>\&2 "\$0: expected $num_pkgs installed";
-      exit 1;
-    fi
-
-   exit 0;
-
-EOF
-
-  return $out;
-} # create_script
-
-
-
-
-# check what running with --update would do.  If I were to write a
-# check_rollback_packages the output would be similar but the packge
-# update order would be reversed.
-
-sub test_update {
-  my(@pkg_list) = @_;
-  
-  get_rpm_info();
-
-  # find what we will upgrade
-  
-  foreach $pkg (@pkg_list) {
-    is_installed($pkg) && next;
-    push @out, "out of sync, must update: $pkg->{'fqn'}\n";
-  } # each $fqn
-  
-
-  # remove old versions of what we installed.
-
-  foreach $pkgname ( keys %INSTALLED_BY_NAME ) { 
-    foreach $pkg (@{ $INSTALLED_BY_NAME{$pkgname} }) {
-
-      ($LISTED_BY_FQN{$pkg->{'fqn'}}) && next;
-
-      push @out, "out of sync, must delete: $pkg->{'fqn'}\n";
-    }
-  }
-
-  return @out;
-} # test_update
-
-
-
-sub nonblock {
-  
-    # unbuffer a fh so we can select on it
-    
-    my ($fh) = shift;
-    my $rc = '';
-    my $flags = '';
-    
-    $flags = fcntl($fh, F_GETFL, 0) ||
-       fatal_error("Could not get flags of socket: $fh : $!\n");
-    
-    $flags |= O_NONBLOCK;
-    
-    $rc = fcntl($fh, F_SETFL, $flags) ||
-       fatal_error("Could not set flags of socket: $fh : $!\n");
-    
-    return 1;
-}
-
-
-
-sub mkdir_R {
-# a recusive mkdir function
-
-  my ($dir, $mode) = @_;
-  my @dir = split('/', $dir);
-
-  foreach $i (0..$#dir) {
-
-    my ($dir) = join('/', @dir[0..$i]);
-    ($dir) || next;
-
-      (-d $dir) ||
-       mkdir($dir, $mode) ||
-         die("Could not mkdir: $dir, for writing: $!\n");
-  }
-  
-  return ;
-}
-
-
-sub chk_system_config {
-  # refuse to start if the system is in a dangerous state
-
-  
-  @problem = ();
-
-  # this is just a placeholder for now
-  # checks go here and failures add to @problem
-
-  return @problem;
-}
-
-
-# park a bunch of unused function here for future scripts
-
-
-sub run_local_rcscripts {
-  my @script_args = @_;
-
-  (-d $LOCAL_RC2_DIR) || return ;
-
-  my @rc_files = ();
-
-  opendir(DIR, "$LOCAL_RC2_DIR") ||
-    die("Could not opendir: '$LOCAL_RC2_DIR': $!\n");
-
-  @rc_files = grep(/^S/, readdir(DIR));
-
-  closedir(DIR) ||
-    die("Could not closedir : '$LOCAL_RC2_DIR': $!\n");
-  
-  ( scalar(@rc_files) > 0 ) || return ;
-
-  if ($script_args[0] eq 'start') {
-    @rc_files =         sort @rc_files;
-  }else{
-    @rc_files = reverse sort @rc_files;
-  }
-
-  foreach $script (@rc_file) {
-    my ($wait_status, $log_out, $log_err) = 
-      system3(
-             'cmd_vec' => ["$LOCAL_RC2_DIR/$script", @script_args],
-             'log_cmds'=> 1,
-            );
-  }
-
-  return ;
-}
-
-
-sub update_package_list {
-
-  my $update_script = '';
-  
-  # learn what updates we wish to make
-
-  {
-    open(FILELIST, "<$BUILD_FILE") ||
-      die("Could not open build file: '$BUILD_FILE': $!\n");
-
-    my $lineno = 0;
-    while ($fqn=<FILELIST>) {
-      $lineno++;
-      $fqn =~ s/\#.*$//;
-      $fqn =~ s/\s+//g;
-
-      # untaint the input. As a security precaution only allow a few
-      # "good characters" in the package name, or our eval of the
-      # update_script might do some really unexpected things.
-
-      if ($fqn =~ m/([-_.a-zA-Z0-9]+)/) {
-       my $pkg = new_rpm_package($1, "file: $BUILD_FILE lineno: $lineno");
-       $update_script .= "\$fqn =~ s/^$pkg->{'name'}-\\d.*\$/$pkg->{'fqn'}/;\n"
-      }
-    }
-    
-    close(FILELIST) ||
-      die("Could not close build file: '$BUILD_FILE': $!\n");
-  }
-
-  # Perform the modifications to the file list
-
-  {
-
-# co -l $MANIFEST_FILE
-
-    rename($MANIFEST_FILE, $MANIFEST_FILE.".bak") ||
-      die("Could not rename ".
-         "file: $MANIFEST_FILE, ${PACKAGE_FILE}.bak: $!\n");
-
-    open(FILELIST_IN, "<${PACKAGE_FILE}.bak") ||
-      die("Could not open for writing ".
-         "packagefile: '${PACKAGE_FILE}.bak': $!\n");
-
-    open(FILELIST_OUT, ">$MANIFEST_FILE") ||
-      die("Could not read from packagefile: '${PACKAGE_FILE}.bak': $!\n");
-    
-    while ($fqn=<FILELIST_IN>) {
-      eval $update_script;
-      print FILELIST_OUT $fqn;
-    }
-    
-    close(FILELIST_OUT) ||
-      die("Could not close packagefile: '$MANIFEST_FILE': $!\n");
-
-    close(FILELIST_IN) ||
-      die("Could not close packagefile: '${PACKAGE_FILE}.bak': $!\n");
-
-# ci -u $MANIFEST_FILE
-
-  }
-
-  return ;
-}
-
-
-sub include_file {
-  my ($filename) = @_;
-  my (@inc) = ();
-  my $fh = gensym();  
-  
-  (-f "$INCLUDE_DIR/$filename") ||
-    die("include file: $INCLUDE_DIR/$filename, \n".
-       "found while expanding: $BUILD_FILE, does not exist.\n");
-  
-  open($fh, ">$INCLUDE_DIR/$filename") ||
-    die("Could not open include file: '$INCLUDE_DIR/$filename': $!\n");
-  
-  while (defined($line = <$fh>) ) {
-    
-    if ($line =~ m/\w*\$([-_.a-zA-Z0-9]+)/) {
-      push @inc, include_file($line);
-    } else {
-      push @inc, $line;
-    }
-    
-  }
-  
-  close($fh) ||
-    die("Could not close include file: '$INCLUDE_DIR/$filename': $!\n");
-  
-  return @inc;
-}
-
-
-sub expand_package_list {
-
-  my $update_script = '';
-  
-  # learn what updates we wish to make
-
-    open(INFILE, "<$BUILD_FILE") ||
-      die("Could not open build file: '$BUILD_FILE': $!\n");
-    
-    open(OUTFILE, ">$TMP_FILE") ||
-      die("Could not open tmp file: '$TMP_FILE': $!\n");
-    
-    while ($line=<INFILE>) {
-
-      # untaint the input. As a security precaution only allow a few
-      # "good characters" in the package name.
-
-      if ($line =~ m/\w*\$([-_.a-zA-Z0-9]+)/) {
-       print include_file($1);
-      } else {
-       print $line;
-      }
-
-    }
-    
-    close(INFILE) ||
-      die("Could not close build file: '$BUILD_FILE': $!\n");
-
-    close(OUTFILE) ||
-      die("Could not close tmp file: '$TMP_FILE': $!\n");
-
-  return ;
-}
-
-
-sub update_time {
-
-  $TIME = time();
-  $LOCALTIME = localtime($main::TIME);
-
-  return ;
-}
-
-
-
-sub set_static_vars {
-
-# This functions sets all the static variables which are often
-# configuration parameters.  Since it only sets variables to static
-# quantites it can not fail at run time. Some of these variables are
-# adjusted by parse_args() but asside from that none of these
-# variables are ever written to. All global variables are defined here
-# so we have a list of them and a comment of what they are for.
-  
-  @ORIG_ARGV = @ARGV;
-  
-  $INCLUDE_DIR = "";
-  $TMP_FILE = "";
-
-  $LOG_FILE="/var/log/rpmsync/log";
-  $LOCK_FILE="/var/lock/rpmsync";
-  $MANIFEST_FILE="/usr/local/etc/rpmpkg.manifest";
-
-  $FTP_PATH='ftp://machine.iname.net/pub/redhat';
-  $SEARCH_PATH = (
-                 # the old hard mounted master-mm package repository
-                 '/net/master-mm/export/rpms/redhat'.
-
-                 # the new auto mounted master-mm package repository
-                 ':/network/master-mm.mail.com/export/rpms/redhat'.
-
-                 # look in obvious places on the machine for packages
-                 ':/tmp'.
-
-                 ':/usr/local/src/redhat/noarch'.
-                 ':/usr/local/src/redhat/sparc'.
-                 ':/usr/local/src/redhat/i386'.
-
-                 # for testing: this is how the current build machine
-                 # is set up.
-
-                 ':/data1/archive/redhat');
-
-  $VERSION = ( qw$Revision: 1.2 $ )[1];
-
-  $VERBOSE=0;
-  $SKIP_CHECK=0;
-
-  # The pattern for fqn.  remember that the format of the file is
-  # dependent on how RPM is configured so this may not be portable to
-  # all RPM users.
-
-  $BINARY_PACKAGE_FILE_PAT = ('$dir/RPMS/$arch/'.
-                             '$name-$version-$release.$os-$arch.rpm');
-  $SOURCE_PACKAGE_FILE_PAT = '$dir/SRPMS/$source_rpm_file';
-
-  # The pattern for parsing fqn into ($name, $version, $release).
-  # This is difficult to parse since some hyphens are significant and
-  # others are not, some packages have alphabetic characters in the
-  # version number.
-
-  $PACKAGE_PAT ='(.*)-([^-]+)-([^-]+)';
-
-  # set a known path
-  
-  $ENV{'PATH'}= (
-                '/usr/bin'.
-                ':/data/gnu/bin'.
-                ':/data/local/bin'.
-                ':/data/devel/bin'.
-                ':/usr/local/bin'.
-                ':/bin'.
-                '');
-  
-  
-  # taint perl requires we clean up these bad environmental variables.
-  
-  delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
-  
-  %SYS_CMDS = (
-              'hostname' => 'hostname',
-              'rpm' => 'rpm',
-              'uname' => 'uname',
-             );
-
-  $SIG{'CHLD'} = 'DEFAULT';
-
-  return ;
-}
-
-
-sub get_env {
-
-# this function sets variables similar to set_static variables.  This
-# function may fail only if the OS is in a very strange state.  after
-# we leave this function we should be all set up to give good error
-# handling, should things fail.
-
-  $| = 1;
-  $PROGRAM = basename($0);
-  $PID = $$; 
-  $TIME = time();
-  $LOCALTIME = localtime($main::TIME); 
-
-  $START_TIME = $TIME;
-  $UID = $<;
-
-  update_time();
-  my ($wait_status, $log_out, $log_err) = 
-    system3('cmd_vec' => ['hostname'],);
-
-  $HOSTNAME = $log_out;
-  chomp $HOSTNAME;
-
-  my ($wait_status, $log_out, $log_err) = 
-    system3('cmd_vec' => ['uname', '-a'],);
-  $uname = $log_out;
-
-  ( $uname =~ m/sparc/ ) && ( $ARCH="sparc");
-  ( $uname =~ m/i\d86/ ) && ( $ARCH="i386" );
-  
-  $osname = $^O;
-  ( $osname =~ m/solaris/ ) && ( $OS="solaris2.6" );
-  ( $osname =~ m/linux/ )   && ( $OS="linux" );
-  
-  return ;
-} # get_env
-
-
-sub parse_args {
-
-  Getopt::Long::config('require_order', 'auto_abbrev', 'ignore_case');
-
-  my ($help, $version, $force_and_verify);
-
-  %option_linkage = (
-                    "version" => \$version,
-                    "verbose" => \$VERBOSE,
-                    "silent" => \$SILENT,
-                    "help" => \$help,
-                    "skip_check" => \$SKIP_CHECK,
-                    "log_file" => \$LOG_FILE,
-                    "manifest_file" => \$MANIFEST_FILE,
-                    "update"=>\$UPDATE,
-                    "force"=>\$FORCE,
-                    "force_and_verify"=>\$force_and_verify,
-                    "rollback"=>\$ROLLBACK,
-                    "test"=>\$TEST,
-                    "rpm_args" =>\@RPM_ARGS,
-                    "script_file" =>\$SCRIPT_FILE,
-                   );
-
-
-  GetOptions (\%option_linkage, qw(
-                silent! verbose! version! help! skip_check!
-                update! force! force_and_verify! rollback! test! 
-                manifest_file=s script_file=s
-                log_file=s manifest_file=s
-                rpm_args=s@
-               )) ||
-                   die("Illegal options in \@ARGV: '@ARGV',");
-
-  if ($force_and_verify) {
-    $FORCE = 1;
-    $VERIFY = 1;
-  }
-
-  if ($version) {
-    print "$0: Version: $VERSION\n";
-    exit 0;  
-  }
-  
-  if ($help) {
-    usage();
-  }
-
-  $Process::VERBOSE = $VERBOSE;
-
-  {
-
-    my $args=0;
-
-    ($UPDATE) &&
-      $args++;
-    
-    ($FORCE) &&
-      $args++;
-    
-    ($TEST) &&
-      $args++;
-    
-    ($ROLLBACK) &&
-      $args++;
-    
-    ($args == 0) &&
-      die("Must have: 'update', 'force', 'test', 'rollback', argument.\n");
-    
-    ($args > 1) &&
-      die("Can not choice more then one: ".
-         "'update', 'force', 'test', 'rollback', arguments.\n");
-  }
-
-  return 1;
-} # parse_args
-
-
-sub set_logging {
-
-# setup the logging facilities to send errors to syslog/log file.
-
-# this needs to come after parse_args() so that we send usage and argv
-# errors to the stderr.
-
-  {
-    my $logopt = 'cons,ndelay';
-    my $facility = 'daemon';
-
-    # no need to test if this succeeds.  It calls croak so we will
-    # die if there is a problem.
-
-    openlog($PROGRAM, $logopt, $facility);
-  }
-
-  $SIG{'__WARN__'} = \&log_error;
-  $SIG{'__DIE__'} =  \&fatal_error;
-
-  my @sys_errors = chk_system_config();
-
-  if (@sys_errors) { 
-    if ($SKIP_CHECK) {
-
-      # even though we are skipping the test put a record of the
-      # problems in the log
-
-      warn(
-          "Warning Error list:\n",
-          @sys_errors,
-          "End Warning Error list\n",
-          "These Errors would be fatal, ".
-          "if run without '--skip_check'\n"
-         );
-
-    } else {
-
-      # should not start with these problems
-
-      die("Fatal Error list:\n",
-                 @sys_errors,
-                 "End Fatal Error list\n");
-    }
-  }
-
-  if ($LOG_FILE) {
-    # redirect error log
-    mkdir_R(dirname($LOG_FILE), 0755);
-
-    open (LOG, ">>$LOG_FILE") || 
-      die("Could not open log_file: $LOG_FILE, ".
-         "for writing: $!\n");
-
-    print LOG "\n";
-    chmod 0744, $LOG_FILE;
-    LOG->autoflush(1);
-  } 
-
-  STDERR->autoflush(1);
-
-}
-
-    
-sub get_package_list  {
-
-# load the $package_file into memory
-
-# this fucntion must follow get_env() since we need $skip_check to be
-# respected, if set.
-
-  my ($package_file) = @_;
-  my @pkg_list = ();
-
-  (%LISTED_BY_FQN) = ();
-  
-  my %package_count = ();
-  open(FILELIST, "<$package_file") ||
-    die("Could not open packagefile: '$package_file': $!\n");
-
-  my $fqn;  
-  my $lineno = 0;
-
-  while ($fqn=<FILELIST>) {
-    $lineno++;
-    my $new_package = '';
-    my $pkg_flags = '';
-
-    chomp $fqn;
-    $fqn =~ s/\#.*$//;
-    if ($fqn =~ s/\s+(.*)$// ) {
-      $pkg_flags = $1;
-    }
-    ($fqn) || next;
-
-    $new_package = new_rpm_package($fqn, "file: BUILD_FILE lineno: $lineno");
-    ($pkg_flags) && 
-      ($new_package->{'rpm_flags'} = [ split(/\s+/, $pkg_flags) ] );
-    $package_count{ $new_package->{'name'} }++;
-    $LISTED_BY_FQN{$new_package->{'fqn'}} = 1;    
-    push @pkg_list, $new_package ;
-  }
-  
-  close(FILELIST) ||
-    die("Could not close packagefile: '$package_file': $!\n");
-
-  foreach $pkg_name (sort keys %package_count) {
-    ($package_count{ $pkg_name } > 1) && 
-      die("Package: $pkg_name is listed ".
-         "$package_count{ $pkg_name } times ".
-         "in file: $package_file\n");
-  }
-
-  return (@pkg_list);
-}
-
-
-sub get_package_hash  {
-
-# load the $package_file into memory
-
-# this fucntion must follow get_env() since we need $skip_check to be
-# respected, if set.
-
-  my $package_file = @_;
-  my $pkg_hash = ();
-
-  open(FILELIST, "<$package_file") ||
-    die("Could not open packagefile: '$package_file': $!\n");
-  my $lineno = 0;
-  
-  while ($fqn=<FILELIST>) {
-    $lineno++;
-    $fqn =~ s/\#.*$//;
-    $fqn =~ s/\s+//g;
-    chomp $fqn;
-    ($fqn) || next;
-
-    my ($pkg) = new_rpm_package($fqn, "file: $package_file lineno: $lineno");
-    push @{ $pkg_hash{$pkg->{'name'}} }, $pkg;
-  }
-  
-
-  close(FILELIST) ||
-    die("Could not close packagefile: '$package_file': $!\n");
-
-  return ($pkg_hash);
-}
-
-
-
-sub pkg_diff {
-
-  $hash0=get_package_hash($file0);
-  $hash1=get_package_hash($file1);
-
-  my ($pkg_out, $file_out);
-  my @warnings = ();
-  my %seen = ();
-
-  foreach $pkg_name ( keys %{$hash0}, keys %{$hash1} ) {
-
-    $seen{$pkg_name} && next;
-    $seen{$pkg_name} = 1;
-     if ( 
-       ( scalar($hash0->{$pkg_name}) > 1) ||
-       ( scalar($hash1->{$pkg_name} > 1 ) ) 
-       ) {
-      push @warnings, $pkg_name;
-    }
-
-    if ( ($hash0->{$pkg_name}) && 
-        (!($hash1->{$pkg_name}) ) ) {
-      $pkg_out .= "missing $hash0->{$pkg_name}->{'fqn'}\n";
-      next;
-    } elsif ( (!($hash0->{$pkg_name})) && 
-             ($hash1->{$pkg_name}) ) {
-      $pkg_out .= "added   $hash1->{$pkg_name}->{'fqn'}\n";
-      next;
-    } else {
-
-      my ($wait_status, $log_out, $log_err) = 
-       system3('cmd_vec' => [
-                             'rpmdiff',
-                             ($hash0->{$pkg_name}->{'name'}),
-                             ($hash1->{$pkg_name}->{'name'}),
-                            ],);
-      $file_out .= $log_out;      
-    }
-
-  } # each $pkg_name
-
-  print  ("Package Differences:\n\n".
-         sort( split(/\n+/, $pkg_out) ).
-         "\n\nFile Differences:\n\n".
-         sort( split(/\n+/, $file_out) ) );
-  
-  if (@warnings) {
-    print STDERR ("The following packages have more then one version\n".
-                 " mentioned in the pkglist: ".
-                 join(", ", @warnings)."\n".
-                 "The diff algorithm assumes only single versions\n".
-                 "in pkglist file.\n");
-  }
-  
-  return ;
-}
-
-
-
-# -----------------------main--------------------------
-
-{
-  set_static_vars();
-  get_env();
-
-  parse_args();
-  set_logging();
-  @MANIFEST = get_package_list($MANIFEST_FILE);
-  
-  # Learn the state of the machine and ensure that we have the srpms
-  # and rpms for this state.  This must be done after parsing the
-  # arguments since we may have set '--skip_check'
-
-  get_rpm_info('-qa');
-
-  info_error("starting argv: '@ORIG_ARGV' \n");
-  syslog('info', "starting argv: '@ORIG_ARGV' \n");
-
-  my ($exit_with_error) = 0;
-
-  my ($wait_status, $log_out, $log_err) = ();
-
-  ($UID == 0 ) &&
-    ( ($wait_status, $log_out, $log_err) = 
-      system3('cmd_vec' => [$SYS_CMDS{'rpm'}, '--rebuilddb'],));
-
-  if ($TEST) {
-
-    my (@todo) = test_update(@MANIFEST);
-
-    if (@todo) {
-      warn(@todo);
-      $exit_with_error = 1;
-    }
-
-  } elsif ($SCRIPT_FILE) {
-
-    open(SCRIPT_FILE, ">$SCRIPT_FILE") ||
-      die("Could not write to file: $SCRIPT_FILE. $!\n");
-
-    my $script = create_scriptfile(@MANIFEST);
-    print SCRIPT_FILE $script;
-
-    close(SCRIPT_FILE) ||
-      die("Could not close file: $SCRIPT_FILE. $!\n");
-
-  } else {
-
-    # eventually there will be a installer id who will run this code but
-    # for now rpm must be run as  root.
-    
-    ($UID == 0 ) || 
-      die("Must run this program as root\n");
-
-    ($FORCE) && 
-      force_packages(@MANIFEST);
-    
-    ($UPDATE) && 
-      update_packages(@MANIFEST);
-    
-    ($ROLLBACK) &&
-      rollback_packages(@MANIFEST);
-    
-    remove_extra_packages(@MANIFEST);
-    
-    my ($wait_status, $log_out, $log_err) = 
-      system3('cmd_vec' => [$SYS_CMDS{'rpm'}, '--rebuilddb'],);
-    
-    my @problems = test_update(@MANIFEST);
-    
-    (@problems) && die("@problems");
-
-    ($VERIFY) &&
-      verify_packages(@MANIFEST);    
-  }
-  
-  info_error("finished argv: '@ORIG_ARGV' \n");
-  syslog('info', "finished argv: '@ORIG_ARGV' \n");
-  
-  clean_up();
-
-  ($exit_with_error) && 
-    exit 9;
-
-  exit 0;  
-}
-
diff --git a/scripts/sysvinitdeps.sh b/scripts/sysvinitdeps.sh
new file mode 100755 (executable)
index 0000000..ea91383
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+[ "$1" = '-P' -o "$1" = '--provides' ] || {
+    cat > /dev/null
+    exit 0
+}
+
+while read file; do
+       case $file in
+          */etc/init.d/*)
+               provs=`grep '^# *Provides:' $file | sed 's,^.*:,,'`
+               for p in $provs; do
+                       echo "sysvinit($p)"
+               done
+         ;;
+        esac
+done
diff --git a/scripts/tcl.req b/scripts/tcl.req
deleted file mode 100644 (file)
index 43c5920..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/usr/bin/perl
-
-# tcl.req - a simple makedepends like script for tcl.
-
-# I plan to rewrite this in C so that perl is not required by RPM at
-# build time.
-
-# by Ken Estes Mail.com kestes@staff.mail.com
-
-use File::Basename;
-
-if ("@ARGV") {
-  foreach (@ARGV) {
-    process_file($_);
-  }
-} else {
-  
-  # notice we are passed a list of filenames NOT as common in unix the
-  # contents of the file.
-  
-  foreach (<>) {
-    process_file($_);
-  }
-}
-
-
-foreach $module (sort keys %require) {
-    print "tcl($module)\n";
-}
-
-exit 0;
-
-
-
-sub process_file {
-  
-  my ($file) = @_;
-  chomp $file;
-  
-  open(FILE, "<$file")||
-    die("$0: Could not open file: '$file' : $!\n");
-  
-  while (<FILE>) {
-
-    # Each keyword can appear multiple times.  Don't
-    #  bother with datastructures to store these strings,
-    #  if we need to print it print it now.
-    
-    if ( m/^\s*\$RPM_Requires\s*=\s*["'](.*)['"]/i) {
-      foreach $_ (spit(/\s+/, $1)) {
-       print "$_\n";
-      }
-    }
-
-    s/\#.*//;
-    
-    # Each keyword can appear multiple times.  Don't
-    #  bother with datastructures to store these strings,
-    #  if we need to print it print it now.
-    
-    if ( m/^\s*\$RPM_Requires\s*=\s*["'](.*)['"]/i) {
-      foreach $_ (spit(/\s+/, $1))
-       print "$_\n";
-    }
-
-
-# we wish to capture these source statements:
-
-#  source "$PATH/lib/util.tcl"
-#  source "comconf.tcl"
-#  if {[catch {source $env(CONTROL_PANEL_LIB_DIR)/bindings.tcl}] != 0} {
-
-    # quick check to see if the complex regexps could possibly match.
-    # This should speed things up.
-
-    (m/source/) || next;
-
-    # note we include parethesis and '$' and '\' in the pattern
-
-    if ( 
-       (m!source\s+([\'\"])?([0-9A-Za-z/._\-\\\(\)\$]+)!)
-       ) {     
-      
-      my ($module) = $2;
-
-      # If there is some interpolation of variables, 
-      # see if taking the basename will give us the filename.
-
-      ($module =~ m/\$/) &&
-       ($module = basename($module));
-      
-      ($module =~ m/\$/) ||
-       ($require{$module}=1);
-    }
-  }
-
-  close(FILE)||
-    die("$0: Could not close file: '$file' : $!\n");
-  
-  return ; 
-}
index 238cffbb43998bd131f73c68e9178ef3a69ad8e9..c29564a065c93437874157bd177d17795920098a 100755 (executable)
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 
+PATH=/bin:/usr/bin:/sbin:/usr/sbin
 for pkg in $*
 do
     if [ "$pkg" = "" -o ! -e "$pkg" ]; then
index c15f080f13a8401dd38e5e5a163371fa1f991fd5..0b86d4b05f61688569045e53e5d1a1559142d1e5 100755 (executable)
@@ -51,7 +51,7 @@ usage="$usage\t[--find_provides '/path/to/find-provides']\n"
 usage="$usage\t[--shlib_dirs 'dirs:which:contain:shared:libs']\n"
 usage="$usage\t[--ignore_dirs 'grep-E|pattern|of|paths|to|ignore']\n"
 
-# these two should be unnessary as the regular dependency analysis
+# these two should be unnecessary as the regular dependency analysis
 # should take care of interpreters as well as shared libraries.
 
 usage="$usage\t[--interp_dirs 'dirs:which:contain:interpreters']\n"
@@ -67,10 +67,10 @@ sum_cmd="xargs cksum"
 date=`date`
 hostname=`uname -n`
 
-# if some subdirectories of the system directories needs to be ignored
+# if some subdirectories of the system directories need to be ignored
 # (eg /usr/local is a subdirectory of /usr but should not be part of
 # the virtual package) then call this script with ignore_dirs set to a
-# valid grep -E pattern which discribes the directories to ignored.
+# valid grep -E pattern which describes the directories to ignore.
 
 PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb:/usr/bsd
 export PATH
@@ -207,7 +207,7 @@ do
 done
 
 
-# consistancy checks on the arguments
+# consistency checks on the arguments
 
 if [ ! -f $spec_header ]; then
        echo "You must pass me the full path to the partial spec file"
@@ -294,7 +294,7 @@ cat $spec_header
 } | sed -e 's/%/%%/g'
 
 #
-# Output the discription of the spec file
+# Output the description of the spec file
 #
 
 cat <<_EIEIO_
index db82702bccb032283ef0b72668cbab270f825af9..db774de0e17e8e2982c5d8524829c1d963a0fa1f 100644 (file)
@@ -1,8 +1,10 @@
 # Makefile for rpm library.
 
 include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
 
 AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -I$(top_builddir)/include/
+AM_CPPFLAGS += @WITH_BEECRYPT_INCLUDE@
 AM_CPPFLAGS += @WITH_NSS_INCLUDE@
 AM_CPPFLAGS += @WITH_POPT_INCLUDE@
 AM_CPPFLAGS += -I$(top_srcdir)/misc
@@ -11,9 +13,14 @@ usrlibdir = $(libdir)
 
 usrlib_LTLIBRARIES = librpmsign.la
 librpmsign_la_SOURCES = rpmgensig.c
-librpmsign_la_LDFLAGS = -version-info 2:0:1
+librpmsign_la_LDFLAGS = -version-info $(rpm_version_info)
 librpmsign_la_LIBADD = \
        $(top_builddir)/lib/librpm.la \
        $(top_builddir)/rpmio/librpmio.la \
        @WITH_POPT_LIB@ \
        @LIBINTL@
+
+if WITH_IMAEVM
+librpmsign_la_SOURCES += rpmsignfiles.c rpmsignfiles.h
+librpmsign_la_LIBADD += @WITH_IMAEVM_LIB@
+endif
index 7695ffad70d5e2b2950aae45d2970ecf1d3ab792..d29c178379522efbf48dfeea800e5473f029b09a 100644 (file)
@@ -8,6 +8,7 @@
 #include <errno.h>
 #include <sys/wait.h>
 #include <popt.h>
+#include <libgen.h>
 
 #include <rpm/rpmlib.h>                        /* RPMSIGTAG & related */
 #include <rpm/rpmmacro.h>
 #include <rpm/rpmfileutil.h>   /* rpmMkTemp() */
 #include <rpm/rpmlog.h>
 #include <rpm/rpmstring.h>
+#include <rpmio/rpmio_internal.h>
 
 #include "lib/rpmlead.h"
 #include "lib/signature.h"
+#include "sign/rpmsignfiles.h"
 
 #include "debug.h"
 
-#if !defined(__GLIBC__) && !defined(__APPLE__)
-char ** environ = NULL;
-#endif
+typedef struct sigTarget_s {
+    FD_t fd;
+    const char *fileName;
+    off_t start;
+    rpm_loff_t size;
+} *sigTarget;
+
+/*
+ * There is no function for creating unique temporary fifos so create
+ * unique temporary directory and then create fifo in it.
+ */
+static char *mkTempFifo(void)
+{
+    char *tmppath = NULL, *tmpdir = NULL, *fifofn = NULL;
+    mode_t mode;
+
+    tmppath = rpmExpand("%{_tmppath}", NULL);
+    if (rpmioMkpath(tmppath, 0755, (uid_t) -1, (gid_t) -1))
+       goto exit;
+
+
+    tmpdir = rpmGetPath(tmppath, "/rpm-tmp.XXXXXX", NULL);
+    mode = umask(0077);
+    tmpdir = mkdtemp(tmpdir);
+    umask(mode);
+    if (tmpdir == NULL) {
+       rpmlog(RPMLOG_ERR, _("error creating temp directory %s: %m\n"),
+           tmpdir);
+       tmpdir = _free(tmpdir);
+       goto exit;
+    }
+
+    fifofn = rpmGetPath(tmpdir, "/fifo", NULL);
+    if (mkfifo(fifofn, 0600) == -1) {
+       rpmlog(RPMLOG_ERR, _("error creating fifo %s: %m\n"), fifofn);
+       fifofn = _free(fifofn);
+    }
+
+exit:
+    if (fifofn == NULL && tmpdir != NULL)
+       unlink(tmpdir);
+
+    free(tmppath);
+    free(tmpdir);
+
+    return fifofn;
+}
+
+/* Delete fifo and then temporary directory in which it was located */
+static int rpmRmTempFifo(const char *fn)
+{
+    int rc = 0;
+    char *dfn = NULL, *dir = NULL;
+
+    if ((rc = unlink(fn)) != 0) {
+       rpmlog(RPMLOG_ERR, _("error delete fifo %s: %m\n"), fn);
+       return rc;
+    }
+
+    dfn = xstrdup(fn);
+    dir = dirname(dfn);
+
+    if ((rc = rmdir(dir)) != 0)
+       rpmlog(RPMLOG_ERR, _("error delete directory %s: %m\n"), dir);
+    free(dfn);
+
+    return rc;
+}
 
 static int closeFile(FD_t *fdp)
 {
@@ -42,13 +110,26 @@ static int closeFile(FD_t *fdp)
 static int manageFile(FD_t *fdp, const char *fn, int flags)
 {
     FD_t fd;
+    const char *fmode;
 
     if (fdp == NULL || fn == NULL)     /* programmer error */
        return 1;
 
     /* open a file and set *fdp */
     if (*fdp == NULL && fn != NULL) {
-       fd = Fopen(fn, (flags & O_ACCMODE) == O_WRONLY ? "w.ufdio" : "r.ufdio");
+       switch (flags & O_ACCMODE) {
+           case O_WRONLY:
+               fmode = "w.ufdio";
+               break;
+           case O_RDONLY:
+               fmode = "r.ufdio";
+               break;
+           default:
+           case O_RDWR:
+               fmode = "r+.ufdio";
+               break;
+       }
+       fd = Fopen(fn, fmode);
        if (fd == NULL || Ferror(fd)) {
            rpmlog(RPMLOG_ERR, _("%s: open failed: %s\n"), fn,
                Fstrerror(fd));
@@ -68,6 +149,10 @@ static int manageFile(FD_t *fdp, const char *fn, int flags)
 
 /**
  * Copy header+payload, calculating digest(s) on the fly.
+ * @param sfdp source file
+ * @param sfnp source path
+ * @param tfdp destination file
+ * @param tfnp destination path
  */
 static int copyFile(FD_t *sfdp, const char *sfnp,
                FD_t *tfdp, const char *tfnp)
@@ -76,11 +161,6 @@ static int copyFile(FD_t *sfdp, const char *sfnp,
     ssize_t count;
     int rc = 1;
 
-    if (manageFile(sfdp, sfnp, O_RDONLY))
-       goto exit;
-    if (manageFile(tfdp, tfnp, O_WRONLY|O_CREAT|O_TRUNC))
-       goto exit;
-
     while ((count = Fread(buf, sizeof(buf[0]), sizeof(buf), *sfdp)) > 0)
     {
        if (Fwrite(buf, sizeof(buf[0]), count, *tfdp) != count) {
@@ -101,8 +181,6 @@ static int copyFile(FD_t *sfdp, const char *sfnp,
     rc = 0;
 
 exit:
-    if (*sfdp) (void) closeFile(sfdp);
-    if (*tfdp) (void) closeFile(tfdp);
     return rc;
 }
 
@@ -110,14 +188,13 @@ exit:
  * Validate generated signature and insert to header if it looks sane.
  * NSS doesn't support everything GPG does. Basic tests to see if the 
  * generated signature is something we can use.
- * Return 0 on success, 1 on failure.
+ * Return generated signature tag data on success, NULL on failure.
  */
-static int putSignature(Header sigh, int ishdr, uint8_t *pkt, size_t pktlen)
+static rpmtd makeSigTag(Header sigh, int ishdr, uint8_t *pkt, size_t pktlen)
 {
     pgpDigParams sigp = NULL;
     rpmTagVal sigtag;
-    struct rpmtd_s sigtd;
-    int rc = 1; /* assume failure */
+    rpmtd sigtd = NULL;
     unsigned int hash_algo;
     unsigned int pubkey_algo;
 
@@ -147,48 +224,42 @@ static int putSignature(Header sigh, int ishdr, uint8_t *pkt, size_t pktlen)
        break;
     }
 
-    /* Looks sane, insert into header */
-    rpmtdReset(&sigtd);
-    sigtd.count = pktlen;
-    sigtd.data = pkt;
-    sigtd.type = RPM_BIN_TYPE;
-    sigtd.tag = sigtag;
-
-    /* Argh, reversed return codes */
-    rc = (headerPut(sigh, &sigtd, HEADERPUT_DEFAULT) == 0);
+    /* Looks sane, create the tag data */
+    sigtd = rpmtdNew();
+    sigtd->count = pktlen;
+    sigtd->data = memcpy(xmalloc(pktlen), pkt, pktlen);;
+    sigtd->type = RPM_BIN_TYPE;
+    sigtd->tag = sigtag;
+    sigtd->flags |= RPMTD_ALLOCED;
 
 exit:
     pgpDigParamsFree(sigp);
-    return rc;
+    return sigtd;
 }
 
-static int runGPG(const char *file, const char *sigfile, const char * passPhrase)
+static int runGPG(sigTarget sigt, const char *sigfile)
 {
-    int pid, status;
-    int inpipe[2];
-    FILE * fpipe;
+    int pid = 0, status;
+    FD_t fnamedPipe = NULL;
+    char *namedPipeName = NULL;
+    unsigned char buf[BUFSIZ];
+    ssize_t count;
+    ssize_t wantCount;
+    rpm_loff_t size;
     int rc = 1; /* assume failure */
 
-    inpipe[0] = inpipe[1] = 0;
-    if (pipe(inpipe) < 0) {
-       rpmlog(RPMLOG_ERR, _("Couldn't create pipe for signing: %m"));
-       goto exit;
-    }
+    namedPipeName = mkTempFifo();
 
-    addMacro(NULL, "__plaintext_filename", NULL, file, -1);
-    addMacro(NULL, "__signature_filename", NULL, sigfile, -1);
+    rpmPushMacro(NULL, "__plaintext_filename", NULL, namedPipeName, -1);
+    rpmPushMacro(NULL, "__signature_filename", NULL, sigfile, -1);
 
     if (!(pid = fork())) {
        char *const *av;
        char *cmd = NULL;
        const char *gpg_path = rpmExpand("%{?_gpg_path}", NULL);
 
-       (void) dup2(inpipe[0], 3);
-       (void) close(inpipe[1]);
-
        if (gpg_path && *gpg_path != '\0')
            (void) setenv("GNUPGHOME", gpg_path, 1);
-       (void) setenv("LC_ALL", "C", 1);
 
        unsetenv("MALLOC_CHECK_");
        cmd = rpmExpand("%{?__gpg_sign_cmd}", NULL);
@@ -201,23 +272,61 @@ static int runGPG(const char *file, const char *sigfile, const char * passPhrase
        _exit(EXIT_FAILURE);
     }
 
-    delMacro(NULL, "__plaintext_filename");
-    delMacro(NULL, "__signature_filename");
+    rpmPopMacro(NULL, "__plaintext_filename");
+    rpmPopMacro(NULL, "__signature_filename");
 
-    fpipe = fdopen(inpipe[1], "w");
-    (void) close(inpipe[0]);
-    if (fpipe) {
-       fprintf(fpipe, "%s\n", (passPhrase ? passPhrase : ""));
-       (void) fclose(fpipe);
+    fnamedPipe = Fopen(namedPipeName, "w");
+    if (!fnamedPipe) {
+       rpmlog(RPMLOG_ERR, _("Fopen failed\n"));
+       goto exit;
+    }
+
+    if (Fseek(sigt->fd, sigt->start, SEEK_SET) < 0) {
+       rpmlog(RPMLOG_ERR, _("Could not seek in file %s: %s\n"),
+               sigt->fileName, Fstrerror(sigt->fd));
+       goto exit;
     }
 
+    size = sigt->size;
+    wantCount = size < sizeof(buf) ? size : sizeof(buf);
+    while ((count = Fread(buf, sizeof(buf[0]), wantCount, sigt->fd)) > 0) {
+       Fwrite(buf, sizeof(buf[0]), count, fnamedPipe);
+       if (Ferror(fnamedPipe)) {
+           rpmlog(RPMLOG_ERR, _("Could not write to pipe\n"));
+           goto exit;
+       }
+       size -= count;
+       wantCount = size < sizeof(buf) ? size : sizeof(buf);
+    }
+    if (count < 0) {
+       rpmlog(RPMLOG_ERR, _("Could not read from file %s: %s\n"),
+               sigt->fileName, Fstrerror(sigt->fd));
+       goto exit;
+    }
+    Fclose(fnamedPipe);
+    fnamedPipe = NULL;
+
     (void) waitpid(pid, &status, 0);
+    pid = 0;
     if (!WIFEXITED(status) || WEXITSTATUS(status)) {
        rpmlog(RPMLOG_ERR, _("gpg exec failed (%d)\n"), WEXITSTATUS(status));
     } else {
        rc = 0;
     }
+
 exit:
+
+    if (fnamedPipe)
+       Fclose(fnamedPipe);
+
+    if (pid)
+       waitpid(pid, &status, 0);
+
+    if (namedPipeName) {
+       rpmRmTempFifo(namedPipeName);
+       free(namedPipeName);
+    }
+
     return rc;
 }
 
@@ -225,20 +334,19 @@ exit:
  * Generate GPG signature(s) for a header+payload file.
  * @param sigh         signature header
  * @param ishdr                header-only signature?
- * @param file         header+payload file name
+ * @param sigt         signature target
  * @param passPhrase   private key pass phrase
- * @return             0 on success, 1 on failure
+ * @return             generated sigtag on success, 0 on failure
  */
-static int makeGPGSignature(Header sigh, int ishdr,
-                           const char * file, const char * passPhrase)
+static rpmtd makeGPGSignature(Header sigh, int ishdr, sigTarget sigt)
 {
-    char * sigfile = rstrscat(NULL, file, ".sig", NULL);
+    char * sigfile = rstrscat(NULL, sigt->fileName, ".sig", NULL);
     struct stat st;
     uint8_t * pkt = NULL;
     size_t pktlen = 0;
-    int rc = 1; /* assume failure */
+    rpmtd sigtd = NULL;
 
-    if (runGPG(file, sigfile, passPhrase))
+    if (runGPG(sigt, sigfile))
        goto exit;
 
     if (stat(sigfile, &st)) {
@@ -253,7 +361,7 @@ static int makeGPGSignature(Header sigh, int ishdr,
 
     {  FD_t fd;
 
-       rc = 0;
+       int rc = 0;
        fd = Fopen(sigfile, "r.ufdio");
        if (fd != NULL && !Ferror(fd)) {
            rc = Fread(pkt, sizeof(*pkt), pktlen, fd);
@@ -268,233 +376,346 @@ static int makeGPGSignature(Header sigh, int ishdr,
     rpmlog(RPMLOG_DEBUG, "Got %zd bytes of GPG sig\n", pktlen);
 
     /* Parse the signature, change signature tag as appropriate. */
-    rc = putSignature(sigh, ishdr, pkt, pktlen);
+    sigtd = makeSigTag(sigh, ishdr, pkt, pktlen);
 exit:
     (void) unlink(sigfile);
     free(sigfile);
     free(pkt);
 
-    return rc;
+    return sigtd;
 }
 
-/**
- * Generate header only signature(s) from a header+payload file.
- * @param sigh         signature header
- * @param file         header+payload file name
- * @param passPhrase   private key pass phrase
- * @return             0 on success, -1 on failure
- */
-static int makeHDRSignature(Header sigh, const char * file,
-               const char * passPhrase)
+static void deleteSigs(Header sigh)
 {
-    Header h = NULL;
-    FD_t fd = NULL;
-    char * fn = NULL;
-    int ret = -1;      /* assume failure. */
+    headerDel(sigh, RPMSIGTAG_GPG);
+    headerDel(sigh, RPMSIGTAG_PGP);
+    headerDel(sigh, RPMSIGTAG_DSA);
+    headerDel(sigh, RPMSIGTAG_RSA);
+    headerDel(sigh, RPMSIGTAG_PGP5);
+}
+
+static int haveSignature(rpmtd sigtd, Header h)
+{
+    pgpDigParams sig1 = NULL;
+    pgpDigParams sig2 = NULL;
+    struct rpmtd_s oldtd;
+    int rc = 0; /* assume no */
+
+    if (!headerGet(h, rpmtdTag(sigtd), &oldtd, HEADERGET_DEFAULT))
+       return rc;
+
+    pgpPrtParams(sigtd->data, sigtd->count, PGPTAG_SIGNATURE, &sig1);
+    while (rpmtdNext(&oldtd) >= 0 && rc == 0) {
+       pgpPrtParams(oldtd.data, oldtd.count, PGPTAG_SIGNATURE, &sig2);
+       if (pgpDigParamsCmp(sig1, sig2) == 0)
+           rc = 1;
+       pgpDigParamsFree(sig2);
+    }
+    pgpDigParamsFree(sig1);
+    rpmtdFreeData(&oldtd);
+
+    return rc;
+}
 
-    fd = Fopen(file, "r.fdio");
-    if (fd == NULL || Ferror(fd))
+static int replaceSignature(Header sigh, sigTarget sigt_v3, sigTarget sigt_v4)
+{
+    int rc = -1;
+    rpmtd sigtd = NULL;
+    
+    /* Make the cheaper v4 signature first */
+    if ((sigtd = makeGPGSignature(sigh, 1, sigt_v4)) == NULL)
        goto exit;
-    h = headerRead(fd, HEADER_MAGIC_YES);
-    if (h == NULL)
+
+    /* See if we already have a signature by the same key and parameters */
+    if (haveSignature(sigtd, sigh)) {
+       rc = 1;
        goto exit;
-    (void) Fclose(fd);
+    }
+    /* Nuke all signature tags */
+    deleteSigs(sigh);
 
-    fd = rpmMkTempFile(NULL, &fn);
-    if (fd == NULL || Ferror(fd))
+    if (headerPut(sigh, sigtd, HEADERPUT_DEFAULT) == 0)
        goto exit;
-    if (headerWrite(fd, h, HEADER_MAGIC_YES))
+    rpmtdFree(sigtd);
+
+    /* Assume the same signature test holds for v3 signature too */
+    if ((sigtd = makeGPGSignature(sigh, 0, sigt_v3)) == NULL)
        goto exit;
 
-    ret = makeGPGSignature(sigh, 1, fn, passPhrase);
+    if (headerPut(sigh, sigtd, HEADERPUT_DEFAULT) == 0)
+       goto exit;
 
+    rc = 0;
 exit:
-    if (fn) {
-       (void) unlink(fn);
-       free(fn);
+    rpmtdFree(sigtd);
+    return rc;
+}
+
+static void unloadImmutableRegion(Header *hdrp, rpmTagVal tag)
+{
+    struct rpmtd_s td;
+    rpmtd utd = &td;
+    Header nh;
+    Header oh;
+
+    if (headerGet(*hdrp, tag, utd, HEADERGET_DEFAULT)) {
+       oh = headerCopyLoad(utd->data);
+       nh = headerCopy(oh);
+       headerFree(oh);
+       rpmtdFreeData(utd);
+       headerFree(*hdrp);
+       *hdrp = headerLink(nh);
+       headerFree(nh);
     }
-    headerFree(h);
-    if (fd != NULL) (void) Fclose(fd);
-    return ret;
 }
 
-static int rpmGenSignature(Header sigh, const char * file,
-               const char * passPhrase)
+#ifdef WITH_IMAEVM
+static rpmRC replaceSigDigests(FD_t fd, const char *rpm, Header *sigp,
+                              off_t sigStart, off_t sigTargetSize,
+                              char *SHA256, char *SHA1, uint8_t *MD5)
 {
-    int ret = -1;      /* assume failure. */
+    off_t archiveSize;
+    rpmRC rc = RPMRC_OK;
 
-    if (makeGPGSignature(sigh, 0, file, passPhrase) == 0) {
-       /* XXX Piggyback a header-only DSA/RSA signature as well. */
-       ret = makeHDRSignature(sigh, file, passPhrase);
+    if (Fseek(fd, sigStart, SEEK_SET) < 0) {
+       rc = RPMRC_FAIL;
+       rpmlog(RPMLOG_ERR, _("Could not seek in file %s: %s\n"),
+               rpm, Fstrerror(fd));
+       goto exit;
     }
 
-    return ret;
-}
+    /* Get payload size from signature tag */
+    archiveSize = headerGetNumber(*sigp, RPMSIGTAG_PAYLOADSIZE);
+    if (!archiveSize) {
+       archiveSize = headerGetNumber(*sigp, RPMSIGTAG_LONGARCHIVESIZE);
+    }
 
-/**
- * Retrieve signature from header tag
- * @param sigh         signature header
- * @param sigtag       signature tag
- * @return             parsed pgp dig or NULL
- */
-static pgpDigParams getSig(Header sigh, rpmTagVal sigtag)
-{
-    struct rpmtd_s pkt;
-    pgpDigParams sig = NULL;
+    /* Set reserved space to 0 */
+    rpmPushMacro(NULL, "__gpg_reserved_space", NULL, 0, RMIL_GLOBAL);
 
-    if (headerGet(sigh, sigtag, &pkt, HEADERGET_DEFAULT) && pkt.data != NULL) {
-       pgpPrtParams(pkt.data, pkt.count, PGPTAG_SIGNATURE, &sig);
-       rpmtdFreeData(&pkt);
+    /* Replace old digests in sigh */
+    rc = rpmGenerateSignature(SHA256, SHA1, MD5, sigTargetSize, archiveSize, fd);
+    if (rc != RPMRC_OK) {
+       rpmlog(RPMLOG_ERR, _("generateSignature failed\n"));
+       goto exit;
     }
-    return sig;
-}
 
-static void deleteSigs(Header sigh)
-{
-    headerDel(sigh, RPMSIGTAG_GPG);
-    headerDel(sigh, RPMSIGTAG_PGP);
-    headerDel(sigh, RPMSIGTAG_DSA);
-    headerDel(sigh, RPMSIGTAG_RSA);
-    headerDel(sigh, RPMSIGTAG_PGP5);
+    if (Fseek(fd, sigStart, SEEK_SET) < 0) {
+       rc = RPMRC_FAIL;
+       rpmlog(RPMLOG_ERR, _("Could not seek in file %s: %s\n"),
+               rpm, Fstrerror(fd));
+       goto exit;
+    }
+
+    headerFree(*sigp);
+    rc = rpmReadSignature(fd, sigp, NULL);
+    if (rc != RPMRC_OK) {
+       rpmlog(RPMLOG_ERR, _("rpmReadSignature failed\n"));
+       goto exit;
+    }
+
+exit:
+    return rc;
 }
+#endif
 
-static int sameSignature(rpmTagVal sigtag, Header h1, Header h2)
+static rpmRC includeFileSignatures(FD_t fd, const char *rpm,
+                                  Header *sigp, Header *hdrp,
+                                  off_t sigStart, off_t headerStart)
 {
-    pgpDigParams sig1 = getSig(h1, sigtag);
-    pgpDigParams sig2 = getSig(h2, sigtag);;
+#ifdef WITH_IMAEVM
+    FD_t ofd = NULL;
+    char *trpm = NULL;
+    char *key;
+    char *keypass;
+    char *SHA1 = NULL;
+    char *SHA256 = NULL;
+    uint8_t *MD5 = NULL;
+    off_t sigTargetSize;
+    rpmRC rc = RPMRC_OK;
+    struct rpmtd_s osigtd;
+    char *o_sha1 = NULL;
+
+    unloadImmutableRegion(hdrp, RPMTAG_HEADERIMMUTABLE);
+
+    key = rpmExpand("%{?_file_signing_key}", NULL);
+
+    keypass = rpmExpand("%{?_file_signing_key_password}", NULL);
+    if (rstreq(keypass, "")) {
+       free(keypass);
+       keypass = NULL;
+    }
 
-    int rc = pgpDigParamsCmp(sig1, sig2);
+    rc = rpmSignFiles(*hdrp, key, keypass);
+    if (rc != RPMRC_OK) {
+       goto exit;
+    }
 
-    pgpDigParamsFree(sig1);
-    pgpDigParamsFree(sig2);
-    return (rc == 0);
-}
+    *hdrp = headerReload(*hdrp, RPMTAG_HEADERIMMUTABLE);
+    if (*hdrp == NULL) {
+       rc = RPMRC_FAIL;
+       rpmlog(RPMLOG_ERR, _("headerReload failed\n"));
+       goto exit;
+    }
 
-static int replaceSignature(Header sigh, const char *sigtarget,
-                           const char *passPhrase)
-{
-    /* Grab a copy of the header so we can compare the result */
-    Header oldsigh = headerCopy(sigh);
-    int rc = -1;
-    
-    /* Nuke all signature tags */
-    deleteSigs(sigh);
+    ofd = rpmMkTempFile(NULL, &trpm);
+    if (ofd == NULL || Ferror(ofd)) {
+       rc = RPMRC_FAIL;
+       rpmlog(RPMLOG_ERR, _("rpmMkTemp failed\n"));
+       goto exit;
+    }
+
+    /* Copy archive to temp file */
+    if (copyFile(&fd, rpm, &ofd, trpm)) {
+       rc = RPMRC_FAIL;
+       rpmlog(RPMLOG_ERR, _("copyFile failed\n"));
+       goto exit;
+    }
+
+    if (Fseek(fd, headerStart, SEEK_SET) < 0) {
+       rc = RPMRC_FAIL;
+       rpmlog(RPMLOG_ERR, _("Could not seek in file %s: %s\n"),
+               rpm, Fstrerror(fd));
+       goto exit;
+    }
 
-    /*
-     * rpmGenSignature() internals parse the actual signing result and 
-     * adds appropriate tags for DSA/RSA.
-     */
-    if (rpmGenSignature(sigh, sigtarget, passPhrase) == 0) {
-       /* Lets see what we got and whether its the same signature as before */
-       rpmTagVal sigtag = headerIsEntry(sigh, RPMSIGTAG_DSA) ?
-                                       RPMSIGTAG_DSA : RPMSIGTAG_RSA;
+    /* Start MD5 calculation */
+    fdInitDigestID(fd, PGPHASHALGO_MD5, RPMSIGTAG_MD5, 0);
 
-       rc = sameSignature(sigtag, sigh, oldsigh);
+    /* Write header to rpm and recalculate digests */
+    fdInitDigestID(fd, PGPHASHALGO_SHA1, RPMSIGTAG_SHA1, 0);
+    fdInitDigestID(fd, PGPHASHALGO_SHA256, RPMSIGTAG_SHA256, 0);
+    rc = headerWrite(fd, *hdrp, HEADER_MAGIC_YES);
+    if (rc != RPMRC_OK) {
+       rpmlog(RPMLOG_ERR, _("headerWrite failed\n"));
+       goto exit;
+    }
+    fdFiniDigest(fd, RPMSIGTAG_SHA1, (void **)&SHA1, NULL, 1);
+    /* Only add SHA256 if it was there to begin with */
+    if (headerIsEntry(*sigp, RPMSIGTAG_SHA256))
+       fdFiniDigest(fd, RPMSIGTAG_SHA256, (void **)&SHA256, NULL, 1);
+
+    /* Copy archive from temp file */
+    if (Fseek(ofd, 0, SEEK_SET) < 0) {
+       rc = RPMRC_FAIL;
+       rpmlog(RPMLOG_ERR, _("Could not seek in file %s: %s\n"),
+               rpm, Fstrerror(fd));
+       goto exit;
+    }
+    if (copyFile(&ofd, trpm, &fd, rpm)) {
+       rc = RPMRC_FAIL;
+       rpmlog(RPMLOG_ERR, _("copyFile failed\n"));
+       goto exit;
+    }
+    unlink(trpm);
+
+    sigTargetSize = Ftell(fd) - headerStart;
+    fdFiniDigest(fd, RPMSIGTAG_MD5, (void **)&MD5, NULL, 0);
 
+    if (headerGet(*sigp, RPMSIGTAG_SHA1, &osigtd, HEADERGET_DEFAULT)) {
+       o_sha1 = xstrdup(osigtd.data);
+       rpmtdFreeData(&osigtd);
     }
 
-    headerFree(oldsigh);
+    if (strcmp(SHA1, o_sha1) == 0)
+       rpmlog(RPMLOG_WARNING,
+              _("%s already contains identical file signatures\n"),
+              rpm);
+    else
+       replaceSigDigests(fd, rpm, sigp, sigStart, sigTargetSize, SHA256, SHA1, MD5);
+
+exit:
+    free(trpm);
+    free(MD5);
+    free(SHA1);
+    free(SHA256);
+    free(o_sha1);
+    free(keypass);
+    free(key);
+    if (ofd)
+       (void) closeFile(&ofd);
     return rc;
+#else
+    rpmlog(RPMLOG_ERR, _("file signing support not built in\n"));
+    return RPMRC_FAIL;
+#endif
 }
 
 /** \ingroup rpmcli
  * Create/modify elements in signature header.
  * @param rpm          path to package
  * @param deleting     adding or deleting signature?
- * @param passPhrase   passPhrase (ignored when deleting)
+ * @param signfiles    sign files if non-zero
  * @return             0 on success, -1 on error
  */
-static int rpmSign(const char *rpm, int deleting, const char *passPhrase)
+static int rpmSign(const char *rpm, int deleting, int signfiles)
 {
     FD_t fd = NULL;
     FD_t ofd = NULL;
-    rpmlead lead = NULL;
-    char *sigtarget = NULL, *trpm = NULL;
+    char *trpm = NULL;
     Header sigh = NULL;
-    char * msg = NULL;
+    Header h = NULL;
+    char *msg = NULL;
     int res = -1; /* assume failure */
     rpmRC rc;
     struct rpmtd_s utd;
+    off_t headerStart;
+    off_t sigStart;
+    struct sigTarget_s sigt_v3;
+    struct sigTarget_s sigt_v4;
+    unsigned int origSigSize;
+    int insSig = 0;
 
     fprintf(stdout, "%s:\n", rpm);
 
-    if (manageFile(&fd, rpm, O_RDONLY))
+    if (manageFile(&fd, rpm, O_RDWR))
        goto exit;
 
-    if ((rc = rpmLeadRead(fd, &lead, NULL, &msg)) != RPMRC_OK) {
+    if ((rc = rpmLeadRead(fd, NULL, &msg)) != RPMRC_OK) {
        rpmlog(RPMLOG_ERR, "%s: %s\n", rpm, msg);
-       free(msg);
        goto exit;
     }
 
-    rc = rpmReadSignature(fd, &sigh, RPMSIGTYPE_HEADERSIG, &msg);
-    switch (rc) {
-    default:
+    sigStart = Ftell(fd);
+    rc = rpmReadSignature(fd, &sigh, &msg);
+    if (rc != RPMRC_OK) {
        rpmlog(RPMLOG_ERR, _("%s: rpmReadSignature failed: %s"), rpm,
                    (msg && *msg ? msg : "\n"));
-       msg = _free(msg);
        goto exit;
-       break;
-    case RPMRC_OK:
-       if (sigh == NULL) {
-           rpmlog(RPMLOG_ERR, _("%s: No signature available\n"), rpm);
-           goto exit;
-       }
-       break;
     }
-    msg = _free(msg);
 
-    ofd = rpmMkTempFile(NULL, &sigtarget);
-    if (ofd == NULL || Ferror(ofd)) {
-       rpmlog(RPMLOG_ERR, _("rpmMkTemp failed\n"));
+    headerStart = Ftell(fd);
+    if (rpmReadHeader(NULL, fd, &h, &msg) != RPMRC_OK) {
+       rpmlog(RPMLOG_ERR, _("%s: headerRead failed: %s\n"), rpm, msg);
        goto exit;
     }
-    /* Write the header and archive to a temp file */
-    if (copyFile(&fd, rpm, &ofd, sigtarget))
-       goto exit;
-    /* Both fd and ofd are now closed. sigtarget contains tempfile name. */
-
-    /* Dump the immutable region (if present). */
-    if (headerGet(sigh, RPMTAG_HEADERSIGNATURES, &utd, HEADERGET_DEFAULT)) {
-       struct rpmtd_s copytd;
-       Header nh = headerNew();
-       Header oh = headerCopyLoad(utd.data);
-       HeaderIterator hi = headerInitIterator(oh);
-       while (headerNext(hi, &copytd)) {
-           if (copytd.data)
-               headerPut(nh, &copytd, HEADERPUT_DEFAULT);
-           rpmtdFreeData(&copytd);
-       }
-       headerFreeIterator(hi);
-       headerFree(oh);
 
-       headerFree(sigh);
-       sigh = headerLink(nh);
-       headerFree(nh);
+    if (!headerIsEntry(h, RPMTAG_HEADERIMMUTABLE)) {
+       rpmlog(RPMLOG_ERR, _("Cannot sign RPM v3 packages\n"));
+       goto exit;
     }
 
-    /* Eliminate broken digest values. */
-    headerDel(sigh, RPMSIGTAG_BADSHA1_1);
-    headerDel(sigh, RPMSIGTAG_BADSHA1_2);
-
-    /* Toss and recalculate header+payload size and digests. */
-    {
-       rpmTagVal const sigs[] = {      RPMSIGTAG_SIZE, 
-                                   RPMSIGTAG_MD5,
-                                   RPMSIGTAG_SHA1,
-                                };
-       int nsigs = sizeof(sigs) / sizeof(rpmTagVal);
-       for (int i = 0; i < nsigs; i++) {
-           (void) headerDel(sigh, sigs[i]);
-           if (rpmGenDigest(sigh, sigtarget, sigs[i]))
-               goto exit;
-       }
+    if (signfiles) {
+       includeFileSignatures(fd, rpm, &sigh, &h, sigStart, headerStart);
     }
 
+    unloadImmutableRegion(&sigh, RPMTAG_HEADERSIGNATURES);
+    origSigSize = headerSizeof(sigh, HEADER_MAGIC_YES);
+
     if (deleting) {    /* Nuke all the signature tags. */
        deleteSigs(sigh);
     } else {
-       res = replaceSignature(sigh, sigtarget, passPhrase);
+       /* Signature target containing header + payload */
+       sigt_v3.fd = fd;
+       sigt_v3.start = headerStart;
+       sigt_v3.fileName = rpm;
+       sigt_v3.size = fdSize(fd) - headerStart;
+
+       /* Signature target containing only header */
+       sigt_v4 = sigt_v3;
+       sigt_v4.size = headerSizeof(h, HEADER_MAGIC_YES);
+
+       res = replaceSignature(sigh, &sigt_v3, &sigt_v4);
        if (res != 0) {
            if (res == 1) {
                rpmlog(RPMLOG_WARNING,
@@ -505,6 +726,31 @@ static int rpmSign(const char *rpm, int deleting, const char *passPhrase)
            }
            goto exit;
        }
+       res = -1;
+    }
+
+    /* Try to make new signature smaller to have size of original signature */
+    rpmtdReset(&utd);
+    if (headerGet(sigh, RPMSIGTAG_RESERVEDSPACE, &utd, HEADERGET_MINMEM)) {
+       int diff;
+       int count;
+       char *reservedSpace = NULL;
+
+       count = utd.count;
+       diff = headerSizeof(sigh, HEADER_MAGIC_YES) - origSigSize;
+
+       if (diff < count) {
+           reservedSpace = xcalloc(count - diff, sizeof(char));
+           headerDel(sigh, RPMSIGTAG_RESERVEDSPACE);
+           rpmtdReset(&utd);
+           utd.tag = RPMSIGTAG_RESERVEDSPACE;
+           utd.count = count - diff;
+           utd.type = RPM_BIN_TYPE;
+           utd.data = reservedSpace;
+           headerPut(sigh, &utd, HEADERPUT_DEFAULT);
+           free(reservedSpace);
+           insSig = 1;
+       }
     }
 
     /* Reallocate the signature into one contiguous region. */
@@ -512,38 +758,60 @@ static int rpmSign(const char *rpm, int deleting, const char *passPhrase)
     if (sigh == NULL)  /* XXX can't happen */
        goto exit;
 
-    rasprintf(&trpm, "%s.XXXXXX", rpm);
-    ofd = rpmMkTemp(trpm);
-    if (ofd == NULL || Ferror(ofd)) {
-       rpmlog(RPMLOG_ERR, _("rpmMkTemp failed\n"));
-       goto exit;
-    }
+    if (insSig) {
+       /* Insert new signature into original rpm */
+       if (Fseek(fd, sigStart, SEEK_SET) < 0) {
+           rpmlog(RPMLOG_ERR, _("Could not seek in file %s: %s\n"),
+                   rpm, Fstrerror(fd));
+           goto exit;
+       }
 
-    /* Write the lead/signature of the output rpm */
-    rc = rpmLeadWrite(ofd, lead);
-    if (rc != RPMRC_OK) {
-       rpmlog(RPMLOG_ERR, _("%s: writeLead failed: %s\n"), trpm,
-           Fstrerror(ofd));
-       goto exit;
-    }
+       if (rpmWriteSignature(fd, sigh)) {
+           rpmlog(RPMLOG_ERR, _("%s: rpmWriteSignature failed: %s\n"), rpm,
+               Fstrerror(fd));
+           goto exit;
+       }
+       res = 0;
+    } else {
+       /* Replace orignal rpm with new rpm containing new signature */
+       rasprintf(&trpm, "%s.XXXXXX", rpm);
+       ofd = rpmMkTemp(trpm);
+       if (ofd == NULL || Ferror(ofd)) {
+           rpmlog(RPMLOG_ERR, _("rpmMkTemp failed\n"));
+           goto exit;
+       }
 
-    if (rpmWriteSignature(ofd, sigh)) {
-       rpmlog(RPMLOG_ERR, _("%s: rpmWriteSignature failed: %s\n"), trpm,
-           Fstrerror(ofd));
-       goto exit;
-    }
+       /* Write the lead/signature of the output rpm */
+       rc = rpmLeadWrite(ofd, h);
+       if (rc != RPMRC_OK) {
+           rpmlog(RPMLOG_ERR, _("%s: writeLead failed: %s\n"), trpm,
+               Fstrerror(ofd));
+           goto exit;
+       }
 
-    /* Append the header and archive from the temp file */
-    if (copyFile(&fd, sigtarget, &ofd, trpm) == 0) {
-       struct stat st;
+       if (rpmWriteSignature(ofd, sigh)) {
+           rpmlog(RPMLOG_ERR, _("%s: rpmWriteSignature failed: %s\n"), trpm,
+               Fstrerror(ofd));
+           goto exit;
+       }
 
-       /* Move final target into place, restore file permissions. */
-       if (stat(rpm, &st) == 0 && unlink(rpm) == 0 &&
-                   rename(trpm, rpm) == 0 && chmod(rpm, st.st_mode) == 0) {
-           res = 0;
-       } else {
-           rpmlog(RPMLOG_ERR, _("replacing %s failed: %s\n"),
-                  rpm, strerror(errno));
+       if (Fseek(fd, headerStart, SEEK_SET) < 0) {
+           rpmlog(RPMLOG_ERR, _("Could not seek in file %s: %s\n"),
+                   rpm, Fstrerror(fd));
+           goto exit;
+       }
+       /* Append the header and archive from the temp file */
+       if (copyFile(&fd, rpm, &ofd, trpm) == 0) {
+           struct stat st;
+
+           /* Move final target into place, restore file permissions. */
+           if (stat(rpm, &st) == 0 && unlink(rpm) == 0 &&
+                       rename(trpm, rpm) == 0 && chmod(rpm, st.st_mode) == 0) {
+               res = 0;
+           } else {
+               rpmlog(RPMLOG_ERR, _("replacing %s failed: %s\n"),
+                      rpm, strerror(errno));
+           }
        }
     }
 
@@ -551,14 +819,11 @@ exit:
     if (fd)    (void) closeFile(&fd);
     if (ofd)   (void) closeFile(&ofd);
 
-    rpmFreeSignature(sigh);
-    rpmLeadFree(lead);
+    headerFree(sigh);
+    headerFree(h);
+    free(msg);
 
     /* Clean up intermediate target */
-    if (sigtarget) {
-       unlink(sigtarget);
-       free(sigtarget);
-    }
     if (trpm) {
        (void) unlink(trpm);
        free(trpm);
@@ -567,8 +832,7 @@ exit:
     return res;
 }
 
-int rpmPkgSign(const char *path,
-               const struct rpmSignArgs * args, const char *passPhrase)
+int rpmPkgSign(const char *path, const struct rpmSignArgs * args)
 {
     int rc;
 
@@ -576,29 +840,29 @@ int rpmPkgSign(const char *path,
        if (args->hashalgo) {
            char *algo = NULL;
            rasprintf(&algo, "%d", args->hashalgo);
-           addMacro(NULL, "_gpg_digest_algo", NULL, algo, RMIL_GLOBAL);
+           rpmPushMacro(NULL, "_gpg_digest_algo", NULL, algo, RMIL_GLOBAL);
            free(algo);
        }
        if (args->keyid) {
-           addMacro(NULL, "_gpg_name", NULL, args->keyid, RMIL_GLOBAL);
+           rpmPushMacro(NULL, "_gpg_name", NULL, args->keyid, RMIL_GLOBAL);
        }
     }
 
-    rc = rpmSign(path, 0, passPhrase);
+    rc = rpmSign(path, 0, args ? args->signfiles : 0);
 
     if (args) {
        if (args->hashalgo) {
-           delMacro(NULL, "_gpg_digest_algo");
+           rpmPopMacro(NULL, "_gpg_digest_algo");
        }
        if (args->keyid) {
-           delMacro(NULL, "_gpg_name");
+           rpmPopMacro(NULL, "_gpg_name");
        }
     }
 
     return rc;
 }
 
-int rpmPkgDelSign(const char *path)
+int rpmPkgDelSign(const char *path, const struct rpmSignArgs * args)
 {
-    return rpmSign(path, 1, NULL);
+    return rpmSign(path, 1, 0);
 }
index 15b3e0fe820cb033ec2d77f6267403e947598666..bed8d6245d14b7c17e45a4fd77c96b72f861b120 100644 (file)
@@ -1,6 +1,11 @@
 #ifndef _RPMSIGN_H
 #define _RPMSIGN_H
 
+/** \file sign/rpmsign.h
+ *
+ * Signature API
+ */
+
 #include <rpm/argv.h>
 #include <rpm/rpmpgp.h>
 
@@ -11,6 +16,7 @@ extern "C" {
 struct rpmSignArgs {
     char *keyid;
     pgpHashAlgo hashalgo;
+    int signfiles;
     /* ... what else? */
 };
 
@@ -18,18 +24,17 @@ struct rpmSignArgs {
  * Sign a package
  * @param path         path to package
  * @param args         signing parameters (or NULL for defaults)
- * @param passPhrase   passphrase for the signing key
  * @return             0 on success
  */
-int rpmPkgSign(const char *path,
-              const struct rpmSignArgs * args, const char *passPhrase);
+int rpmPkgSign(const char *path, const struct rpmSignArgs * args);
 
 /** \ingroup rpmsign
  * Delete signature(s) from a package
  * @param path         path to package
+ * @param args         signing parameters (or NULL for defaults)
  * @return             0 on success
  */
-int rpmPkgDelSign(const char *path);
+int rpmPkgDelSign(const char *path, const struct rpmSignArgs * args);
 
 #ifdef __cplusplus
 }
diff --git a/sign/rpmsignfiles.c b/sign/rpmsignfiles.c
new file mode 100644 (file)
index 0000000..61b73bd
--- /dev/null
@@ -0,0 +1,135 @@
+/**
+ * Copyright (C) 2014 IBM Corporation
+ *
+ * Author: Fionnuala Gunter <fin@linux.vnet.ibm.com>
+ */
+
+#include "system.h"
+#include "imaevm.h"
+
+#include <rpm/rpmlog.h>                /* rpmlog */
+#include <rpm/rpmstring.h>     /* rnibble */
+#include <rpm/rpmpgp.h>                /* rpmDigestLength */
+#include "lib/header.h"                /* HEADERGET_MINMEM */
+#include "lib/rpmtypes.h"      /* rpmRC */
+
+#include "sign/rpmsignfiles.h"
+
+#define MAX_SIGNATURE_LENGTH 1024
+
+static const char *hash_algo_name[] = {
+    [PGPHASHALGO_MD5]          = "md5",
+    [PGPHASHALGO_SHA1]         = "sha1",
+    [PGPHASHALGO_RIPEMD160]    = "rmd160",
+    [PGPHASHALGO_MD2]          = "md2",
+    [PGPHASHALGO_TIGER192]     = "tgr192",
+    [PGPHASHALGO_HAVAL_5_160]  = "haval5160",
+    [PGPHASHALGO_SHA256]       = "sha256",
+    [PGPHASHALGO_SHA384]       = "sha384",
+    [PGPHASHALGO_SHA512]       = "sha512",
+    [PGPHASHALGO_SHA224]       = "sha224",
+};
+
+#define ARRAY_SIZE(a)  (sizeof(a) / sizeof(a[0]))
+
+static char *signFile(const char *algo, const char *fdigest, int diglen,
+const char *key, char *keypass)
+{
+    char *fsignature;
+    unsigned char digest[diglen];
+    unsigned char signature[MAX_SIGNATURE_LENGTH];
+    int siglen;
+
+    /* convert file digest hex to binary */
+    memset(digest, 0, diglen);
+    /* some entries don't have a digest - we return an empty signature */
+    if (strlen(fdigest) != diglen * 2)
+        return strdup("");
+
+    for (int i = 0; i < diglen; ++i, fdigest += 2)
+       digest[i] = (rnibble(fdigest[0]) << 4) | rnibble(fdigest[1]);
+
+    /* prepare file signature */
+    memset(signature, 0, MAX_SIGNATURE_LENGTH);
+    signature[0] = '\x03';
+
+    /* calculate file signature */
+    siglen = sign_hash(algo, digest, diglen, key, keypass, signature+1);
+    if (siglen < 0) {
+       rpmlog(RPMLOG_ERR, _("sign_hash failed\n"));
+       return NULL;
+    }
+
+    /* convert file signature binary to hex */
+    fsignature = pgpHexStr(signature, siglen+1);
+    return fsignature;
+}
+
+static uint32_t signatureLength(const char *algo, int diglen, const char *key,
+char *keypass)
+{
+    unsigned char digest[diglen];
+    unsigned char signature[MAX_SIGNATURE_LENGTH];
+
+    memset(digest, 0, diglen);
+    memset(signature, 0, MAX_SIGNATURE_LENGTH);
+    signature[0] = '\x03';
+
+    uint32_t siglen = sign_hash(algo, digest, diglen, key, keypass,
+                               signature+1);
+    return siglen + 1;
+}
+
+rpmRC rpmSignFiles(Header h, const char *key, char *keypass)
+{
+    struct rpmtd_s digests;
+    int algo;
+    int diglen;
+    uint32_t siglen;
+    const char *algoname;
+    const char *digest;
+    char *signature;
+    rpmRC rc = RPMRC_OK;
+
+    algo = headerGetNumber(h, RPMTAG_FILEDIGESTALGO);
+    if (!algo) {
+        /* use default algorithm */
+        algo = PGPHASHALGO_MD5;
+    } else if (algo < 0 || algo >= ARRAY_SIZE(hash_algo_name)) {
+       rpmlog(RPMLOG_ERR, _("File digest algorithm id is invalid"));
+       return RPMRC_FAIL;
+    }
+
+    diglen = rpmDigestLength(algo);
+    algoname = hash_algo_name[algo];
+    if (!algoname) {
+       rpmlog(RPMLOG_ERR, _("hash_algo_name failed\n"));
+       return RPMRC_FAIL;
+    }
+
+    headerDel(h, RPMTAG_FILESIGNATURELENGTH);
+    headerDel(h, RPMTAG_FILESIGNATURES);
+    siglen = signatureLength(algoname, diglen, key, keypass);
+    headerPutUint32(h, RPMTAG_FILESIGNATURELENGTH, &siglen, 1);
+
+    headerGet(h, RPMTAG_FILEDIGESTS, &digests, HEADERGET_MINMEM);
+    while ((digest = rpmtdNextString(&digests))) {
+       signature = signFile(algoname, digest, diglen, key, keypass);
+       if (!signature) {
+           rpmlog(RPMLOG_ERR, _("signFile failed\n"));
+           rc = RPMRC_FAIL;
+           goto exit;
+       }
+       if (!headerPutString(h, RPMTAG_FILESIGNATURES, signature)) {
+           free(signature);
+           rpmlog(RPMLOG_ERR, _("headerPutString failed\n"));
+           rc = RPMRC_FAIL;
+           goto exit;
+       }
+       free(signature);
+    }
+
+exit:
+    rpmtdFreeData(&digests);
+    return rc;
+}
diff --git a/sign/rpmsignfiles.h b/sign/rpmsignfiles.h
new file mode 100644 (file)
index 0000000..4163faf
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef H_RPMSIGNFILES
+#define H_RPMSIGNFILES
+
+#include <rpm/rpmtypes.h>
+#include <rpm/rpmutil.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Sign file digests in header and store the signatures in header
+ * @param h            package header
+ * @param key          signing key
+ * @param keypass      signing key password
+ * @return             RPMRC_OK on success
+ */
+RPM_GNUC_INTERNAL
+rpmRC rpmSignFiles(Header h, const char *key, char *keypass);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif /* H_RPMSIGNFILES */
index f3b1bab329be6ddd4d5600ce35468c80a41f4a43..570cef13a4e35fc1b6d799cf19eebb550cdf3cea 100644 (file)
--- a/system.h
+++ b/system.h
@@ -1,5 +1,7 @@
 /**
  * \file system.h
+ *
+ *  Some misc low-level API
  */
 
 #ifndef        H_SYSTEM
@@ -78,29 +80,8 @@ char * stpncpy(char * dest, const char * src, size_t n);
 #endif
 #endif
 
-#if WITH_SELINUX
-#include <selinux/selinux.h>
-#include <selinux/label.h>
-#include <selinux/avc.h>
-#else
-typedef        char * security_context_t;
-
-#define        freecon(_c)
-
-#define        setfilecon(_fn, _c)     (-1)
-#define        lsetfilecon(_fn, _c)    (-1)
-
-#define        is_selinux_enabled()    (0)
-
-#define matchpathcon_init(_fn)                 (-1)
-#define matchpathcon_fini()                    (0)
-#define matchpathcon(_fn, _fm, _c)             (-1)
-
-#define selabel_lookup_raw(_hnd, _scon, _key,_type)    (-1)
-
-#define selinux_file_context_path() (0)
-
-#define rpm_execcon(_v, _fn, _av, _envp)       (0)
+#if defined(HAVE_FDATASYNC) && !HAVE_DECL_FDATASYNC
+extern int fdatasync(int fildes);
 #endif
 
 #include "rpmio/rpmutil.h"
@@ -111,20 +92,23 @@ typedef    char * security_context_t;
 #define xstrdup(_str) rstrdup((_str))
 #define _free(_ptr) rfree((_ptr))
 
-/* Retrofit glibc __progname */
-#if defined __GLIBC__ && __GLIBC__ >= 2
-#if __GLIBC_MINOR__ >= 1
-#define        __progname      __assert_program_name
-#endif
-#define        setprogname(pn)
+/* To extract program's name: use calls (reimplemented or shipped with system):
+   - void setprogname(const char *pn)
+   - const char *getprogname(void)
+
+   setprogname(*pn) must be the first call in main() in order to set the name
+   as soon as possible. */
+#if defined(HAVE_SETPROGNAME) /* BSD'ish systems */
+# include <stdlib.h> /* Make sure this header is included */
+# define xsetprogname(pn) setprogname(pn)
+# define xgetprogname(pn) getprogname(pn)
+#elif defined(HAVE___PROGNAME) /* glibc and others */
+# define xsetprogname(pn)
+  extern const char *__progname;
+# define xgetprogname(pn) __progname
 #else
-#define        __progname      program_name
-#define        setprogname(pn) \
-  { if ((__progname = strrchr(pn, '/')) != NULL) __progname++; \
-    else __progname = pn;              \
-  }
+# error "Did not find any sutable implementation of xsetprogname/xgetprogname"
 #endif
-extern const char *__progname;
 
 /* Take care of NLS matters.  */
 #if ENABLE_NLS
index 61c18afcbb9a29567e1e647a8dd977059d285629..bd5d4d71dd4b4c04aad406351cc17b353c3b9ffa 100644 (file)
@@ -1,13 +1,11 @@
 ## Process this file with automake to produce Makefile.in.
 
 include $(top_srcdir)/rpm.am
+AM_CFLAGS = @RPMCFLAGS@
 
 EXTRA_DIST =
 CLEANFILES =
 
-# HACK: This should not be here.
-rpmbindir = `echo $(bindir) | sed -e s,usr/bin,bin,`
-
 ##
 TESTSUITE = $(srcdir)/rpmtests
 EXTRA_DIST += local.at $(TESTSUITE)
@@ -19,6 +17,7 @@ TESTSUITE_AT += rpmquery.at
 TESTSUITE_AT += rpmverify.at
 TESTSUITE_AT += rpmdb.at
 TESTSUITE_AT += rpmbuild.at
+TESTSUITE_AT += rpmbuildid.at
 TESTSUITE_AT += rpmi.at
 TESTSUITE_AT += rpmvercmp.at
 TESTSUITE_AT += rpmdeps.at
@@ -31,17 +30,26 @@ TESTSUITE_AT += rpmmacro.at
 TESTSUITE_AT += rpmpython.at
 TESTSUITE_AT += rpmdepmatch.at
 TESTSUITE_AT += rpmscript.at
+TESTSUITE_AT += rpmsigdig.at
+TESTSUITE_AT += rpmio.at
+TESTSUITE_AT += rpmorder.at
 EXTRA_DIST += $(TESTSUITE_AT)
 
 ## testsuite data
 EXTRA_DIST += data/SPECS/attrtest.spec
 EXTRA_DIST += data/SPECS/hello.spec
+EXTRA_DIST += data/SPECS/hello-r2.spec
 EXTRA_DIST += data/SPECS/hello-script.spec
+EXTRA_DIST += data/SPECS/hello2.spec
+EXTRA_DIST += data/SPECS/hello2cp.spec
+EXTRA_DIST += data/SPECS/hello2ln.spec
+EXTRA_DIST += data/SPECS/hello2-suid.spec
 EXTRA_DIST += data/SPECS/foo.spec
 EXTRA_DIST += data/SPECS/globtest.spec
 EXTRA_DIST += data/SPECS/versiontest.spec
 EXTRA_DIST += data/SPECS/conflicttest.spec
 EXTRA_DIST += data/SPECS/configtest.spec
+EXTRA_DIST += data/SPECS/filedep.spec
 EXTRA_DIST += data/SPECS/flangtest.spec
 EXTRA_DIST += data/SPECS/hlinktest.spec
 EXTRA_DIST += data/SPECS/symlinktest.spec
@@ -51,6 +59,16 @@ EXTRA_DIST += data/SPECS/fakeshell.spec
 EXTRA_DIST += data/SPECS/scripts.spec
 EXTRA_DIST += data/SPECS/selfconflict.spec
 EXTRA_DIST += data/SPECS/replacetest.spec
+EXTRA_DIST += data/SPECS/triggers.spec
+EXTRA_DIST += data/SPECS/filetriggers.spec
+EXTRA_DIST += data/SPECS/parallel.spec
+EXTRA_DIST += data/SPECS/prefixtest.spec
+EXTRA_DIST += data/SPECS/testdoc.spec
+EXTRA_DIST += data/SPECS/sigpipe.spec
+EXTRA_DIST += data/SPECS/test-subpackages.spec
+EXTRA_DIST += data/SPECS/test-subpackages-exclude.spec
+EXTRA_DIST += data/SPECS/test-subpackages-pathpostfixes.spec
+EXTRA_DIST += data/SPECS/vattrtest.spec
 EXTRA_DIST += data/SOURCES/hello-1.0-modernize.patch
 EXTRA_DIST += data/SOURCES/hello-1.0.tar.gz
 EXTRA_DIST += data/SOURCES/hello-2.0.tar.gz
@@ -59,8 +77,18 @@ EXTRA_DIST += data/RPMS/hello-1.0-1.i386.rpm
 EXTRA_DIST += data/RPMS/hello-1.0-1.ppc64.rpm
 EXTRA_DIST += data/RPMS/hello-2.0-1.i686.rpm
 EXTRA_DIST += data/RPMS/hello-2.0-1.x86_64.rpm
+EXTRA_DIST += data/RPMS/hello-2.0-1.x86_64-signed.rpm
 EXTRA_DIST += data/SRPMS/foo-1.0-1.src.rpm
 EXTRA_DIST += data/SRPMS/hello-1.0-1.src.rpm
+EXTRA_DIST += data/SOURCES/hello.c
+EXTRA_DIST += data/SPECS/hello-attr-buildid.spec
+EXTRA_DIST += data/SPECS/hello-config-buildid.spec
+EXTRA_DIST += data/SPECS/hello-cd.spec
+EXTRA_DIST += data/keys/rpm.org-rsa-2048-test.pub
+EXTRA_DIST += data/keys/rpm.org-rsa-2048-test.secret
+EXTRA_DIST += data/keys/CVE-2021-3521-badbind.asc
+EXTRA_DIST += data/keys/CVE-2021-3521-nosubsig.asc
+EXTRA_DIST += data/keys/CVE-2021-3521-nosubsig-last.asc
 
 # testsuite voodoo
 AUTOTEST = $(AUTOM4TE) --language=autotest
@@ -86,35 +114,41 @@ CLEANFILES += atconfig
 
 atlocal:       atlocal.in Makefile
        @sed \
-         -e "s,[@]rpmbindir[@],$(rpmbindir)," \
          -e "s,[@]usrbindir[@],$(bindir)," \
          -e "s,[@]usrlibdir[@],$(libdir)," \
+         -e "s,[@]execprefix[@],$(exec_prefix)," \
          -e "s,[@]RPMCONFIGDIR[@],$(rpmconfigdir)," \
        < $(srcdir)/atlocal.in > atlocal
 DISTCLEANFILES = atlocal
 EXTRA_DIST += atlocal.in
 
 # Hack: Abusing testing$(bindir)/rpmbuild as stamp file
+# The chmod is needed when copying from read-only sources (eg in distcheck)
 testing$(bindir)/rpmbuild: ../rpmbuild
+       HOME=$(abs_builddir)/testing gpg-connect-agent --no-autostart killagent bye ||:
        rm -rf testing
        mkdir -p testing/$(bindir)
        ln -s ./$(bindir) testing/bin
+       mkdir -p testing/usr
+       ln -s ../bin testing/usr/bin
        (cd ${top_builddir} && \
                  $(MAKE) DESTDIR=`pwd`/${subdir}/testing install)
-       cp -r data/ testing/
-       mkdir testing/{dev,etc,magic,tmp}
-       for node in stdin stderr stdout null; do ln -s /dev/$${node} testing/dev/$${node}; done
-       for cf in hosts resolv.conf passwd shadow group gshadow mtab fstab; do [ -f /etc/$${cf} ] && ln -s /etc/$${cf} testing/etc/$${cf}; done
-       for prog in gzip cat patch tar sh ln chmod rm mkdir uname grep sed find file mktemp cut sort diff; do p=`which $${prog}`; ln -s $${p} testing/$${p}; done
+       cp -r ${srcdir}/data/ testing/
+       chmod -R u+w testing/data/
+       for d in dev etc magic tmp var; do if [ ! -d testing/$${d} ]; then mkdir testing/$${d}; fi; done
+       for node in urandom stdin stderr stdout null; do ln -s /dev/$${node} testing/dev/$${node}; done
+       for cf in hosts resolv.conf passwd shadow group gshadow mtab ; do [ -f /etc/$${cf} ] && ln -s /etc/$${cf} testing/etc/$${cf}; done
+       for prog in gzip cat patch tar sh ln chmod rm mkdir uname grep sed find file ionice mktemp nice cut sort diff touch install wc; do p=`which $${prog}`; ln -s $${p} testing/$(bindir)/; done
        for d in /proc /sys /selinux /etc/selinux; do if [ -d $${d} ]; then ln -s $${d} testing/$${d}; fi; done
        (cd testing/magic && file -C)
+       HOME=$(abs_builddir)/testing gpg2 --import ${abs_srcdir}/data/keys/*.secret || HOME=$(abs_builddir)/testing gpg --import ${abs_srcdir}/data/keys/*.secret
 
 check_DATA = atconfig atlocal $(TESTSUITE)
 check_DATA += testing$(bindir)/rpmbuild
 
 if HAVE_FAKECHROOT
 check-local: $(check_DATA)
-       $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS) ||:
+       $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)
 else
 check-local:
        echo "you need to have fakechroot installed"
index 5ce6f4f93df416dc5eeb7f6a5283f4e4d6895529..d7d837f45737913c3bb8c79c0c5bee156c9de068 100644 (file)
@@ -3,7 +3,7 @@ export LD_LIBRARY_PATH
 PATH="${abs_builddir}/testing@rpmbindir@:${abs_builddir}/testing@usrbindir@:$PATH"
 export PATH
 
-PYLIBDIR=`python -c "from distutils.sysconfig import get_python_lib; import sys; sys.stdout.write(get_python_lib(1))"`
+PYLIBDIR=`python -c "from distutils.sysconfig import get_python_lib; import sys; sys.stdout.write(get_python_lib(1,0,'@execprefix@'))"`
 PYTHONPATH="${abs_builddir}/testing${PYLIBDIR}"
 export PYTHONPATH
 
@@ -18,18 +18,35 @@ export RPM_CONFIGDIR RPM_POPTEXEC_PATH
 HOME="${RPMTEST}"
 export HOME
 
+TZ=UTC
+export TZ
+
 TOPDIR="${RPMTEST}/build"
 
 RPM_XFAIL=${RPM_XFAIL-1}
 
 function run()
 {
-    "$@" --define "_topdir ${TOPDIR}" --dbpath="${RPMTEST}/var/lib/rpm/"
+    "$@" --define "_tmppath ${RPMTEST}/tmp" --define "_topdir ${TOPDIR}" --dbpath="${RPMTEST}/var/lib/rpm/"
+}
+
+function rundebug()
+{
+    cp ${top_srcdir}/macros.debug ${RPM_CONFIGDIR}/macros.d/
+    "$@" --define "_tmppath ${RPMTEST}/tmp" --define "_topdir ${TOPDIR}" --dbpath="${RPMTEST}/var/lib/rpm/"
+    rm -f ${RPM_CONFIGDIR}/macros.d/macros.debug
 }
 
 function runroot()
 {
-    (cd ${RPMTEST} && \
-     MAGIC="/magic/magic" FAKECHROOT_BASE="${RPMTEST}" fakechroot "$@" --define "_topdir /build"
+    (unset RPM_CONFIGDIR RPM_POPTEXEC_PATH; cd ${RPMTEST} && \
+     MAGIC="/magic/magic" FAKECHROOT_BASE="${RPMTEST}" fakechroot "$@" --define "_topdir /build" --noplugins
+    )
+}
+
+function runroot_other()
+{
+    (unset RPM_CONFIGDIR RPM_POPTEXEC_PATH; cd ${RPMTEST} && \
+     FAKECHROOT_BASE="${RPMTEST}" fakechroot "$@"
     )
 }
index 46c60b1f9ee54e1479320267aafb793b81906882..ecb7c96d72812f4b583ac0c913e7b5ae2e9e191d 100644 (file)
Binary files a/tests/data/RPMS/hello-2.0-1.i686.rpm and b/tests/data/RPMS/hello-2.0-1.i686.rpm differ
diff --git a/tests/data/RPMS/hello-2.0-1.x86_64-signed.rpm b/tests/data/RPMS/hello-2.0-1.x86_64-signed.rpm
new file mode 100644 (file)
index 0000000..be627a7
Binary files /dev/null and b/tests/data/RPMS/hello-2.0-1.x86_64-signed.rpm differ
index 50e39ddd9572bd012df85d20838e2319a30f4eda..003e930938bdcfd75b559b546b5b4041920a7ce3 100644 (file)
Binary files a/tests/data/RPMS/hello-2.0-1.x86_64.rpm and b/tests/data/RPMS/hello-2.0-1.x86_64.rpm differ
diff --git a/tests/data/SOURCES/hello.c b/tests/data/SOURCES/hello.c
new file mode 100644 (file)
index 0000000..020484e
--- /dev/null
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+int
+main (void)
+{
+  printf ("Hello, world!\n");
+  return 0;
+}
diff --git a/tests/data/SOURCES/poltest-1.0.tar.bz2 b/tests/data/SOURCES/poltest-1.0.tar.bz2
deleted file mode 100644 (file)
index 37dcc23..0000000
Binary files a/tests/data/SOURCES/poltest-1.0.tar.bz2 and /dev/null differ
diff --git a/tests/data/SOURCES/poltest-policy-1.0.tar.bz2 b/tests/data/SOURCES/poltest-policy-1.0.tar.bz2
deleted file mode 100644 (file)
index 76f4e14..0000000
Binary files a/tests/data/SOURCES/poltest-policy-1.0.tar.bz2 and /dev/null differ
index 6f787b19e0cb28c8c99f4713400f6e3cca9831b1..1d7e4bfe2c8a759c3cfc66f3925ae927bed7c284 100644 (file)
@@ -20,7 +20,7 @@ for x in a b c d e f g h i j; do
     chmod 400 $RPM_BUILD_ROOT/${x}/file
 done
 
-%files
+%files -n %{name}
 /a/dir
 /a/file
 
@@ -56,3 +56,7 @@ done
 %defattr(640,zoot,zoot,750)
 %attr(777,-,-) /j/dir
 %attr(222,-,-) /j/file
+
+%changelog
+* Tue Jun 28 2011 Panu Matilainen <pmatilai@redhat.com>
+- Initial package
index 5f15c349fcfdac2c6ae376401b0cf1f0de240798..17dd7c901e86ab4773da77a7329dd129e39c9a34 100644 (file)
@@ -1,3 +1,6 @@
+# avoid depending on rpm configuration
+%define _sysconfdir /etc
+
 %{!?filetype: %global filetype file}
 
 Name:          configtest%{?sub:-%{sub}}
index bd1dd1c5f7751cee1a8bfb88a06a4e3d604e3f66..46fbb29a1e73ac090ce15b9120b07e25c396929d 100644 (file)
@@ -1,3 +1,6 @@
+# avoid depending on rpm configuration
+%define _datadir /usr/share
+
 Name:          conflict%{pkg}
 Version:       1.0
 Release:       1
index 7f2228f11606fda23584eead38232e8617ce1103..68b0fcbcc32ff021c6860534ee9800882c4739b5 100644 (file)
@@ -10,9 +10,20 @@ BuildArch:   noarch
 %{?provs:Provides: %{provs}}
 %{?cfls:Conflicts: %{cfls}}
 %{?obs:Obsoletes: %{obs}}
+%{?recs:Recommends: %{recs}}
+%{?sugs:Suggests: %{sugs}}
+%{?sups:Supplements: %{sups}}
+%{?ens:Enhances: %{ens}}
+%{?buildreqs:BuildRequires: %{buildreqs}}
+%{?buildcfls:BuildConflicts: %{buildcfls}}
 
 %description
 %{summary}
 
+%install
+mkdir -p %{buildroot}/opt/
+echo FOO > %{buildroot}/opt/bar
+
 %files
 %defattr(-,root,root,-)
+/opt/bar
diff --git a/tests/data/SPECS/filedep.spec b/tests/data/SPECS/filedep.spec
new file mode 100644 (file)
index 0000000..d403058
--- /dev/null
@@ -0,0 +1,49 @@
+Name:          filedep
+Version:       1.0
+Release:       1
+Summary:       Testing file dependencies
+License:       GPL
+BuildArch:     noarch
+
+%description
+%{summary}
+
+%prep
+%setup -q -T -c %{name}-%{version}
+
+
+%build
+cat << EOF >> foo
+#!/bin/sh
+cat /etc/foo.conf
+EOF
+
+cat << EOF >> bar
+#!/bin/f00f
+echo BUG
+EOF
+
+cat << EOF >> foo.conf
+hello there
+EOF
+
+cat << EOF >> README
+Some stuff, huh?
+EOF
+
+%install
+mkdir -p %{buildroot}/etc
+mkdir -p %{buildroot}/usr/bin
+mkdir -p %{buildroot}/usr/share/doc/filedep
+install -D -m 644 foo.conf %{buildroot}/etc
+install -D -m 755 foo bar %{buildroot}/usr/bin/
+install -D -m 644 README %{buildroot}/usr/share/doc/filedep
+
+%files
+/etc/*
+/usr/bin/*
+/usr/share/doc/filedep/
+
+
+%changelog
+
diff --git a/tests/data/SPECS/filetriggers.spec b/tests/data/SPECS/filetriggers.spec
new file mode 100644 (file)
index 0000000..b1dc3d5
--- /dev/null
@@ -0,0 +1,95 @@
+Name:           filetriggers
+Version:        1.0
+Release:        1
+Summary:        Testing file triggers
+
+Group:          testing
+License:        GPL
+BuildArch:      noarch
+
+
+%description
+%{summary}
+
+
+%filetriggerin --  /usr/bin
+echo "filetriggerin(/usr/bin*):"
+cat
+echo
+
+%filetriggerun --  /usr/bin
+echo "filetriggerun(/usr/bin*):"
+cat
+echo
+
+%filetriggerpostun --  /usr/bin
+echo "filetriggerpostun(/usr/bin*):"
+cat
+echo
+
+%transfiletriggerin -- /usr/bin
+echo "transfiletriggerin(/usr/bin*):"
+cat
+echo
+
+%transfiletriggerun -- /usr/bin
+echo "transfiletriggerun(/usr/bin*):"
+cat
+echo
+
+%transfiletriggerpostun -- /usr/bin
+echo "transfiletriggerpostun(/usr/bin*):"
+cat
+echo
+
+%filetriggerin -p <lua> -- /usr/bin
+print("filetriggerin(/usr/bin*)<lua>:")
+a = rpm.next_file()
+while a do
+    print(a)
+    a = rpm.next_file()
+end
+print("")
+io.flush()
+
+%filetriggerin -- /foo
+echo "filetriggerin(/foo*):"
+cat
+echo
+
+%filetriggerun -- /foo
+echo "filetriggerun(/foo*):"
+cat
+echo
+
+%filetriggerpostun -- /foo
+echo "filetriggerpostun(/foo*):"
+cat
+echo
+
+%transfiletriggerin -- /foo
+echo "transfiletriggerin(/foo*):"
+cat
+echo
+
+%transfiletriggerun -- /foo
+echo "transfiletriggerun(/foo*):"
+cat
+echo
+
+%transfiletriggerpostun -- /foo
+echo "transfiletriggerpostun(/foo*):"
+cat
+echo
+
+%filetriggerin -p <lua> -- /foo
+print("filetriggerin(/foo*)<lua>:")
+a = rpm.next_file()
+while a do
+    print(a)
+    a = rpm.next_file()
+end
+print("")
+io.flush()
+
+%files
index 3f36795887a7b1accebe54b280bcc88df9f0532a..a361bcdc993e3c3a6e3cee614b19a34deb10e289 100644 (file)
@@ -1,3 +1,6 @@
+# avoid depending on rpm configuration
+%define _datadir /usr/share
+
 Name:           flangtest 
 Version:        1.0
 Release:        1
@@ -16,6 +19,7 @@ mkdir -p  $RPM_BUILD_ROOT/%{_datadir}/%{name}
 for f in fi de en pl none; do
     echo "This is $f language" > $RPM_BUILD_ROOT/%{_datadir}/%{name}/$f.txt
 done
+touch $RPM_BUILD_ROOT/%{_datadir}/%{name}/empty.txt
 
 %clean
 rm -rf $RPM_BUILD_ROOT
@@ -27,3 +31,4 @@ rm -rf $RPM_BUILD_ROOT
 %lang(en) %{_datadir}/%{name}/en.txt
 %lang(pl) %{_datadir}/%{name}/pl.txt
 %{_datadir}/%{name}/none.txt
+%{_datadir}/%{name}/empty.txt
diff --git a/tests/data/SPECS/hello-attr-buildid.spec b/tests/data/SPECS/hello-attr-buildid.spec
new file mode 100644 (file)
index 0000000..cdab95f
--- /dev/null
@@ -0,0 +1,27 @@
+Name:           test
+Version:        1.0
+Release:        1
+Summary:        Test
+
+License:        Public Domain
+URL:            https://fedoraproject.org
+Source:         hello.c
+
+%description
+%{summary}.
+
+%prep
+%autosetup -c -D -T
+cp -a %{S:0} .
+
+%build
+gcc -g hello.c -o hello
+
+%install
+mkdir -p %{buildroot}%{_bindir}
+install -D -p -m 0755 -t %{buildroot}%{_bindir} hello
+
+%files
+%attr(644,root,root) %{_bindir}/hello
+
+%changelog
diff --git a/tests/data/SPECS/hello-cd.spec b/tests/data/SPECS/hello-cd.spec
new file mode 100644 (file)
index 0000000..ab1e300
--- /dev/null
@@ -0,0 +1,29 @@
+Name:           test
+Version:        1.0
+Release:        1
+Summary:        Test
+
+License:        Public Domain
+URL:            https://fedoraproject.org
+Source:         hello.c
+
+%description
+%{summary}.
+
+%prep
+%autosetup -c -D -T
+cp -a %{S:0} .
+
+%build
+gcc -g hello.c -o hello
+
+%install
+mkdir -p %{buildroot}/bin
+install -D -p -m 0755 -t %{buildroot}/bin hello
+# Pretend we need to do something in /tmp
+cd /tmp
+
+%files
+%attr(644,root,root) /bin/hello
+
+%changelog
diff --git a/tests/data/SPECS/hello-config-buildid.spec b/tests/data/SPECS/hello-config-buildid.spec
new file mode 100644 (file)
index 0000000..ca2d30d
--- /dev/null
@@ -0,0 +1,30 @@
+Name:           test
+Version:        1.0
+Release:        1
+Summary:        Test
+
+License:        Public Domain
+URL:            https://fedoraproject.org
+Source:         hello.c
+
+%description
+%{summary}.
+
+%prep
+%autosetup -c -D -T
+cp -a %{S:0} .
+
+%build
+gcc -g hello.c -o hello
+
+%install
+mkdir -p %{buildroot}/bin
+install -D -p -m 0755 -t %{buildroot}/bin hello
+mkdir -p %{buildroot}/etc
+echo "settings" > %{buildroot}/etc/config.file
+
+%files
+%attr(644,root,root) /bin/hello
+%config(noreplace) /etc/config.file
+
+%changelog
diff --git a/tests/data/SPECS/hello-r2.spec b/tests/data/SPECS/hello-r2.spec
new file mode 100644 (file)
index 0000000..ca5091d
--- /dev/null
@@ -0,0 +1,58 @@
+Summary: hello -- hello, world rpm
+Name: hello
+Version: 1.0
+Release: 2
+Group: Utilities
+License: GPL
+Distribution: RPM test suite.
+Vendor: Red Hat Software
+Packager: Red Hat Software <bugs@redhat.com>
+URL: http://www.redhat.com
+Source0: hello-1.0.tar.gz
+Patch0: hello-1.0-modernize.patch
+Excludearch: lsi
+Excludeos: cpm
+Provides: hi
+Conflicts: goodbye
+Obsoletes: howdy
+Prefix: /usr
+
+%description
+Simple rpm demonstration.
+
+%prep
+%setup -q
+%patch0 -p1 -b .modernize
+
+%build
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/usr/local/bin
+make DESTDIR=$RPM_BUILD_ROOT install
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%pre
+
+%post
+
+%preun
+
+%postun
+
+%files
+%defattr(-,root,root)
+%doc   FAQ
+#%readme README
+#%license COPYING
+%attr(0751,root,root)  /usr/local/bin/hello
+
+%changelog
+* Wed Jun  8 2016 Mark Wielaard <mjw@redhat.com>
+- Update release for unique build-id generation tests.
+
+* Tue Oct 20 1998 Jeff Johnson <jbj@redhat.com>
+- create.
index 567519e333abbd10ade84189169fcae908d1d3cf..a28c446f6c8bddaed8d315862a1a47ccdb102448 100644 (file)
@@ -13,6 +13,7 @@ BuildArch:    noarch
 %install
 rm -rf $RPM_BUILD_ROOT
 mkdir -p $RPM_BUILD_ROOT/usr/bin
+mkdir -p $RPM_BUILD_ROOT/zoot
 cat << EOF > $RPM_BUILD_ROOT/usr/bin/hello
 echo "Hello world!"
 EOF
@@ -20,3 +21,4 @@ EOF
 %files
 %defattr(-,root,root,-)
 /usr/bin/hello
+/zoot
diff --git a/tests/data/SPECS/hello2-suid.spec b/tests/data/SPECS/hello2-suid.spec
new file mode 100644 (file)
index 0000000..32bdce1
--- /dev/null
@@ -0,0 +1,67 @@
+Summary: hello2 -- double hello, world rpm
+Name: hello2
+Version: 1.0
+Release: 1
+Group: Utilities
+License: GPL
+Distribution: RPM test suite.
+Vendor: Red Hat Software
+Packager: Red Hat Software <bugs@redhat.com>
+URL: http://www.redhat.com
+Source0: hello-1.0.tar.gz
+Patch0: hello-1.0-modernize.patch
+Excludearch: lsi
+Excludeos: cpm
+Provides: hi
+Conflicts: goodbye
+Obsoletes: howdy
+Prefix: /usr
+
+%description
+Simple rpm demonstration.
+
+%prep
+%setup -q -n hello-1.0
+%patch0 -p1 -b .modernize
+
+%build
+make CFLAGS="-g -O1"
+mv hello hello2
+make CFLAGS="-g -O2 -D_FORTIFY_SOURCE=2"
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/usr/local/bin
+# Note explicit install hello as suid
+install -m 4755 hello $RPM_BUILD_ROOT/usr/local/bin
+install -m 755 hello2 $RPM_BUILD_ROOT/usr/local/bin
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%pre
+
+%post
+
+%preun
+
+%postun
+
+%files
+# Note we don't set any attrs. We expect the suid flag to have been picked up.
+/usr/local/bin/hello
+/usr/local/bin/hello2
+%defattr(-,root,root)
+%doc   FAQ
+#%readme README
+#%license COPYING
+
+%changelog
+* Tue Jun 14 2016 Mark Wielaard <mjw@redhat.com>
+- Make hello (implicit) suid
+
+* Wed May 18 2016 Mark Wielaard <mjw@redhat.com>
+- Add hello2 for dwz testing support.
+
+* Tue Oct 20 1998 Jeff Johnson <jbj@redhat.com>
+- create.
diff --git a/tests/data/SPECS/hello2.spec b/tests/data/SPECS/hello2.spec
new file mode 100644 (file)
index 0000000..01777af
--- /dev/null
@@ -0,0 +1,62 @@
+Summary: hello2 -- double hello, world rpm
+Name: hello2
+Version: 1.0
+Release: 1
+Group: Utilities
+License: GPL
+Distribution: RPM test suite.
+Vendor: Red Hat Software
+Packager: Red Hat Software <bugs@redhat.com>
+URL: http://www.redhat.com
+Source0: hello-1.0.tar.gz
+Patch0: hello-1.0-modernize.patch
+Excludearch: lsi
+Excludeos: cpm
+Provides: hi
+Conflicts: goodbye
+Obsoletes: howdy
+Prefix: /usr
+
+%description
+Simple rpm demonstration.
+
+%prep
+%setup -q -n hello-1.0
+%patch0 -p1 -b .modernize
+
+%build
+make CFLAGS="-g -O1"
+mv hello hello2
+make CFLAGS="-g -O2 -D_FORTIFY_SOURCE=2"
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/usr/local/bin
+make DESTDIR=$RPM_BUILD_ROOT install
+cp hello2 $RPM_BUILD_ROOT/usr/local/bin/
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%pre
+
+%post
+
+%preun
+
+%postun
+
+%files
+%defattr(-,root,root)
+%doc   FAQ
+#%readme README
+#%license COPYING
+%attr(0751,root,root)  /usr/local/bin/hello
+%attr(0751,root,root)  /usr/local/bin/hello2
+
+%changelog
+* Wed May 18 2016 Mark Wielaard <mjw@redhat.com>
+- Add hello2 for dwz testing support.
+
+* Tue Oct 20 1998 Jeff Johnson <jbj@redhat.com>
+- create.
diff --git a/tests/data/SPECS/hello2cp.spec b/tests/data/SPECS/hello2cp.spec
new file mode 100644 (file)
index 0000000..33d8dc2
--- /dev/null
@@ -0,0 +1,64 @@
+Summary: hello2 -- double hello, world rpm
+Name: hello2
+Version: 1.0
+Release: 1
+Group: Utilities
+License: GPL
+Distribution: RPM test suite.
+Vendor: Red Hat Software
+Packager: Red Hat Software <bugs@redhat.com>
+URL: http://www.redhat.com
+Source0: hello-1.0.tar.gz
+Patch0: hello-1.0-modernize.patch
+Excludearch: lsi
+Excludeos: cpm
+Provides: hi
+Conflicts: goodbye
+Obsoletes: howdy
+Prefix: /usr
+
+%description
+Simple rpm demonstration.
+
+%prep
+%setup -q -n hello-1.0
+%patch0 -p1 -b .modernize
+
+%build
+make CFLAGS="-g -O1"
+cp hello hello2
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/usr/local/bin
+make DESTDIR=$RPM_BUILD_ROOT install
+cp hello2 $RPM_BUILD_ROOT/usr/local/bin/
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%pre
+
+%post
+
+%preun
+
+%postun
+
+%files
+%defattr(-,root,root)
+%doc   FAQ
+#%readme README
+#%license COPYING
+%attr(0751,root,root)  /usr/local/bin/hello
+%attr(0751,root,root)  /usr/local/bin/hello2
+
+%changelog
+* Mon Jun  6 2016 Mark Wielaard <mjw@redhat.com>
+- Copy hello to hello2 for duplicate build-id testing.
+
+* Wed May 18 2016 Mark Wielaard <mjw@redhat.com>
+- Add hello2 for dwz testing support.
+
+* Tue Oct 20 1998 Jeff Johnson <jbj@redhat.com>
+- create.
diff --git a/tests/data/SPECS/hello2ln.spec b/tests/data/SPECS/hello2ln.spec
new file mode 100644 (file)
index 0000000..2c40dcc
--- /dev/null
@@ -0,0 +1,63 @@
+Summary: hello2 -- double hello, world rpm
+Name: hello2
+Version: 1.0
+Release: 1
+Group: Utilities
+License: GPL
+Distribution: RPM test suite.
+Vendor: Red Hat Software
+Packager: Red Hat Software <bugs@redhat.com>
+URL: http://www.redhat.com
+Source0: hello-1.0.tar.gz
+Patch0: hello-1.0-modernize.patch
+Excludearch: lsi
+Excludeos: cpm
+Provides: hi
+Conflicts: goodbye
+Obsoletes: howdy
+Prefix: /usr
+
+%description
+Simple rpm demonstration.
+
+%prep
+%setup -q -n hello-1.0
+%patch0 -p1 -b .modernize
+
+%build
+make CFLAGS="-g -O1"
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/usr/local/bin
+make DESTDIR=$RPM_BUILD_ROOT install
+ln $RPM_BUILD_ROOT/usr/local/bin/hello $RPM_BUILD_ROOT/usr/local/bin/hello2
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%pre
+
+%post
+
+%preun
+
+%postun
+
+%files
+%defattr(-,root,root)
+%doc   FAQ
+#%readme README
+#%license COPYING
+%attr(0751,root,root)  /usr/local/bin/hello
+%attr(0751,root,root)  /usr/local/bin/hello2
+
+%changelog
+* Mon Jun  6 2016 Mark Wielaard <mjw@redhat.com>
+- Hard link hello to hello2 for duplicate build-id testing.
+
+* Wed May 18 2016 Mark Wielaard <mjw@redhat.com>
+- Add hello2 for dwz testing support.
+
+* Tue Oct 20 1998 Jeff Johnson <jbj@redhat.com>
+- create.
index 7c22d29aeacef3582b871cf7cb7b8b97bfc22f7a..b3b8866fc4499543842bc4b86080e5be4b8b8a59 100644 (file)
@@ -1,3 +1,6 @@
+%bcond_with unpackaged_dirs
+%bcond_with unpackaged_files
+
 Summary:          Testing hard link behavior
 Name:             hlinktest
 Version:          1.0
@@ -5,6 +8,7 @@ Release:          1
 License:          Testing
 Group:            Testing
 BuildArch:       noarch
+Provides: /bin/sh
 %description
   
 %install
@@ -12,16 +16,26 @@ rm -rf %{buildroot}
 mkdir -p $RPM_BUILD_ROOT/foo
 cat << EOF >> $RPM_BUILD_ROOT/foo/hello
 #!/bin/sh
-echo $0
+echo %{name}-%{version}
 EOF
 
 cd $RPM_BUILD_ROOT/foo
 cat hello > copyllo
+cat hello > aaaa
+ln aaaa zzzz
 chmod a+x hello copyllo
 for f in foo bar world; do
     ln hello hello-${f}
 done
 
+%if %{with unpackaged_dirs}
+mkdir -p $RPM_BUILD_ROOT/zoo/
+%endif
+
+%if %{with unpackaged_files}
+touch $RPM_BUILD_ROOT/toot
+%endif
+
 %files
 %defattr(-,root,root)
 /foo/*
diff --git a/tests/data/SPECS/parallel.spec b/tests/data/SPECS/parallel.spec
new file mode 100644 (file)
index 0000000..4189672
--- /dev/null
@@ -0,0 +1,50 @@
+Name:          parallel
+Version:       %{ver}
+Release:       1%{?dist}
+Summary:       Testing parallel install behavior
+BuildArch:     noarch
+License:       GPL
+
+%description
+%{summary}
+
+%package trigger
+Summary: %{summary}
+
+%description trigger
+%{summary}
+
+%transfiletriggerin trigger -- /opt/parallel
+echo %transfiletriggerin: $*
+cat | wc -l
+
+%transfiletriggerun trigger -- /opt/parallel
+echo %transfiletriggerun: $*
+cat | wc -l
+
+%transfiletriggerpostun trigger -- /opt/parallel
+echo %transfiletriggerpostun: $*
+cat | wc -l
+
+%filetriggerin trigger -- /opt/parallel
+echo %filetriggerin: $*
+cat | wc -l
+
+%filetriggerpostun trigger -- /opt/parallel
+echo %filetriggerpostun: $*
+cat | wc -l
+
+
+%install
+for d in mydir yourdir; do
+    datadir=%{buildroot}/opt/parallel/%{version}/${d}
+    mkdir -p ${datadir}
+    for f in 1 2 3 4; do
+        echo ${f} > ${datadir}/${f}
+    done
+done
+
+%files
+/opt/%{name}
+
+%files trigger
diff --git a/tests/data/SPECS/poltest.spec b/tests/data/SPECS/poltest.spec
deleted file mode 100644 (file)
index 233c33b..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-%define debug_package %{nil}
-
-Summary: Policy in rpm example
-Name:    poltest
-Version: 1.0
-Release: 2
-Group:   Utilities
-License: GPL
-Requires: poltest-policy
-Source0: poltest-%{version}.tar.bz2
-Source1: poltest-policy-%{version}.tar.bz2
-Buildroot: %{_tmppath}/%{name}-%{version}-root
-%description
-Example for installing policy included in a package header
-
-%prep
-%setup -q
-%setup -q -T -D -a 1
-
-%build
-make CFLAGS="$RPM_OPT_FLAGS"
-make -f /usr/share/selinux/devel/Makefile -C poltest-policy-%{version}
-
-%install
-rm -rf $RPM_BUILD_ROOT
-make DESTDIR=%{buildroot} prefix=%{_prefix} install
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%files
-%defattr(-,root,root)
-%{_bindir}/foo
-%{_bindir}/bar
-
-
-%package policy
-Summary: Policy for the poltest package
-Group: System/Policy
-Collections: sepolicy
-%description policy
-Policy for the poltest package
-
-%sepolicy policy
-%semodule -n foo -t default      poltest-policy-%{version}/foo.pp
-%semodule -n bar -t mls,targeted poltest-policy-%{version}/bar.pp
-
-%files policy
-
-%changelog
-* Wed Jul 1 2009 Steve Lawrence <slawrence@tresys.com>
-- create
diff --git a/tests/data/SPECS/prefixtest.spec b/tests/data/SPECS/prefixtest.spec
new file mode 100644 (file)
index 0000000..004e353
--- /dev/null
@@ -0,0 +1,42 @@
+Name:           prefixtest
+Version:        1.0
+Release:        1
+Summary:        Testing file glob behavior
+Group:          Testing
+License:        GPL
+BuildArch:     noarch
+RemovePathPostfixes: g:f
+
+%description
+%{summary}
+
+%define testdir /opt/%{name}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+mkdir -p $RPM_BUILD_ROOT/%{testdir}
+echo "foo" > $RPM_BUILD_ROOT/%{testdir}/weird%%name
+for f in bif baf zab zeb zib; do
+    echo "$f" > $RPM_BUILD_ROOT/%{testdir}/$f
+done
+for f in bing bang bong; do
+    mkdir -p $RPM_BUILD_ROOT/%{testdir}/$f
+done
+mkdir -p $RPM_BUILD_ROOT/%{testdir}/foo
+for f in one two three; do
+    echo "$f" > $RPM_BUILD_ROOT/%{testdir}/foo/$f
+done
+
+ln -s %{testdir}/zab $RPM_BUILD_ROOT/%{testdir}/linkgood
+ln -s %{testdir}/zub $RPM_BUILD_ROOT/%{testdir}/linkbad
+
+%files
+%defattr(-,root,root,-)
+%{testdir}/b??
+%{testdir}/weird?name
+%{testdir}/z*
+%{testdir}/l*
+%{testdir}/b*g/
+%dir %{testdir}/foo
+%{testdir}/foo/*
index e8a64e8034ada55aed8d7988b309c7b01fb8c7ec..54974567b90ff1ef353388d732f69af0564842f9 100644 (file)
@@ -1,5 +1,7 @@
 %{!?filetype: %global filetype file}
 %{?fixit: %global havepretrans 1}
+%{!?user: %global user root}
+%{!?grp: %global grp root}
 
 Name:          replacetest%{?sub:-%{sub}}
 Version:       %{ver}
@@ -43,5 +45,5 @@ rm -rf $RPM_BUILD_ROOT
 %endif
 
 %files
-%defattr(-,root,root,-)
+%defattr(-,%{user},%{grp},-)
 /opt/*
index fbb9bc989546f00e314fe952e2e542faf90f019a..581a56f5c52fb72d61ee34ab3e970c829555b14e 100644 (file)
@@ -29,3 +29,7 @@ echo %{name}-%{version}-%{release} POSTUN $*
 
 %posttrans
 echo %{name}-%{version}-%{release} POSTTRANS $*
+
+%verifyscript
+echo %{name}-%{version}-%{release} VERIFY $*
+
diff --git a/tests/data/SPECS/sigpipe.spec b/tests/data/SPECS/sigpipe.spec
new file mode 100644 (file)
index 0000000..c9db679
--- /dev/null
@@ -0,0 +1,47 @@
+%bcond_with buildpipe
+%bcond_with manyfiles
+
+Name:          sigpipe
+Version:       1.0
+Release:       1%{?dist}
+Summary:       Testing SIGPIPE behavior
+
+Group:         Testing
+License:       GPLv2
+BuildArch:     noarch
+
+%description
+%{summary}
+%end
+
+%define datadir /opt/%{name}/data
+
+# Reproducer for https://bugzilla.redhat.com/show_bug.cgi?id=651463
+%if %{with buildpipe}
+%prep
+bash -c 's=$SECONDS
+set -o pipefail
+for ((i=0; i < 30; i++))
+do      printf hello 2>/dev/null
+        sleep .1
+done |  /bin/sleep 1
+(( (SECONDS-s) < 2 )) || exit 1'
+%endif
+
+%install
+mkdir -p %{buildroot}/%{datadir}
+%if %{with manyfiles}
+for i in {1..32}; do
+    mkdir %{buildroot}/%{datadir}/${i}
+    for j in {a..z}; do
+        touch %{buildroot}/%{datadir}/${i}/${j}
+    done
+done
+%endif
+
+# For simulating https://bugzilla.redhat.com/show_bug.cgi?id=1264198
+%post
+kill -PIPE ${PPID}
+
+%files
+%{datadir}
diff --git a/tests/data/SPECS/test-subpackages-exclude.spec b/tests/data/SPECS/test-subpackages-exclude.spec
new file mode 100644 (file)
index 0000000..e93b10b
--- /dev/null
@@ -0,0 +1,42 @@
+Name:           test
+Version:        1.0
+Release:        1
+Summary:        Test
+
+License:        Public Domain
+URL:            https://fedoraproject.org
+Source:         hello.c
+
+%description
+%{summary}.
+
+%package test2
+Summary: Test2.
+%description test2
+
+%prep
+%autosetup -c -D -T
+cp -a %{S:0} .
+
+%build
+gcc -g hello.c -o hello
+cp hello.c hello2.c
+gcc -g hello2.c -o hello2
+cp hello.c hello3.c
+gcc -g hello3.c -o hello3
+
+%install
+mkdir -p %{buildroot}/bin
+install -D -p -m 0755 -t %{buildroot}/bin hello
+install -D -p -m 0755 -t %{buildroot}/bin hello2
+# Install it, but then exclude it...
+install -D -p -m 0755 -t %{buildroot}/bin hello3
+
+%files
+/bin/hello
+
+%files test2
+/bin/hello2
+%exclude /bin/hello3
+
+%changelog
diff --git a/tests/data/SPECS/test-subpackages-pathpostfixes.spec b/tests/data/SPECS/test-subpackages-pathpostfixes.spec
new file mode 100644 (file)
index 0000000..19b3b9e
--- /dev/null
@@ -0,0 +1,39 @@
+Name:           test
+Version:        1.0
+Release:        1
+Summary:        Test
+
+License:        Public Domain
+URL:            https://fedoraproject.org
+Source:         hello.c
+
+%description
+%{summary}.
+
+%package test2
+RemovePathPostfixes: .foobar
+Summary: Test2.
+%description test2
+
+%prep
+%autosetup -c -D -T
+cp -a %{S:0} .
+
+%build
+gcc -g hello.c -o hello
+cp hello.c hello2.c
+gcc -g hello2.c -o hello.foobar
+
+%install
+mkdir -p %{buildroot}/bin
+install -D -p -m 0755 -t %{buildroot}/bin hello
+# Install as hello.foobar, but we want the postfix removed in the package...
+install -D -p -m 0755 -t %{buildroot}/bin hello.foobar
+
+%files
+/bin/hello
+
+%files test2
+/bin/hello.foobar
+
+%changelog
diff --git a/tests/data/SPECS/test-subpackages.spec b/tests/data/SPECS/test-subpackages.spec
new file mode 100644 (file)
index 0000000..8306600
--- /dev/null
@@ -0,0 +1,47 @@
+Name:           test
+Version:        1.0
+Release:        1
+Summary:        Test
+
+License:        Public Domain
+URL:            https://fedoraproject.org
+Source:         hello.c
+
+%description
+%{summary}.
+
+%package test2
+Summary: Test2.
+%description test2
+
+%package test3
+Summary: Test3.
+%description test3
+
+%prep
+%autosetup -c -D -T
+cp -a %{S:0} .
+
+%build
+gcc -g hello.c -o hello
+cp hello.c hello2.c
+gcc -g hello2.c -o hello2
+cp hello.c hello3.c
+gcc -g hello3.c -o hello3
+
+%install
+mkdir -p %{buildroot}/bin
+install -D -p -m 0755 -t %{buildroot}/bin hello
+install -D -p -m 0755 -t %{buildroot}/bin hello2
+install -D -p -m 0755 -t %{buildroot}/bin hello3
+
+%files
+/bin/hello
+
+%files test2
+/bin/hello2
+
+%files test3
+/bin/hello3
+
+%changelog
diff --git a/tests/data/SPECS/testdoc.spec b/tests/data/SPECS/testdoc.spec
new file mode 100644 (file)
index 0000000..7cdfb74
--- /dev/null
@@ -0,0 +1,32 @@
+Summary:       testdoc
+Name:          testdoc
+Version:       1.0
+Release:       1
+Group:         Utilities
+License:       GPLv2+
+Distribution: RPM test suite.
+BuildArch:  noarch
+
+%description
+Package for testing rpm install option "--excludedocs".
+
+%install
+mkdir -p %{buildroot}%{_datadir}/testdoc
+echo "nodoc" > %{buildroot}%{_datadir}/testdoc/nodoc
+
+mkdir -p %{buildroot}%{_docdir}/testdoc
+echo "doc1" > %{buildroot}%{_docdir}/testdoc/documentation1
+echo "doc2" > %{buildroot}%{_docdir}/testdoc/documentation2
+
+mkdir -p %{buildroot}%{_docdir}/testdoc/examples
+echo "example1" > %{buildroot}%{_docdir}/testdoc/examples/example1
+echo "example2" > %{buildroot}%{_docdir}/testdoc/examples/example2
+
+%files
+%{_datadir}/testdoc/nodoc
+%dir %{_docdir}/testdoc
+%doc %{_docdir}/testdoc/documentation1
+%doc %{_docdir}/testdoc/documentation2
+%dir %{_docdir}/testdoc/examples
+%doc %{_docdir}/testdoc/examples/example1
+%doc %{_docdir}/testdoc/examples/example2
diff --git a/tests/data/SPECS/triggers.spec b/tests/data/SPECS/triggers.spec
new file mode 100644 (file)
index 0000000..ae447b6
--- /dev/null
@@ -0,0 +1,26 @@
+Name:           triggers
+Version:        1.0
+Release:        %{rel}
+Summary:        Testing trigger behavior
+Group:          Testing
+License:        GPL
+BuildArch:     noarch
+
+%description
+%{summary}
+
+%files
+%defattr(-,root,root,-)
+
+%triggerprein -- %{trigpkg}
+echo %{name}-%{version}-%{release} TRIGGERPREIN $*
+
+%triggerin -- %{trigpkg}
+echo %{name}-%{version}-%{release} TRIGGERIN $*
+
+%triggerun -- %{trigpkg}
+echo %{name}-%{version}-%{release} TRIGGERUN $*
+
+%triggerpostun -- %{trigpkg}
+echo %{name}-%{version}-%{release} TRIGGERPOSTUN $*
+
diff --git a/tests/data/SPECS/vattrtest.spec b/tests/data/SPECS/vattrtest.spec
new file mode 100644 (file)
index 0000000..130f040
--- /dev/null
@@ -0,0 +1,29 @@
+Name:           vattrtest
+Version:        1.0
+Release:        1
+Summary:        Testing virtual file attribute behavior
+Group:          Testing
+License:        GPL
+BuildArch:     noarch
+
+%description
+%{summary}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+mkdir -p $RPM_BUILD_ROOT/opt/%{name}
+for x in a c cn d g l m r; do
+    echo ${x} > $RPM_BUILD_ROOT/opt/%{name}/${x}
+done
+
+%files
+%dir /opt/%{name}
+%artifact /opt/%{name}/a
+%config /opt/%{name}/c
+%config(noreplace) /opt/%{name}/cn
+%doc /opt/%{name}/d
+%ghost /opt/%{name}/g
+%license /opt/%{name}/l
+%missingok /opt/%{name}/m
+%readme /opt/%{name}/r
diff --git a/tests/data/keys/CVE-2021-3521-badbind.asc b/tests/data/keys/CVE-2021-3521-badbind.asc
new file mode 100755 (executable)
index 0000000..aea00f9
--- /dev/null
@@ -0,0 +1,25 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: rpm-4.17.90 (NSS-3)
+
+mQENBFjmORgBCAC7TMEk6wnjSs8Dr4yqSScWdU2pjcqrkTxuzdWvowcIUPZI0w/g
+HkRqGd4apjvY2V15kjL10gk3QhFP3pZ/9p7zh8o8NHX7aGdSGDK7NOq1eFaErPRY
+91LW9RiZ0lbOjXEzIL0KHxUiTQEmdXJT43DJMFPyW9fkCWg0OltiX618FUdWWfI8
+eySdLur1utnqBvdEbCUvWK2RX3vQZQdvEBODnNk2pxqTyV0w6VPQ96W++lF/5Aas
+7rUv3HIyIXxIggc8FRrnH+y9XvvHDonhTIlGnYZN4ubm9i4y3gOkrZlGTrEw7elQ
+1QeMyG2QQEbze8YjpTm4iLABCBrRfPRaQpwrABEBAAG0IXJwbS5vcmcgUlNBIHRl
+c3RrZXkgPHJzYUBycG0ub3JnPokBNwQTAQgAIQUCWOY5GAIbAwULCQgHAgYVCAkK
+CwIEFgIDAQIeAQIXgAAKCRBDRFkeGWTF/MxxCACnjqFL+MmPh9W9JQKT2DcLbBzf
+Cqo6wcEBoCOcwgRSk8dSikhARoteoa55JRJhuMyeKhhEAogE9HRmCPFdjezFTwgB
+BDVBpO2dZ023mLXDVCYX3S8pShOgCP6Tn4wqCnYeAdLcGg106N4xcmgtcssJE+Pr
+XzTZksbZsrTVEmL/Ym+R5w5jBfFnGk7Yw7ndwfQsfNXQb5AZynClFxnX546lcyZX
+fEx3/e6ezw57WNOUK6WT+8b+EGovPkbetK/rGxNXuWaP6X4A/QUm8O98nCuHYFQq
++mvNdsCBqGf7mhaRGtpHk/JgCn5rFvArMDqLVrR9hX0LdCSsH7EGE+bR3r7wuQEN
+BFjmORgBCACk+vDZrIXQuFXEYToZVwb2attzbbJJCqD71vmZTLsW0QxuPKRgbcYY
+zp4K4lVBnHhFrF8MOUOxJ7kQWIJZMZFt+BDcptCYurbD2H4W2xvnWViiC+LzCMzz
+iMJT6165uefL4JHTDPxC2fFiM9yrc72LmylJNkM/vepT128J5Qv0gRUaQbHiQuS6
+Dm/+WRnUfx3i89SV4mnBxb/Ta93GVqoOciWwzWSnwEnWYAvOb95JL4U7c5J5f/+c
+KnQDHsW7sIiIdscsWzvgf6qs2Ra1Zrt7Fdk4+ZS2f/adagLhDO1C24sXf5XfMk5m
+L0OGwZSr9m5s17VXxfspgU5ugc8kBJfzABEBAAE=
+=WCfs
+-----END PGP PUBLIC KEY BLOCK-----
+
diff --git a/tests/data/keys/CVE-2021-3521-nosubsig-last.asc b/tests/data/keys/CVE-2021-3521-nosubsig-last.asc
new file mode 100755 (executable)
index 0000000..aea00f9
--- /dev/null
@@ -0,0 +1,25 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: rpm-4.17.90 (NSS-3)
+
+mQENBFjmORgBCAC7TMEk6wnjSs8Dr4yqSScWdU2pjcqrkTxuzdWvowcIUPZI0w/g
+HkRqGd4apjvY2V15kjL10gk3QhFP3pZ/9p7zh8o8NHX7aGdSGDK7NOq1eFaErPRY
+91LW9RiZ0lbOjXEzIL0KHxUiTQEmdXJT43DJMFPyW9fkCWg0OltiX618FUdWWfI8
+eySdLur1utnqBvdEbCUvWK2RX3vQZQdvEBODnNk2pxqTyV0w6VPQ96W++lF/5Aas
+7rUv3HIyIXxIggc8FRrnH+y9XvvHDonhTIlGnYZN4ubm9i4y3gOkrZlGTrEw7elQ
+1QeMyG2QQEbze8YjpTm4iLABCBrRfPRaQpwrABEBAAG0IXJwbS5vcmcgUlNBIHRl
+c3RrZXkgPHJzYUBycG0ub3JnPokBNwQTAQgAIQUCWOY5GAIbAwULCQgHAgYVCAkK
+CwIEFgIDAQIeAQIXgAAKCRBDRFkeGWTF/MxxCACnjqFL+MmPh9W9JQKT2DcLbBzf
+Cqo6wcEBoCOcwgRSk8dSikhARoteoa55JRJhuMyeKhhEAogE9HRmCPFdjezFTwgB
+BDVBpO2dZ023mLXDVCYX3S8pShOgCP6Tn4wqCnYeAdLcGg106N4xcmgtcssJE+Pr
+XzTZksbZsrTVEmL/Ym+R5w5jBfFnGk7Yw7ndwfQsfNXQb5AZynClFxnX546lcyZX
+fEx3/e6ezw57WNOUK6WT+8b+EGovPkbetK/rGxNXuWaP6X4A/QUm8O98nCuHYFQq
++mvNdsCBqGf7mhaRGtpHk/JgCn5rFvArMDqLVrR9hX0LdCSsH7EGE+bR3r7wuQEN
+BFjmORgBCACk+vDZrIXQuFXEYToZVwb2attzbbJJCqD71vmZTLsW0QxuPKRgbcYY
+zp4K4lVBnHhFrF8MOUOxJ7kQWIJZMZFt+BDcptCYurbD2H4W2xvnWViiC+LzCMzz
+iMJT6165uefL4JHTDPxC2fFiM9yrc72LmylJNkM/vepT128J5Qv0gRUaQbHiQuS6
+Dm/+WRnUfx3i89SV4mnBxb/Ta93GVqoOciWwzWSnwEnWYAvOb95JL4U7c5J5f/+c
+KnQDHsW7sIiIdscsWzvgf6qs2Ra1Zrt7Fdk4+ZS2f/adagLhDO1C24sXf5XfMk5m
+L0OGwZSr9m5s17VXxfspgU5ugc8kBJfzABEBAAE=
+=WCfs
+-----END PGP PUBLIC KEY BLOCK-----
+
diff --git a/tests/data/keys/CVE-2021-3521-nosubsig.asc b/tests/data/keys/CVE-2021-3521-nosubsig.asc
new file mode 100755 (executable)
index 0000000..3a2e741
--- /dev/null
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: rpm-4.17.90 (NSS-3)
+
+mQENBFjmORgBCAC7TMEk6wnjSs8Dr4yqSScWdU2pjcqrkTxuzdWvowcIUPZI0w/g
+HkRqGd4apjvY2V15kjL10gk3QhFP3pZ/9p7zh8o8NHX7aGdSGDK7NOq1eFaErPRY
+91LW9RiZ0lbOjXEzIL0KHxUiTQEmdXJT43DJMFPyW9fkCWg0OltiX618FUdWWfI8
+eySdLur1utnqBvdEbCUvWK2RX3vQZQdvEBODnNk2pxqTyV0w6VPQ96W++lF/5Aas
+7rUv3HIyIXxIggc8FRrnH+y9XvvHDonhTIlGnYZN4ubm9i4y3gOkrZlGTrEw7elQ
+1QeMyG2QQEbze8YjpTm4iLABCBrRfPRaQpwrABEBAAG0IXJwbS5vcmcgUlNBIHRl
+c3RrZXkgPHJzYUBycG0ub3JnPokBNwQTAQgAIQUCWOY5GAIbAwULCQgHAgYVCAkK
+CwIEFgIDAQIeAQIXgAAKCRBDRFkeGWTF/MxxCACnjqFL+MmPh9W9JQKT2DcLbBzf
+Cqo6wcEBoCOcwgRSk8dSikhARoteoa55JRJhuMyeKhhEAogE9HRmCPFdjezFTwgB
+BDVBpO2dZ023mLXDVCYX3S8pShOgCP6Tn4wqCnYeAdLcGg106N4xcmgtcssJE+Pr
+XzTZksbZsrTVEmL/Ym+R5w5jBfFnGk7Yw7ndwfQsfNXQb5AZynClFxnX546lcyZX
+fEx3/e6ezw57WNOUK6WT+8b+EGovPkbetK/rGxNXuWaP6X4A/QUm8O98nCuHYFQq
++mvNdsCBqGf7mhaRGtpHk/JgCn5rFvArMDqLVrR9hX0LdCSsH7EGE+bR3r7wuQEN
+BFjmORgBCACk+vDZrIXQuFXEYToZVwb2attzbbJJCqD71vmZTLsW0QxuPKRgbcYY
+zp4K4lVBnHhFrF8MOUOxJ7kQWIJZMZFt+BDcptCYurbD2H4W2xvnWViiC+LzCMzz
+iMJT6165uefL4JHTDPxC2fFiM9yrc72LmylJNkM/vepT128J5Qv0gRUaQbHiQuS6
+Dm/+WRnUfx3i89SV4mnBxb/Ta93GVqoOciWwzWSnwEnWYAvOb95JL4U7c5J5f/+c
+KnQDHsW7sIiIdscsWzvgf6qs2Ra1Zrt7Fdk4+ZS2f/adagLhDO1C24sXf5XfMk5m
+L0OGwZSr9m5s17VXxfspgU5ugc8kBJfzABEBAAG5AQ0EWOY5GAEIAKT68NmshdC4
+VcRhOhlXBvZq23NtskkKoPvW+ZlMuxbRDG48pGBtxhjOngriVUGceEWsXww5Q7En
+uRBYglkxkW34ENym0Ji6tsPYfhbbG+dZWKIL4vMIzPOIwlPrXrm558vgkdMM/ELZ
+8WIz3KtzvYubKUk2Qz+96lPXbwnlC/SBFRpBseJC5LoOb/5ZGdR/HeLz1JXiacHF
+v9Nr3cZWqg5yJbDNZKfASdZgC85v3kkvhTtzknl//5wqdAMexbuwiIh2xyxbO+B/
+qqzZFrVmu3sV2Tj5lLZ/9p1qAuEM7ULbixd/ld8yTmYvQ4bBlKv2bmzXtVfF+ymB
+Tm6BzyQEl/MAEQEAAYkBHwQYAQgACQUCWOY5GAIbDAAKCRBDRFkeGWTF/PANB/9j
+mifmj6z/EPe0PJFhrpISt9PjiUQCt0IPtiL5zKAkWjHePIzyi+0kCTBF6DDLFxos
+3vN4bWnVKT1kBhZAQlPqpJTg+m74JUYeDGCdNx9SK7oRllATqyu+5rncgxjWVPnQ
+zu/HRPlWJwcVFYEVXYL8xzfantwQTqefjmcRmBRdA2XJITK+hGWwAmrqAWx+q5xX
+Pa8wkNMxVzNS2rUKO9SoVuJ/wlUvfoShkJ/VJ5HDp3qzUqncADfdGN35TDzscngQ
+gHvnMwVBfYfSCABV1hNByoZcc/kxkrWMmsd/EnIyLd1Q1baKqc3cEDuC6E6/o4yJ
+E4XX4jtDmdZPreZALsiB
+=rRop
+-----END PGP PUBLIC KEY BLOCK-----
+
diff --git a/tests/data/keys/rpm.org-rsa-2048-test.pub b/tests/data/keys/rpm.org-rsa-2048-test.pub
new file mode 100644 (file)
index 0000000..6e38a5d
--- /dev/null
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2
+
+mQENBFjmORgBCAC7TMEk6wnjSs8Dr4yqSScWdU2pjcqrkTxuzdWvowcIUPZI0w/g
+HkRqGd4apjvY2V15kjL10gk3QhFP3pZ/9p7zh8o8NHX7aGdSGDK7NOq1eFaErPRY
+91LW9RiZ0lbOjXEzIL0KHxUiTQEmdXJT43DJMFPyW9fkCWg0OltiX618FUdWWfI8
+eySdLur1utnqBvdEbCUvWK2RX3vQZQdvEBODnNk2pxqTyV0w6VPQ96W++lF/5Aas
+7rUv3HIyIXxIggc8FRrnH+y9XvvHDonhTIlGnYZN4ubm9i4y3gOkrZlGTrEw7elQ
+1QeMyG2QQEbze8YjpTm4iLABCBrRfPRaQpwrABEBAAG0IXJwbS5vcmcgUlNBIHRl
+c3RrZXkgPHJzYUBycG0ub3JnPokBNwQTAQgAIQUCWOY5GAIbAwULCQgHAgYVCAkK
+CwIEFgIDAQIeAQIXgAAKCRBDRFkeGWTF/MxxCACnjqFL+MmPh9W9JQKT2DcLbBzf
+Cqo6wcEBoCOcwgRSk8dSikhARoteoa55JRJhuMyeKhhEAogE9HRmCPFdjezFTwgB
+BDVBpO2dZ023mLXDVCYX3S8pShOgCP6Tn4wqCnYeAdLcGg106N4xcmgtcssJE+Pr
+XzTZksbZsrTVEmL/Ym+R5w5jBfFnGk7Yw7ndwfQsfNXQb5AZynClFxnX546lcyZX
+fEx3/e6ezw57WNOUK6WT+8b+EGovPkbetK/rGxNXuWaP6X4A/QUm8O98nCuHYFQq
++mvNdsCBqGf7mhaRGtpHk/JgCn5rFvArMDqLVrR9hX0LdCSsH7EGE+bR3r7wuQEN
+BFjmORgBCACk+vDZrIXQuFXEYToZVwb2attzbbJJCqD71vmZTLsW0QxuPKRgbcYY
+zp4K4lVBnHhFrF8MOUOxJ7kQWIJZMZFt+BDcptCYurbD2H4W2xvnWViiC+LzCMzz
+iMJT6165uefL4JHTDPxC2fFiM9yrc72LmylJNkM/vepT128J5Qv0gRUaQbHiQuS6
+Dm/+WRnUfx3i89SV4mnBxb/Ta93GVqoOciWwzWSnwEnWYAvOb95JL4U7c5J5f/+c
+KnQDHsW7sIiIdscsWzvgf6qs2Ra1Zrt7Fdk4+ZS2f/adagLhDO1C24sXf5XfMk5m
+L0OGwZSr9m5s17VXxfspgU5ugc8kBJfzABEBAAGJAR8EGAEIAAkFAljmORgCGwwA
+CgkQQ0RZHhlkxfzwDQf/Y5on5o+s/xD3tDyRYa6SErfT44lEArdCD7Yi+cygJFox
+3jyM8ovtJAkwRegwyxcaLN7zeG1p1Sk9ZAYWQEJT6qSU4Ppu+CVGHgxgnTcfUiu6
+EZZQE6srvua53IMY1lT50M7vx0T5VicHFRWBFV2C/Mc32p7cEE6nn45nEZgUXQNl
+ySEyvoRlsAJq6gFsfqucVz2vMJDTMVczUtq1CjvUqFbif8JVL36EoZCf1SeRw6d6
+s1Kp3AA33Rjd+Uw87HJ4EIB75zMFQX2H0ggAVdYTQcqGXHP5MZK1jJrHfxJyMi3d
+UNW2iqnN3BA7guhOv6OMiROF1+I7Q5nWT63mQC7IgQ==
+=Z6nu
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/tests/data/keys/rpm.org-rsa-2048-test.secret b/tests/data/keys/rpm.org-rsa-2048-test.secret
new file mode 100644 (file)
index 0000000..1d2890e
--- /dev/null
@@ -0,0 +1,57 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+Version: GnuPG v2
+
+lQOYBFjmORgBCAC7TMEk6wnjSs8Dr4yqSScWdU2pjcqrkTxuzdWvowcIUPZI0w/g
+HkRqGd4apjvY2V15kjL10gk3QhFP3pZ/9p7zh8o8NHX7aGdSGDK7NOq1eFaErPRY
+91LW9RiZ0lbOjXEzIL0KHxUiTQEmdXJT43DJMFPyW9fkCWg0OltiX618FUdWWfI8
+eySdLur1utnqBvdEbCUvWK2RX3vQZQdvEBODnNk2pxqTyV0w6VPQ96W++lF/5Aas
+7rUv3HIyIXxIggc8FRrnH+y9XvvHDonhTIlGnYZN4ubm9i4y3gOkrZlGTrEw7elQ
+1QeMyG2QQEbze8YjpTm4iLABCBrRfPRaQpwrABEBAAEAB/wMHvWkNHuxfwlc6ohB
+YDY3MK8uc6kefOnQHTegw/2erv1JODN0+bB2vKbQIFrgzSxMmPFS/DKG0MU7Cc4W
+iONqIisBxhQD3uf00EZphrf7t3EYk/LE1niWGvVqcEoYLYoaWMTdufuNpTXCWI5m
+BGLWT5oseyoXrU4rjG1BNVeOSdvkizW4g3r9HeylbKrmffhJ6121B/Rmbt3d//2Y
+M+B7dWFAfzpzkiyJr6Hyw3yllIDlh3J1jgZP+OFG/9Fey+G5v8/36a9COWLElqwg
+0kYyOcL6K79/lu73+YAkAcpFPzgoAwXzAEUmKpl42+TyMi5h8mHHA3MsK2YE/sxh
+pWVdBADYaV18rl113k9zEvR9d94MjYNrf8fX4tjccrF1h7bU420YVHkxPlixnzXS
+6XvusOCngwi9q4lM18SJazOPkUOQHq7DZH2qM9qmZM5cp0GheVZVLJoRG459LWlp
+8bbTFu9flKrsIuhkMpa85ol3zdmovRzXQUnhzebkoSr3R5p0dQQA3ZATIPnrDML7
+kgqNw2v7DlBbXOW9ZSfs5+MwEX6iblIWikZHXd9OerScDioqah8K4IWNjSHr5jyY
+9zNU4Lecb4L0VmFJC+LSbkYqms/iTT+IkgsUChjNPCDSJHz0kHY0z3+4Zy50Uetg
+ez8GRAe3ggtaGDK+Bk7SKvz5bTn8Oh8EAMp6FBRhdd9rtXNszkPfWQ+YC25pVJFm
+dWtezTyotonh/qyV1mM3uVbkF1nf24Uy5mpb9ysN2ux81j3Fvmb05Isdx3UpZgku
+YOKwLGvjYAMJhCC0wVwINE2Hf1AgqLGYqjGLLe+x3QwvrZh0mu6z7D5MHOOzobBT
+PPGl3K5O/4xfRxC0IXJwbS5vcmcgUlNBIHRlc3RrZXkgPHJzYUBycG0ub3JnPokB
+NwQTAQgAIQUCWOY5GAIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBDRFke
+GWTF/MxxCACnjqFL+MmPh9W9JQKT2DcLbBzfCqo6wcEBoCOcwgRSk8dSikhARote
+oa55JRJhuMyeKhhEAogE9HRmCPFdjezFTwgBBDVBpO2dZ023mLXDVCYX3S8pShOg
+CP6Tn4wqCnYeAdLcGg106N4xcmgtcssJE+PrXzTZksbZsrTVEmL/Ym+R5w5jBfFn
+Gk7Yw7ndwfQsfNXQb5AZynClFxnX546lcyZXfEx3/e6ezw57WNOUK6WT+8b+EGov
+PkbetK/rGxNXuWaP6X4A/QUm8O98nCuHYFQq+mvNdsCBqGf7mhaRGtpHk/JgCn5r
+FvArMDqLVrR9hX0LdCSsH7EGE+bR3r7wnQOYBFjmORgBCACk+vDZrIXQuFXEYToZ
+Vwb2attzbbJJCqD71vmZTLsW0QxuPKRgbcYYzp4K4lVBnHhFrF8MOUOxJ7kQWIJZ
+MZFt+BDcptCYurbD2H4W2xvnWViiC+LzCMzziMJT6165uefL4JHTDPxC2fFiM9yr
+c72LmylJNkM/vepT128J5Qv0gRUaQbHiQuS6Dm/+WRnUfx3i89SV4mnBxb/Ta93G
+VqoOciWwzWSnwEnWYAvOb95JL4U7c5J5f/+cKnQDHsW7sIiIdscsWzvgf6qs2Ra1
+Zrt7Fdk4+ZS2f/adagLhDO1C24sXf5XfMk5mL0OGwZSr9m5s17VXxfspgU5ugc8k
+BJfzABEBAAEAB/4w+VcO3uJYS6gWJCCJjiaAdscPNFSUzyVrrOyqH7d39fWBMdo/
+z8Za7dbHd1mEoQyo7hrG96bLC3YpzoRfMtIveVCUF6bbd62yZG1FnqRhYEnpzKqB
+p66jaoj5PWkArBmNkWvoYTXvKGA53RhYAwMU0qoGVCfRX7CUU+Lf5pDOcxrWQI0J
+8qdNludySOYgQB9OvKUGltkf2HFuYGZNXazg1txWN5hgfTSfWuaru9/ltDwd7cx1
+kZ38Wp44Vx3ogpt++rolDYEhsVCeiENVSA2EX/XHkF56QWwNedkSsS1OtFwmwu7J
+o+svs1V1BrGb4+649zByzp6p+VwAleuH2nDRBADB1Muwz2tVewnM3/oQcpzWoa/R
+Iba3mk0ASkjr9brKdXpMY/KMCFeeMW+PAXvvw9en2xDUWzERPbQ1VZsSYp5KXr+x
+1n7f4LfflKIaS2wEIsUjMwhGFx34UJRWjzjfh5GknIyR6fRMq/a0LpnO+CEuIjMj
+VR1L4wnucdDpcOoewwQA2eU7ODI/89RlNA/A9AlhYSWek4OzKgDDi96edwTeqjLP
++Zq0MM5WyupnrIoSdWsb9GBJww4CkAvbAGq94SH31uJU7D42VmrLxRHfrauk0UaL
+YnNewXwtbREMaC6qGLHMhH2orh1oNauvyL7QBuJPSr23+xqj4B6xdWx1DIw2bxED
+/iutL4RSkEagJgut+oM8xLoCBP2T4avue9chzo/S6GL308HpesBDeITBMndPg/Tw
+6z2Rn0rA7e9xuOmeUpvnqmAUNOMgiuGFoCfHZCHAZ0jIpjBx8sjyPKGZ/V6Qa1UA
+UNso1LQgageYiyksmuJjyI0yP2E9P9Hd2SBRTLoFB3b4SSmJAR8EGAEIAAkFAljm
+ORgCGwwACgkQQ0RZHhlkxfzwDQf/Y5on5o+s/xD3tDyRYa6SErfT44lEArdCD7Yi
++cygJFox3jyM8ovtJAkwRegwyxcaLN7zeG1p1Sk9ZAYWQEJT6qSU4Ppu+CVGHgxg
+nTcfUiu6EZZQE6srvua53IMY1lT50M7vx0T5VicHFRWBFV2C/Mc32p7cEE6nn45n
+EZgUXQNlySEyvoRlsAJq6gFsfqucVz2vMJDTMVczUtq1CjvUqFbif8JVL36EoZCf
+1SeRw6d6s1Kp3AA33Rjd+Uw87HJ4EIB75zMFQX2H0ggAVdYTQcqGXHP5MZK1jJrH
+fxJyMi3dUNW2iqnN3BA7guhOv6OMiROF1+I7Q5nWT63mQC7IgQ==
+=phzS
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/tests/package.m4 b/tests/package.m4
new file mode 100644 (file)
index 0000000..6862204
--- /dev/null
@@ -0,0 +1,6 @@
+# Signature of the current package.
+m4_define([AT_PACKAGE_NAME],      [rpm])
+m4_define([AT_PACKAGE_TARNAME],   [rpm])
+m4_define([AT_PACKAGE_VERSION],   [4.14.1])
+m4_define([AT_PACKAGE_STRING],    [rpm 4.14.1])
+m4_define([AT_PACKAGE_BUGREPORT], [rpm-maint@lists.rpm.org])
index 7661e35f57df669005c6eaa107f62ef8a9a11d4a..5e0b0d4923c7d3a1eb3efd40ddbc7895b9dde646 100644 (file)
@@ -51,6 +51,22 @@ run rpmbuild \
 [ignore])
 AT_CLEANUP
 
+AT_SETUP([rpmbuild --short-circuit -bl])
+AT_KEYWORDS([build])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+run rpmbuild -bi "${abs_srcdir}"/data/SPECS/hello.spec &> /dev/null
+run rpmbuild --quiet -bl --short-circuit "${abs_srcdir}"/data/SPECS/hello.spec
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
 # ------------------------------
 # Check if tar unpacking works
 AT_SETUP([rpmbuild -tb <tar with bad spec>])
@@ -95,7 +111,7 @@ runroot rpmbuild \
 
 runroot rpm -qp --qf \
   "\n[%{filemodes:perms} %-8{fileusername} %-8{filegroupname} %{filenames}\n]"\
-  "${TOPDIR}"/RPMS/noarch/attrtest-1.0-1.noarch.rpm
+  /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm
 ]],
 [0],
 [
@@ -135,7 +151,7 @@ rm -rf ${TOPDIR}
 runroot rpmbuild \
   -bb --quiet /data/SPECS/hlinktest.spec
 
-runroot rpm -i "${TOPDIR}"/RPMS/noarch/hlinktest-1.0-1.noarch.rpm
+runroot rpm -i /build/RPMS/noarch/hlinktest-1.0-1.noarch.rpm
 
 runroot rpm -q --qf "[[%{filenlinks} %{filenames}\n]]%{longsize}\n" hlinktest
 runroot rpm -V --nouser --nogroup hlinktest
@@ -143,17 +159,59 @@ ls -i "${RPMTEST}"/foo/hello* | awk {'print $1'} | sort -u | wc -l
 
 ],
 [0],
-[1 /foo/copyllo
+[2 /foo/aaaa
+1 /foo/copyllo
 4 /foo/hello
 4 /foo/hello-bar
 4 /foo/hello-foo
 4 /foo/hello-world
-78
+2 /foo/zzzz
+87
 1
 ],
 [])
 AT_CLEANUP
 
+AT_SETUP([rpmbuild unpackaged files])
+AT_KEYWORDS([build])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf ${TOPDIR}
+
+runroot rpmbuild \
+  -bb --quiet --with unpackaged_files /data/SPECS/hlinktest.spec
+],
+[1],
+[],
+[error: Installed (but unpackaged) file(s) found:
+   /toot
+    Installed (but unpackaged) file(s) found:
+   /toot
+])
+AT_CLEANUP
+
+# rpm doesn't detect unpackaged directories but should, really
+AT_SETUP([rpmbuild unpackaged directories])
+AT_KEYWORDS([build])
+AT_XFAIL_IF([test $RPM_XFAIL -ne 0])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf ${TOPDIR}
+
+runroot rpmbuild \
+  -bb --quiet --with unpackaged_dirs /data/SPECS/hlinktest.spec
+],
+[1],
+[],
+[error: Installed (but unpackaged) file(s) found:
+   /zoo
+    Installed (but unpackaged) file(s) found:
+   /zoo
+])
+AT_CLEANUP
+
 AT_SETUP([rpmbuild glob])
 AT_KEYWORDS([build])
 AT_CHECK([
@@ -164,7 +222,7 @@ rm -rf ${TOPDIR}
 runroot rpmbuild -bb --quiet /data/SPECS/globtest.spec
 runroot rpm -qp \
        --qf "[[%{filemodes:perms} %{filenames}\n]]" \
-       "${TOPDIR}"/RPMS/noarch/globtest-1.0-1.noarch.rpm
+       /build/RPMS/noarch/globtest-1.0-1.noarch.rpm
 ],
 [0],
 [-rw-r--r-- /opt/globtest/baf
@@ -185,3 +243,1111 @@ lrwxrwxrwx /opt/globtest/linkgood
 ],
 [])
 AT_CLEANUP
+
+AT_SETUP([rpmbuild prefixpostfix])
+AT_KEYWORDS([build])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf ${TOPDIR}
+
+runroot rpmbuild -bb --quiet \
+       /data/SPECS/prefixtest.spec
+runroot rpm -qp \
+       --qf "[[%{filemodes:perms} %{filenames}\n]]" \
+       /build/RPMS/noarch/prefixtest-1.0-1.noarch.rpm
+],
+[0],
+[-rw-r--r-- /opt/prefixtest/ba
+drwxr-xr-x /opt/prefixtest/ban
+-rw-r--r-- /opt/prefixtest/bi
+drwxr-xr-x /opt/prefixtest/bin
+drwxr-xr-x /opt/prefixtest/bon
+drwxr-xr-x /opt/prefixtest/foo
+-rw-r--r-- /opt/prefixtest/foo/one
+-rw-r--r-- /opt/prefixtest/foo/three
+-rw-r--r-- /opt/prefixtest/foo/two
+lrwxrwxrwx /opt/prefixtest/linkbad
+lrwxrwxrwx /opt/prefixtest/linkgood
+-rw-r--r-- /opt/prefixtest/weird%name
+-rw-r--r-- /opt/prefixtest/zab
+-rw-r--r-- /opt/prefixtest/zeb
+-rw-r--r-- /opt/prefixtest/zib
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Check if weak and reverse requires can be built
+AT_SETUP([Weak and reverse requires])
+AT_KEYWORDS([build])
+AT_CHECK([
+
+runroot rpmbuild -bb --quiet \
+       --define "pkg weakdeps" \
+       --define "recs foo > 1.2.3" \
+       --define "sugs bar >= 0.1.2" \
+       --define "sups baz" \
+       --define "ens zap = 3" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -qp --recommends /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+runroot rpm -qp --suggests /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+runroot rpm -qp --supplements /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+runroot rpm -qp --enhances /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+],
+[0],
+[foo > 1.2.3
+bar >= 0.1.2
+baz
+zap = 3
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Test BuildRequire functionality
+AT_SETUP([Build requires])
+AT_KEYWORDS([build])
+AT_CHECK([
+
+runroot rpmbuild -bb --quiet \
+               --define "pkg buildreq" \
+               --define "buildreqs foo > 1.2.3" \
+               /data/SPECS/deptest.spec
+],
+[1],
+[],
+[error: Failed build dependencies:
+       foo > 1.2.3 is needed by deptest-buildreq-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([Dependency generation])
+AT_KEYWORDS([build])
+AT_CHECK([
+
+runroot rpmbuild -bb --quiet \
+               /data/SPECS/filedep.spec
+echo Requires:
+runroot rpm  -qp --requires /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+echo Provides:
+runroot rpm -qp --provides /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+echo Filerequires:
+runroot rpm -qp --qf '[["%{FILENAMES}\t%{FILEREQUIRE}"\n]]' /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+echo Fileprovides:
+runroot rpm -qp --qf '[["%{FILENAMES}\t%{FILEPROVIDE}"\n]]' /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+],
+[0],
+[Requires:
+/bin/f00f
+/bin/sh
+rpmlib(CompressedFileNames) <= 3.0.4-1
+rpmlib(FileDigests) <= 4.6.0-1
+rpmlib(PayloadFilesHavePrefix) <= 4.0-1
+Provides:
+filedep = 1.0-1
+Filerequires:
+"/etc/foo.conf "
+"/usr/bin/bar  /bin/f00f"
+"/usr/bin/foo  /bin/sh"
+"/usr/share/doc/filedep        "
+"/usr/share/doc/filedep/README "
+Fileprovides:
+"/etc/foo.conf "
+"/usr/bin/bar  "
+"/usr/bin/foo  "
+"/usr/share/doc/filedep        "
+"/usr/share/doc/filedep/README "
+],
+[])
+AT_CLEANUP
+
+
+# ------------------------------
+# Test spec query functionality
+AT_SETUP([rpmspec query 1])
+AT_KEYWORDS([build])
+AT_CHECK([
+
+runroot rpmspec -q \
+               --define "pkg dep" \
+               --define "reqs foo > 1.2.3 bar <= 2.3" \
+               --requires \
+               /data/SPECS/deptest.spec
+],
+[0],
+[bar <= 2.3
+foo > 1.2.3
+],
+[])
+
+AT_CLEANUP
+
+# ------------------------------
+# archive sanity check
+AT_SETUP([rpmbuild archive sanity])
+AT_KEYWORDS([build])
+AT_CHECK([
+rm -rf ${TOPDIR}
+
+runroot rpmbuild \
+  -bb --quiet /data/SPECS/attrtest.spec
+
+runroot rpm2cpio \
+  /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm > /tmp/attrtest.cpio
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild creates the minisymtab section in the main hello binary
+AT_SETUP([rpmbuild debuginfo minisymtab])
+AT_KEYWORDS([build] [debuginfo])
+AT_CHECK([
+rm -rf ${TOPDIR}
+
+# Use macros.debug to generate a debuginfo package.
+export CFLAGS="-g"
+rundebug rpmbuild --quiet \
+  --rebuild "${abs_srcdir}"/data/SRPMS/hello-1.0-1.src.rpm
+
+# Extract the main package and inspect the hello binary
+# It should contain .gnu_debugdata, but not the full .symtab
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm | cpio -diu
+test -f ./usr/local/bin/hello || exit 1
+readelf -S ./usr/local/bin/hello |\
+   grep -q .gnu_debugdata; test $? == 0 || exit 1
+readelf -S ./usr/local/bin/hello \
+  | grep -q .symtab; test $? == 1 || exit 1
+
+# And the opposite for the debuginfo package
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+test -f ./usr/lib/debug/usr/local/bin/hello*.debug || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \
+  | grep -q .gnu_debugdata; test $? == 1 || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \
+  | grep -q .symtab; test $? == 0 || exit 1
+],
+[0],
+[],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild doesn't create the minisymtab section if we keep symtab
+# Some package might want to use strip -g to keep the symbol table and only
+# but the debug symbols/info in the debuginfo package.
+AT_SETUP([rpmbuild debuginfo minisymtab strip -g])
+AT_KEYWORDS([build] [debuginfo])
+AT_CHECK([
+rm -rf ${TOPDIR}
+
+# Use macros.debug to generate a debuginfo package.
+export CFLAGS="-g"
+rundebug rpmbuild --quiet \
+  --define="_find_debuginfo_opts -g" \
+  --rebuild "${abs_srcdir}"/data/SRPMS/hello-1.0-1.src.rpm
+
+# Extract the main package and inspect the hello binary
+# It should contain .symtab (because of strip -g), so doesn't .gnu_debugdata.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm | cpio -diu
+test -f ./usr/local/bin/hello || exit 1
+readelf -S ./usr/local/bin/hello \
+  | grep -q .gnu_debugdata; test $? == 1 || exit 1
+readelf -S ./usr/local/bin/hello \
+  | grep -q .symtab; test $? == 0 || exit 1
+
+# The debuginfo package should contain neither. The .symtab is NOBITS.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+test -f ./usr/lib/debug/usr/local/bin/hello*.debug || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \
+  | grep -q .gnu_debugdata; test $? == 1 || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \
+  | grep .symtab | grep -q NOBITS; test $? == 0 || exit 1
+],
+[0],
+[],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild runs dwz and generates a multi file that with shared
+# debuginfo. This is simply the hello example with one binary build twice
+# so dwz has enough slightly similar debug data.
+# Test the case without unique debug file names.
+AT_SETUP([rpmbuild debuginfo dwz])
+AT_KEYWORDS([build] [debuginfo] [dwz])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# The debuginfo package should contain a .debug file for each binary
+# and a dwz multi file that contains the shared debuginfo between them.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+hello_file_debug=./usr/lib/debug/usr/local/bin/hello.debug
+hello2_file_debug=./usr/lib/debug/usr/local/bin/hello2.debug
+hello_multi_file=./usr/lib/debug/.dwz/hello2-1.0-1.*
+test -f $hello_file_debug || echo "no hello debug file: $hello_file_debug"
+test -f $hello2_file_debug || echo "no hello2 debug file: $hello2_file_debug"
+test -f $hello_multi_file || echo "no dwz multi file: $hello_multi_file"
+
+# Make sure the main package binaries contain the correct build-ids
+# linking them to the debug packages.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu
+hello_file=./usr/local/bin/hello
+hello2_file=./usr/local/bin/hello2
+test -f $hello_file || echo "no hello file: $hello_file"
+test -f $hello2_file || echo "no hello2 file: $hello2_file"
+
+id1=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+id2=$(file $hello2_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+id1debug=$(file $hello_file_debug | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+id2debug=$(file $hello2_file_debug | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+idmulti=$(file $hello_multi_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+test "$id1" = "$id1debug" || echo "id1: $id1 != id1debug: $id1debug"
+test "$id2" = "$id2debug" || echo "id2: $id2 != id2debug: $id2debug"
+
+# The build-id files should link to the .debug files.
+id1file="./usr/lib/debug/.build-id/${id1:0:2}/${id1:2}"
+canonid1file=$(readlink -f ${id1file})
+canonfile1=$(readlink -f $hello_file)
+canonid1debug=$(readlink -f ${id1file}.debug)
+canondebug1=$(readlink -f $hello_file_debug)
+
+test "$canonid1file" = "$canonfile1" \
+  || echo "canonid1file: $canonid1file != $canonfile1"
+test "$canonid1debug" = "$canondebug1" \
+  || echo "canonid1debug: $canonid1debug != $canondebug1"
+
+id2file="./usr/lib/debug/.build-id/${id2:0:2}/${id2:2}"
+canonid2file=$(readlink -f ${id2file})
+canonfile2=$(readlink -f $hello2_file)
+canonid2debug=$(readlink -f ${id2file}.debug)
+canondebug2=$(readlink -f $hello2_file_debug)
+
+test "$canonid2file" = "$canonfile2" \
+  || echo "canonid2: $canonid2file != $canonfile2"
+test "$canonid2debug" = "$canondebug2" \
+  || echo "canonid2debug: $canonid2debug" != "$canondebug2"
+
+# Both .debug files should point to the dwz multi file.
+# It would be nice to also test that they contain the correct dwz build-id
+# but that is a bit hard to grep out of the section data.
+multiref1=$(readelf --string-dump=.gnu_debugaltlink $hello_file_debug \
+  | grep '[     0]' | cut -c13-)
+multiref2=$(readelf --string-dump=.gnu_debugaltlink $hello2_file_debug \
+  | grep '[     0]' | cut -c13-)
+
+test "$multiref1" = "$multiref2" || echo "multiref: $multiref1 != $multiref2"
+
+canonmultiref=$(readlink -f $(dirname $canondebug1)/$multiref1)
+canonmultifile=$(readlink -f $hello_multi_file)
+
+test "$canonmultiref" = "$canonmultifile" \
+  || echo "canonmultiref: $canonmultiref" != "$canonmultifile"
+],
+[0],
+[],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild runs dwz and generates a multi file that with shared
+# debuginfo. This is simply the hello example with one binary build twice
+# so dwz has enough slightly similar debug data.
+# Test with unique debug file names.
+AT_SETUP([rpmbuild debuginfo dwz unique debug names])
+AT_KEYWORDS([build] [debuginfo] [dwz])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# The debuginfo package should contain a .debug file for each binary
+# and a dwz multi file that contains the shared debuginfo between them.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+hello_file_debug=./usr/lib/debug/usr/local/bin/hello-*.debug
+hello2_file_debug=./usr/lib/debug/usr/local/bin/hello2-*.debug
+hello_multi_file=./usr/lib/debug/.dwz/hello2-1.0-1.*
+test -f $hello_file_debug || echo "no hello debug file: $hello_file_debug"
+test -f $hello2_file_debug || echo "no hello2 debug file: $hello2_file_debug"
+test -f $hello_multi_file || echo "no dwz multi file: $hello_multi_file"
+
+# Make sure the main package binaries contain the correct build-ids
+# linking them to the debug packages.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu
+hello_file=./usr/local/bin/hello
+hello2_file=./usr/local/bin/hello2
+test -f $hello_file || echo "no hello file: $hello_file"
+test -f $hello2_file || echo "no hello2 file: $hello2_file"
+
+id1=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+id2=$(file $hello2_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+id1debug=$(file $hello_file_debug | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+id2debug=$(file $hello2_file_debug | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+idmulti=$(file $hello_multi_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+test "$id1" = "$id1debug" || echo "id1: $id1 != id1debug: $id1debug"
+test "$id2" = "$id2debug" || echo "id2: $id2 != id2debug: $id2debug"
+
+# The build-id files should link to the .debug files.
+id1file="./usr/lib/debug/.build-id/${id1:0:2}/${id1:2}"
+canonid1file=$(readlink -f ${id1file})
+canonfile1=$(readlink -f $hello_file)
+canonid1debug=$(readlink -f ${id1file}.debug)
+canondebug1=$(readlink -f $hello_file_debug)
+
+test "$canonid1file" = "$canonfile1" \
+  || echo "canonid1file: $canonid1file != $canonfile1"
+test "$canonid1debug" = "$canondebug1" \
+  || echo "canonid1debug: $canonid1debug != $canondebug1"
+
+id2file="./usr/lib/debug/.build-id/${id2:0:2}/${id2:2}"
+canonid2file=$(readlink -f ${id2file})
+canonfile2=$(readlink -f $hello2_file)
+canonid2debug=$(readlink -f ${id2file}.debug)
+canondebug2=$(readlink -f $hello2_file_debug)
+
+test "$canonid2file" = "$canonfile2" \
+  || echo "canonid2: $canonid2file != $canonfile2"
+test "$canonid2debug" = "$canondebug2" \
+  || echo "canonid2debug: $canonid2debug" != "$canondebug2"
+
+# Both .debug files should point to the dwz multi file.
+# It would be nice to also test that they contain the correct dwz build-id
+# but that is a bit hard to grep out of the section data.
+multiref1=$(readelf --string-dump=.gnu_debugaltlink $hello_file_debug \
+  | grep '[     0]' | cut -c13-)
+multiref2=$(readelf --string-dump=.gnu_debugaltlink $hello2_file_debug \
+  | grep '[     0]' | cut -c13-)
+
+test "$multiref1" = "$multiref2" || echo "multiref: $multiref1 != $multiref2"
+
+canonmultiref=$(readlink -f $(dirname $canondebug1)/$multiref1)
+canonmultifile=$(readlink -f $hello_multi_file)
+
+test "$canonmultiref" = "$canonmultifile" \
+  || echo "canonmultiref: $canonmultiref" != "$canonmultifile"
+],
+[0],
+[],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that old style gnu_debuglink CRC checksums are correct even after
+# using dwz to compress the debuginfo files.
+AT_SETUP([rpmbuild debuginfo dwz gnu_debuglink crc])
+AT_KEYWORDS([build] [debuginfo])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Build a package that
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the main and debuginfo rpms so we can check binaries and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check that dwz has ran and a multi file has been produced
+test -f ./usr/lib/debug/.dwz/hello2-1.0-1.* || exit 1
+
+# Run sepdbugcrcfix on the binaries, both should have correct CRC already.
+${abs_top_builddir}/sepdebugcrcfix ./usr/lib/debug \
+  ./usr/local/bin/hello ./usr/local/bin/hello2 | grep CRC32 | cut -f2 -d:
+],
+[0],
+[ Updated 0 CRC32s, 2 CRC32s did match.
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that an implicit suid binary get included with the suid bit set.
+# We explicitly build with all debug.macros to test those helpers.
+AT_SETUP([rpmbuild implicit suid binary])
+AT_KEYWORDS([build] [debuginfo] [dwz] [suid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  -ba "${abs_srcdir}"/data/SPECS/hello2-suid.spec
+
+# Unpack rpm so we can check the included binaries.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# List all binaries with suid bit set (should be one, hello).
+echo "suid:"
+find usr -executable -type f -perm /4000
+# List all binaries without suid bit set (should also be one, hello2).
+echo "no-suid:"
+find usr -executable -type f \! -perm /4000
+],
+[0],
+[suid:
+usr/local/bin/hello
+no-suid:
+usr/local/bin/hello2
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that a GDB index is included when requested.
+AT_SETUP([rpmbuild debuginfo gdb index included])
+AT_KEYWORDS([build] [debuginfo] [gdb])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_include_gdb_index 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that gdb-add-index has ran and a .gdb_index section has been added
+readelf -S ./usr/lib/debug/usr/local/bin/hello2*.debug \
+  | grep gdb_index | cut -c8-17
+],
+[0],
+[.gdb_index
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that a GDB index is NOT included when not requested.
+AT_SETUP([rpmbuild debuginfo no gdb index included])
+AT_KEYWORDS([build] [debuginfo] [gdb])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --undefine "_include_gdb_index" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that gdb-add-index has not ran and no .gdb_index section has been added
+readelf -S ./usr/lib/debug/usr/local/bin/hello2*.debug \
+  | grep gdb_index | cut -c8-17
+],
+[0],
+[],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that a debug source is in a "unique" directory when requested.
+AT_SETUP([rpmbuild debuginfo unique debug src dir])
+AT_KEYWORDS([build] [debuginfo])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Note that the spec defines hello2 as name, but the source is hello-1.0.
+# Disable dwz to make debuginfo path rewrite checking easier.
+rundebug rpmbuild --quiet \
+  --undefine "_find_debuginfo_dwz_opts" \
+  --define "_unique_debug_srcs 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that the source path is "unique"
+# Drop the final arch prefix to make the test arch-independent.
+ls ./usr/src/debug/ | cut -f1,2 -d\.
+
+# Check that the source path has been rewritten in the .debug file.
+# Drop the final arch prefix to make the test arch-independent.
+readelf --debug-dump=info ./usr/lib/debug/usr/local/bin/hello2*.debug \
+  | grep comp_dir | sed -e 's/\t$//' | cut -f5- -d/ | cut -f1,2 -d\.
+],
+[0],
+[hello2-1.0-1
+hello2-1.0-1
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that a debug source is NOT in a "unique" directory when not requested.
+# It will be in the "build directory" name under /usr/src/debug.
+AT_SETUP([rpmbuild debuginfo no unique debug src dir])
+AT_KEYWORDS([build] [debuginfo])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Note that the spec defines hello2 as name, but the source is hello-1.0.
+# Disable dwz to make debuginfo path rewrite checking easier.
+rundebug rpmbuild --quiet \
+  --undefine "_find_debuginfo_dwz_opts" \
+  --undefine "_unique_debug_srcs" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that the source path is "unique"
+ls ./usr/src/debug/
+
+# Check that the source path has been rewritten in the .debug file.
+readelf --debug-dump=info ./usr/lib/debug/usr/local/bin/hello2*.debug \
+  | grep comp_dir | sed -e 's/\t$//' | cut -f5- -d/
+],
+[0],
+[hello-1.0
+hello-1.0
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that defining _debugsource_packages creates -debugsource package
+AT_SETUP([rpmbuild debugsource])
+AT_KEYWORDS([build] [debuginfo] [debugsource])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_debugsource_packages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debugsource rpm so we can check the sources are there.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debugsource-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that hello.c is there.
+ls ./usr/src/debug/hello2-1.0*/
+
+# The debuginfo package should recommend the debugsource package (ignore arch).
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm | sed -E 's/([[-.a-z0-9]]+)\(.*\) = ([[-.0-9]]+)/\1\(ignore-arch\) = \2/'
+],
+[0],
+[hello.c
+Recommends: hello2-debugsource(ignore-arch) = 1.0-1
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that defining _debugsource_packages creates -debugsource package
+# even if %install changes the working directory (debugsources.list
+# should be in expected build dir).
+AT_SETUP([rpmbuild debugsource debugsources.list path])
+AT_KEYWORDS([build] [debuginfo] [debugsource])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_debugsource_packages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-cd.spec
+
+# Unpack the debuginfo rpms so we can check the sources are there.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debugsource-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that hello.c is there.
+ls ./usr/src/debug/test-1.0*/
+],
+[0],
+[hello.c
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that undefining _debuginfo_subpackages creates one single -debuginfo.
+AT_SETUP([rpmbuild debuginfo subpackages single])
+AT_KEYWORDS([build] [debuginfo] [debugsubpackage])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --undefine "_debugsource_packages" \
+  --undefine "_debuginfo_subpackages" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages.spec
+
+# Check that there is just one debuginfo package.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# Which contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+],
+[0],
+[1
+hello debug exists
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that defining _debuginfo_subpackages creates multiple -debuginfos.
+AT_SETUP([rpmbuild debuginfo subpackages multiple])
+AT_KEYWORDS([build] [debuginfo] [debugsubpackage])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --undefine "_debugsource_packages" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages.spec
+
+# Check that there are 3 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# Second contains hello2.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello2 debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm | sed -E 's/([[-.a-z0-9]]+)\(.*\) = ([[-.0-9]]+)/\1\(ignore-arch\) = \2/'
+
+# Third contains hello3.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello3 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello3 debug exists"
+else
+  echo "No hello3: $debug_name"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm | sed -E 's/([[-.a-z0-9]]+)\(.*\) = ([[-.0-9]]+)/\1\(ignore-arch\) = \2/'
+],
+[0],
+[3
+hello debug exists
+hello2 debug exists
+Recommends: test-debuginfo(ignore-arch) = 1.0-1
+hello3 debug exists
+Recommends: test-debuginfo(ignore-arch) = 1.0-1
+],
+[ignore])
+AT_CLEANUP
+# ------------------------------
+# Check that defining _debuginfo_subpackages creates multiple -debuginfos.
+# With unique debug and source names
+AT_SETUP([rpmbuild debuginfo subpackages multiple unique])
+AT_KEYWORDS([build] [debuginfo] [debugsubpackage])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --undefine "_debugsource_packages" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages.spec
+
+# Check that there are 3 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# Second contains hello2.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello2 debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm | sed -E 's/([[-.a-z0-9]]+)\(.*\) = ([[-.0-9]]+)/\1\(ignore-arch\) = \2/'
+
+# Third contains hello3.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello3 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello3 debug exists"
+else
+  echo "No hello3: $debug_name"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm | sed -E 's/([[-.a-z0-9]]+)\(.*\) = ([[-.0-9]]+)/\1\(ignore-arch\) = \2/'
+],
+[0],
+[3
+hello debug exists
+hello2 debug exists
+Recommends: test-debuginfo(ignore-arch) = 1.0-1
+hello3 debug exists
+Recommends: test-debuginfo(ignore-arch) = 1.0-1
+],
+[ignore])
+AT_CLEANUP
+# ------------------------------
+# Check that defining _debuginfo_subpackages creates multiple -debuginfos.
+# Unique with debugsources.
+AT_SETUP([rpmbuild debuginfo subpackages multiple unique debugsource])
+AT_KEYWORDS([build] [debuginfo] [debugsubpackage] [debugsource])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --define "_debugsource_packages 1" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages.spec
+
+# Check that there are 3 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# Sources are in debugsource package. Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm | sed -E 's/([[-.a-z0-9]]+)\(.*\) = ([[-.0-9]]+)/\1\(ignore-arch\) = \2/'
+
+# Second contains hello2.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello2 debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+# Sources are in debugsource package. Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm | sed -E 's/([[-.a-z0-9]]+)\(.*\) = ([[-.0-9]]+)/\1\(ignore-arch\) = \2/'
+
+# Third contains hello3.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello3 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello3 debug exists"
+else
+  echo "No hello3: $debug_name"
+fi
+
+# Sources are in debugsource package. Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm | sed -E 's/([[-.a-z0-9]]+)\(.*\) = ([[-.0-9]]+)/\1\(ignore-arch\) = \2/'
+],
+[0],
+[3
+hello debug exists
+Recommends: test-debugsource(ignore-arch) = 1.0-1
+hello2 debug exists
+Recommends: test-debugsource(ignore-arch) = 1.0-1
+hello3 debug exists
+Recommends: test-debugsource(ignore-arch) = 1.0-1
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that defining _debuginfo_subpackages works with excluded files.
+AT_SETUP([rpmbuild debuginfo subpackages multiple excluded])
+AT_KEYWORDS([build] [debuginfo] [debugsubpackage] [debugsource])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --define "_debugsource_packages 1" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages-exclude.spec
+
+# Check that there are 2 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# Second contains hello2.debug but NOT hello3.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello2 debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+if test -f ./usr/lib/debug/bin/hello3*; then
+  echo "hello3 debug exists"
+else
+  echo "No hello3 debug"
+fi
+],
+[0],
+[2
+hello debug exists
+hello2 debug exists
+No hello3 debug
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that defining _debuginfo_subpackages works with RemovePathPostfixes.
+AT_SETUP([rpmbuild debuginfo subpackages multiple excluded])
+AT_KEYWORDS([build] [debuginfo] [debugsubpackage] [debugsource])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --define "_debugsource_packages 1" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages-pathpostfixes.spec
+
+# Check that there are 2 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# remove it, we are going to check the other debuginfo package.
+rm ./bin/hello
+rm ./usr/lib/debug/bin/$debug_name
+orig_debugname=$debugname
+
+# Second contains hello.foobar.debug but NOT hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello.foobar debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+if test -f ./usr/lib/debug/bin/$orig_debugname; then
+  echo "$orig_debugname exists"
+else
+  echo "No hello.debug"
+fi
+],
+[0],
+[2
+hello debug exists
+hello.foobar debug exists
+No hello.debug
+],
+[ignore])
+AT_CLEANUP
diff --git a/tests/rpmbuildid.at b/tests/rpmbuildid.at
new file mode 100644 (file)
index 0000000..5ecefb2
--- /dev/null
@@ -0,0 +1,1312 @@
+# rpmbuildid.at: test rpmbuild buildid symlink support
+#
+# This file is part of RPM, the RPM Package Manager.
+# Copyright (C) 2016 Mark J. Wielaard <mjw@redhat.com>
+#
+# This file 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.
+#
+# RPM 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, see <http://www.gnu.org/licenses/>.
+
+AT_BANNER([RPM buildid tests])
+
+# ------------------------------
+# Check if rpmbuild "none" doesn't generates buildid symlinks for hello program
+AT_SETUP([rpmbuild buildid none])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links none" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be zero build-id files in both the main and debuginfo package
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+],
+[0],
+[hello build-id files: 0
+hello debuginfo build-id files: 0
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild "alldebug" generates debuginfo buildid symlinks.
+# Without unique debug file names.
+AT_SETUP([rpmbuild buildid alldebug])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links alldebug" \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be zero build-id files in the main package
+# Main and debug should be in the debuginfo package,
+# plus the .build-id/xx subdir, 3 in total.
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+id_main_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+],
+[0],
+[hello build-id files: 0
+hello debuginfo build-id files: 3
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild "alldebug" generates debuginfo buildid symlinks.
+# With unique debug file names.
+AT_SETUP([rpmbuild buildid alldebug unique debug names])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links alldebug" \
+  --define="_unique_debug_names 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be zero build-id files in the main package
+# Main and debug should be in the debuginfo package,
+# plus the .build-id/xx subdir, 3 in total.
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+id_main_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello-*.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+],
+[0],
+[hello build-id files: 0
+hello debuginfo build-id files: 3
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild "separate" generates main and debuginfo buildid symlinks
+# Without unique debug file names
+AT_SETUP([rpmbuild buildid separate])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links separate" \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package
+# plus the .build-id/xx subdir, 2 in total.
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+],
+[0],
+[hello build-id files: 2
+hello debuginfo build-id files: 2
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild "separate" generates main and debuginfo buildid symlinks
+# With unique debug file names
+AT_SETUP([rpmbuild buildid separate unique debug names])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links separate" \
+  --define="_unique_debug_names 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package
+# plus the .build-id/xx subdir, 2 in total.
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello-*.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+],
+[0],
+[hello build-id files: 2
+hello debuginfo build-id files: 2
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild "compat" generates main and debuginfo buildid symlinks
+# Without unique debug file names
+AT_SETUP([rpmbuild buildid compat])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links compat" \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package.
+# the debuginfo package has one extra main build-id compat symlink
+# plus the .build-id/xx subdir, 2 in total in main, 3 in total in debug
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+
+# The compat link should also point to the same (indirectly).
+id_compat_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_compat_file" || echo "No build-id compat file $id_compat_file"
+
+canon_compat_file=$(readlink -f ${id_compat_file})
+
+test -f "$canon_compat_file" \
+  || echo "Cannot resolve compat file ${id_compat_file} -> ${canon_compat_file}"
+
+test "$canon_compat_file" = "$canon_main_file" \
+  || echo "compat and build-id not linked"
+],
+[0],
+[hello build-id files: 2
+hello debuginfo build-id files: 3
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check if rpmbuild "compat" generates main and debuginfo buildid symlinks
+# With unique debug file names
+AT_SETUP([rpmbuild buildid compat unique debug names])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links compat" \
+  --define="_unique_debug_names 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package.
+# the debuginfo package has one extra main build-id compat symlink
+# plus the .build-id/xx subdir, 2 in total in main, 3 in total in debug
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello-*debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+
+# The compat link should also point to the same (indirectly).
+id_compat_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_compat_file" || echo "No build-id compat file $id_compat_file"
+
+canon_compat_file=$(readlink -f ${id_compat_file})
+
+test -f "$canon_compat_file" \
+  || echo "Cannot resolve compat file ${id_compat_file} -> ${canon_compat_file}"
+
+test "$canon_compat_file" = "$canon_main_file" \
+  || echo "compat and build-id not linked"
+],
+[0],
+[hello build-id files: 2
+hello debuginfo build-id files: 3
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that (copied) files with duplicate build-ids are handled correctly.
+# This should create "numbered" build-id files.
+# This is simply the hello example with one binary copied.
+AT_SETUP([rpmbuild buildid duplicate alldebug])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Should create two warnings
+rundebug rpmbuild --quiet \
+  --define="_build_id_links alldebug" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2cp.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# alldebug not here...
+id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# alldebug, so they are all here
+test -L "$id_file" && echo "main id in debug package"
+test -L "$id_dup_file" && echo "main dup id in debug package"
+
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+],
+[0],
+[warning: Duplicate build-ids
+warning: Duplicate build-ids
+main id in debug package
+main dup id in debug package
+debug id in debug package
+debug dup id in debug package
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Check that hard linked files are handled correctly.
+# Since the hard linked files have duplicate build-ids,
+# it should create "numbered" build-id files.
+# This is simply the hello example with one binary hard linked.
+AT_SETUP([rpmbuild buildid hardlink alldebug])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --define="_build_id_links alldebug" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2ln.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# alldebug not here...
+id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# alldebug, so they are all here
+test -L "$id_file" && echo "main id in debug package"
+test -L "$id_dup_file" && echo "main dup id in debug package"
+
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+],
+[0],
+[main id in debug package
+main dup id in debug package
+debug id in debug package
+debug dup id in debug package
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Check that (copied) files with duplicate build-ids are handled correctly.
+# This should create "numbered" build-id files.
+# This is simply the hello example with one binary copied.
+AT_SETUP([rpmbuild buildid duplicate separate])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Should create two warnings
+rundebug rpmbuild --quiet \
+  --define="_build_id_links separate" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2cp.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# separate build-ids split...
+id_file="./usr/lib/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# separate, so debug ids are here
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+],
+[0],
+[warning: Duplicate build-ids
+warning: Duplicate build-ids
+main id in main package
+main dup id in main package
+debug id in debug package
+debug dup id in debug package
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Check that hard linked files are handled correctly.
+# Since the hard linked files have duplicate build-ids,
+# it should create "numbered" build-id files.
+# This is simply the hello example with one binary hard linked.
+AT_SETUP([rpmbuild buildid hardlink separate])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --define="_build_id_links separate" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2ln.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# separate build-ids split...
+id_file="./usr/lib/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# separate, so debug ids are here
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+],
+[0],
+[main id in main package
+main dup id in main package
+debug id in debug package
+debug dup id in debug package
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Check that (copied) files with duplicate build-ids are handled correctly.
+# This should create "numbered" build-id files.
+# This is simply the hello example with one binary copied.
+AT_SETUP([rpmbuild buildid duplicate compat])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Should create two warnings
+rundebug rpmbuild --quiet \
+  --define="_build_id_links compat" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2cp.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# compat build-ids split...
+id_file="./usr/lib/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# compat, so main (and debug) ids are (also) here
+compat_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}"
+test -L "$compat_file" && echo "compat id in debug package"
+compat_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1"
+test -L "$compat_dup_file" && echo "compat dup id in debug package"
+
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+
+canon_compat_file=$(readlink -f ${compat_file})
+canon_compat_dup_file=$(readlink -f ${compat_dup_file})
+test "$canon_compat_file" != "$canon_compat_dup_file" \
+  || echo "compat id and dup same"
+],
+[0],
+[warning: Duplicate build-ids
+warning: Duplicate build-ids
+main id in main package
+main dup id in main package
+compat id in debug package
+compat dup id in debug package
+debug id in debug package
+debug dup id in debug package
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Check that hard linked files are handled correctly.
+# Since the hard linked files have duplicate build-ids,
+# it should create "numbered" build-id files.
+# This is simply the hello example with one binary hard linked.
+AT_SETUP([rpmbuild buildid hardlink compat])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --define="_build_id_links compat" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2ln.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# compat build-ids split...
+id_file="./usr/lib/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# compat, so main (and debug) ids are (also) here
+compat_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}"
+test -L "$compat_file" && echo "compat id in debug package"
+compat_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1"
+test -L "$compat_dup_file" && echo "compat dup id in debug package"
+
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+
+canon_compat_file=$(readlink -f ${compat_file})
+canon_compat_dup_file=$(readlink -f ${compat_dup_file})
+test "$canon_compat_file" != "$canon_compat_dup_file" \
+  || echo "compat id and dup same"
+],
+[0],
+[main id in main package
+main dup id in main package
+compat id in debug package
+compat dup id in debug package
+debug id in debug package
+debug dup id in debug package
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Check build-ids are recomputed with unique_build_ids,
+# but not with _no_recompute_build_ids
+AT_SETUP([rpmbuild buildid recompute])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Make sure we get debuginfo
+export CFLAGS="-g"
+
+# Unique 1
+rundebug rpmbuild --quiet \
+  --define="_unique_build_ids 1" \
+  --undefine="_no_recompute_build_ids" \
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id1=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# Make sure we generate a new one
+rm $hello_file
+
+# Unique 2
+# Build the "next" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \
+  --define="_unique_build_ids 1" \
+  --undefine="_no_recompute_build_ids" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id2=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# Two unique builds should not be equal
+if test "$id1" == "$id2"; then
+  echo "uniques equal";
+else
+  echo "uniques unequal";
+fi
+
+# Make sure we generate a new one
+rm $hello_file
+
+# no-recompute 1
+rundebug rpmbuild --quiet \
+  --undefine="_unique_build_ids" \
+  --undefine="_unique_debug_names" \
+  --undefine="_unique_debug_srcs" \
+  --define="_no_recompute_build_ids 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id3=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# An unique and no-recompute build should be unequal
+if test "$id2" == "$id3"; then
+  echo "no-recompute unique equal";
+else
+  echo "no-recompute unique unequal";
+fi
+
+# Make sure we generate a new one
+rm $hello_file
+
+# no-recompute 2
+# Build the "next" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \
+  --undefine="_unique_build_ids" \
+  --undefine="_unique_debug_names" \
+  --undefine="_unique_debug_srcs" \
+  --define="_no_recompute_build_ids 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id4=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# Two no-recompute builds should be equal. Even for different "releases".
+if test "$id3" == "$id4"; then
+  echo "no-recomputes equal";
+else
+  echo "no-recomputes unequal";
+fi
+],
+[0],
+[uniques unequal
+no-recompute unique unequal
+no-recomputes equal
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check build-ids are unique between versions/releases
+# with _unique_build_ids defined.
+AT_SETUP([rpmbuild buildid unique r1 r2])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --define="_unique_build_ids 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id1=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# Make sure we generate a new one
+rm $hello_file
+
+# Build the "next" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \
+  --define="_unique_build_ids 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id2=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+if test "$id1" == "$id2"; then echo "equal $id1"; else echo "unequal"; fi
+],
+[0],
+[unequal
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check build-ids are non-unique between versions/releases
+# with _unique_build_ids undefined (and exact same sources).
+AT_SETUP([rpmbuild buildid non-unique r1 r2])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --undefine="_unique_build_ids" \
+  --undefine="_unique_debug_names" \
+  --undefine="_unique_debug_srcs" \
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id1=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+# Make sure we generate a new one
+rm $hello_file
+
+# Build the "next" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \
+  --undefine="_unique_build_ids" \
+  --undefine="_unique_debug_names" \
+  --undefine="_unique_debug_srcs" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id2=$(file $hello_file | sed 's/.*, BuildID\[[.*\]]=\([[0-9a-f]]*\),.*/\1/')
+
+if test "$id1" == "$id2"; then echo "equal"; else echo "unequal $id1 $id2"; fi
+],
+[0],
+[equal
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that build-id directories are created with the right permissions
+# even if the spec file sets attrs explicitly.
+AT_SETUP([rpmbuild buildid attrs])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links compat" \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello-attr-buildid.spec
+
+run rpm -qp --qf "[[%{filenames} %{filemodes:perms}\n]]" \
+        ${abs_builddir}/testing/build/RPMS/*/test-1.0-1*rpm \
+       | grep "build-id d"
+
+run rpm -qp --qf "[[%{filenames} %{filemodes:perms}\n]]" \
+        ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1*rpm \
+       | grep "build-id d"
+],
+[0],
+[/usr/lib/.build-id drwxr-xr-x
+/usr/lib/debug/.build-id drwxr-xr-x
+],
+[ignore])
+AT_CLEANUP
+
+# ------------------------------
+# Check that build-id directories are created with the right attributes
+# even if the spec file sets config explicitly.
+AT_SETUP([rpmbuild buildid config attrs])
+AT_KEYWORDS([build] [debuginfo] [buildid])
+AT_CHECK([
+rm -rf ${TOPDIR}
+AS_MKDIR_P(${TOPDIR}/SOURCES)
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links compat" \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello-config-buildid.spec
+
+# Should contain one config file.
+run rpm -c -qp ${abs_builddir}/testing/build/RPMS/*/test-1.0-1*rpm
+# Should not contain config files.
+run rpm -c -qp ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1*rpm
+],
+[0],
+[/etc/config.file
+],
+[ignore])
+AT_CLEANUP
index 91c03ba571bc564d8825168ad4e74ea0e81aa592..87e9310dd5da437885cd1c1f3af9f1ccb258d1b3 100644 (file)
@@ -18,7 +18,7 @@ runroot rpmbuild --quiet -bb \
           /data/SPECS/configtest.spec
 
 echo "otherstuff" > "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 runroot rpm -e configtest
 cat "${cf}.rpmorig"
@@ -32,7 +32,7 @@ otherstuff
 AT_CLEANUP
 
 # Install over existing config file
-AT_SETUP([install config(noreplace) on existiting file])
+AT_SETUP([install config(noreplace) on existing file])
 AT_KEYWORDS([install])
 AT_CHECK([
 RPMDB_CLEAR
@@ -44,19 +44,25 @@ rm -rf "${TOPDIR}"
 runroot rpmbuild --quiet -bb \
         --define "ver 1.0" \
        --define "filedata foo" \
+       --define "noreplace 1" \
           /data/SPECS/configtest.spec
 
 echo "otherstuff" > "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
+cat "${cf}.rpmnew"
 runroot rpm -e configtest
-cat "${cf}.rpmorig"
+cat "${cf}.rpmsave"
+cat "${cf}.rpmnew"
 ],
 [0],
-[foo
+[otherstuff
+foo
 otherstuff
+foo
 ],
-[warning: /etc/my.conf saved as /etc/my.conf.rpmorig]
+[warning: /etc/my.conf created as /etc/my.conf.rpmnew
+warning: /etc/my.conf saved as /etc/my.conf.rpmsave]
 )
 AT_CLEANUP
 
@@ -76,7 +82,7 @@ runroot rpmbuild --quiet -bb \
           /data/SPECS/configtest.spec
 
 echo "foo" > "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 runroot rpm -e configtest
 test ! -f "${cf}"
@@ -102,7 +108,7 @@ runroot rpmbuild --quiet -bb \
        --define "filedata foo" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 runroot rpm -e configtest
 test ! -f "${cf}"
@@ -128,7 +134,7 @@ runroot rpmbuild --quiet -bb \
        --define "filedata foo" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${cf}"
 runroot rpm -e configtest
@@ -159,7 +165,7 @@ runroot rpmbuild --quiet -bb \
        --define "noreplace 1" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${cf}"
 runroot rpm -e configtest
@@ -192,9 +198,9 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -203,6 +209,34 @@ foo
 ],
 [])
 AT_CLEANUP
+
+# ------------------------------
+# (Build and) upgrade package with config file, no backup here
+AT_SETUP([upgrade unchanged config - touching test])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -Uvv --fsmdebug /build/RPMS/noarch/configtest-2.0-1.noarch.rpm > output.txt 2>&1
+grep -c  "touch" output.txt
+],
+[0],
+[1
+],
+[])
+AT_CLEANUP
 #
 # ------------------------------
 # Upgrade package with locally modified config file, unchanged in pkg
@@ -222,11 +256,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${cf}"
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -255,9 +289,9 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -285,11 +319,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${RPMTEST}"/etc/my.conf
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 cat "${cf}.rpmsave"
 ],
@@ -321,11 +355,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "foo-2.0" > "${RPMTEST}"/etc/my.conf
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -357,9 +391,9 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -389,11 +423,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${cf}"
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -423,9 +457,9 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -454,11 +488,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${RPMTEST}"/etc/my.conf
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 cat "${cf}.rpmnew"
 ],
@@ -491,11 +525,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "foo-2.0" > "${RPMTEST}"/etc/my.conf
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -529,12 +563,12 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 cat "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -567,14 +601,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${cf}"
 cat "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -607,12 +641,12 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 cat "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -644,14 +678,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${RPMTEST}"/etc/my.conf
 cat "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 cat "${cf}"
 cat "${cf}.rpmsave"
 ],
@@ -687,14 +721,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 cat "${cf}"
 echo "foo-2.0" > "${RPMTEST}"/etc/my.conf
 cat "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -729,14 +763,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${RPMTEST}"/etc/my.conf
 cat "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 cat "${cf}"
 cat "${cf}.rpmnew"
 ],
@@ -773,14 +807,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 cat "${cf}"
 echo "foo-2.0" > "${RPMTEST}"/etc/my.conf
 cat "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -815,18 +849,18 @@ done
 test ! -f "${cf}" && echo OK1
 echo "keaton" > "${cf}"
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 runroot rpm -e configtest
 cat "${cf}"
 rm -f "${cf}"
 
 # post-install config, upgrade, erase
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 test ! -f "${cf}" && echo OK2
 echo "buster" > "${cf}"
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 runroot rpm -e configtest
 cat "${cf}"
index 04053a1afb78f3bb0d3169bdc428f360786f84fd..5974cb932044b9d51723ba95b9f1b21463e40521 100644 (file)
@@ -19,7 +19,7 @@ runroot rpmbuild --quiet -bb \
           /data/SPECS/configtest.spec
 
 ln -s "otherstuff" "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 runroot rpm -e configtest
 readlink "${cf}.rpmorig"
@@ -50,7 +50,7 @@ runroot rpmbuild --quiet -bb \
 
 ln -s "foo" "${cf}"
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 runroot rpm -e configtest
 test ! -L "${cf}"
@@ -78,7 +78,7 @@ runroot rpmbuild --quiet -bb \
        --define "filetype link" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 runroot rpm -e configtest
 test ! -L "${cf}"
@@ -105,7 +105,7 @@ runroot rpmbuild --quiet -bb \
        --define "filetype link" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "otherstuff" "${cf}"
 runroot rpm -e configtest
@@ -138,9 +138,9 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -150,6 +150,35 @@ foo
 [])
 AT_CLEANUP
 
+#
+# (Build and) upgrade package with config link, no backup here
+AT_SETUP([upgrade unchanged config link - touching test])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -Uvv --fsmdebug /build/RPMS/noarch/configtest-2.0-1.noarch.rpm > output.txt 2>&1
+grep -c  "touch" output.txt
+],
+[0],
+[1
+],
+[])
+AT_CLEANUP
+
 #
 # ------------------------------
 # Upgrade package with modified config link, unchanged in pkg. No backup.
@@ -170,11 +199,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "otherstuff" "${cf}"
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -204,9 +233,9 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -235,11 +264,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "otherstuff" "${cf}"
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 readlink "${cf}.rpmsave"
 ],
@@ -272,11 +301,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "foo-2.0" "${cf}"
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -309,9 +338,9 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -342,11 +371,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "otherstuff" "${cf}"
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -377,9 +406,9 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -409,11 +438,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "otherstuff" "${cf}"
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 readlink "${cf}.rpmnew"
 ],
@@ -447,11 +476,11 @@ for v in "1.0" "2.0"; do
           /data/SPECS/configtest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "foo-2.0" "${cf}"
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 test ! -L "${cf}.rpmnew"
 ],
@@ -487,12 +516,12 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 readlink "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -526,14 +555,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "otherstuff" "${cf}"
 readlink "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -567,12 +596,12 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 readlink "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -605,14 +634,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "otherstuff" "${cf}"
 readlink "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 readlink "${cf}"
 readlink "${cf}.rpmsave"
 ],
@@ -649,14 +678,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "foo-2.0" "${cf}"
 readlink "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 readlink "${cf}"
 ],
 [0],
@@ -692,14 +721,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "otherstuff" "${cf}"
 readlink "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 readlink "${cf}"
 readlink "${cf}.rpmnew"
 ],
@@ -737,14 +766,14 @@ for s in "A" "B"; do
 done
 
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "foo-2.0" "${cf}"
 readlink "${cf}"
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
 readlink "${cf}"
 test ! -L "${cf}.rpmnew"
 ],
index 5a32c0c3474f65ad0a5f269d3e8dfb042a4044f3..db2e44e17fb8338056946f67d96c3bf4d1baa59a 100644 (file)
@@ -25,11 +25,11 @@ runroot rpmbuild --quiet -bb \
        --define "noconfig 1" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
-runroot rpm -U --oldpackage "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -63,14 +63,14 @@ runroot rpmbuild --quiet -bb \
        --define "noconfig 1" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${cf}"
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 cat "${cf}.rpmsave"
-runroot rpm -U --oldpackage "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -107,13 +107,13 @@ runroot rpmbuild --quiet -bb \
        --define "noconfig 1" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "bar" > "${cf}"
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
-runroot rpm -U --oldpackage "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -147,11 +147,11 @@ runroot rpmbuild --quiet -bb \
        --define "filedata bar" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
-runroot rpm -U --oldpackage "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 ],
 [0],
@@ -184,11 +184,11 @@ runroot rpmbuild --quiet -bb \
        --define "filedata bar" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${cf}"
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 readlink "${cf}"
 cat "${cf}.rpmsave"
 ],
@@ -224,11 +224,11 @@ runroot rpmbuild --quiet -bb \
        --define "filedata bar" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 readlink "${cf}"
 ln -sf "otherstuff" "${cf}"
 readlink "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 cat "${cf}"
 readlink "${cf}.rpmsave"
 ],
@@ -263,9 +263,9 @@ runroot rpmbuild --quiet -bb \
        --define "filetype dir" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 test -d "${cf}"
 ],
 [0],
@@ -295,11 +295,11 @@ runroot rpmbuild --quiet -bb \
        --define "filetype dir" \
           /data/SPECS/configtest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
 cat "${cf}"
 echo "otherstuff" > "${cf}"
 cat "${cf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/configtest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
 test -d "${cf}"
 cat "${cf}.rpmsave"
 ],
index 90d077d6194a56465e533e8097bb5c53abd9bb33..ba6b41aab9c668619182c7a6633a8a01206f347e 100644 (file)
@@ -1,6 +1,6 @@
 #    rpmconflict.at: rpm file conflict tests
 
-AT_BANNER([RPM file conflicts])
+AT_BANNER([RPM implicit file conflicts])
 
 # ------------------------------
 # (Build and) install conflicting package (should fail)
@@ -18,8 +18,8 @@ for p in "one" "two"; do
           /data/SPECS/conflicttest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/conflictone-1.0-1.noarch.rpm
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
 ],
 [1],
 [ignore],
@@ -35,8 +35,8 @@ RPMDB_CLEAR
 RPMDB_INIT
 
 runroot rpm -U \
-  "${TOPDIR}"/RPMS/noarch/conflictone-1.0-1.noarch.rpm \
-  "${TOPDIR}"/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+  /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
 ],
 [2],
 [ignore],
@@ -59,8 +59,8 @@ for p in "one" "two"; do
           /data/SPECS/conflicttest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/conflictone-1.0-1.noarch.rpm
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
 ],
 [0],
 [ignore],
@@ -76,8 +76,8 @@ RPMDB_CLEAR
 RPMDB_INIT
 
 runroot rpm -U \
-  "${TOPDIR}"/RPMS/noarch/conflictone-1.0-1.noarch.rpm \
-  "${TOPDIR}"/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+  /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
 ],
 [0],
 [ignore],
@@ -95,7 +95,7 @@ rm -rf "${TOPDIR}"
 
 runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
 rm -rf "${RPMTEST}"/opt/mydir
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
 ],
 [0],
 [],
@@ -115,7 +115,7 @@ runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
 rm -rf "${RPMTEST}"/opt/mydir
 mkdir -p "${RPMTEST}"/opt/mydir/one
 ln -s one "${RPMTEST}"/opt/mydir/two
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
 ],
 [1],
 [],
@@ -288,7 +288,7 @@ runroot rpm -U --ignoreos --ignorearch --nodeps \
   --define "_transaction_color 3" \
   --define "_prefer_color 2" \
   /data/RPMS/hello-2.0-1.x86_64.rpm \
-  "${TOPDIR}"/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
 ],
 [2],
 [],
@@ -313,7 +313,7 @@ runroot rpm -U --ignoreos --ignorearch --nodeps \
 runroot rpm -U --ignoreos --ignorearch --nodeps \
   --define "_transaction_color 3" \
   --define "_prefer_color 2" \
-  "${TOPDIR}"/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
 ],
 [1],
 [],
@@ -333,7 +333,7 @@ runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
 runroot rpm -U --ignoreos --ignorearch --nodeps \
   --define "_transaction_color 3" \
   --define "_prefer_color 2" \
-  "${TOPDIR}"/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
 
 runroot rpm -U --ignoreos --ignorearch --nodeps \
   --define "_transaction_color 3" \
@@ -361,8 +361,8 @@ runroot rpmbuild --quiet -bb \
 runroot rpmbuild --quiet -bb \
     --define "rel 2" --with symlink /data/SPECS/symlinktest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/symlinktest-1.0-1.noarch.rpm
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/symlinktest-1.0-2.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-2.noarch.rpm
 ],
 [2],
 [],
@@ -385,8 +385,8 @@ runroot rpmbuild --quiet -bb \
 runroot rpmbuild --quiet -bb \
     --define "rel 2" --without symlink /data/SPECS/symlinktest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/symlinktest-1.0-1.noarch.rpm
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/symlinktest-1.0-2.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-2.noarch.rpm
 ],
 [2],
 [],
@@ -414,8 +414,8 @@ runroot rpmbuild --quiet -bb \
 
 test ! -f "${fn}" && echo OK
 runroot rpm -U \
-    "${TOPDIR}"/RPMS/noarch/conflictone-1.0-1.noarch.rpm \
-    "${TOPDIR}"/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+    /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
 cat "${fn}"
 runroot rpm -e conflicttwo
 cat "${fn}"
index 5b10ac67a49f467906878ec1cbcd8898ec744ed8..e1893c7cd78b08e776668e9ac3ecb3d1f5d21e77 100644 (file)
@@ -103,7 +103,7 @@ AT_CLEANUP
 
 # ------------------------------
 # reinstall a noarch package (with no files)
-AT_SETUP([rpm -U --replacepkgs])
+AT_SETUP([rpm -U --replacepkgs 1])
 AT_KEYWORDS([rpmdb install])
 
 AT_CHECK([
@@ -123,6 +123,49 @@ runroot rpm -i "${tpkg}" &&
 
 AT_CLEANUP
 
+# ------------------------------
+# reinstall a package with different file policies
+AT_SETUP([rpm -U --replacepkgs 2])
+AT_KEYWORDS([rpmdb install])
+
+AT_CHECK([
+AT_XFAIL_IF([test $RPM_XFAIL -ne 0])
+RPMDB_CLEAR
+RPMDB_INIT
+
+tpkg="/data/RPMS/hello-2.0-1.i686.rpm"
+
+runroot rpm -U --nodeps --ignorearch "${tpkg}" && 
+  runroot rpm -U --nodeps --ignorearch --nodocs --replacepkgs "${tpkg}" &&
+  runroot rpm -e hello
+test -d "${RPMTEST}"/usr/share/doc/hello-2.0
+],
+[1],
+[],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# reinstall a package with different file policies
+AT_SETUP([rpm --reinstall 1])
+AT_KEYWORDS([rpmdb install])
+
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+tpkg="/data/RPMS/hello-2.0-1.i686.rpm"
+
+runroot rpm -U --nodeps --ignorearch "${tpkg}" && 
+  runroot rpm --reinstall --nodeps --ignorearch --nodocs "${tpkg}" &&
+  runroot rpm -e hello
+test -d "${RPMTEST}"/usr/share/doc/hello-2.0
+],
+[1],
+[],
+[])
+AT_CLEANUP
+
 # ------------------------------
 # install a package into a local rpmdb
 # * Shall only work with relocation
@@ -162,6 +205,44 @@ runroot rpm -i \
 
 AT_CLEANUP
 
+AT_SETUP([rpmdb --rebuilddb])
+AT_KEYWORDS([rpmdb])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+runroot rpm -U --noscripts --nodeps --ignorearch \
+  /data/RPMS/hello-1.0-1.i386.rpm
+runroot rpm -qa --qf "%{nevra} %{dbinstance}\n"
+runroot rpm -U --noscripts --nodeps --ignorearch \
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -qa --qf "%{nevra} %{dbinstance}\n"
+runroot rpmdb --rebuilddb
+runroot rpm -qa --qf "%{nevra} %{dbinstance}\n"
+],
+[],
+[hello-1.0-1.i386 1
+hello-2.0-1.i686 2
+hello-2.0-1.i686 1
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Attempt to initialize, rebuild and verify a db
+AT_SETUP([rpmdb --rebuilddb and verify empty database])
+AT_KEYWORDS([rpmdb])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+runroot rpmdb --rebuilddb
+runroot rpmdb --verifydb
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
 # ------------------------------
 # Install and verify status
 AT_SETUP([rpm -U and verify status])
@@ -176,7 +257,7 @@ runroot rpmbuild --quiet -bb \
        --define "filedata same_stuff" \
           /data/SPECS/conflicttest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/conflictstatus-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/conflictstatus-1.0-1.noarch.rpm
 runroot rpm -qls conflictstatus
 ],
 [0],
@@ -197,11 +278,12 @@ rm -rf "${TOPDIR}"
 runroot rpmbuild --quiet -bb \
           /data/SPECS/flangtest.spec
 
-runroot rpm -U --define "_install_langs de:fi" "${TOPDIR}"/RPMS/noarch/flangtest-1.0-1.noarch.rpm
+runroot rpm -U --define "_install_langs de:fi" /build/RPMS/noarch/flangtest-1.0-1.noarch.rpm
 runroot rpm -qls flangtest
 ],
 [0],
 [normal        /usr/share/flangtest/de.txt
+normal        /usr/share/flangtest/empty.txt
 not installed /usr/share/flangtest/en.txt
 normal        /usr/share/flangtest/fi.txt
 normal        /usr/share/flangtest/none.txt
@@ -221,7 +303,7 @@ rm -rf "${TOPDIR}"
 rm -rf "${RPMTEST}"/opt/*
 
 runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
 find "${RPMTEST}"/opt | wc -l
 ],
 [0],
@@ -242,7 +324,7 @@ rm -rf "${TOPDIR}"
 rm -rf "${RPMTEST}"/opt/*
 
 runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
 runroot rpm -e selfconflict
 find "${RPMTEST}"/opt | wc -l
 ],
index 5e828c273c0e3effb46e088e25f63f27ffebdfb7..c7f3f91f4498fafa44bf04d43699ee1b0e5217bd 100644 (file)
@@ -16,7 +16,7 @@ runroot rpmbuild --quiet -bb \
        --define "reqs deptest-two" \
          /data/SPECS/deptest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
 ],
 [1],
 [],
@@ -44,7 +44,7 @@ runroot rpmbuild --quiet -bb \
        --define "reqs deptest-one" \
          /data/SPECS/deptest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm "${TOPDIR}"/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
 ],
 [0],
 [],
@@ -70,7 +70,7 @@ runroot rpmbuild --quiet -bb \
        --define "provs deptest-foo = 1.0" \
          /data/SPECS/deptest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm "${TOPDIR}"/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
 ],
 [2],
 [],
@@ -98,7 +98,7 @@ runroot rpmbuild --quiet -bb \
        --define "provs deptest-foo = 2.0" \
          /data/SPECS/deptest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm "${TOPDIR}"/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
 ],
 [0],
 [],
@@ -123,7 +123,7 @@ runroot rpmbuild --quiet -bb \
        --define "pkg two" \
          /data/SPECS/deptest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm "${TOPDIR}"/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
 ],
 [2],
 [],
@@ -150,8 +150,8 @@ runroot rpmbuild --quiet -bb \
        --define "pkg two" \
          /data/SPECS/deptest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
 ],
 [1],
 [],
@@ -159,6 +159,66 @@ runroot rpm -U "${TOPDIR}"/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
        deptest-two < 2.0 conflicts with (installed) deptest-one-1.0-1.noarch
 ])
 AT_CLEANUP
+
+AT_SETUP([install and verify self-conflicting package])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "provs something" \
+       --define "cfls something" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -V --nofiles deptest-one
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+# explicit file conflicts
+AT_SETUP([explicit file conflicts])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "cfls /opt/bar" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U --test \
+       /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm \
+       /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -e deptest-one
+# XXX FIXME: rpm's problem message for this case is higly bogus.
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -e deptest-two
+],
+[],
+[],
+[error: Failed dependencies:
+       /opt/bar conflicts with deptest-one-1.0-1.noarch
+error: Failed dependencies:
+       /opt/bar conflicts with (installed) deptest-one-1.0-1.noarch
+error: Failed dependencies:
+       /opt/bar conflicts with deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
 # ------------------------------
 # 
 AT_SETUP([erase to break dependencies])
@@ -178,7 +238,7 @@ runroot rpmbuild --quiet -bb \
        --define "provs deptest-foo = 2.0" \
          /data/SPECS/deptest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm "${TOPDIR}"/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
 runroot rpm -e deptest-two
 ],
 [1],
@@ -206,7 +266,7 @@ runroot rpm -U --ignoreos --ignorearch --nodeps \
        --define "_prefer_color 2" \
        /data/RPMS/hello-2.0-1.i686.rpm \
        /data/RPMS/hello-2.0-1.x86_64.rpm \
-       "${TOPDIR}"/RPMS/noarch/deptest-hello-1.0-1.noarch.rpm
+       /build/RPMS/noarch/deptest-hello-1.0-1.noarch.rpm
 
 runroot rpm -e hello.x86_64
 ],
@@ -235,7 +295,7 @@ runroot rpm -U --ignoreos --ignorearch --nodeps \
        --define "_prefer_color 2" \
        /data/RPMS/hello-2.0-1.i686.rpm \
        /data/RPMS/hello-2.0-1.x86_64.rpm \
-       "${TOPDIR}"/RPMS/noarch/deptest-hello-1.0-1.noarch.rpm
+       /build/RPMS/noarch/deptest-hello-1.0-1.noarch.rpm
 
 runroot rpm -e hello.i686
 ],
@@ -243,3 +303,654 @@ runroot rpm -e hello.i686
 [],
 [])
 AT_CLEANUP
+
+# ------------------------------
+#
+AT_SETUP([unsatisfied WITH require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two with flavor = dekstop)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = server" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+       --define "provs flavor = desktop" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+],
+[3],
+[],
+[error: Failed dependencies:
+       (deptest-two with flavor = dekstop) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([unsatisfied WITH require (rpmdb)])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two with flavor = dekstop)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = server" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+       --define "provs flavor = desktop" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+],
+[1],
+[],
+[error: Failed dependencies:
+       (deptest-two with flavor = dekstop) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([satisfied WITH require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two with flavor = desktop)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = desktop" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([satisfied WITH require (rpmdb)])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two with flavor = desktop)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = desktop" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+# ------------------------------
+#
+AT_SETUP([unsatisfied WITHOUT require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two without flavor)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = server" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+],
+[2],
+[],
+[error: Failed dependencies:
+       (deptest-two without flavor) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([unsatisfied WITHOUT require (rpmdb)])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two without flavor)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = server" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+],
+[1],
+[],
+[error: Failed dependencies:
+       (deptest-two without flavor) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([satisfied WITHOUT require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two without flavor)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([satisfied WITHOUT require (rpmdb)])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two without flavor)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+# ------------------------------
+#
+AT_SETUP([unsatisfied AND require - all missing])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+],
+[1],
+[],
+[error: Failed dependencies:
+       (deptest-two and deptest-three) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([unsatisfied AND require - first is missing])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+],
+[2],
+[],
+[error: Failed dependencies:
+       (deptest-two and deptest-three) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([unsatisfied AND require - second is missing])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+],
+[2],
+[],
+[error: Failed dependencies:
+       (deptest-two and deptest-three) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([satisfied AND require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+# ------------------------------
+#
+AT_SETUP([unsatisfied OR require - all missing])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two or deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+],
+[1],
+[],
+[error: Failed dependencies:
+       (deptest-two or deptest-three) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([satisfied OR require - first is missing])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two or deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([satisfied OR require - second is missing])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two or deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([satisfied OR require - both present])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two or deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+# ------------------------------
+#
+AT_SETUP([unsatisfied IF require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+],
+[2],
+[],
+[error: Failed dependencies:
+       (deptest-two if deptest-three) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([satisfied IF require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([unsatisfied IF-ELSE require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three else deptest-four)" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+],
+[1],
+[],
+[error: Failed dependencies:
+       (deptest-two if deptest-three else deptest-four) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([satisfied IF-ELSE require - right clause])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three else deptest-four)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg four" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-four-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([satisfied IF-ELSE require - left clause])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three else deptest-four)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+# ------------------------------
+#
+AT_SETUP([unsatisfied nested AND-OR require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and (deptest-three or deptest-four))" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+],
+[2],
+[],
+[error: Failed dependencies:
+       (deptest-two and (deptest-three or deptest-four)) is needed by deptest-one-1.0-1.noarch
+])
+AT_CLEANUP
+
+AT_SETUP([satisfied nested AND-OR require])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and (deptest-three or deptest-four))" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+# ------------------------------
+#
+AT_SETUP([satisfied nested AND-IF require - without right clause])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and (deptest-three if deptest-four))" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([satisfied nested AND-IF require - with right clause])
+AT_KEYWORDS([install, boolean])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and (deptest-three if deptest-four))" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg four" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-four-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
index eb0d86dda04f22ceb491251ad18ffb6b76358787..509277f2c1ad97793a20783a46220bc21cb3278f 100644 (file)
@@ -62,7 +62,6 @@ CHANGELOGNAME
 CHANGELOGTEXT
 CHANGELOGTIME
 CLASSDICT
-COLLECTIONS
 CONFLICTFLAGS
 CONFLICTNAME
 CONFLICTNEVRS
@@ -79,10 +78,12 @@ DISTTAG
 DISTURL
 DSAHEADER
 E
+ENCODING
+ENHANCEFLAGS
+ENHANCENAME
+ENHANCENEVRS
 ENHANCES
-ENHANCESFLAGS
-ENHANCESNAME
-ENHANCESVERSION
+ENHANCEVERSION
 EPOCH
 EPOCHNUM
 EVR
@@ -112,8 +113,20 @@ FILENLINKS
 FILEPROVIDE
 FILERDEVS
 FILEREQUIRE
+FILESIGNATURELENGTH
+FILESIGNATURES
 FILESIZES
 FILESTATES
+FILETRIGGERCONDS
+FILETRIGGERFLAGS
+FILETRIGGERINDEX
+FILETRIGGERNAME
+FILETRIGGERPRIORITIES
+FILETRIGGERSCRIPTFLAGS
+FILETRIGGERSCRIPTPROG
+FILETRIGGERSCRIPTS
+FILETRIGGERTYPE
+FILETRIGGERVERSION
 FILEUSERNAME
 FILEVERIFYFLAGS
 FSCONTEXTS
@@ -151,7 +164,15 @@ OBSOLETENAME
 OBSOLETENEVRS
 OBSOLETES
 OBSOLETEVERSION
+OLDENHANCES
+OLDENHANCESFLAGS
+OLDENHANCESNAME
+OLDENHANCESVERSION
 OLDFILENAMES
+OLDSUGGESTS
+OLDSUGGESTSFLAGS
+OLDSUGGESTSNAME
+OLDSUGGESTSVERSION
 OPTFLAGS
 ORDERFLAGS
 ORDERNAME
@@ -168,6 +189,8 @@ PATCHESFLAGS
 PATCHESNAME
 PATCHESVERSION
 PAYLOADCOMPRESSOR
+PAYLOADDIGEST
+PAYLOADDIGESTALGO
 PAYLOADFLAGS
 PAYLOADFORMAT
 PKGID
@@ -203,6 +226,11 @@ PROVIDES
 PROVIDEVERSION
 PUBKEYS
 R
+RECOMMENDFLAGS
+RECOMMENDNAME
+RECOMMENDNEVRS
+RECOMMENDS
+RECOMMENDVERSION
 RECONTEXTS
 RELEASE
 REMOVETID
@@ -214,6 +242,7 @@ REQUIREVERSION
 RPMVERSION
 RSAHEADER
 SHA1HEADER
+SHA256HEADER
 SIGGPG
 SIGMD5
 SIGPGP
@@ -223,11 +252,27 @@ SOURCE
 SOURCEPACKAGE
 SOURCEPKGID
 SOURCERPM
+SUGGESTFLAGS
+SUGGESTNAME
+SUGGESTNEVRS
 SUGGESTS
-SUGGESTSFLAGS
-SUGGESTSNAME
-SUGGESTSVERSION
+SUGGESTVERSION
 SUMMARY
+SUPPLEMENTFLAGS
+SUPPLEMENTNAME
+SUPPLEMENTNEVRS
+SUPPLEMENTS
+SUPPLEMENTVERSION
+TRANSFILETRIGGERCONDS
+TRANSFILETRIGGERFLAGS
+TRANSFILETRIGGERINDEX
+TRANSFILETRIGGERNAME
+TRANSFILETRIGGERPRIORITIES
+TRANSFILETRIGGERSCRIPTFLAGS
+TRANSFILETRIGGERSCRIPTPROG
+TRANSFILETRIGGERSCRIPTS
+TRANSFILETRIGGERTYPE
+TRANSFILETRIGGERVERSION
 TRIGGERCONDS
 TRIGGERFLAGS
 TRIGGERINDEX
index 04491c8416ea2e259f3d69042832f28057f2c328..8357a8cb326813a09c416a2cb9c4d3f270d9b80b 100644 (file)
 
 AT_BANNER([RPM install tests])
 
+AT_SETUP([rpm -U <manifest>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+echo /data/RPMS/hello-2.0-1.x86_64.rpm > ${RPMTEST}/tmp/test.mft
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/test.mft
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([rpm -U <manifest notfound 1>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+echo /data/RPMS/hello-2.0-1.x86_64.rpm > ${RPMTEST}/tmp/test.mft
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/test-not-there.mft
+],
+[1],
+[],
+[error: open of /tmp/test-not-there.mft failed: No such file or directory
+])
+AT_CLEANUP
+
+AT_SETUP([rpm -U <manifest notfound 2>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+echo /data/RPMS/hello-not-there-2.0-1.x86_64.rpm > ${RPMTEST}/tmp/test.mft
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/test.mft
+],
+[1],
+[],
+[error: open of /data/RPMS/hello-not-there-2.0-1.x86_64.rpm failed: No such file or directory
+])
+AT_CLEANUP
+
+AT_SETUP([rpm -U <notfound>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /data/RPMS/hello-not-there-2.0-1.x86_64.rpm
+],
+[1],
+[],
+[error: open of /data/RPMS/hello-not-there-2.0-1.x86_64.rpm failed: No such file or directory
+])
+AT_CLEANUP
+
+AT_SETUP([rpm -U <unsigned>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /data/RPMS/hello-2.0-1.x86_64.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([rpm -U <signed nokey>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+],
+[0],
+[],
+[warning: /data/RPMS/hello-2.0-1.x86_64-signed.rpm: Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+])
+AT_CLEANUP
+
+AT_SETUP([rpm -U <signed>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([rpm -U <corrupted signed 1>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=264 count=2 2> /dev/null
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/${pkg}
+],
+[1],
+[],
+[error: /tmp/hello-2.0-1.x86_64-signed.rpm: Header signature: BAD (package tag 268: invalid OpenPGP signature)
+error: /tmp/hello-2.0-1.x86_64-signed.rpm cannot be installed
+])
+AT_CLEANUP
+
+AT_SETUP([rpm -U <corrupted signed 2>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=5555 count=6 2> /dev/null
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/${pkg}
+],
+[1],
+[],
+[error: /tmp/hello-2.0-1.x86_64-signed.rpm: Header V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+error: /tmp/hello-2.0-1.x86_64-signed.rpm: Header SHA1 digest: BAD (Expected 5cd9874c510b67b44483f9e382a1649ef7743bac != 4261b2c1eb861a4152c2239bce20bfbcaa8971ba)
+error: /tmp/hello-2.0-1.x86_64-signed.rpm: Header SHA256 digest: BAD (Expected ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9 != 29fdfe92782fb0470a9a164a6c94af87d3b138c63b39d4c30e0223ca1202ba82)
+error: /tmp/hello-2.0-1.x86_64-signed.rpm cannot be installed
+])
+AT_CLEANUP
+
+# This is more about documenting current behavior than what it *should* do
+# when encountering corrupted payload.
+AT_SETUP([rpm -U <corrupted signed 3>])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=7788 count=6 2> /dev/null
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/${pkg}
+],
+[1],
+[],
+[warning: /tmp/hello-2.0-1.x86_64-signed.rpm: Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+error: unpacking of archive failed: cpio: Bad magic
+error: hello-2.0-1.x86_64: install failed
+])
+AT_CLEANUP
+
 # ------------------------------
 # Check if rpm -U *.src.rpm works
 AT_SETUP([rpm -U *.src.rpm])
@@ -111,8 +285,8 @@ for v in "1.0" "2.0"; do
           /data/SPECS/versiontest.spec
 done
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/versiontest-1.0-1.noarch.rpm
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
 runroot rpm -q versiontest
 ],
 [0],
@@ -127,8 +301,8 @@ AT_CHECK([
 RPMDB_CLEAR
 RPMDB_INIT
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/versiontest-2.0-1.noarch.rpm
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
 ],
 [2],
 [],
@@ -142,8 +316,8 @@ AT_CHECK([
 RPMDB_CLEAR
 RPMDB_INIT
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/versiontest-2.0-1.noarch.rpm
-runroot rpm -U --oldpackage "${TOPDIR}"/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
 runroot rpm -q versiontest
 ],
 [0],
@@ -159,8 +333,8 @@ RPMDB_CLEAR
 RPMDB_INIT
 
 runroot rpm -Uv \
-  "${TOPDIR}"/RPMS/noarch/versiontest-1.0-1.noarch.rpm \
-  "${TOPDIR}"/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
 runroot rpm -q versiontest
 ],
 [0],
@@ -179,8 +353,8 @@ RPMDB_CLEAR
 RPMDB_INIT
 
 runroot rpm -Uv \
-  "${TOPDIR}"/RPMS/noarch/versiontest-2.0-1.noarch.rpm \
-  "${TOPDIR}"/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+  /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm \
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
 runroot rpm -q versiontest
 ],
 [0],
@@ -208,8 +382,8 @@ runroot rpmbuild --quiet -bb \
 
 
 runroot rpm -Uv \
-  "${TOPDIR}"/RPMS/noarch/deptest-two-1.0-1.noarch.rpm \
-  "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+  /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
 runroot rpm -q deptest-one
 ],
 [0],
@@ -237,8 +411,8 @@ runroot rpmbuild --quiet -bb \
 
 
 runroot rpm -Uv \
-  "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm \
-  "${TOPDIR}"/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+  /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
 runroot rpm -q deptest-one
 ],
 [0],
@@ -257,8 +431,8 @@ RPMDB_CLEAR
 RPMDB_INIT
 
 runroot rpm -i \
-  "${TOPDIR}"/RPMS/noarch/versiontest-1.0-1.noarch.rpm \
-  "${TOPDIR}"/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
 runroot rpm -q versiontest
 ],
 [0],
@@ -276,8 +450,8 @@ RPMDB_CLEAR
 RPMDB_INIT
 
 runroot rpm -i \
-  "${TOPDIR}"/RPMS/noarch/versiontest-1.0-1.noarch.rpm \
-  "${TOPDIR}"/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
 runroot rpm -q versiontest
 ],
 [0],
@@ -297,7 +471,7 @@ RPMDB_INIT
 runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
 
 runroot rpm -U --test --ignoreos --relocate /usr=/opt \
-  "${TOPDIR}"/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
 ],
 [1],
 [],
@@ -314,9 +488,44 @@ RPMDB_INIT
 runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
 
 runroot rpm -U --test --ignoreos --badreloc --relocate /usr=/opt \
-  "${TOPDIR}"/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+AT_SETUP([rpm -i with/without --excludedocs])
+AT_KEYWORDS([install excludedocs])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+runroot rpmbuild --quiet -bb /data/SPECS/testdoc.spec
+
+runroot rpm -i --excludedocs \
+  /build/RPMS/noarch/testdoc-1.0-1.noarch.rpm
+
+RPM_DOCDIR=$(runroot rpm --eval '%_defaultdocdir')
+RPM_DATADIR=$(runroot rpm --eval '%_datadir')
+
+test ! -e ${RPMTEST}${RPM_DOCDIR}/testdoc || exit 1
+test -e ${RPMTEST}${RPM_DATADIR}/testdoc/nodoc || exit 1
+
+runroot rpm -e testdoc
+
+runroot rpm -i \
+  /build/RPMS/noarch/testdoc-1.0-1.noarch.rpm
+test -e ${RPMTEST}${RPM_DOCDIR}/testdoc/documentation1 || exit 1
+test -e ${RPMTEST}${RPM_DOCDIR}/testdoc/documentation2 || exit 1
+test -e ${RPMTEST}${RPM_DOCDIR}/testdoc/examples/example1 || exit 1
+test -e ${RPMTEST}${RPM_DOCDIR}/testdoc/examples/example2 || exit 1
+test -e ${RPMTEST}${RPM_DATADIR}/testdoc/nodoc || exit 1
+
+runroot rpm -e testdoc
 ],
 [0],
 [],
 [])
 AT_CLEANUP
+
diff --git a/tests/rpmio.at b/tests/rpmio.at
new file mode 100644 (file)
index 0000000..46d713b
--- /dev/null
@@ -0,0 +1,50 @@
+#    rpmio.at: Misc (librpm)io tests
+
+AT_BANNER([I/O])
+
+# test too unstable for production
+#AT_SETUP([SIGPIPE from --pipe])
+#AT_KEYWORDS([signals])
+#AT_CHECK([
+#RPMDB_CLEAR
+#RPMDB_INIT
+#
+#runroot rpmbuild --quiet --with manyfiles -bb /data/SPECS/sigpipe.spec
+#runroot rpm -qpl /build/RPMS/noarch/sigpipe-1.0-1.noarch.rpm --pipe "cat" | head -1
+#],
+#[0],
+#[/opt/sigpipe/data
+#],
+#[])
+#AT_CLEANUP
+
+AT_SETUP([SIGPIPE from install scriptlet])
+AT_KEYWORDS([signals])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+runroot rpmbuild --quiet -bb /data/SPECS/sigpipe.spec
+runroot rpm -U --nodeps /build/RPMS/noarch/sigpipe-1.0-1.noarch.rpm
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
+# XXX TODO: test for RhBug:471591 too, but needs a simpler reproducer
+
+# test too unstable for production
+#AT_SETUP([SIGPIPE in build scriptlet])
+#AT_KEYWORDS([signals])
+#AT_CHECK([
+#RPMDB_CLEAR
+#RPMDB_INIT
+#
+#run rpmbuild --quiet --with buildpipe -bb "${RPMDATA}/SPECS/sigpipe.spec"
+#],
+#[0],
+#[],
+#[])
+#AT_CLEANUP
+
index 50545a17af9c21c3c49538caae4a19a8c74f4763..6352a28bca33a3c1b78312324b5b345f185d77e3 100644 (file)
@@ -13,6 +13,45 @@ runroot rpm --define "this that" --eval '%{this}'
 ])
 AT_CLEANUP
 
+# ------------------------------
+AT_SETUP([invalid rpm --eval])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm --eval '%define _ that'
+],
+[1],
+[],
+[error: Macro %_ has illegal name (%define)
+])
+AT_CLEANUP
+
+# ------------------------------
+AT_SETUP([invalid rpm --define])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm --define "_ that"
+],
+[1],
+[],
+[error: Macro %_ has illegal name (%define)
+])
+AT_CLEANUP
+
+AT_SETUP([rpm --undefine])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm --define "this that" --eval '1. %{this}' --undefine 'this' --eval '2. %{this'}
+runroot rpm --eval '1. %{this}' --define "this that" --eval '2. %{this}' --undefine 'this' --eval '3. %{this'}
+],
+[0],
+[1. that
+2. %{this}
+1. %{this}
+2. that
+3. %{this}
+])
+AT_CLEANUP
+
 AT_SETUP([simple true conditional rpm --eval])
 AT_KEYWORDS([macros])
 AT_CHECK([
@@ -33,6 +72,121 @@ runroot rpm --define "this that" --eval '%{?that}'
 ])
 AT_CLEANUP
 
+AT_SETUP([nested macro in name])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm --define "this that" --define "that_that foo" --eval '%{expand:%{%{this}_that}}'
+],
+[0],
+[foo
+])
+AT_CLEANUP
+
+AT_SETUP([parametrized macro 1])
+AT_KEYWORDS([macros])
+AT_CHECK([
+cat << EOF > ${abs_builddir}/testing/mtest
+%bar() bar
+%foo()\\
+%bar\\
+foo 1\\
+%{bar}\\
+foo 2\\
+%bar x\\
+foo 3\\
+%{bar x}\\
+foo 4\\
+%bar \\
+foo 5
+EOF
+
+runroot rpm --eval '%{load:mtest}%{foo}'
+],
+[0],
+[
+bar
+foo 1
+bar
+foo 2
+bar
+foo 3
+bar
+foo 4
+bar
+foo 5
+],
+[])
+AT_CLEANUP
+
+AT_SETUP([parametrized macro 2])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm \
+    --define '%bar() "Bar %#: %{?1} %{?2}"' \
+    --define '%foo() "Foo %#: %{?1} %{?2}" %bar a' \
+    --eval '%foo 1 2'
+],
+[0],
+["Foo 2: 1 2" "Bar 1: a "
+])
+AT_CLEANUP
+
+AT_SETUP([parametrized macro 3])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm \
+    --define '%foo() 1:%1 2:%2' \
+    --eval '%foo %nil bar'
+],
+[0],
+[1:bar 2:%2
+])
+AT_CLEANUP
+
+AT_SETUP([parametrized macro 4])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm \
+    --define '%bar yyy' \
+    --define '%foo() %1' \
+    --eval '%foo %bar' \
+    --eval '%foo %%bar'
+],
+[0],
+[yyy
+%bar
+])
+AT_CLEANUP
+
+AT_SETUP([parametrized macro 5])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm \
+    --define '%foo() %#:%{?1:"%1"}%{?2: "%2"}' \
+    --define 'bar zzz' \
+    --eval '%foo 1' \
+    --eval '%foo   2  ' \
+    --eval '%foo 1 2' \
+    --eval '%foo %{nil}' \
+    --eval '%foo %{nil} xx' \
+    --eval '%foo %{bar} xx' \
+    --eval '%foo %{quote:   2 3  5} %{quote:%{nil}}' \
+    --eval '%foo x%{quote:y}z 123' \
+    --eval '%foo x%{quote:%{nil}}z' \
+],
+[0],
+[1:"1"
+1:"2"
+2:"1" "2"
+0:
+1:"xx"
+2:"zzz" "xx"
+2:"   2 3  5" ""
+2:"xyz" "123"
+1:"xz"
+])
+AT_CLEANUP
+
 AT_SETUP([uncompress macro])
 AT_KEYWORDS([macros])
 AT_CHECK([
@@ -56,6 +210,17 @@ runroot rpm \
 ])
 AT_CLEANUP
 
+AT_SETUP([shrink macro])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm \
+    --eval "%{shrink:  h e  l   lo  }"
+],
+[0],
+[h e l lo
+])
+AT_CLEANUP
+
 AT_SETUP([suffix macro])
 AT_KEYWORDS([macros])
 AT_CHECK([
@@ -126,9 +291,133 @@ AT_CHECK([
 runroot rpm \
   --eval '%{lua: os.exit()}))}'
 ],
+[1],
+[],
+[error: lua script failed: [[string "<lua>"]]:1: exit not permitted in this context]
+)
+AT_CLEANUP
+
+AT_SETUP([%define + %undefine in nested levels 1])
+AT_KEYWORDS([macros define undefine])
+AT_CHECK([
+# basic %define in nested scoping level
+runroot rpm \
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand:%undefine xxx} %{echo:%xxx}' \
+    --eval .'%foo'.
+],
+[0],
+[1
+%xxx
+.   .
+])
+AT_CLEANUP
+
+AT_SETUP([%define + %undefine in nested levels 2])
+AT_KEYWORDS([macros define])
+AT_CHECK([
+# %define macro once in a nested scope
+runroot rpm \
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx}' \
+    --eval .'%foo'. \
+    --eval '%xxx'
+],
+[0],
+[1
+. .
+%xxx
+])
+AT_CLEANUP
+
+AT_SETUP([%define + %undefine in nested levels 3])
+AT_KEYWORDS([macros define])
+AT_CHECK([
+AT_XFAIL_IF([test $RPM_XFAIL -ne 0])
+# %define macro twice in a nested scope
+runroot rpm \
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %define xxx 2} %{echo:%xxx}' \
+    --eval .'%foo'. \
+    --eval '%xxx'
+],
+[0],
+[1
+2
+.    .
+%xxx
+])
+AT_CLEANUP
+
+AT_SETUP([%define + %undefine in nested levels 4])
+AT_KEYWORDS([macros define global])
+AT_CHECK([
+AT_XFAIL_IF([test $RPM_XFAIL -ne 0])
+# %define in a nested level covered by %global
+runroot rpm \
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %global xxx 2} %{echo:%xxx}' \
+    --eval .'%foo'. \
+    --eval '%xxx' \
+    --eval .'%undefine xxx'. \
+    --eval '%xxx'
+],
+[0],
+[1
+2
+.    .
+2
+..
+%xxx
+])
+AT_CLEANUP
+
+AT_SETUP([%define in conditional macro])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm \
+    --define 'dofoo() true'\
+    --eval '.%{!?foo: %define foo bar}.'\
+    --eval '%foo' \
+    --eval '%dofoo'\
+    --eval '%foo'
+],
+[0],
+[. .
+bar
+true
+bar
+])
+AT_CLEANUP
+
+AT_SETUP([%verbose negative test])
+AT_KEYWORDS([macros verbose])
+AT_CHECK([
+runroot rpm \
+  --eval '%{verbose:%{echo:is verbose}}' \
+  --eval '%{verbose:is verbose text}'\
+  --eval '%{!verbose:%{echo:is not verbose}}'\
+  --eval '%{!verbose:is not verbose text}'
+],
 [0],
 [
+
+is not verbose
+
+is not verbose text
+])
+AT_CLEANUP
+
+AT_SETUP([%verbose positive test])
+AT_KEYWORDS([macros verbose])
+AT_CHECK([
+runroot rpm -v \
+  --eval '%{!verbose:%{echo:is not verbose}}' \
+  --eval '%{!verbose:is not verbose text}'\
+  --eval '%{verbose:%{echo:is verbose}}'\
+  --eval '%{verbose:is verbose text}'
 ],
-[error: lua script failed: [[string "<lua>"]]:1: exit not permitted in this context]
-)
+[0],
+[
+
+is verbose
+
+is verbose text
+])
 AT_CLEANUP
diff --git a/tests/rpmorder.at b/tests/rpmorder.at
new file mode 100644 (file)
index 0000000..5eadc27
--- /dev/null
@@ -0,0 +1,45 @@
+AT_BANNER([RPM install/erase ordering])
+
+AT_SETUP([basic install/erase order 1])
+AT_KEYWORDS([install erase order])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs deptest-two" \
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "reqs deptest-three" \
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+       /data/SPECS/deptest.spec
+
+echo INSTALL:
+runroot rpm -Uv --justdb \
+       /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm \
+       /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm \
+       /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+echo ERASE:
+runroot rpm -ev --justdb \
+        deptest-three \
+       deptest-one \
+       deptest-two
+],
+[0],
+[INSTALL:
+Preparing packages...
+deptest-three-1.0-1.noarch
+deptest-two-1.0-1.noarch
+deptest-one-1.0-1.noarch
+ERASE:
+Preparing packages...
+deptest-one-1.0-1.noarch
+deptest-two-1.0-1.noarch
+deptest-three-1.0-1.noarch
+],
+[])
+AT_CLEANUP
index 1ccbb7070b83358aa9ba3e6cad6afd7ed8b87ac3..3a974eaf834836dcf76c8fbd6791970279caccea 100644 (file)
@@ -53,8 +53,8 @@ for iot in [ 'fpio', 'fdio', 'ufdio', 'gzdio' ]:
     fd = rpm.fd(fn, 'r', iot)
     rdata = fd.read()
     if rdata != data:
-        myprint('%s read fail (got %d bytes)' % (iot, len(rdata), rdata))
-    # compressed io types cant seek
+        myprint('%s read fail (got %d bytes)\n%s' % (iot, len(rdata), rdata))
+    # compressed io types can't seek
     if iot == 'ufdio':
         fd.seek(0)
     else:
@@ -134,6 +134,39 @@ myprint(h['arch'])
 [ppc64]
 )
 
+RPMPY_TEST([reading a signed package file 1],[
+ts = rpm.ts()
+# avoid rpmlog spew with absolute path to package
+sink = open('/dev/null', 'w')
+rpm.setLogFile(sink)
+try:
+    h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.x86_64-signed.rpm')
+    myprint(h['arch'])
+except rpm.error, e:
+    myprint(e)
+],
+[public key not available
+],
+)
+
+RPMPY_TEST([reading a signed package file 2],[
+
+keydata = open('${RPMDATA}/keys/rpm.org-rsa-2048-test.pub').read()
+pubkey = rpm.pubkey(keydata)
+keyring = rpm.keyring()
+keyring.addKey(pubkey)
+
+ts = rpm.ts()
+ts.setKeyring(keyring)
+try:
+    h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.x86_64-signed.rpm')
+    myprint(h['arch'])
+except rpm.error, e:
+    myprint(e)
+],
+[x86_64]
+)
+
 RPMPY_TEST([add package to transaction],[
 ts = rpm.ts()
 ts.addInstall('${RPMDATA}/RPMS/foo-1.0-1.noarch.rpm', 'u')
@@ -195,6 +228,33 @@ runroot rpm -i \
 [],
 [])
 
+RPMPY_CHECK([
+ts = rpm.ts()
+ix = 0
+mi = ts.dbMatch()
+mi.pattern('name', rpm.RPMMIRE_STRCMP, 'hello')
+for h in mi:
+    ix = h['dbinstance']
+    break
+del mi
+for h in ts.dbMatch('packages', ix):
+    myprint(h['nevra'])
+],
+[hello-2.0-1.i686
+],
+[])
+
+RPMPY_CHECK([
+ts = rpm.ts()
+mi = ts.dbMatch()
+mi.pattern('name', rpm.RPMMIRE_DEFAULT, 'f*')
+for h in mi:
+    myprint(h['nevra'])
+],
+[foo-1.0-1.noarch
+],
+[])
+
 RPMPY_CHECK([
 ts = rpm.ts()
 for h in ts.dbMatch('name'):
@@ -233,7 +293,7 @@ for h in ts.dbMatch('basenames', '/usr/share/doc/hello-2.0/FAQ'):
 [])
 RPMPY_CHECK([
 ts = rpm.ts()
-for di in ts.dbIndex('obsoletes'):
+for di in sorted(ts.dbIndex('obsoletes')):
     myprint(di)
 ],
 [howdy
@@ -242,7 +302,7 @@ for di in ts.dbIndex('obsoletes'):
 
 RPMPY_CHECK([
 ts = rpm.ts()
-for di in ts.dbIndex('provides'):
+for di in sorted(ts.dbIndex('provides')):
     myprint(di)
 ],
 [foo
@@ -297,3 +357,73 @@ for f in fi:
 ],
 [])
 
+RPMPY_TEST([string pool 1],[
+p = rpm.strpool()
+for s in ['foo', 'bar', 'foo', 'zoo']:
+    p.str2id(s)
+myprint('%s' % len(p))
+for i in range(1, len(p)+1):
+    myprint('%s: %s' % (i, p[i]))
+],
+[3
+1: foo
+2: bar
+3: zoo
+],
+[])
+
+RPMPY_TEST([string pool 2],[
+p = rpm.strpool()
+d1 = rpm.ds(('foo', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
+d2 = rpm.ds(('bar', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
+d3 = rpm.ds(('bar', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
+myprint('%s' % len(p))
+del p
+myprint(d1.DNEVR())
+myprint(d2.DNEVR())
+myprint(d3.DNEVR())
+],
+[3
+P foo = 2.0
+P bar = 2.0
+P bar = 2.0
+],
+[])
+
+RPMPY_TEST([archive 1],[
+import hashlib
+ts = rpm.ts()
+fd = rpm.fd.open('${RPMDATA}/SRPMS/hello-1.0-1.src.rpm')
+h = ts.hdrFromFdno(fd)
+payload = rpm.fd.open(fd, flags=h['payloadcompressor'])
+files = rpm.files(h)
+archive = files.archive(payload)
+for f in archive:
+    if not f.fflags & rpm.RPMFILE_SPECFILE:
+        continue
+    spec = archive.read()
+    hash = hashlib.md5(spec)
+    if f.digest != hash.hexdigest():
+        myprint('%s should be %s' % (hash.hexdigest(), f.digest))
+    break
+],
+[],
+[])
+
+RPMPY_TEST([header unload],[
+ts = rpm.ts()
+h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
+# Add some garbage to header to make it non-sorted
+h['installtime'] = 0
+# RhBug:1061730 causes export of non-sorted header to be larger than it should
+len1 = len(h.unload())
+# Accessing the header before export forces sorting to take place even on
+# buggy versions
+t = h['installtime']
+len2 = len(h.unload())
+myprint(len1 == len2)
+],
+[True
+],
+[])
+
index 5a7470f7e5a282326cf756e40cac7a63bcfe67f4..1ca8adf0081e654a89e49fae7a79365ccfd6dd68 100644 (file)
@@ -238,6 +238,19 @@ runroot rpm \
 [])
 AT_CLEANUP
 
+AT_SETUP([pgpsig extension query])
+AT_KEYWORDS([query signature])
+AT_CHECK([
+runroot rpm \
+    --queryformat="%{rsaheader:pgpsig}" \
+    -qp /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+],
+[0],
+[RSA/SHA256, Thu Apr  6 13:02:33 2017, Key ID 4344591e1964c5fc],
+[warning: /data/RPMS/hello-2.0-1.x86_64-signed.rpm: Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+])
+AT_CLEANUP
+
 # ------------------------------
 AT_SETUP([integer array perms format query])
 AT_KEYWORDS([query])
@@ -307,11 +320,41 @@ runroot rpm \
 AT_CLEANUP
 
 # ------------------------------
-AT_SETUP([different sizes arrays query])
+AT_SETUP([different sizes arrays query 1])
+AT_KEYWORDS([query])
+AT_CHECK([
+runroot rpm \
+  --queryformat="[[%{basenames} %{changelogname}]\n]" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+],
+[0],
+[],
+[error: incorrect format: array iterator used with different sized arrays
+])
+AT_CLEANUP
+
+# ------------------------------
+# This is succeeds because there happens to be exactly one changelog entry
+# so the size matches with name.
+AT_SETUP([different sizes arrays query 2])
+AT_KEYWORDS([query])
+AT_CHECK([
+runroot rpm \
+  --queryformat="[[%{name} %{changelogtime}]\n]" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+],
+[0],
+[hello 908877600
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+AT_SETUP([different sizes arrays query 3])
 AT_KEYWORDS([query])
 AT_CHECK([
 runroot rpm \
-  --queryformat="[[%{basenames} %{changelogname}]]" \
+  --queryformat="[[%{name} %{basenames}]\n]" \
   -qp /data/RPMS/hello-1.0-1.i386.rpm
 ],
 [0],
@@ -320,6 +363,22 @@ runroot rpm \
 ])
 AT_CLEANUP
 
+# ------------------------------
+AT_SETUP([different sizes arrays query 4])
+AT_KEYWORDS([query])
+AT_CHECK([
+runroot rpm \
+  --queryformat="[[%{=name} %{basenames}\n]]" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+],
+[0],
+[hello hello
+hello hello-1.0
+hello FAQ
+],
+[])
+
+AT_CLEANUP
 # ------------------------------
 AT_SETUP([non-existent string tag])
 AT_KEYWORDS([query])
@@ -369,7 +428,7 @@ runroot rpm \
 ],
 [0],
 [],
-[error: incorrect format: unknown tag
+[error: incorrect format: unknown tag: "notag"
 ])
 AT_CLEANUP
 
@@ -399,3 +458,355 @@ runroot rpm \
 [error: incorrect format: invalid field width
 ])
 AT_CLEANUP
+
+AT_SETUP([xml format])
+AT_KEYWORDS([query])
+AT_CHECK([
+runroot rpm -qp --xml  data/RPMS/hello-2.0-1.x86_64.rpm
+],
+[0],
+[<rpmHeader>
+  <rpmTag name="Headeri18ntable">
+       <string>C</string>
+  </rpmTag>
+  <rpmTag name="Sigsize">
+       <integer>5411</integer>
+  </rpmTag>
+  <rpmTag name="Sigmd5">
+       <base64>E3yh2LNcygKhhUujAcVDLg==
+</base64>
+  </rpmTag>
+  <rpmTag name="Sha1header">
+       <string>5cd9874c510b67b44483f9e382a1649ef7743bac</string>
+  </rpmTag>
+  <rpmTag name="Sha256header">
+       <string>ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9</string>
+  </rpmTag>
+  <rpmTag name="Name">
+       <string>hello</string>
+  </rpmTag>
+  <rpmTag name="Version">
+       <string>2.0</string>
+  </rpmTag>
+  <rpmTag name="Release">
+       <string>1</string>
+  </rpmTag>
+  <rpmTag name="Summary">
+       <string>hello -- hello, world rpm</string>
+  </rpmTag>
+  <rpmTag name="Description">
+       <string>Simple rpm demonstration.</string>
+  </rpmTag>
+  <rpmTag name="Buildtime">
+       <integer>1227355200</integer>
+  </rpmTag>
+  <rpmTag name="Buildhost">
+       <string>localhost</string>
+  </rpmTag>
+  <rpmTag name="Size">
+       <integer>7243</integer>
+  </rpmTag>
+  <rpmTag name="License">
+       <string>GPL</string>
+  </rpmTag>
+  <rpmTag name="Group">
+       <string>Testing</string>
+  </rpmTag>
+  <rpmTag name="Os">
+       <string>linux</string>
+  </rpmTag>
+  <rpmTag name="Arch">
+       <string>x86_64</string>
+  </rpmTag>
+  <rpmTag name="Filesizes">
+       <integer>7120</integer>
+       <integer>4096</integer>
+       <integer>48</integer>
+       <integer>36</integer>
+       <integer>39</integer>
+  </rpmTag>
+  <rpmTag name="Filemodes">
+       <integer>33257</integer>
+       <integer>16877</integer>
+       <integer>33188</integer>
+       <integer>33188</integer>
+       <integer>33188</integer>
+  </rpmTag>
+  <rpmTag name="Filerdevs">
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+  </rpmTag>
+  <rpmTag name="Filemtimes">
+       <integer>1489670606</integer>
+       <integer>1489670606</integer>
+       <integer>908894882</integer>
+       <integer>908895030</integer>
+       <integer>908884468</integer>
+  </rpmTag>
+  <rpmTag name="Filedigests">
+       <string>c89fa87aeb1143969c0b6be9334b21d932f77f74e8f60120b5de316406369cf0</string>
+       <string/>
+       <string>fac3b28492ecdc16da172a6f1a432ceed356ca4d9248157b2a962b395e37b3b0</string>
+       <string>678b87e217a415f05e43460e2c7b668245b412e2b4f18a75aa7399d9774ed0b4</string>
+       <string>d63fdc6c986106f57230f217d36b2395d83ecf491d2b7187af714dc8db9629e9</string>
+  </rpmTag>
+  <rpmTag name="Filelinktos">
+       <string/>
+       <string/>
+       <string/>
+       <string/>
+       <string/>
+  </rpmTag>
+  <rpmTag name="Fileflags">
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+  </rpmTag>
+  <rpmTag name="Fileusername">
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+  </rpmTag>
+  <rpmTag name="Filegroupname">
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+  </rpmTag>
+  <rpmTag name="Sourcerpm">
+       <string>hello-2.0-1.src.rpm</string>
+  </rpmTag>
+  <rpmTag name="Fileverifyflags">
+       <integer>4294967295</integer>
+       <integer>0</integer>
+       <integer>4294967295</integer>
+       <integer>4294967295</integer>
+       <integer>4294967295</integer>
+  </rpmTag>
+  <rpmTag name="Archivesize">
+       <integer>8060</integer>
+  </rpmTag>
+  <rpmTag name="Providename">
+       <string>hello</string>
+       <string>hello(x86-64)</string>
+  </rpmTag>
+  <rpmTag name="Requireflags">
+       <integer>16384</integer>
+       <integer>16384</integer>
+       <integer>16777226</integer>
+       <integer>16777226</integer>
+       <integer>16777226</integer>
+       <integer>16384</integer>
+  </rpmTag>
+  <rpmTag name="Requirename">
+       <string>libc.so.6()(64bit)</string>
+       <string>libc.so.6(GLIBC_2.2.5)(64bit)</string>
+       <string>rpmlib(CompressedFileNames)</string>
+       <string>rpmlib(FileDigests)</string>
+       <string>rpmlib(PayloadFilesHavePrefix)</string>
+       <string>rtld(GNU_HASH)</string>
+  </rpmTag>
+  <rpmTag name="Requireversion">
+       <string/>
+       <string/>
+       <string>3.0.4-1</string>
+       <string>4.6.0-1</string>
+       <string>4.0-1</string>
+       <string/>
+  </rpmTag>
+  <rpmTag name="Rpmversion">
+       <string>4.13.90</string>
+  </rpmTag>
+  <rpmTag name="Changelogtime">
+       <integer>1227355200</integer>
+       <integer>908884800</integer>
+  </rpmTag>
+  <rpmTag name="Changelogname">
+       <string>Panu Matilainen &lt;pmatilai@redhat.com&gt;</string>
+       <string>Jeff Johnson &lt;jbj@redhat.com&gt;</string>
+  </rpmTag>
+  <rpmTag name="Changelogtext">
+       <string>- updated version</string>
+       <string>- create.</string>
+  </rpmTag>
+  <rpmTag name="Filedevices">
+       <integer>1</integer>
+       <integer>1</integer>
+       <integer>1</integer>
+       <integer>1</integer>
+       <integer>1</integer>
+  </rpmTag>
+  <rpmTag name="Fileinodes">
+       <integer>1</integer>
+       <integer>2</integer>
+       <integer>3</integer>
+       <integer>4</integer>
+       <integer>5</integer>
+  </rpmTag>
+  <rpmTag name="Filelangs">
+       <string/>
+       <string/>
+       <string/>
+       <string/>
+       <string/>
+  </rpmTag>
+  <rpmTag name="Prefixes">
+       <string>/usr</string>
+  </rpmTag>
+  <rpmTag name="Provideflags">
+       <integer>8</integer>
+       <integer>8</integer>
+  </rpmTag>
+  <rpmTag name="Provideversion">
+       <string>2.0-1</string>
+       <string>2.0-1</string>
+  </rpmTag>
+  <rpmTag name="Dirindexes">
+       <integer>0</integer>
+       <integer>1</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+  </rpmTag>
+  <rpmTag name="Basenames">
+       <string>hello</string>
+       <string>hello-2.0</string>
+       <string>COPYING</string>
+       <string>FAQ</string>
+       <string>README</string>
+  </rpmTag>
+  <rpmTag name="Dirnames">
+       <string>/usr/bin/</string>
+       <string>/usr/share/doc/</string>
+       <string>/usr/share/doc/hello-2.0/</string>
+  </rpmTag>
+  <rpmTag name="Optflags">
+       <string>-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic</string>
+  </rpmTag>
+  <rpmTag name="Payloadformat">
+       <string>cpio</string>
+  </rpmTag>
+  <rpmTag name="Payloadcompressor">
+       <string>gzip</string>
+  </rpmTag>
+  <rpmTag name="Payloadflags">
+       <string>9</string>
+  </rpmTag>
+  <rpmTag name="Platform">
+       <string>x86_64-redhat-linux-gnu</string>
+  </rpmTag>
+  <rpmTag name="Filecolors">
+       <integer>2</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+  </rpmTag>
+  <rpmTag name="Fileclass">
+       <integer>0</integer>
+       <integer>1</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+  </rpmTag>
+  <rpmTag name="Classdict">
+       <string>ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[[sha1]]=775fdcb927e4300adbe83cfacec3cfeb1f63fe17, stripped</string>
+       <string>directory</string>
+       <string>ASCII text</string>
+  </rpmTag>
+  <rpmTag name="Filedependsx">
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+  </rpmTag>
+  <rpmTag name="Filedependsn">
+       <integer>3</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+  </rpmTag>
+  <rpmTag name="Dependsdict">
+       <integer>1375731713</integer>
+       <integer>1375731712</integer>
+       <integer>1375731717</integer>
+  </rpmTag>
+  <rpmTag name="Filedigestalgo">
+       <integer>8</integer>
+  </rpmTag>
+  <rpmTag name="Encoding">
+       <string>utf-8</string>
+  </rpmTag>
+  <rpmTag name="Payloaddigest">
+       <string>84a7338287bf19715c4eed0243f5cdb447eeb0ade37b2af718d4060aefca2f7c</string>
+  </rpmTag>
+  <rpmTag name="Payloaddigestalgo">
+       <integer>8</integer>
+  </rpmTag>
+</rpmHeader>
+],
+[])
+AT_CLEANUP
+
+AT_SETUP([query file attribute filtering])
+AT_KEYWORDS([query])
+AT_CHECK([
+runroot rpmbuild -bb --quiet \
+  /data/SPECS/vattrtest.spec
+
+pkg="/build/RPMS/noarch/vattrtest-1.0-1.noarch.rpm"
+cmd="rpm -qpl"
+for filter in --noconfig --noghost --noartifact -A -c -d -L; do
+    echo ${filter}
+    runroot ${cmd} ${filter} ${pkg}
+done
+],
+[0],
+[--noconfig
+/opt/vattrtest
+/opt/vattrtest/a
+/opt/vattrtest/d
+/opt/vattrtest/g
+/opt/vattrtest/l
+/opt/vattrtest/m
+/opt/vattrtest/r
+--noghost
+/opt/vattrtest
+/opt/vattrtest/a
+/opt/vattrtest/c
+/opt/vattrtest/cn
+/opt/vattrtest/d
+/opt/vattrtest/l
+/opt/vattrtest/m
+/opt/vattrtest/r
+--noartifact
+/opt/vattrtest
+/opt/vattrtest/c
+/opt/vattrtest/cn
+/opt/vattrtest/d
+/opt/vattrtest/g
+/opt/vattrtest/l
+/opt/vattrtest/m
+/opt/vattrtest/r
+-A
+/opt/vattrtest/a
+-c
+/opt/vattrtest/c
+/opt/vattrtest/cn
+-d
+/opt/vattrtest/d
+-L
+/opt/vattrtest/l
+],
+[])
+AT_CLEANUP
index cdc8d03d9beca6f0269812d616a102a7bc3acc34..6f0444bb75a09e995a90885c1dd4a95620d93ae1 100644 (file)
@@ -22,11 +22,11 @@ runroot rpmbuild --quiet -bb \
        --define "filedata bar" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 cat "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 cat "${tf}"
-runroot rpm -U --oldpackage "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 cat "${tf}"
 ],
 [0],
@@ -58,11 +58,11 @@ runroot rpmbuild --quiet -bb \
        --define "filedata stuff" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 cat "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 readlink "${tf}"
-runroot rpm -U --oldpackage "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 cat "${tf}"
 ],
 [0],
@@ -94,11 +94,11 @@ runroot rpmbuild --quiet -bb \
        --define "filedata goo" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 cat "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 readlink "${tf}"
-runroot rpm -U --oldpackage "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 cat "${tf}"
 ],
 [0],
@@ -130,9 +130,9 @@ runroot rpmbuild --quiet -bb \
        --define "filedata stuff" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 readlink "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 readlink "${tf}"
 ],
 [0],
@@ -163,9 +163,9 @@ runroot rpmbuild --quiet -bb \
        --define "filedata goo" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 readlink "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 readlink "${tf}"
 ],
 [0],
@@ -196,9 +196,9 @@ runroot rpmbuild --quiet -bb \
        --define "filedata zoo" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 readlink "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 readlink "${tf}"
 ],
 [0],
@@ -228,9 +228,9 @@ runroot rpmbuild --quiet -bb \
        --define "filetype dir" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 cat "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 test -d "${tf}"
 ],
 [0],
@@ -259,9 +259,9 @@ runroot rpmbuild --quiet -bb \
        --define "filetype dir" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 readlink "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 test -d "${tf}"
 ],
 [0],
@@ -290,9 +290,9 @@ runroot rpmbuild --quiet -bb \
        --define "filetype dir" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 readlink "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 test -d "${tf}"
 ],
 [0],
@@ -321,9 +321,9 @@ runroot rpmbuild --quiet -bb \
        --define "filetype dir" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
 readlink "${tf}"
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 ],
 [2],
 [zoo
@@ -351,8 +351,8 @@ runroot rpmbuild --quiet -bb \
        --define "filetype dir" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
-test -d "${tf}" && runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 test -d "${tf}"
 ],
 [0],
@@ -380,8 +380,8 @@ runroot rpmbuild --quiet -bb \
        --define "filedata woot" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
-test -d "${tf}" && runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 ],
 [2],
 [],
@@ -402,18 +402,22 @@ runroot rpmbuild --quiet -bb \
         --define "ver 1.0" \
        --define "filetype datadir" \
        --define "filedata README1" \
+       --define "user $(id -u -n)" \
+       --define "grp $(id -g -n)" \
           /data/SPECS/replacetest.spec
 
 runroot rpmbuild --quiet -bb \
         --define "ver 2.0" \
        --define "filetype datadir" \
        --define "filedata README2" \
+       --define "user $(id -u -n)" \
+       --define "grp $(id -g -n)" \
           /data/SPECS/replacetest.spec
 
 mkdir "${RPMTEST}"/opt/f00f
 ln -s f00f "${RPMTEST}"/opt/foo
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
-test -L "${tf}" && test -d "${tf}" && runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -L "${tf}" && test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 test -L "${tf}" && test -d "${tf}"
 ],
 [0],
@@ -421,6 +425,38 @@ test -L "${tf}" && test -d "${tf}"
 [])
 AT_CLEANUP
 
+AT_SETUP([upgrade invalid locally symlinked directory])
+AT_KEYWORDS([install])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype datadir" \
+       --define "filedata README1" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype datadir" \
+       --define "filedata README2" \
+          /data/SPECS/replacetest.spec
+
+mkdir "${RPMTEST}"/opt/f00f
+ln -s f00f "${RPMTEST}"/opt/foo
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -L "${tf}" && test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d "${tf}"
+],
+[0],
+[],
+[])
+AT_CLEANUP
+
 AT_SETUP([upgrade empty directory to broken link])
 AT_KEYWORDS([install])
 AT_CHECK([
@@ -441,8 +477,8 @@ runroot rpmbuild --quiet -bb \
        --define "filedata woot" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
-test -d "${tf}" && runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 ],
 [2],
 [],
@@ -470,8 +506,8 @@ runroot rpmbuild --quiet -bb \
        --define "filedata woot" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
-test -d "${tf}" && runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 ],
 [2],
 [],
@@ -499,8 +535,8 @@ runroot rpmbuild --quiet -bb \
        --define "filedata goo" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
-test -d "${tf}" && rmdir "${tf}" && runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && rmdir "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 readlink "${tf}"
 ],
 [0],
@@ -529,8 +565,8 @@ runroot rpmbuild --quiet -bb \
        --define "filedata goo" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
-test -d "${tf}" && rmdir "${tf}" && ln -sf goo "${tf}" && runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && rmdir "${tf}" && ln -sf goo "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 readlink "${tf}"
 ],
 [0],
@@ -560,8 +596,8 @@ runroot rpmbuild --quiet -bb \
        --define "fixit posix.rmdir('/opt/foo')" \
           /data/SPECS/replacetest.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-1.0-1.noarch.rpm
-test -d "${tf}" && runroot rpm -U --test "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm && runroot rpm -U "${TOPDIR}"/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U --test /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
 readlink "${tf}"
 ],
 [0],
index ab4478504bd0f9a04bfa1cab3275f92903a6fc37..b93fcad02f8212914a8e6f83dc8efb558daf6986 100644 (file)
@@ -15,25 +15,236 @@ runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
 runroot rpmbuild --quiet -bb --define "rel 1" /data/SPECS/scripts.spec
 runroot rpmbuild --quiet -bb --define "rel 2" /data/SPECS/scripts.spec
 
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/scripts-1.0-1.noarch.rpm
-runroot rpm -U "${TOPDIR}"/RPMS/noarch/scripts-1.0-2.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+runroot rpm -Vvp /build/RPMS/noarch/scripts-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-2.noarch.rpm
+runroot rpm -Vv scripts
 runroot rpm -e scripts
 ],
 [0],
-[scripts-1.0-1 PRETRANS 0
+[scripts-1.0-1 VERIFY 0
+scripts-1.0-1 PRETRANS 1
 scripts-1.0-1 PRE 1
 scripts-1.0-1 POST 1
-scripts-1.0-1 POSTTRANS 0
-scripts-1.0-2 PRETRANS 0
+scripts-1.0-1 POSTTRANS 1
+scripts-1.0-2 PRETRANS 2
 scripts-1.0-2 PRE 2
 scripts-1.0-2 POST 2
 scripts-1.0-1 PREUN 1
 scripts-1.0-1 POSTUN 1
-scripts-1.0-2 POSTTRANS 0
+scripts-1.0-2 POSTTRANS 1
+scripts-1.0-2 VERIFY 1
 scripts-1.0-2 PREUN 0
 scripts-1.0-2 POSTUN 0
 ],
 [])
 AT_CLEANUP
 
+AT_SETUP([basic trigger scripts and arguments])
+AT_KEYWORDS([trigger script])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+runroot rpmbuild --quiet -bb --define "rel 1" /data/SPECS/scripts.spec
+runroot rpmbuild --quiet -bb --define "rel 2" /data/SPECS/scripts.spec
+runroot rpmbuild --quiet -bb --define "rel 1" --define "trigpkg scripts" /data/SPECS/triggers.spec
+runroot rpmbuild --quiet -bb --define "rel 2" --define "trigpkg scripts" /data/SPECS/triggers.spec
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+echo TRIGGERS 1
+runroot rpm -U /build/RPMS/noarch/triggers-1.0-1.noarch.rpm
+echo SCRIPTS 1
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-1.noarch.rpm
+echo SCRIPTS 2
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-2.noarch.rpm
+echo TRIGGERS 2
+runroot rpm -U /build/RPMS/noarch/triggers-1.0-2.noarch.rpm
+echo ERASE
+runroot rpm -e scripts
+],
+[0],
+[TRIGGERS 1
+SCRIPTS 1
+scripts-1.0-1 PRETRANS 1
+triggers-1.0-1 TRIGGERPREIN 1 0
+scripts-1.0-1 PRE 1
+scripts-1.0-1 POST 1
+triggers-1.0-1 TRIGGERIN 1 1
+scripts-1.0-1 POSTTRANS 1
+SCRIPTS 2
+scripts-1.0-2 PRETRANS 2
+triggers-1.0-1 TRIGGERPREIN 1 1
+scripts-1.0-2 PRE 2
+scripts-1.0-2 POST 2
+triggers-1.0-1 TRIGGERIN 1 2
+triggers-1.0-1 TRIGGERUN 1 1
+scripts-1.0-1 PREUN 1
+scripts-1.0-1 POSTUN 1
+triggers-1.0-1 TRIGGERPOSTUN 1 1
+scripts-1.0-2 POSTTRANS 1
+TRIGGERS 2
+triggers-1.0-2 TRIGGERPREIN 1 1
+triggers-1.0-2 TRIGGERIN 2 1
+triggers-1.0-1 TRIGGERUN 1 1
+ERASE
+triggers-1.0-2 TRIGGERUN 1 0
+scripts-1.0-2 PREUN 0
+scripts-1.0-2 POSTUN 0
+triggers-1.0-2 TRIGGERPOSTUN 1 0
+],
+[])
+AT_CLEANUP
+
+AT_SETUP([basic file trigger scripts])
+AT_KEYWORDS([file trigger script])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+runroot rpmbuild --quiet -bb /data/SPECS/hlinktest.spec
+runroot rpmbuild --quiet -bb /data/SPECS/filetriggers.spec
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/filetriggers-1.0-1.noarch.rpm
+echo INSTALLATION
+runroot rpm -U /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm \
+/build/RPMS/noarch/hlinktest-1.0-1.noarch.rpm
+echo ERASE
+runroot rpm -e hello-script hlinktest
+],
+[0],
+[INSTALLATION
+filetriggerin(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerin(/foo*)<lua>:
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerin(/usr/bin*):
+/usr/bin/hello
+
+filetriggerin(/usr/bin*)<lua>:
+/usr/bin/hello
+
+transfiletriggerin(/usr/bin*):
+/usr/bin/hello
+
+transfiletriggerin(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+ERASE
+transfiletriggerun(/usr/bin*):
+/usr/bin/hello
+
+transfiletriggerun(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerun(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerpostun(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerun(/usr/bin*):
+/usr/bin/hello
+
+filetriggerpostun(/usr/bin*):
+/usr/bin/hello
+
+transfiletriggerpostun(/usr/bin*):
+
+transfiletriggerpostun(/foo*):
+
+],
+[])
+AT_CLEANUP
+
+AT_SETUP([basic file triggers 2])
+AT_KEYWORDS([filetrigger script])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+for v in 1.0 2.0 3.0; do
+    runroot rpmbuild --quiet -bb --define "ver ${v}" /data/SPECS/parallel.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm 
+runroot rpm -i \
+       /build/RPMS/noarch/parallel-1.0-1.noarch.rpm \
+       /build/RPMS/noarch/parallel-2.0-1.noarch.rpm \
+       /build/RPMS/noarch/parallel-3.0-1.noarch.rpm
+
+echo INSTALL:
+runroot rpm -U /build/RPMS/noarch/parallel-trigger-1.0-1.noarch.rpm
+echo UPGRADE:
+runroot rpm -U /build/RPMS/noarch/parallel-trigger-2.0-1.noarch.rpm
+echo ERASE:
+runroot rpm -e parallel-trigger
+
+],
+[0],
+[INSTALL:
+%filetriggerin: 0 0
+36
+%transfiletriggerin: 0 0
+36
+UPGRADE:
+%transfiletriggerun: 0 0
+36
+%filetriggerin: 0 0
+36
+%transfiletriggerin: 0 0
+36
+ERASE:
+%transfiletriggerun: 0 0
+36
+],
+[])
+AT_CLEANUP
+
diff --git a/tests/rpmsigdig.at b/tests/rpmsigdig.at
new file mode 100644 (file)
index 0000000..6938299
--- /dev/null
@@ -0,0 +1,471 @@
+#    rpmsigdig.at: rpm signature and digest tests
+
+AT_BANNER([RPM signatures and digests])
+
+# ------------------------------
+# Test pre-built package verification
+AT_SETUP([rpmkeys -Kv <unsigned> 1])
+AT_KEYWORDS([rpmkeys digest])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64.rpm /data/RPMS/hello-1.0-1.i386.rpm
+],
+[0],
+[/data/RPMS/hello-2.0-1.x86_64.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    MD5 digest: OK
+/data/RPMS/hello-1.0-1.i386.rpm:
+    Header SHA1 digest: OK
+    MD5 digest: OK
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Test corrupted package verification (corrupted signature)
+AT_SETUP([rpmkeys -Kv <corrupted unsigned> 1])
+AT_KEYWORDS([rpmkeys digest])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+# conv=notrunc bs=1 seek=261 count=6 2> /dev/null
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=333 count=4 2> /dev/null
+runroot rpmkeys -Kv /tmp/${pkg}
+],
+[1],
+[/tmp/hello-2.0-1.x86_64.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    MD5 digest: BAD (Expected 007ca1d8b35cca02a1854ba301c5432e != 137ca1d8b35cca02a1854ba301c5432e)
+],
+[])
+AT_CLEANUP
+# ------------------------------
+# Test corrupted package verification (corrupted header)
+AT_SETUP([rpmkeys -Kv <corrupted unsigned> 2])
+AT_KEYWORDS([rpmkeys digest])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=5555 count=6 2> /dev/null
+runroot rpmkeys -Kv /tmp/${pkg}
+],
+[1],
+[/tmp/hello-2.0-1.x86_64.rpm:
+    Header SHA1 digest: BAD (Expected 5cd9874c510b67b44483f9e382a1649ef7743bac != 4261b2c1eb861a4152c2239bce20bfbcaa8971ba)
+    Header SHA256 digest: BAD (Expected ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9 != 29fdfe92782fb0470a9a164a6c94af87d3b138c63b39d4c30e0223ca1202ba82)
+    Payload SHA256 digest: OK
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != de65519eeb4ab52eb076ec054d42e34e)
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Test corrupted package verification (corrupted payload)
+AT_SETUP([rpmkeys -Kv <corrupted unsigned> 3])
+AT_KEYWORDS([rpmkeys digest])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=7777 count=6 2> /dev/null
+runroot rpmkeys -Kv /tmp/${pkg}
+],
+[1],
+[/tmp/hello-2.0-1.x86_64.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: BAD (Expected 84a7338287bf19715c4eed0243f5cdb447eeb0ade37b2af718d4060aefca2f7c != bea903609dceac36e1f26a983c493c98064d320fdfeb423034ed63d649b2c8dc)
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != d662cd0d81601a7107312684ad1ddf38)
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Reproducably build and verify a package
+AT_SETUP([rpmkeys -Kv <unsigned> 2])
+AT_KEYWORDS([rpmkeys digest])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild -bb --quiet \
+       --define "%optflags -O2 -g" \
+       --define "%_target_platform noarch-linux" \
+       --define "%_binary_payload w.ufdio" \
+       --define "%_buildhost localhost" \
+       --define "%source_date_epoch_from_changelog 1" \
+       --define "%clamp_mtime_to_source_date_epoch 1" \
+       /data/SPECS/attrtest.spec 
+runroot rpmkeys -Kv /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm
+],
+[0],
+[/build/RPMS/noarch/attrtest-1.0-1.noarch.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    MD5 digest: OK
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Import a public RSA key
+AT_SETUP([rpmkeys --import rsa])
+AT_KEYWORDS([rpmkeys import])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpm -qi gpg-pubkey-1964c5fc-58e63918|grep -v Date|grep -v Version:
+],
+[0],
+[Name        : gpg-pubkey
+Version     : 1964c5fc
+Release     : 58e63918
+Architecture: (none)
+Group       : Public Keys
+Size        : 0
+License     : pubkey
+Signature   : (none)
+Source RPM  : (none)
+Build Host  : localhost
+Relocations : (not relocatable)
+Packager    : rpm.org RSA testkey <rsa@rpm.org>
+Summary     : gpg(rpm.org RSA testkey <rsa@rpm.org>)
+Description :
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQENBFjmORgBCAC7TMEk6wnjSs8Dr4yqSScWdU2pjcqrkTxuzdWvowcIUPZI0w/g
+HkRqGd4apjvY2V15kjL10gk3QhFP3pZ/9p7zh8o8NHX7aGdSGDK7NOq1eFaErPRY
+91LW9RiZ0lbOjXEzIL0KHxUiTQEmdXJT43DJMFPyW9fkCWg0OltiX618FUdWWfI8
+eySdLur1utnqBvdEbCUvWK2RX3vQZQdvEBODnNk2pxqTyV0w6VPQ96W++lF/5Aas
+7rUv3HIyIXxIggc8FRrnH+y9XvvHDonhTIlGnYZN4ubm9i4y3gOkrZlGTrEw7elQ
+1QeMyG2QQEbze8YjpTm4iLABCBrRfPRaQpwrABEBAAG0IXJwbS5vcmcgUlNBIHRl
+c3RrZXkgPHJzYUBycG0ub3JnPokBNwQTAQgAIQUCWOY5GAIbAwULCQgHAgYVCAkK
+CwIEFgIDAQIeAQIXgAAKCRBDRFkeGWTF/MxxCACnjqFL+MmPh9W9JQKT2DcLbBzf
+Cqo6wcEBoCOcwgRSk8dSikhARoteoa55JRJhuMyeKhhEAogE9HRmCPFdjezFTwgB
+BDVBpO2dZ023mLXDVCYX3S8pShOgCP6Tn4wqCnYeAdLcGg106N4xcmgtcssJE+Pr
+XzTZksbZsrTVEmL/Ym+R5w5jBfFnGk7Yw7ndwfQsfNXQb5AZynClFxnX546lcyZX
+fEx3/e6ezw57WNOUK6WT+8b+EGovPkbetK/rGxNXuWaP6X4A/QUm8O98nCuHYFQq
++mvNdsCBqGf7mhaRGtpHk/JgCn5rFvArMDqLVrR9hX0LdCSsH7EGE+bR3r7wuQEN
+BFjmORgBCACk+vDZrIXQuFXEYToZVwb2attzbbJJCqD71vmZTLsW0QxuPKRgbcYY
+zp4K4lVBnHhFrF8MOUOxJ7kQWIJZMZFt+BDcptCYurbD2H4W2xvnWViiC+LzCMzz
+iMJT6165uefL4JHTDPxC2fFiM9yrc72LmylJNkM/vepT128J5Qv0gRUaQbHiQuS6
+Dm/+WRnUfx3i89SV4mnBxb/Ta93GVqoOciWwzWSnwEnWYAvOb95JL4U7c5J5f/+c
+KnQDHsW7sIiIdscsWzvgf6qs2Ra1Zrt7Fdk4+ZS2f/adagLhDO1C24sXf5XfMk5m
+L0OGwZSr9m5s17VXxfspgU5ugc8kBJfzABEBAAGJAR8EGAEIAAkFAljmORgCGwwA
+CgkQQ0RZHhlkxfzwDQf/Y5on5o+s/xD3tDyRYa6SErfT44lEArdCD7Yi+cygJFox
+3jyM8ovtJAkwRegwyxcaLN7zeG1p1Sk9ZAYWQEJT6qSU4Ppu+CVGHgxgnTcfUiu6
+EZZQE6srvua53IMY1lT50M7vx0T5VicHFRWBFV2C/Mc32p7cEE6nn45nEZgUXQNl
+ySEyvoRlsAJq6gFsfqucVz2vMJDTMVczUtq1CjvUqFbif8JVL36EoZCf1SeRw6d6
+s1Kp3AA33Rjd+Uw87HJ4EIB75zMFQX2H0ggAVdYTQcqGXHP5MZK1jJrHfxJyMi3d
+UNW2iqnN3BA7guhOv6OMiROF1+I7Q5nWT63mQC7IgQ==
+=Z6nu
+-----END PGP PUBLIC KEY BLOCK-----
+
+],
+[])
+AT_CLEANUP
+
+AT_SETUP([rpmkeys --import invalid keys])
+AT_KEYWORDS([rpmkeys import])
+RPMDB_INIT
+
+AT_CHECK([
+runroot rpmkeys --import /data/keys/CVE-2021-3521-badbind.asc
+],
+[1],
+[],
+[error: /data/keys/CVE-2021-3521-badbind.asc: key 1 import failed.]
+)
+AT_CHECK([
+runroot rpmkeys --import /data/keys/CVE-2021-3521-nosubsig.asc
+],
+[1],
+[],
+[error: /data/keys/CVE-2021-3521-nosubsig.asc: key 1 import failed.]
+)
+
+AT_CHECK([
+runroot rpmkeys --import /data/keys/CVE-2021-3521-nosubsig-last.asc
+],
+[1],
+[],
+[error: /data/keys/CVE-2021-3521-nosubsig-last.asc: key 1 import failed.]
+)
+AT_CLEANUP
+
+# ------------------------------
+# Test pre-built package verification
+AT_SETUP([rpmkeys -K <signed> 1])
+AT_KEYWORDS([rpmkeys digest signature])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmkeys -K /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -K /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+],
+[0],
+[[/data/RPMS/hello-2.0-1.x86_64-signed.rpm: digests SIGNATURES NOT OK
+/data/RPMS/hello-2.0-1.x86_64-signed.rpm: digests signatures OK
+]],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Test pre-built package verification
+AT_SETUP([rpmkeys -Kv <signed> 1])
+AT_KEYWORDS([rpmkeys digest signature])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys -Kv --nodigest /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys -Kv --nosignature /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+],
+[0],
+[/data/RPMS/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    MD5 digest: OK
+/data/RPMS/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    MD5 digest: OK
+/data/RPMS/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+/data/RPMS/hello-2.0-1.x86_64-signed.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    MD5 digest: OK
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Test pre-built corrupted package verification (corrupted signature)
+AT_SETUP([rpmkeys -Kv <corrupted signed> 1])
+AT_KEYWORDS([rpmkeys digest signature])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=264 count=6 2> /dev/null
+
+runroot rpmkeys -Kv /tmp/${pkg}
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/${pkg}
+],
+[1],
+[/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header signature: BAD (package tag 268: invalid OpenPGP signature)
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    MD5 digest: OK
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header signature: BAD (package tag 268: invalid OpenPGP signature)
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    MD5 digest: OK
+],
+[])
+AT_CLEANUP
+# ------------------------------
+# Test pre-built corrupted package verification (corrupted header)
+AT_SETUP([rpmkeys -Kv <corrupted signed> 2])
+AT_KEYWORDS([rpmkeys digest signature])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=5555 count=6 2> /dev/null
+
+runroot rpmkeys -Kv /tmp/${pkg}
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/${pkg}
+],
+[1],
+[/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    Header SHA1 digest: BAD (Expected 5cd9874c510b67b44483f9e382a1649ef7743bac != 4261b2c1eb861a4152c2239bce20bfbcaa8971ba)
+    Header SHA256 digest: BAD (Expected ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9 != 29fdfe92782fb0470a9a164a6c94af87d3b138c63b39d4c30e0223ca1202ba82)
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != de65519eeb4ab52eb076ec054d42e34e)
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    Header SHA1 digest: BAD (Expected 5cd9874c510b67b44483f9e382a1649ef7743bac != 4261b2c1eb861a4152c2239bce20bfbcaa8971ba)
+    Header SHA256 digest: BAD (Expected ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9 != 29fdfe92782fb0470a9a164a6c94af87d3b138c63b39d4c30e0223ca1202ba82)
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != de65519eeb4ab52eb076ec054d42e34e)
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Test pre-built corrupted package verification (corrupted payload)
+AT_SETUP([rpmkeys -Kv <corrupted signed> 3])
+AT_KEYWORDS([rpmkeys digest signature])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=7777 count=6 2> /dev/null
+
+runroot rpmkeys -Kv /tmp/${pkg}
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/${pkg}
+],
+[1],
+[/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: BAD (Expected 84a7338287bf19715c4eed0243f5cdb447eeb0ade37b2af718d4060aefca2f7c != bea903609dceac36e1f26a983c493c98064d320fdfeb423034ed63d649b2c8dc)
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != d662cd0d81601a7107312684ad1ddf38)
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: BAD (Expected 84a7338287bf19715c4eed0243f5cdb447eeb0ade37b2af718d4060aefca2f7c != bea903609dceac36e1f26a983c493c98064d320fdfeb423034ed63d649b2c8dc)
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != d662cd0d81601a7107312684ad1ddf38)
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Test --addsign
+AT_SETUP([rpmsign --addsign <unsigned>])
+AT_KEYWORDS([rpmsign signature])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+cp "${RPMTEST}"/data/RPMS/hello-2.0-1.x86_64.rpm "${RPMTEST}"/tmp/
+run rpmsign --key-id 1964C5FC --addsign "${RPMTEST}"/tmp/hello-2.0-1.x86_64.rpm > /dev/null
+echo PRE-IMPORT
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64.rpm|grep -v digest
+echo POST-IMPORT
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64.rpm|grep -v digest
+run rpmsign --delsign "${RPMTEST}"/tmp/hello-2.0-1.x86_64.rpm > /dev/null
+echo POST-DELSIGN
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64.rpm|grep -v digest
+],
+[0],
+[PRE-IMPORT
+/tmp/hello-2.0-1.x86_64.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+POST-IMPORT
+/tmp/hello-2.0-1.x86_64.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+POST-DELSIGN
+/tmp/hello-2.0-1.x86_64.rpm:
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Test --delsign
+AT_SETUP([rpmsign --delsign <package>])
+AT_KEYWORDS([rpmsign signature])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+cp "${RPMTEST}"/data/RPMS/hello-2.0-1.x86_64-signed.rpm "${RPMTEST}"/tmp/
+echo PRE-DELSIGN
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64-signed.rpm|grep -v digest
+echo POST-DELSIGN
+run rpmsign --delsign "${RPMTEST}"/tmp/hello-2.0-1.x86_64-signed.rpm > /dev/null
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64-signed.rpm|grep -v digest
+],
+[0],
+[PRE-DELSIGN
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+POST-DELSIGN
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Test --addsign
+AT_SETUP([rpmsign --addsign <signed>])
+AT_KEYWORDS([rpmsign signature])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+rm -rf "${TOPDIR}"
+
+cp "${RPMTEST}"/data/RPMS/hello-2.0-1.x86_64-signed.rpm "${RPMTEST}"/tmp/
+run rpmsign --key-id 1964C5FC --addsign "${RPMTEST}"/tmp/hello-2.0-1.x86_64-signed.rpm 2>&1 |grep -q "already contains identical signature, skipping"
+],
+[0],
+[],
+[])
+AT_CLEANUP
diff --git a/tests/rpmtests b/tests/rpmtests
new file mode 100755 (executable)
index 0000000..7a2a9a7
--- /dev/null
@@ -0,0 +1,30451 @@
+#! /bin/sh
+# Generated from local.at by GNU Autoconf 2.69.
+#
+# Copyright (C) 2009-2012 Free Software Foundation, Inc.
+#
+# This test suite is free software; the Free Software Foundation gives
+# unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+        /*)
+          for as_base in sh bash ksh sh5; do
+            # Try only shells that exist, to save several forks.
+            as_shell=$as_dir/$as_base
+            if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+                   { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+                  if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+          done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+             { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# How were we run?
+at_cli_args="$@"
+
+
+# Not all shells have the 'times' builtin; the subshell is needed to make
+# sure we discard the 'times: not found' message from the shell.
+at_times_p=false
+(times) >/dev/null 2>&1 && at_times_p=:
+
+# CLI Arguments to pass to the debugging scripts.
+at_debug_args=
+# -e sets to true
+at_errexit_p=false
+# Shall we be verbose?  ':' means no, empty means yes.
+at_verbose=:
+at_quiet=
+# Running several jobs in parallel, 0 means as many as test groups.
+at_jobs=1
+at_traceon=:
+at_trace_echo=:
+at_check_filter_trace=:
+
+# Shall we keep the debug scripts?  Must be `:' when the suite is
+# run by a debug script, so that the script doesn't remove itself.
+at_debug_p=false
+# Display help message?
+at_help_p=false
+# Display the version message?
+at_version_p=false
+# List test groups?
+at_list_p=false
+# --clean
+at_clean=false
+# Test groups to run
+at_groups=
+# Whether to rerun failed tests.
+at_recheck=
+# Whether a write failure occurred
+at_write_fail=0
+
+# The directory we run the suite in.  Default to . if no -C option.
+at_dir=`pwd`
+# An absolute reference to this testsuite script.
+case $as_myself in
+  [\\/]* | ?:[\\/]* ) at_myself=$as_myself ;;
+  * ) at_myself=$at_dir/$as_myself ;;
+esac
+# Whether -C is in effect.
+at_change_dir=false
+
+# Whether to enable colored test results.
+at_color=no
+# List of the tested programs.
+at_tested='rpm
+rpmbuild
+rpmquery'
+# As many question marks as there are digits in the last test group number.
+# Used to normalize the test group numbers so that `ls' lists them in
+# numerical order.
+at_format='???'
+# Description of all the test groups.
+at_help_all="1;rpmgeneral.at:22;rpm --version;basic;
+2;rpmgeneral.at:31;rpmbuild --version;basic;
+3;rpmgeneral.at:40;rpm --showrc;basic;
+4;rpmgeneral.at:50;rpm --querytags;basic;
+5;rpmio.at:21;SIGPIPE from install scriptlet;signals;
+6;rpmquery.at:22;rpm --qf -p *.i386.rpm;query;
+7;rpmquery.at:36;rpm --qf -p *.src.rpm;query;
+8;rpmquery.at:50;rpm -ql -p *.src.rpm;query;
+9;rpmquery.at:65;rpmspec -q;query;
+10;rpmquery.at:77;rpm -ql -p *.i386.rpm;query;
+11;rpmquery.at:94;rpm -qp <manifest>;query;
+12;rpmquery.at:115;rpm -q --scripts -p *.i386.rpm;query;
+13;rpmquery.at:136;rpm -q on installed package;rpmdb install query;
+14;rpmquery.at:180;integer array query;query;
+15;rpmquery.at:196;formatted filesbypkg query;query;
+16;rpmquery.at:212;hex formatted integer array extension query;query;
+17;rpmquery.at:228;base64 extension query;query;
+18;rpmquery.at:241;pgpsig extension query;query signature;
+19;rpmquery.at:255;integer array perms format query;query;
+20;rpmquery.at:271;string array query;query;
+21;rpmquery.at:284;empty string array query;query;
+22;rpmquery.at:297;empty string array extension array format;query;
+23;rpmquery.at:310;empty string array extension query;query;
+24;rpmquery.at:323;different sizes arrays query 1;query;
+25;rpmquery.at:339;different sizes arrays query 2;query;
+26;rpmquery.at:353;different sizes arrays query 3;query;
+27;rpmquery.at:367;different sizes arrays query 4;query;
+28;rpmquery.at:383;non-existent string tag;query;
+29;rpmquery.at:396;non-existent integer tag query;query;
+30;rpmquery.at:409;conditional queryformat;query;
+31;rpmquery.at:422;invalid tag query;query;
+32;rpmquery.at:436;invalid data for format query;query;
+33;rpmquery.at:449;invalid format width query;query;
+34;rpmquery.at:462;xml format;query;
+35;rpmquery.at:761;query file attribute filtering;query;
+36;rpmverify.at:7;dependency problems;verify;
+37;rpmverify.at:32;files with no problems;verify;
+38;rpmverify.at:48;files with no problems in verbose mode;verify;
+39;rpmverify.at:67;directory replaced with a directory symlink;verify;
+40;rpmverify.at:98;directory replaced with an invalid directory symlink;verify;
+41;rpmverify.at:128;verify from db, with problems present;verify;
+42;rpmverify.at:150;verify from package, with problems present;verify;
+43;rpmverify.at:171;verify file attribute filtering;query;
+44;rpmverify.at:220;verifyscript failure;verify;
+45;rpmverify.at:237;verifyscript success;verify;
+46;rpmverify.at:256;shared file timestamp behavior;verify;
+47;rpmverify.at:285;Upgraded verification with min_writes 1 (files);upgrade verify min_writes;
+48;rpmverify.at:357;Upgraded verification with min_writes 2 (files);upgrade verify min_writes;
+49;rpmverify.at:436;Upgraded verification with min_writes 3 (LINKs);upgrade verify min_writes;
+50;rpmverify.at:503;Upgraded verification with min_writes 4 (LINKs);upgrade verify min_writes;
+51;rpmsigdig.at:7;rpmkeys -Kv <unsigned> 1;rpmkeys digest;
+52;rpmsigdig.at:31;rpmkeys -Kv <corrupted unsigned> 1;rpmkeys digest;
+53;rpmsigdig.at:56;rpmkeys -Kv <corrupted unsigned> 2;rpmkeys digest;
+54;rpmsigdig.at:81;rpmkeys -Kv <corrupted unsigned> 3;rpmkeys digest;
+55;rpmsigdig.at:106;rpmkeys -Kv <unsigned> 2;rpmkeys digest;
+56;rpmsigdig.at:135;rpmkeys --import rsa;rpmkeys import;
+57;rpmsigdig.at:196;rpmkeys -K <signed> 1;rpmkeys digest signature;
+58;rpmsigdig.at:216;rpmkeys -Kv <signed> 1;rpmkeys digest signature;
+59;rpmsigdig.at:258;rpmkeys -Kv <corrupted signed> 1;rpmkeys digest signature;
+60;rpmsigdig.at:294;rpmkeys -Kv <corrupted signed> 2;rpmkeys digest signature;
+61;rpmsigdig.at:331;rpmkeys -Kv <corrupted signed> 3;rpmkeys digest signature;
+62;rpmsigdig.at:368;rpmsign --addsign <unsigned>;rpmsign signature;
+63;rpmsigdig.at:403;rpmsign --delsign <package>;rpmsign signature;
+64;rpmsigdig.at:430;rpmsign --addsign <signed>;rpmsign signature;
+65;rpmdb.at:23;rpm --initdb;rpmdb;
+66;rpmdb.at:36;rpm -qa;rpmdb query;
+67;rpmdb.at:49;rpm -q foo;rpmdb query;
+68;rpmdb.at:69;rpm -q foo-;rpmdb query;
+69;rpmdb.at:90;rpm -i *.noarch.rpm;rpmdb install;
+70;rpmdb.at:106;rpm -U --replacepkgs 1;rpmdb install;
+71;rpmdb.at:128;rpm -U --replacepkgs 2;rpmdb install;
+72;rpmdb.at:150;rpm --reinstall 1;rpmdb install;
+73;rpmdb.at:173;rpm -i --relocate=.. *.i386.rpm;rpmdb install;
+74;rpmdb.at:192;rpm -i --relocate=.. *.ppc64.rpm;rpmdb install;
+75;rpmdb.at:208;rpmdb --rebuilddb;rpmdb;
+76;rpmdb.at:233;rpmdb --rebuilddb and verify empty database;rpmdb;
+77;rpmdb.at:248;rpm -U and verify status;install rpmdb query;
+78;rpmdb.at:271;rpm -U with _install_lang and verify status;install rpmdb query;
+79;rpmdb.at:297;rpm -U and verify files on disk;install rpmdb;
+80;rpmdb.at:318;rpm -e and verify files removed;install rpmdb;
+81;rpmi.at:21;rpm -U <manifest>;install;
+82;rpmi.at:36;rpm -U <manifest notfound 1>;install;
+83;rpmi.at:52;rpm -U <manifest notfound 2>;install;
+84;rpmi.at:68;rpm -U <notfound>;install;
+85;rpmi.at:83;rpm -U <unsigned>;install;
+86;rpmi.at:97;rpm -U <signed nokey>;install;
+87;rpmi.at:112;rpm -U <signed>;install;
+88;rpmi.at:127;rpm -U <corrupted signed 1>;install;
+89;rpmi.at:148;rpm -U <corrupted signed 2>;install;
+90;rpmi.at:173;rpm -U <corrupted signed 3>;install;
+91;rpmi.at:197;rpm -U *.src.rpm;install;
+92;rpmi.at:212;rpm -i *.src.rpm;install;
+93;rpmi.at:228;rpm -i <nonexistent file>;install;
+94;rpmi.at:240;rpm -i --nomanifest <garbage text file>;install;
+95;rpmi.at:257;rpm -i <garbage text file;install;
+96;rpmi.at:276;rpm -U upgrade to newer;;
+97;rpmi.at:299;rpm -U upgrade to older;;
+98;rpmi.at:314;rpm -U --oldpackage downgrade;;
+99;rpmi.at:330;rpm -U two versions of same package 1;;
+100;rpmi.at:350;rpm -U two versions of same package 2;;
+101;rpmi.at:370;rpm -U obsoleted package 1;;
+102;rpmi.at:399;rpm -U obsoleted package 2;;
+103;rpmi.at:428;rpm -i two versions of same package;;
+104;rpmi.at:447;rpm -i identical versions of same package;;
+105;rpmi.at:465;rpm -U with invalid --relocate;install relocate;
+106;rpmi.at:482;rpm -U --badreloc with invalid --relocate;install relocate;
+107;rpmi.at:498;rpm -i with/without --excludedocs;install excludedocs;
+108;rpmorder.at:3;basic install/erase order 1;install erase order;
+109;rpmbuild.at:23;rpmbuild -ba *.spec;build;
+110;rpmbuild.at:41;rpmbuild --rebuild;build;
+111;rpmbuild.at:54;rpmbuild --short-circuit -bl;build;
+112;rpmbuild.at:72;rpmbuild -tb <tar with bad spec>;build;
+113;rpmbuild.at:89;rpmbuild -tb;build;
+114;rpmbuild.at:104;rpmbuild %attr and %defattr;build;
+115;rpmbuild.at:144;rpmbuild hardlink;build;
+116;rpmbuild.at:175;rpmbuild unpackaged files;build;
+117;rpmbuild.at:195;rpmbuild unpackaged directories;build;
+118;rpmbuild.at:215;rpmbuild glob;build;
+119;rpmbuild.at:247;rpmbuild prefixpostfix;build;
+120;rpmbuild.at:282;Weak and reverse requires;build;
+121;rpmbuild.at:310;Build requires;build;
+122;rpmbuild.at:326;Dependency generation;build;
+123;rpmbuild.at:369;rpmspec query 1;build;
+124;rpmbuild.at:389;rpmbuild archive sanity;build;
+125;rpmbuild.at:407;rpmbuild debuginfo minisymtab;build debuginfo;
+126;rpmbuild.at:444;rpmbuild debuginfo minisymtab strip -g;build debuginfo;
+127;rpmbuild.at:483;rpmbuild debuginfo dwz;build debuginfo dwz;
+128;rpmbuild.at:575;rpmbuild debuginfo dwz unique debug names;build debuginfo dwz;
+129;rpmbuild.at:664;rpmbuild debuginfo dwz gnu_debuglink crc;build debuginfo;
+130;rpmbuild.at:698;rpmbuild implicit suid binary;build debuginfo dwz suid;
+131;rpmbuild.at:732;rpmbuild debuginfo gdb index included;build debuginfo gdb;
+132;rpmbuild.at:761;rpmbuild debuginfo no gdb index included;build debuginfo gdb;
+133;rpmbuild.at:789;rpmbuild debuginfo unique debug src dir;build debuginfo;
+134;rpmbuild.at:828;rpmbuild debuginfo no unique debug src dir;build debuginfo;
+135;rpmbuild.at:864;rpmbuild debugsource;build debuginfo debugsource;
+136;rpmbuild.at:899;rpmbuild debugsource debugsourcefiles.list path;build debuginfo debugsource;
+137;rpmbuild.at:927;rpmbuild debuginfo subpackages single;build debuginfo debugsubpackage;
+138;rpmbuild.at:969;rpmbuild debuginfo subpackages multiple;build debuginfo debugsubpackage;
+139;rpmbuild.at:1053;rpmbuild debuginfo subpackages multiple unique;build debuginfo debugsubpackage;
+140;rpmbuild.at:1137;rpmbuild debuginfo subpackages multiple unique debugsource;build debuginfo debugsubpackage debugsource;
+141;rpmbuild.at:1224;rpmbuild debuginfo subpackages multiple excluded;build debuginfo debugsubpackage debugsource;
+142;rpmbuild.at:1288;rpmbuild debuginfo subpackages multiple excluded;build debuginfo debugsubpackage debugsource;
+143;rpmbuildid.at:23;rpmbuild buildid none;build debuginfo buildid;
+144;rpmbuildid.at:57;rpmbuild buildid alldebug;build debuginfo buildid;
+145;rpmbuildid.at:149;rpmbuild buildid alldebug unique debug names;build debuginfo buildid;
+146;rpmbuildid.at:240;rpmbuild buildid separate;build debuginfo buildid;
+147;rpmbuildid.at:331;rpmbuild buildid separate unique debug names;build debuginfo buildid;
+148;rpmbuildid.at:421;rpmbuild buildid compat;build debuginfo buildid;
+149;rpmbuildid.at:525;rpmbuild buildid compat unique debug names;build debuginfo buildid;
+150;rpmbuildid.at:629;rpmbuild buildid duplicate alldebug;build debuginfo buildid;
+151;rpmbuildid.at:697;rpmbuild buildid hardlink alldebug;build debuginfo buildid;
+152;rpmbuildid.at:762;rpmbuild buildid duplicate separate;build debuginfo buildid;
+153;rpmbuildid.at:827;rpmbuild buildid hardlink separate;build debuginfo buildid;
+154;rpmbuildid.at:889;rpmbuild buildid duplicate compat;build debuginfo buildid;
+155;rpmbuildid.at:966;rpmbuild buildid hardlink compat;build debuginfo buildid;
+156;rpmbuildid.at:1039;rpmbuild buildid recompute;build debuginfo buildid;
+157;rpmbuildid.at:1153;rpmbuild buildid unique r1 r2;build debuginfo buildid;
+158;rpmbuildid.at:1201;rpmbuild buildid non-unique r1 r2;build debuginfo buildid;
+159;rpmbuildid.at:1253;rpmbuild buildid attrs;build debuginfo buildid;
+160;rpmbuildid.at:1287;rpmbuild buildid config attrs;build debuginfo buildid;
+161;rpmscript.at:7;basic scripts and arguments;verify;
+162;rpmscript.at:44;basic trigger scripts and arguments;trigger script;
+163;rpmscript.at:102;basic file trigger scripts;file trigger script;
+164;rpmscript.at:205;basic file triggers 2;filetrigger script;
+165;rpmvercmp.at:13;rpmvercmp(1.0, 1.0) = 0;vercmp;
+166;rpmvercmp.at:14;rpmvercmp(1.0, 2.0) = -1;vercmp;
+167;rpmvercmp.at:15;rpmvercmp(2.0, 1.0) = 1;vercmp;
+168;rpmvercmp.at:17;rpmvercmp(2.0.1, 2.0.1) = 0;vercmp;
+169;rpmvercmp.at:18;rpmvercmp(2.0, 2.0.1) = -1;vercmp;
+170;rpmvercmp.at:19;rpmvercmp(2.0.1, 2.0) = 1;vercmp;
+171;rpmvercmp.at:21;rpmvercmp(2.0.1a, 2.0.1a) = 0;vercmp;
+172;rpmvercmp.at:22;rpmvercmp(2.0.1a, 2.0.1) = 1;vercmp;
+173;rpmvercmp.at:23;rpmvercmp(2.0.1, 2.0.1a) = -1;vercmp;
+174;rpmvercmp.at:25;rpmvercmp(5.5p1, 5.5p1) = 0;vercmp;
+175;rpmvercmp.at:26;rpmvercmp(5.5p1, 5.5p2) = -1;vercmp;
+176;rpmvercmp.at:27;rpmvercmp(5.5p2, 5.5p1) = 1;vercmp;
+177;rpmvercmp.at:29;rpmvercmp(5.5p10, 5.5p10) = 0;vercmp;
+178;rpmvercmp.at:30;rpmvercmp(5.5p1, 5.5p10) = -1;vercmp;
+179;rpmvercmp.at:31;rpmvercmp(5.5p10, 5.5p1) = 1;vercmp;
+180;rpmvercmp.at:33;rpmvercmp(10xyz, 10.1xyz) = -1;vercmp;
+181;rpmvercmp.at:34;rpmvercmp(10.1xyz, 10xyz) = 1;vercmp;
+182;rpmvercmp.at:36;rpmvercmp(xyz10, xyz10) = 0;vercmp;
+183;rpmvercmp.at:37;rpmvercmp(xyz10, xyz10.1) = -1;vercmp;
+184;rpmvercmp.at:38;rpmvercmp(xyz10.1, xyz10) = 1;vercmp;
+185;rpmvercmp.at:40;rpmvercmp(xyz.4, xyz.4) = 0;vercmp;
+186;rpmvercmp.at:41;rpmvercmp(xyz.4, 8) = -1;vercmp;
+187;rpmvercmp.at:42;rpmvercmp(8, xyz.4) = 1;vercmp;
+188;rpmvercmp.at:43;rpmvercmp(xyz.4, 2) = -1;vercmp;
+189;rpmvercmp.at:44;rpmvercmp(2, xyz.4) = 1;vercmp;
+190;rpmvercmp.at:46;rpmvercmp(5.5p2, 5.6p1) = -1;vercmp;
+191;rpmvercmp.at:47;rpmvercmp(5.6p1, 5.5p2) = 1;vercmp;
+192;rpmvercmp.at:49;rpmvercmp(5.6p1, 6.5p1) = -1;vercmp;
+193;rpmvercmp.at:50;rpmvercmp(6.5p1, 5.6p1) = 1;vercmp;
+194;rpmvercmp.at:52;rpmvercmp(6.0.rc1, 6.0) = 1;vercmp;
+195;rpmvercmp.at:53;rpmvercmp(6.0, 6.0.rc1) = -1;vercmp;
+196;rpmvercmp.at:55;rpmvercmp(10b2, 10a1) = 1;vercmp;
+197;rpmvercmp.at:56;rpmvercmp(10a2, 10b2) = -1;vercmp;
+198;rpmvercmp.at:58;rpmvercmp(1.0aa, 1.0aa) = 0;vercmp;
+199;rpmvercmp.at:59;rpmvercmp(1.0a, 1.0aa) = -1;vercmp;
+200;rpmvercmp.at:60;rpmvercmp(1.0aa, 1.0a) = 1;vercmp;
+201;rpmvercmp.at:62;rpmvercmp(10.0001, 10.0001) = 0;vercmp;
+202;rpmvercmp.at:63;rpmvercmp(10.0001, 10.1) = 0;vercmp;
+203;rpmvercmp.at:64;rpmvercmp(10.1, 10.0001) = 0;vercmp;
+204;rpmvercmp.at:65;rpmvercmp(10.0001, 10.0039) = -1;vercmp;
+205;rpmvercmp.at:66;rpmvercmp(10.0039, 10.0001) = 1;vercmp;
+206;rpmvercmp.at:68;rpmvercmp(4.999.9, 5.0) = -1;vercmp;
+207;rpmvercmp.at:69;rpmvercmp(5.0, 4.999.9) = 1;vercmp;
+208;rpmvercmp.at:71;rpmvercmp(20101121, 20101121) = 0;vercmp;
+209;rpmvercmp.at:72;rpmvercmp(20101121, 20101122) = -1;vercmp;
+210;rpmvercmp.at:73;rpmvercmp(20101122, 20101121) = 1;vercmp;
+211;rpmvercmp.at:75;rpmvercmp(2_0, 2_0) = 0;vercmp;
+212;rpmvercmp.at:76;rpmvercmp(2.0, 2_0) = 0;vercmp;
+213;rpmvercmp.at:77;rpmvercmp(2_0, 2.0) = 0;vercmp;
+214;rpmvercmp.at:80;rpmvercmp(a, a) = 0;vercmp;
+215;rpmvercmp.at:81;rpmvercmp(a+, a+) = 0;vercmp;
+216;rpmvercmp.at:82;rpmvercmp(a+, a_) = 0;vercmp;
+217;rpmvercmp.at:83;rpmvercmp(a_, a+) = 0;vercmp;
+218;rpmvercmp.at:84;rpmvercmp(+a, +a) = 0;vercmp;
+219;rpmvercmp.at:85;rpmvercmp(+a, _a) = 0;vercmp;
+220;rpmvercmp.at:86;rpmvercmp(_a, +a) = 0;vercmp;
+221;rpmvercmp.at:87;rpmvercmp(+_, +_) = 0;vercmp;
+222;rpmvercmp.at:88;rpmvercmp(_+, +_) = 0;vercmp;
+223;rpmvercmp.at:89;rpmvercmp(_+, _+) = 0;vercmp;
+224;rpmvercmp.at:90;rpmvercmp(+, _) = 0;vercmp;
+225;rpmvercmp.at:91;rpmvercmp(_, +) = 0;vercmp;
+226;rpmvercmp.at:94;rpmvercmp(1.0~rc1, 1.0~rc1) = 0;vercmp;
+227;rpmvercmp.at:95;rpmvercmp(1.0~rc1, 1.0) = -1;vercmp;
+228;rpmvercmp.at:96;rpmvercmp(1.0, 1.0~rc1) = 1;vercmp;
+229;rpmvercmp.at:97;rpmvercmp(1.0~rc1, 1.0~rc2) = -1;vercmp;
+230;rpmvercmp.at:98;rpmvercmp(1.0~rc2, 1.0~rc1) = 1;vercmp;
+231;rpmvercmp.at:99;rpmvercmp(1.0~rc1~git123, 1.0~rc1~git123) = 0;vercmp;
+232;rpmvercmp.at:100;rpmvercmp(1.0~rc1~git123, 1.0~rc1) = -1;vercmp;
+233;rpmvercmp.at:101;rpmvercmp(1.0~rc1, 1.0~rc1~git123) = 1;vercmp;
+234;rpmdeps.at:7;missing dependency;install;
+235;rpmdeps.at:30;cross-depending packages;install;
+236;rpmdeps.at:56;unsatisfied versioned require;install;
+237;rpmdeps.at:84;satisfied versioned require;install;
+238;rpmdeps.at:110;versioned conflict in transaction;install;
+239;rpmdeps.at:137;versioned conflict in database;install;
+240;rpmdeps.at:163;install and verify self-conflicting package;install;
+241;rpmdeps.at:185;explicit file conflicts;install;
+242;rpmdeps.at:224;erase to break dependencies;install;
+243;rpmdeps.at:252;erase to break colored file dependency;install;
+244;rpmdeps.at:281;erase on wrong-colored file dependency;install;
+245;rpmdeps.at:309;unsatisfied WITH require;install, boolean;
+246;rpmdeps.at:340;unsatisfied WITH require (rpmdb);install, boolean;
+247;rpmdeps.at:373;satisfied WITH require;install, boolean;
+248;rpmdeps.at:397;satisfied WITH require (rpmdb);install, boolean;
+249;rpmdeps.at:425;unsatisfied WITHOUT require;install, boolean;
+250;rpmdeps.at:451;unsatisfied WITHOUT require (rpmdb);install, boolean;
+251;rpmdeps.at:479;satisfied WITHOUT require;install, boolean;
+252;rpmdeps.at:502;satisfied WITHOUT require (rpmdb);install, boolean;
+253;rpmdeps.at:529;unsatisfied AND require - all missing;install, boolean;
+254;rpmdeps.at:550;unsatisfied AND require - first is missing;install, boolean;
+255;rpmdeps.at:575;unsatisfied AND require - second is missing;install, boolean;
+256;rpmdeps.at:600;satisfied AND require;install, boolean;
+257;rpmdeps.at:629;unsatisfied OR require - all missing;install, boolean;
+258;rpmdeps.at:650;satisfied OR require - first is missing;install, boolean;
+259;rpmdeps.at:673;satisfied OR require - second is missing;install, boolean;
+260;rpmdeps.at:696;satisfied OR require - both present;install, boolean;
+261;rpmdeps.at:725;unsatisfied IF require;install, boolean;
+262;rpmdeps.at:750;satisfied IF require;install, boolean;
+263;rpmdeps.at:777;unsatisfied IF-ELSE require;install, boolean;
+264;rpmdeps.at:798;satisfied IF-ELSE require - right clause;install, boolean;
+265;rpmdeps.at:821;satisfied IF-ELSE require - left clause;install, boolean;
+266;rpmdeps.at:850;unsatisfied nested AND-OR require;install, boolean;
+267;rpmdeps.at:875;satisfied nested AND-OR require;install, boolean;
+268;rpmdeps.at:904;satisfied nested AND-IF require - without right clause;install, boolean;
+269;rpmdeps.at:927;satisfied nested AND-IF require - with right clause;install, boolean;
+270;rpmconflict.at:7;package with file conflict;install;
+271;rpmconflict.at:31;two packages with a conflicting file;install;
+272;rpmconflict.at:48;package with shareable file;install;
+273;rpmconflict.at:72;two packages with shareable file;install;
+274;rpmconflict.at:89;non-conflicting identical basenames;install;
+275;rpmconflict.at:107;conflicting identical basenames;install;
+276;rpmconflict.at:127;multilib elf conflict, prefer 64bit 1;install;
+277;rpmconflict.at:149;multilib elf conflict, prefer 64bit 2;install;
+278;rpmconflict.at:176;multilib elf conflict, prefer 64bit 3;install;
+279;rpmconflict.at:203;multilib elf conflict, prefer 32bit 1;install;
+280;rpmconflict.at:225;multilib elf conflict, prefer 32bit 2;install;
+281;rpmconflict.at:252;multilib elf conflict, prefer 32bit 3;install;
+282;rpmconflict.at:279;multilib elf vs non-elf file conflict 1;install;
+283;rpmconflict.at:300;multilib elf vs non-elf file conflict 2;install;
+284;rpmconflict.at:325;multilib elf vs non-elf file conflict 3;install;
+285;rpmconflict.at:351;replacing directory with symlink;install;
+286;rpmconflict.at:375;replacing symlink with directory;install;
+287;rpmconflict.at:400;real file with shared ghost;install;
+288;rpmreplace.at:4;upgrade to/from regular file;install;
+289;rpmreplace.at:40;upgrade regular file to/from broken link;install;
+290;rpmreplace.at:76;upgrade regular file to/from file link;install;
+291;rpmreplace.at:112;upgrade broken link to broken link;install;
+292;rpmreplace.at:145;upgrade file link to file link;install;
+293;rpmreplace.at:178;upgrade directory link to directory link;install;
+294;rpmreplace.at:211;upgrade regular file to directory;install;
+295;rpmreplace.at:242;upgrade broken link to directory;install;
+296;rpmreplace.at:273;upgrade file link to directory;install;
+297;rpmreplace.at:304;upgrade directory link to directory;install;
+298;rpmreplace.at:335;upgrade empty directory to empty directory;install;
+299;rpmreplace.at:363;upgrade empty directory to regular file;install;
+300;rpmreplace.at:392;upgrade locally symlinked directory;install;
+301;rpmreplace.at:428;upgrade invalid locally symlinked directory;install;
+302;rpmreplace.at:460;upgrade empty directory to broken link;install;
+303;rpmreplace.at:489;upgrade empty directory to file link;install;
+304;rpmreplace.at:518;upgrade removed empty directory to file link;install;
+305;rpmreplace.at:548;upgrade replaced empty directory to file link;install;
+306;rpmreplace.at:578;upgrade empty directory to file link with pretrans;install;
+307;rpmconfig.at:6;install config on existiting file;install;
+308;rpmconfig.at:35;install config(noreplace) on existing file;install;
+309;rpmconfig.at:70;install config on existiting identical file;install;
+310;rpmconfig.at:97;erase unchanged config;install;
+311;rpmconfig.at:123;erase changed config;install;
+312;rpmconfig.at:153;erase changed config(noreplace);install;
+313;rpmconfig.at:185;upgrade unchanged config;install;
+314;rpmconfig.at:215;upgrade unchanged config - touching test;install;
+315;rpmconfig.at:243;upgrade modified config;install;
+316;rpmconfig.at:276;upgrade changing config;install;
+317;rpmconfig.at:306;upgrade changing, modified config 1;install;
+318;rpmconfig.at:342;upgrade changing, modified config 2;install;
+319;rpmconfig.at:377;upgrade unchanged config(noreplace);install;
+320;rpmconfig.at:409;upgrade modified config(noreplace);install;
+321;rpmconfig.at:443;upgrade changing config(noreplace);install;
+322;rpmconfig.at:474;upgrade changing, modified config(noreplace) 1;install;
+323;rpmconfig.at:511;upgrade changing, modified config(noreplace) 2;install;
+324;rpmconfig.at:546;upgrade unchanged shared config;install;
+325;rpmconfig.at:584;upgrade modified shared config;install;
+326;rpmconfig.at:624;upgrade changing shared config;install;
+327;rpmconfig.at:661;upgrade changing, modified shared config 1;install;
+328;rpmconfig.at:704;upgrade changing, modified shared config 2;install;
+329;rpmconfig.at:745;upgrade changing, modified shared config(noreplace) 1;install;
+330;rpmconfig.at:789;upgrade changing, modified shared config(noreplace) 2;install;
+331;rpmconfig.at:830;install/upgrade/erase ghost config;install;
+332;rpmconfig2.at:6;install config on existiting symlink;install;
+333;rpmconfig2.at:36;install config on existiting identical link;install;
+334;rpmconfig2.at:66;erase unchanged config link;install;
+335;rpmconfig2.at:93;erase changed config link;install;
+336;rpmconfig2.at:124;upgrade unchanged config link;install;
+337;rpmconfig2.at:155;upgrade unchanged config link - touching test;install;
+338;rpmconfig2.at:185;upgrade modified config link;install;
+339;rpmconfig2.at:219;upgrade changing config link;install;
+340;rpmconfig2.at:250;upgrade changing, modified config link 1;install;
+341;rpmconfig2.at:287;upgrade changing, modified config link 2;install;
+342;rpmconfig2.at:323;upgrade unchanged config(noreplace) link;install;
+343;rpmconfig2.at:356;upgrade modified config(noreplace) link;install;
+344;rpmconfig2.at:391;upgrade changing config(noreplace) link;install;
+345;rpmconfig2.at:423;upgrade changing, modified config(noreplace) link 1;install;
+346;rpmconfig2.at:461;upgrade changing, modified config(noreplace) link 2;install;
+347;rpmconfig2.at:498;upgrade unchanged shared config link;install;
+348;rpmconfig2.at:537;upgrade modified shared config link;install;
+349;rpmconfig2.at:578;upgrade changing shared config link;install;
+350;rpmconfig2.at:616;upgrade changing, modified shared config link 1;install;
+351;rpmconfig2.at:660;upgrade changing, modified shared config link 2;install;
+352;rpmconfig2.at:702;upgrade changing, modified shared config(noreplace) link 1;install;
+353;rpmconfig2.at:747;upgrade changing, modified shared config(noreplace) link 2;install;
+354;rpmconfig3.at:6;upgrade config to/from non-config;install;
+355;rpmconfig3.at:44;upgrade modified config to/from non-config 1;install;
+356;rpmconfig3.at:88;upgrade modified config to/from non-config 2;install;
+357;rpmconfig3.at:129;upgrade config to/from config link;install;
+358;rpmconfig3.at:166;upgrade modified config to config link;install;
+359;rpmconfig3.at:206;upgrade modified config link to config;install;
+360;rpmconfig3.at:246;upgrade config to directory;install;
+361;rpmconfig3.at:278;upgrade modified config to directory;install;
+362;rpmmacro.at:6;simple rpm --eval;macros;
+363;rpmmacro.at:17;invalid rpm --eval;macros;
+364;rpmmacro.at:29;invalid rpm --define;macros;
+365;rpmmacro.at:40;rpm --undefine;macros;
+366;rpmmacro.at:55;simple true conditional rpm --eval;macros;
+367;rpmmacro.at:65;simple false conditional rpm --eval;macros;
+368;rpmmacro.at:75;nested macro in name;macros;
+369;rpmmacro.at:85;parametrized macro 1;macros;
+370;rpmmacro.at:121;parametrized macro 2;macros;
+371;rpmmacro.at:134;parametrized macro 3;macros;
+372;rpmmacro.at:146;parametrized macro 4;macros;
+373;rpmmacro.at:161;parametrized macro 5;macros;
+374;rpmmacro.at:190;uncompress macro;macros;
+375;rpmmacro.at:202;basename macro;macros;
+376;rpmmacro.at:213;shrink macro;macros;
+377;rpmmacro.at:224;suffix macro;macros;
+378;rpmmacro.at:235;url2path macro;macros;
+379;rpmmacro.at:246;shell expansion;macros;
+380;rpmmacro.at:257;simple lua --eval;macros lua;
+381;rpmmacro.at:267;lua rpm extensions;macros lua;
+382;rpmmacro.at:277;lua posix extensions;macros lua;
+383;rpmmacro.at:288;lua script exit behavior;macros lua;
+384;rpmmacro.at:300;%define + %undefine in nested levels 1;macros define undefine;
+385;rpmmacro.at:315;%define + %undefine in nested levels 2;macros define;
+386;rpmmacro.at:331;%define + %undefine in nested levels 3;macros define;
+387;rpmmacro.at:349;%define + %undefine in nested levels 4;macros define global;
+388;rpmmacro.at:371;%define in conditional macro;macros;
+389;rpmmacro.at:389;%verbose negative test;macros verbose;
+390;rpmmacro.at:407;%verbose positive test;macros verbose;
+391;rpmpython.at:6;module import;python;
+392;rpmpython.at:12;macro manipulation;python;
+393;rpmpython.at:35;basic rpmio;python;
+394;rpmpython.at:70;spec parse;python;
+395;rpmpython.at:85;basic header manipulation;python;
+396;rpmpython.at:110;invalid header data;python;
+397;rpmpython.at:129;reading a package file;python;
+398;rpmpython.at:137;reading a signed package file 1;python;
+399;rpmpython.at:152;reading a signed package file 2;python;
+400;rpmpython.at:170;add package to transaction;python;
+401;rpmpython.at:182;add bogus package to transaction 1;python;
+402;rpmpython.at:196;add bogus package to transaction 2;python;
+403;rpmpython.at:217;database iterators;python rpmdb;
+404;rpmpython.at:316;dependency sets 1;python;
+405;rpmpython.at:333;dependency sets 2;python;
+406;rpmpython.at:343;file info sets 1;python;
+407;rpmpython.at:360;string pool 1;python;
+408;rpmpython.at:375;string pool 2;python;
+409;rpmpython.at:393;archive 1;python;
+410;rpmpython.at:413;header unload;python;
+411;rpmdepmatch.at:4;provide - require pairs;python;
+"
+# List of the all the test groups.
+at_groups_all=`$as_echo "$at_help_all" | sed 's/;.*//'`
+
+# at_fn_validate_ranges NAME...
+# -----------------------------
+# Validate and normalize the test group number contained in each variable
+# NAME. Leading zeroes are treated as decimal.
+at_fn_validate_ranges ()
+{
+  for at_grp
+  do
+    eval at_value=\$$at_grp
+    if test $at_value -lt 1 || test $at_value -gt 411; then
+      $as_echo "invalid test group: $at_value" >&2
+      exit 1
+    fi
+    case $at_value in
+      0*) # We want to treat leading 0 as decimal, like expr and test, but
+         # AS_VAR_ARITH treats it as octal if it uses $(( )).
+         # With XSI shells, ${at_value#${at_value%%[1-9]*}} avoids the
+         # expr fork, but it is not worth the effort to determine if the
+         # shell supports XSI when the user can just avoid leading 0.
+         eval $at_grp='`expr $at_value + 0`' ;;
+    esac
+  done
+}
+
+at_prev=
+for at_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$at_prev"; then
+    at_option=$at_prev=$at_option
+    at_prev=
+  fi
+
+  case $at_option in
+  *=?*) at_optarg=`expr "X$at_option" : '[^=]*=\(.*\)'` ;;
+  *)    at_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $at_option in
+    --help | -h )
+       at_help_p=:
+       ;;
+
+    --list | -l )
+       at_list_p=:
+       ;;
+
+    --version | -V )
+       at_version_p=:
+       ;;
+
+    --clean | -c )
+       at_clean=:
+       ;;
+
+    --color )
+       at_color=always
+       ;;
+    --color=* )
+       case $at_optarg in
+       no | never | none) at_color=never ;;
+       auto | tty | if-tty) at_color=auto ;;
+       always | yes | force) at_color=always ;;
+       *) at_optname=`echo " $at_option" | sed 's/^ //; s/=.*//'`
+          as_fn_error $? "unrecognized argument to $at_optname: $at_optarg" ;;
+       esac
+       ;;
+
+    --debug | -d )
+       at_debug_p=:
+       ;;
+
+    --errexit | -e )
+       at_debug_p=:
+       at_errexit_p=:
+       ;;
+
+    --verbose | -v )
+       at_verbose=; at_quiet=:
+       ;;
+
+    --trace | -x )
+       at_traceon='set -x'
+       at_trace_echo=echo
+       at_check_filter_trace=at_fn_filter_trace
+       ;;
+
+    [0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9])
+       at_fn_validate_ranges at_option
+       as_fn_append at_groups "$at_option$as_nl"
+       ;;
+
+    # Ranges
+    [0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-)
+       at_range_start=`echo $at_option |tr -d X-`
+       at_fn_validate_ranges at_range_start
+       at_range=`$as_echo "$at_groups_all" | \
+         sed -ne '/^'$at_range_start'$/,$p'`
+       as_fn_append at_groups "$at_range$as_nl"
+       ;;
+
+    -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9])
+       at_range_end=`echo $at_option |tr -d X-`
+       at_fn_validate_ranges at_range_end
+       at_range=`$as_echo "$at_groups_all" | \
+         sed -ne '1,/^'$at_range_end'$/p'`
+       as_fn_append at_groups "$at_range$as_nl"
+       ;;
+
+    [0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9] | \
+    [0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9] | \
+    [0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9] | \
+    [0-9][0-9][0-9]-[0-9][0-9][0-9] | \
+    [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] | \
+    [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] )
+       at_range_start=`expr $at_option : '\(.*\)-'`
+       at_range_end=`expr $at_option : '.*-\(.*\)'`
+       if test $at_range_start -gt $at_range_end; then
+         at_tmp=$at_range_end
+         at_range_end=$at_range_start
+         at_range_start=$at_tmp
+       fi
+       at_fn_validate_ranges at_range_start at_range_end
+       at_range=`$as_echo "$at_groups_all" | \
+         sed -ne '/^'$at_range_start'$/,/^'$at_range_end'$/p'`
+       as_fn_append at_groups "$at_range$as_nl"
+       ;;
+
+    # Directory selection.
+    --directory | -C )
+       at_prev=--directory
+       ;;
+    --directory=* )
+       at_change_dir=:
+       at_dir=$at_optarg
+       if test x- = "x$at_dir" ; then
+         at_dir=./-
+       fi
+       ;;
+
+    # Parallel execution.
+    --jobs | -j )
+       at_jobs=0
+       ;;
+    --jobs=* | -j[0-9]* )
+       if test -n "$at_optarg"; then
+         at_jobs=$at_optarg
+       else
+         at_jobs=`expr X$at_option : 'X-j\(.*\)'`
+       fi
+       case $at_jobs in *[!0-9]*)
+         at_optname=`echo " $at_option" | sed 's/^ //; s/[0-9=].*//'`
+         as_fn_error $? "non-numeric argument to $at_optname: $at_jobs" ;;
+       esac
+       ;;
+
+    # Keywords.
+    --keywords | -k )
+       at_prev=--keywords
+       ;;
+    --keywords=* )
+       at_groups_selected=$at_help_all
+       at_save_IFS=$IFS
+       IFS=,
+       set X $at_optarg
+       shift
+       IFS=$at_save_IFS
+       for at_keyword
+       do
+         at_invert=
+         case $at_keyword in
+         '!'*)
+           at_invert="-v"
+           at_keyword=`expr "X$at_keyword" : 'X!\(.*\)'`
+           ;;
+         esac
+         # It is on purpose that we match the test group titles too.
+         at_groups_selected=`$as_echo "$at_groups_selected" |
+             grep -i $at_invert "^[1-9][^;]*;.*[; ]$at_keyword[ ;]"`
+       done
+       # Smash the keywords.
+       at_groups_selected=`$as_echo "$at_groups_selected" | sed 's/;.*//'`
+       as_fn_append at_groups "$at_groups_selected$as_nl"
+       ;;
+    --recheck)
+       at_recheck=:
+       ;;
+
+    *=*)
+       at_envvar=`expr "x$at_option" : 'x\([^=]*\)='`
+       # Reject names that are not valid shell variable names.
+       case $at_envvar in
+         '' | [0-9]* | *[!_$as_cr_alnum]* )
+           as_fn_error $? "invalid variable name: \`$at_envvar'" ;;
+       esac
+       at_value=`$as_echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"`
+       # Export now, but save eval for later and for debug scripts.
+       export $at_envvar
+       as_fn_append at_debug_args " $at_envvar='$at_value'"
+       ;;
+
+     *) $as_echo "$as_me: invalid option: $at_option" >&2
+       $as_echo "Try \`$0 --help' for more information." >&2
+       exit 1
+       ;;
+  esac
+done
+
+# Verify our last option didn't require an argument
+if test -n "$at_prev"; then :
+  as_fn_error $? "\`$at_prev' requires an argument"
+fi
+
+# The file containing the suite.
+at_suite_log=$at_dir/$as_me.log
+
+# Selected test groups.
+if test -z "$at_groups$at_recheck"; then
+  at_groups=$at_groups_all
+else
+  if test -n "$at_recheck" && test -r "$at_suite_log"; then
+    at_oldfails=`sed -n '
+      /^Failed tests:$/,/^Skipped tests:$/{
+       s/^[ ]*\([1-9][0-9]*\):.*/\1/p
+      }
+      /^Unexpected passes:$/,/^## Detailed failed tests/{
+       s/^[ ]*\([1-9][0-9]*\):.*/\1/p
+      }
+      /^## Detailed failed tests/q
+      ' "$at_suite_log"`
+    as_fn_append at_groups "$at_oldfails$as_nl"
+  fi
+  # Sort the tests, removing duplicates.
+  at_groups=`$as_echo "$at_groups" | sort -nu | sed '/^$/d'`
+fi
+
+if test x"$at_color" = xalways \
+   || { test x"$at_color" = xauto && test -t 1; }; then
+  at_red=`printf '\033[0;31m'`
+  at_grn=`printf '\033[0;32m'`
+  at_lgn=`printf '\033[1;32m'`
+  at_blu=`printf '\033[1;34m'`
+  at_std=`printf '\033[m'`
+else
+  at_red= at_grn= at_lgn= at_blu= at_std=
+fi
+
+# Help message.
+if $at_help_p; then
+  cat <<_ATEOF || at_write_fail=1
+Usage: $0 [OPTION]... [VARIABLE=VALUE]... [TESTS]
+
+Run all the tests, or the selected TESTS, given by numeric ranges, and
+save a detailed log file.  Upon failure, create debugging scripts.
+
+Do not change environment variables directly.  Instead, set them via
+command line arguments.  Set \`AUTOTEST_PATH' to select the executables
+to exercise.  Each relative directory is expanded as build and source
+directories relative to the top level of this distribution.
+E.g., from within the build directory /tmp/foo-1.0, invoking this:
+
+  $ $0 AUTOTEST_PATH=bin
+
+is equivalent to the following, assuming the source directory is /src/foo-1.0:
+
+  PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH $0
+_ATEOF
+cat <<_ATEOF || at_write_fail=1
+
+Operation modes:
+  -h, --help     print the help message, then exit
+  -V, --version  print version number, then exit
+  -c, --clean    remove all the files this test suite might create and exit
+  -l, --list     describes all the tests, or the selected TESTS
+_ATEOF
+cat <<_ATEOF || at_write_fail=1
+
+Execution tuning:
+  -C, --directory=DIR
+                 change to directory DIR before starting
+      --color[=never|auto|always]
+                 enable colored test results on terminal, or always
+  -j, --jobs[=N]
+                 Allow N jobs at once; infinite jobs with no arg (default 1)
+  -k, --keywords=KEYWORDS
+                 select the tests matching all the comma-separated KEYWORDS
+                 multiple \`-k' accumulate; prefixed \`!' negates a KEYWORD
+      --recheck  select all tests that failed or passed unexpectedly last time
+  -e, --errexit  abort as soon as a test fails; implies --debug
+  -v, --verbose  force more detailed output
+                 default for debugging scripts
+  -d, --debug    inhibit clean up and top-level logging
+                 default for debugging scripts
+  -x, --trace    enable tests shell tracing
+_ATEOF
+cat <<_ATEOF || at_write_fail=1
+
+Report bugs to <rpm-maint@lists.rpm.org>.
+_ATEOF
+  exit $at_write_fail
+fi
+
+# List of tests.
+if $at_list_p; then
+  cat <<_ATEOF || at_write_fail=1
+rpm 4.14.1 test suite test groups:
+
+ NUM: FILE-NAME:LINE     TEST-GROUP-NAME
+      KEYWORDS
+
+_ATEOF
+  # Pass an empty line as separator between selected groups and help.
+  $as_echo "$at_groups$as_nl$as_nl$at_help_all" |
+    awk 'NF == 1 && FS != ";" {
+          selected[$ 1] = 1
+          next
+        }
+        /^$/ { FS = ";" }
+        NF > 0 {
+          if (selected[$ 1]) {
+            printf " %3d: %-18s %s\n", $ 1, $ 2, $ 3
+            if ($ 4) {
+              lmax = 79
+              indent = "     "
+              line = indent
+              len = length (line)
+              n = split ($ 4, a, " ")
+              for (i = 1; i <= n; i++) {
+                l = length (a[i]) + 1
+                if (i > 1 && len + l > lmax) {
+                  print line
+                  line = indent " " a[i]
+                  len = length (line)
+                } else {
+                  line = line " " a[i]
+                  len += l
+                }
+              }
+              if (n)
+                print line
+            }
+          }
+        }' || at_write_fail=1
+  exit $at_write_fail
+fi
+if $at_version_p; then
+  $as_echo "$as_me (rpm 4.14.1)" &&
+  cat <<\_ATEOF || at_write_fail=1
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This test suite is free software; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+_ATEOF
+  exit $at_write_fail
+fi
+
+# Should we print banners?  Yes if more than one test is run.
+case $at_groups in #(
+  *$as_nl* )
+      at_print_banners=: ;; #(
+  * ) at_print_banners=false ;;
+esac
+# Text for banner N, set to a single space once printed.
+# Banner 1. rpmgeneral.at:19
+# Category starts at test group 1.
+at_banner_text_1="Basic tests"
+# Banner 2. rpmio.at:3
+# Category starts at test group 5.
+at_banner_text_2="I/O"
+# Banner 3. rpmquery.at:19
+# Category starts at test group 6.
+at_banner_text_3="RPM queries"
+# Banner 4. rpmverify.at:3
+# Category starts at test group 36.
+at_banner_text_4="RPM verification"
+# Banner 5. rpmsigdig.at:3
+# Category starts at test group 51.
+at_banner_text_5="RPM signatures and digests"
+# Banner 6. rpmdb.at:19
+# Category starts at test group 65.
+at_banner_text_6="RPM database access"
+# Banner 7. rpmi.at:19
+# Category starts at test group 81.
+at_banner_text_7="RPM install tests"
+# Banner 8. rpmorder.at:1
+# Category starts at test group 108.
+at_banner_text_8="RPM install/erase ordering"
+# Banner 9. rpmbuild.at:19
+# Category starts at test group 109.
+at_banner_text_9="RPM build"
+# Banner 10. rpmbuildid.at:19
+# Category starts at test group 143.
+at_banner_text_10="RPM buildid tests"
+# Banner 11. rpmscript.at:3
+# Category starts at test group 161.
+at_banner_text_11="RPM scriptlets"
+# Banner 12. rpmvercmp.at:11
+# Category starts at test group 165.
+at_banner_text_12="RPM version comparison"
+# Banner 13. rpmdeps.at:3
+# Category starts at test group 234.
+at_banner_text_13="RPM dependencies"
+# Banner 14. rpmconflict.at:3
+# Category starts at test group 270.
+at_banner_text_14="RPM implicit file conflicts"
+# Banner 15. rpmreplace.at:2
+# Category starts at test group 288.
+at_banner_text_15="RPM file replacement"
+# Banner 16. rpmconfig.at:3
+# Category starts at test group 307.
+at_banner_text_16="RPM config file behavior"
+# Banner 17. rpmconfig2.at:3
+# Category starts at test group 332.
+at_banner_text_17="RPM config symlink behavior"
+# Banner 18. rpmconfig3.at:3
+# Category starts at test group 354.
+at_banner_text_18="RPM config filetype changes"
+# Banner 19. rpmmacro.at:3
+# Category starts at test group 362.
+at_banner_text_19="RPM macros"
+# Banner 20. rpmpython.at:4
+# Category starts at test group 391.
+at_banner_text_20="Python bindings"
+# Banner 21. rpmdepmatch.at:2
+# Category starts at test group 411.
+at_banner_text_21="RPM dependency matching"
+
+# Take any -C into account.
+if $at_change_dir ; then
+  test x != "x$at_dir" && cd "$at_dir" \
+    || as_fn_error $? "unable to change directory"
+  at_dir=`pwd`
+fi
+
+# Load the config files for any default variable assignments.
+for at_file in atconfig atlocal
+do
+  test -r $at_file || continue
+  . ./$at_file || as_fn_error $? "invalid content: $at_file"
+done
+
+# Autoconf <=2.59b set at_top_builddir instead of at_top_build_prefix:
+: "${at_top_build_prefix=$at_top_builddir}"
+
+# Perform any assignments requested during argument parsing.
+eval "$at_debug_args"
+
+# atconfig delivers names relative to the directory the test suite is
+# in, but the groups themselves are run in testsuite-dir/group-dir.
+if test -n "$at_top_srcdir"; then
+  builddir=../..
+  for at_dir_var in srcdir top_srcdir top_build_prefix
+  do
+    eval at_val=\$at_$at_dir_var
+    case $at_val in
+      [\\/$]* | ?:[\\/]* ) at_prefix= ;;
+      *) at_prefix=../../ ;;
+    esac
+    eval "$at_dir_var=\$at_prefix\$at_val"
+  done
+fi
+
+## -------------------- ##
+## Directory structure. ##
+## -------------------- ##
+
+# This is the set of directories and files used by this script
+# (non-literals are capitalized):
+#
+# TESTSUITE         - the testsuite
+# TESTSUITE.log     - summarizes the complete testsuite run
+# TESTSUITE.dir/    - created during a run, remains after -d or failed test
+# + at-groups/      - during a run: status of all groups in run
+# | + NNN/          - during a run: meta-data about test group NNN
+# | | + check-line  - location (source file and line) of current AT_CHECK
+# | | + status      - exit status of current AT_CHECK
+# | | + stdout      - stdout of current AT_CHECK
+# | | + stder1      - stderr, including trace
+# | | + stderr      - stderr, with trace filtered out
+# | | + test-source - portion of testsuite that defines group
+# | | + times       - timestamps for computing duration
+# | | + pass        - created if group passed
+# | | + xpass       - created if group xpassed
+# | | + fail        - created if group failed
+# | | + xfail       - created if group xfailed
+# | | + skip        - created if group skipped
+# + at-stop         - during a run: end the run if this file exists
+# + at-source-lines - during a run: cache of TESTSUITE line numbers for extraction
+# + 0..NNN/         - created for each group NNN, remains after -d or failed test
+# | + TESTSUITE.log - summarizes the group results
+# | + ...           - files created during the group
+
+# The directory the whole suite works in.
+# Should be absolute to let the user `cd' at will.
+at_suite_dir=$at_dir/$as_me.dir
+# The file containing the suite ($at_dir might have changed since earlier).
+at_suite_log=$at_dir/$as_me.log
+# The directory containing helper files per test group.
+at_helper_dir=$at_suite_dir/at-groups
+# Stop file: if it exists, do not start new jobs.
+at_stop_file=$at_suite_dir/at-stop
+# The fifo used for the job dispatcher.
+at_job_fifo=$at_suite_dir/at-job-fifo
+
+if $at_clean; then
+  test -d "$at_suite_dir" &&
+    find "$at_suite_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
+  rm -f -r "$at_suite_dir" "$at_suite_log"
+  exit $?
+fi
+
+# Don't take risks: use only absolute directories in PATH.
+#
+# For stand-alone test suites (ie. atconfig was not found),
+# AUTOTEST_PATH is relative to `.'.
+#
+# For embedded test suites, AUTOTEST_PATH is relative to the top level
+# of the package.  Then expand it into build/src parts, since users
+# may create executables in both places.
+AUTOTEST_PATH=`$as_echo "$AUTOTEST_PATH" | sed "s|:|$PATH_SEPARATOR|g"`
+at_path=
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $AUTOTEST_PATH $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -n "$at_path" && as_fn_append at_path $PATH_SEPARATOR
+case $as_dir in
+  [\\/]* | ?:[\\/]* )
+    as_fn_append at_path "$as_dir"
+    ;;
+  * )
+    if test -z "$at_top_build_prefix"; then
+      # Stand-alone test suite.
+      as_fn_append at_path "$as_dir"
+    else
+      # Embedded test suite.
+      as_fn_append at_path "$at_top_build_prefix$as_dir$PATH_SEPARATOR"
+      as_fn_append at_path "$at_top_srcdir/$as_dir"
+    fi
+    ;;
+esac
+  done
+IFS=$as_save_IFS
+
+
+# Now build and simplify PATH.
+#
+# There might be directories that don't exist, but don't redirect
+# builtins' (eg., cd) stderr directly: Ultrix's sh hates that.
+at_new_path=
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $at_path
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -d "$as_dir" || continue
+case $as_dir in
+  [\\/]* | ?:[\\/]* ) ;;
+  * ) as_dir=`(cd "$as_dir" && pwd) 2>/dev/null` ;;
+esac
+case $PATH_SEPARATOR$at_new_path$PATH_SEPARATOR in
+  *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR*) ;;
+  $PATH_SEPARATOR$PATH_SEPARATOR) at_new_path=$as_dir ;;
+  *) as_fn_append at_new_path "$PATH_SEPARATOR$as_dir" ;;
+esac
+  done
+IFS=$as_save_IFS
+
+PATH=$at_new_path
+export PATH
+
+# Setting up the FDs.
+
+
+
+# 5 is the log file.  Not to be overwritten if `-d'.
+if $at_debug_p; then
+  at_suite_log=/dev/null
+else
+  : >"$at_suite_log"
+fi
+exec 5>>"$at_suite_log"
+
+# Banners and logs.
+$as_echo "## ---------------------- ##
+## rpm 4.14.1 test suite. ##
+## ---------------------- ##"
+{
+  $as_echo "## ---------------------- ##
+## rpm 4.14.1 test suite. ##
+## ---------------------- ##"
+  echo
+
+  $as_echo "$as_me: command line was:"
+  $as_echo "  \$ $0 $at_cli_args"
+  echo
+
+  # If ChangeLog exists, list a few lines in case it might help determining
+  # the exact version.
+  if test -n "$at_top_srcdir" && test -f "$at_top_srcdir/ChangeLog"; then
+    $as_echo "## ---------- ##
+## ChangeLog. ##
+## ---------- ##"
+    echo
+    sed 's/^/| /;10q' "$at_top_srcdir/ChangeLog"
+    echo
+  fi
+
+  {
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+}
+  echo
+
+  # Contents of the config files.
+  for at_file in atconfig atlocal
+  do
+    test -r $at_file || continue
+    $as_echo "$as_me: $at_file:"
+    sed 's/^/| /' $at_file
+    echo
+  done
+} >&5
+
+
+## ------------------------- ##
+## Autotest shell functions. ##
+## ------------------------- ##
+
+# at_fn_banner NUMBER
+# -------------------
+# Output banner NUMBER, provided the testsuite is running multiple groups and
+# this particular banner has not yet been printed.
+at_fn_banner ()
+{
+  $at_print_banners || return 0
+  eval at_banner_text=\$at_banner_text_$1
+  test "x$at_banner_text" = "x " && return 0
+  eval "at_banner_text_$1=\" \""
+  if test -z "$at_banner_text"; then
+    $at_first || echo
+  else
+    $as_echo "$as_nl$at_banner_text$as_nl"
+  fi
+} # at_fn_banner
+
+# at_fn_check_prepare_notrace REASON LINE
+# ---------------------------------------
+# Perform AT_CHECK preparations for the command at LINE for an untraceable
+# command; REASON is the reason for disabling tracing.
+at_fn_check_prepare_notrace ()
+{
+  $at_trace_echo "Not enabling shell tracing (command contains $1)"
+  $as_echo "$2" >"$at_check_line_file"
+  at_check_trace=: at_check_filter=:
+  : >"$at_stdout"; : >"$at_stderr"
+}
+
+# at_fn_check_prepare_trace LINE
+# ------------------------------
+# Perform AT_CHECK preparations for the command at LINE for a traceable
+# command.
+at_fn_check_prepare_trace ()
+{
+  $as_echo "$1" >"$at_check_line_file"
+  at_check_trace=$at_traceon at_check_filter=$at_check_filter_trace
+  : >"$at_stdout"; : >"$at_stderr"
+}
+
+# at_fn_check_prepare_dynamic COMMAND LINE
+# ----------------------------------------
+# Decide if COMMAND at LINE is traceable at runtime, and call the appropriate
+# preparation function.
+at_fn_check_prepare_dynamic ()
+{
+  case $1 in
+    *$as_nl*)
+      at_fn_check_prepare_notrace 'an embedded newline' "$2" ;;
+    *)
+      at_fn_check_prepare_trace "$2" ;;
+  esac
+}
+
+# at_fn_filter_trace
+# ------------------
+# Remove the lines in the file "$at_stderr" generated by "set -x" and print
+# them to stderr.
+at_fn_filter_trace ()
+{
+  mv "$at_stderr" "$at_stder1"
+  grep '^ *+' "$at_stder1" >&2
+  grep -v '^ *+' "$at_stder1" >"$at_stderr"
+}
+
+# at_fn_log_failure FILE-LIST
+# ---------------------------
+# Copy the files in the list on stdout with a "> " prefix, and exit the shell
+# with a failure exit code.
+at_fn_log_failure ()
+{
+  for file
+    do $as_echo "$file:"; sed 's/^/> /' "$file"; done
+  echo 1 > "$at_status_file"
+  exit 1
+}
+
+# at_fn_check_skip EXIT-CODE LINE
+# -------------------------------
+# Check whether EXIT-CODE is a special exit code (77 or 99), and if so exit
+# the test group subshell with that same exit code. Use LINE in any report
+# about test failure.
+at_fn_check_skip ()
+{
+  case $1 in
+    99) echo 99 > "$at_status_file"; at_failed=:
+       $as_echo "$2: hard failure"; exit 99;;
+    77) echo 77 > "$at_status_file"; exit 77;;
+  esac
+}
+
+# at_fn_check_status EXPECTED EXIT-CODE LINE
+# ------------------------------------------
+# Check whether EXIT-CODE is the EXPECTED exit code, and if so do nothing.
+# Otherwise, if it is 77 or 99, exit the test group subshell with that same
+# exit code; if it is anything else print an error message referring to LINE,
+# and fail the test.
+at_fn_check_status ()
+{
+  case $2 in
+    $1 ) ;;
+    77) echo 77 > "$at_status_file"; exit 77;;
+    99) echo 99 > "$at_status_file"; at_failed=:
+       $as_echo "$3: hard failure"; exit 99;;
+    *) $as_echo "$3: exit code was $2, expected $1"
+      at_failed=:;;
+  esac
+}
+
+# at_fn_diff_devnull FILE
+# -----------------------
+# Emit a diff between /dev/null and FILE. Uses "test -s" to avoid useless diff
+# invocations.
+at_fn_diff_devnull ()
+{
+  test -s "$1" || return 0
+  $at_diff "$at_devnull" "$1"
+}
+
+# at_fn_test NUMBER
+# -----------------
+# Parse out test NUMBER from the tail of this file.
+at_fn_test ()
+{
+  eval at_sed=\$at_sed$1
+  sed "$at_sed" "$at_myself" > "$at_test_source"
+}
+
+# at_fn_create_debugging_script
+# -----------------------------
+# Create the debugging script $at_group_dir/run which will reproduce the
+# current test group.
+at_fn_create_debugging_script ()
+{
+  {
+    echo "#! /bin/sh" &&
+    echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$@"}'\''='\''"$@"'\''' &&
+    $as_echo "cd '$at_dir'" &&
+    $as_echo "exec \${CONFIG_SHELL-$SHELL} \"$at_myself\" -v -d $at_debug_args $at_group \${1+\"\$@\"}" &&
+    echo 'exit 1'
+  } >"$at_group_dir/run" &&
+  chmod +x "$at_group_dir/run"
+}
+
+## -------------------------------- ##
+## End of autotest shell functions. ##
+## -------------------------------- ##
+{
+  $as_echo "## ---------------- ##
+## Tested programs. ##
+## ---------------- ##"
+  echo
+} >&5
+
+# Report what programs are being tested.
+for at_program in : $at_tested
+do
+  test "$at_program" = : && continue
+  case $at_program in
+    [\\/]* | ?:[\\/]* ) $at_program_=$at_program ;;
+    * )
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -f "$as_dir/$at_program" && break
+  done
+IFS=$as_save_IFS
+
+    at_program_=$as_dir/$at_program ;;
+  esac
+  if test -f "$at_program_"; then
+    {
+      $as_echo "$at_srcdir/local.at:36: $at_program_ --version"
+      "$at_program_" --version </dev/null
+      echo
+    } >&5 2>&1
+  else
+    as_fn_error $? "cannot find $at_program" "$LINENO" 5
+  fi
+done
+
+{
+  $as_echo "## ------------------ ##
+## Running the tests. ##
+## ------------------ ##"
+} >&5
+
+at_start_date=`date`
+at_start_time=`date +%s 2>/dev/null`
+$as_echo "$as_me: starting at: $at_start_date" >&5
+
+# Create the master directory if it doesn't already exist.
+as_dir="$at_suite_dir"; as_fn_mkdir_p ||
+  as_fn_error $? "cannot create \`$at_suite_dir'" "$LINENO" 5
+
+# Can we diff with `/dev/null'?  DU 5.0 refuses.
+if diff /dev/null /dev/null >/dev/null 2>&1; then
+  at_devnull=/dev/null
+else
+  at_devnull=$at_suite_dir/devnull
+  >"$at_devnull"
+fi
+
+# Use `diff -u' when possible.
+if at_diff=`diff -u "$at_devnull" "$at_devnull" 2>&1` && test -z "$at_diff"
+then
+  at_diff='diff -u'
+else
+  at_diff=diff
+fi
+
+# Get the last needed group.
+for at_group in : $at_groups; do :; done
+
+# Extract the start and end lines of each test group at the tail
+# of this file
+awk '
+BEGIN { FS="\a" }
+/^#AT_START_/ {
+  start = NR
+}
+/^#AT_STOP_/ {
+  test = substr ($ 0, 10)
+  print "at_sed" test "=\"1," start "d;" (NR-1) "q\""
+  if (test == "'"$at_group"'") exit
+}' "$at_myself" > "$at_suite_dir/at-source-lines" &&
+. "$at_suite_dir/at-source-lines" ||
+  as_fn_error $? "cannot create test line number cache" "$LINENO" 5
+rm -f "$at_suite_dir/at-source-lines"
+
+# Set number of jobs for `-j'; avoid more jobs than test groups.
+set X $at_groups; shift; at_max_jobs=$#
+if test $at_max_jobs -eq 0; then
+  at_jobs=1
+fi
+if test $at_jobs -ne 1 &&
+   { test $at_jobs -eq 0 || test $at_jobs -gt $at_max_jobs; }; then
+  at_jobs=$at_max_jobs
+fi
+
+# If parallel mode, don't output banners, don't split summary lines.
+if test $at_jobs -ne 1; then
+  at_print_banners=false
+  at_quiet=:
+fi
+
+# Set up helper dirs.
+rm -rf "$at_helper_dir" &&
+mkdir "$at_helper_dir" &&
+cd "$at_helper_dir" &&
+{ test -z "$at_groups" || mkdir $at_groups; } ||
+as_fn_error $? "testsuite directory setup failed" "$LINENO" 5
+
+# Functions for running a test group.  We leave the actual
+# test group execution outside of a shell function in order
+# to avoid hitting zsh 4.x exit status bugs.
+
+# at_fn_group_prepare
+# -------------------
+# Prepare for running a test group.
+at_fn_group_prepare ()
+{
+  # The directory for additional per-group helper files.
+  at_job_dir=$at_helper_dir/$at_group
+  # The file containing the location of the last AT_CHECK.
+  at_check_line_file=$at_job_dir/check-line
+  # The file containing the exit status of the last command.
+  at_status_file=$at_job_dir/status
+  # The files containing the output of the tested commands.
+  at_stdout=$at_job_dir/stdout
+  at_stder1=$at_job_dir/stder1
+  at_stderr=$at_job_dir/stderr
+  # The file containing the code for a test group.
+  at_test_source=$at_job_dir/test-source
+  # The file containing dates.
+  at_times_file=$at_job_dir/times
+
+  # Be sure to come back to the top test directory.
+  cd "$at_suite_dir"
+
+  # Clearly separate the test groups when verbose.
+  $at_first || $at_verbose echo
+
+  at_group_normalized=$at_group
+
+  eval 'while :; do
+    case $at_group_normalized in #(
+    '"$at_format"'*) break;;
+    esac
+    at_group_normalized=0$at_group_normalized
+  done'
+
+
+  # Create a fresh directory for the next test group, and enter.
+  # If one already exists, the user may have invoked ./run from
+  # within that directory; we remove the contents, but not the
+  # directory itself, so that we aren't pulling the rug out from
+  # under the shell's notion of the current directory.
+  at_group_dir=$at_suite_dir/$at_group_normalized
+  at_group_log=$at_group_dir/$as_me.log
+  if test -d "$at_group_dir"; then
+  find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx {} \;
+  rm -fr "$at_group_dir"/* "$at_group_dir"/.[!.] "$at_group_dir"/.??*
+fi ||
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: test directory for $at_group_normalized could not be cleaned" >&5
+$as_echo "$as_me: WARNING: test directory for $at_group_normalized could not be cleaned" >&2;}
+  # Be tolerant if the above `rm' was not able to remove the directory.
+  as_dir="$at_group_dir"; as_fn_mkdir_p
+
+  echo 0 > "$at_status_file"
+
+  # In verbose mode, append to the log file *and* show on
+  # the standard output; in quiet mode only write to the log.
+  if test -z "$at_verbose"; then
+    at_tee_pipe='tee -a "$at_group_log"'
+  else
+    at_tee_pipe='cat >> "$at_group_log"'
+  fi
+}
+
+# at_fn_group_banner ORDINAL LINE DESC PAD [BANNER]
+# -------------------------------------------------
+# Declare the test group ORDINAL, located at LINE with group description DESC,
+# and residing under BANNER. Use PAD to align the status column.
+at_fn_group_banner ()
+{
+  at_setup_line="$2"
+  test -n "$5" && at_fn_banner $5
+  at_desc="$3"
+  case $1 in
+    [0-9])      at_desc_line="  $1: ";;
+    [0-9][0-9]) at_desc_line=" $1: " ;;
+    *)          at_desc_line="$1: "  ;;
+  esac
+  as_fn_append at_desc_line "$3$4"
+  $at_quiet $as_echo_n "$at_desc_line"
+  echo "#                             -*- compilation -*-" >> "$at_group_log"
+}
+
+# at_fn_group_postprocess
+# -----------------------
+# Perform cleanup after running a test group.
+at_fn_group_postprocess ()
+{
+  # Be sure to come back to the suite directory, in particular
+  # since below we might `rm' the group directory we are in currently.
+  cd "$at_suite_dir"
+
+  if test ! -f "$at_check_line_file"; then
+    sed "s/^ */$as_me: WARNING: /" <<_ATEOF
+      A failure happened in a test group before any test could be
+      run. This means that test suite is improperly designed.  Please
+      report this failure to <rpm-maint@lists.rpm.org>.
+_ATEOF
+    $as_echo "$at_setup_line" >"$at_check_line_file"
+    at_status=99
+  fi
+  $at_verbose $as_echo_n "$at_group. $at_setup_line: "
+  $as_echo_n "$at_group. $at_setup_line: " >> "$at_group_log"
+  case $at_xfail:$at_status in
+    yes:0)
+       at_msg="UNEXPECTED PASS"
+       at_res=xpass
+       at_errexit=$at_errexit_p
+       at_color=$at_red
+       ;;
+    no:0)
+       at_msg="ok"
+       at_res=pass
+       at_errexit=false
+       at_color=$at_grn
+       ;;
+    *:77)
+       at_msg='skipped ('`cat "$at_check_line_file"`')'
+       at_res=skip
+       at_errexit=false
+       at_color=$at_blu
+       ;;
+    no:* | *:99)
+       at_msg='FAILED ('`cat "$at_check_line_file"`')'
+       at_res=fail
+       at_errexit=$at_errexit_p
+       at_color=$at_red
+       ;;
+    yes:*)
+       at_msg='expected failure ('`cat "$at_check_line_file"`')'
+       at_res=xfail
+       at_errexit=false
+       at_color=$at_lgn
+       ;;
+  esac
+  echo "$at_res" > "$at_job_dir/$at_res"
+  # In parallel mode, output the summary line only afterwards.
+  if test $at_jobs -ne 1 && test -n "$at_verbose"; then
+    $as_echo "$at_desc_line $at_color$at_msg$at_std"
+  else
+    # Make sure there is a separator even with long titles.
+    $as_echo " $at_color$at_msg$at_std"
+  fi
+  at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
+  case $at_status in
+    0|77)
+      # $at_times_file is only available if the group succeeded.
+      # We're not including the group log, so the success message
+      # is written in the global log separately.  But we also
+      # write to the group log in case they're using -d.
+      if test -f "$at_times_file"; then
+       at_log_msg="$at_log_msg     ("`sed 1d "$at_times_file"`')'
+       rm -f "$at_times_file"
+      fi
+      $as_echo "$at_log_msg" >> "$at_group_log"
+      $as_echo "$at_log_msg" >&5
+
+      # Cleanup the group directory, unless the user wants the files
+      # or the success was unexpected.
+      if $at_debug_p || test $at_res = xpass; then
+       at_fn_create_debugging_script
+       if test $at_res = xpass && $at_errexit; then
+         echo stop > "$at_stop_file"
+       fi
+      else
+       if test -d "$at_group_dir"; then
+         find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
+         rm -fr "$at_group_dir"
+       fi
+       rm -f "$at_test_source"
+      fi
+      ;;
+    *)
+      # Upon failure, include the log into the testsuite's global
+      # log.  The failure message is written in the group log.  It
+      # is later included in the global log.
+      $as_echo "$at_log_msg" >> "$at_group_log"
+
+      # Upon failure, keep the group directory for autopsy, and create
+      # the debugging script.  With -e, do not start any further tests.
+      at_fn_create_debugging_script
+      if $at_errexit; then
+       echo stop > "$at_stop_file"
+      fi
+      ;;
+  esac
+}
+
+
+## ------------ ##
+## Driver loop. ##
+## ------------ ##
+
+
+if (set -m && set +m && set +b) >/dev/null 2>&1; then
+  set +b
+  at_job_control_on='set -m' at_job_control_off='set +m' at_job_group=-
+else
+  at_job_control_on=: at_job_control_off=: at_job_group=
+fi
+
+for at_signal in 1 2 15; do
+  trap 'set +x; set +e
+       $at_job_control_off
+       at_signal='"$at_signal"'
+       echo stop > "$at_stop_file"
+       trap "" $at_signal
+       at_pgids=
+       for at_pgid in `jobs -p 2>/dev/null`; do
+         at_pgids="$at_pgids $at_job_group$at_pgid"
+       done
+       test -z "$at_pgids" || kill -$at_signal $at_pgids 2>/dev/null
+       wait
+       if test "$at_jobs" -eq 1 || test -z "$at_verbose"; then
+         echo >&2
+       fi
+       at_signame=`kill -l $at_signal 2>&1 || echo $at_signal`
+       set x $at_signame
+       test 0 -gt 2 && at_signame=$at_signal
+       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: caught signal $at_signame, bailing out" >&5
+$as_echo "$as_me: WARNING: caught signal $at_signame, bailing out" >&2;}
+       as_fn_arith 128 + $at_signal && exit_status=$as_val
+       as_fn_exit $exit_status' $at_signal
+done
+
+rm -f "$at_stop_file"
+at_first=:
+
+if test $at_jobs -ne 1 &&
+     rm -f "$at_job_fifo" &&
+     test -n "$at_job_group" &&
+     ( mkfifo "$at_job_fifo" && trap 'exit 1' PIPE STOP TSTP ) 2>/dev/null
+then
+  # FIFO job dispatcher.
+
+  trap 'at_pids=
+       for at_pid in `jobs -p`; do
+         at_pids="$at_pids $at_job_group$at_pid"
+       done
+       if test -n "$at_pids"; then
+         at_sig=TSTP
+         test "${TMOUT+set}" = set && at_sig=STOP
+         kill -$at_sig $at_pids 2>/dev/null
+       fi
+       kill -STOP $$
+       test -z "$at_pids" || kill -CONT $at_pids 2>/dev/null' TSTP
+
+  echo
+  # Turn jobs into a list of numbers, starting from 1.
+  at_joblist=`$as_echo "$at_groups" | sed -n 1,${at_jobs}p`
+
+  set X $at_joblist
+  shift
+  for at_group in $at_groups; do
+    $at_job_control_on 2>/dev/null
+    (
+      # Start one test group.
+      $at_job_control_off
+      if $at_first; then
+       exec 7>"$at_job_fifo"
+      else
+       exec 6<&-
+      fi
+      trap 'set +x; set +e
+           trap "" PIPE
+           echo stop > "$at_stop_file"
+           echo >&7
+           as_fn_exit 141' PIPE
+      at_fn_group_prepare
+      if cd "$at_group_dir" &&
+        at_fn_test $at_group &&
+        . "$at_test_source"
+      then :; else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5
+$as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;}
+       at_failed=:
+      fi
+      at_fn_group_postprocess
+      echo >&7
+    ) &
+    $at_job_control_off
+    if $at_first; then
+      at_first=false
+      exec 6<"$at_job_fifo" 7>"$at_job_fifo"
+    fi
+    shift # Consume one token.
+    if test $# -gt 0; then :; else
+      read at_token <&6 || break
+      set x $*
+    fi
+    test -f "$at_stop_file" && break
+  done
+  exec 7>&-
+  # Read back the remaining ($at_jobs - 1) tokens.
+  set X $at_joblist
+  shift
+  if test $# -gt 0; then
+    shift
+    for at_job
+    do
+      read at_token
+    done <&6
+  fi
+  exec 6<&-
+  wait
+else
+  # Run serially, avoid forks and other potential surprises.
+  for at_group in $at_groups; do
+    at_fn_group_prepare
+    if cd "$at_group_dir" &&
+       at_fn_test $at_group &&
+       . "$at_test_source"; then :; else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5
+$as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;}
+      at_failed=:
+    fi
+    at_fn_group_postprocess
+    test -f "$at_stop_file" && break
+    at_first=false
+  done
+fi
+
+# Wrap up the test suite with summary statistics.
+cd "$at_helper_dir"
+
+# Use ?..???? when the list must remain sorted, the faster * otherwise.
+at_pass_list=`for f in */pass; do echo $f; done | sed '/\*/d; s,/pass,,'`
+at_skip_list=`for f in */skip; do echo $f; done | sed '/\*/d; s,/skip,,'`
+at_xfail_list=`for f in */xfail; do echo $f; done | sed '/\*/d; s,/xfail,,'`
+at_xpass_list=`for f in ?/xpass ??/xpass ???/xpass ????/xpass; do
+                echo $f; done | sed '/?/d; s,/xpass,,'`
+at_fail_list=`for f in ?/fail ??/fail ???/fail ????/fail; do
+               echo $f; done | sed '/?/d; s,/fail,,'`
+
+set X $at_pass_list $at_xpass_list $at_xfail_list $at_fail_list $at_skip_list
+shift; at_group_count=$#
+set X $at_xpass_list; shift; at_xpass_count=$#; at_xpass_list=$*
+set X $at_xfail_list; shift; at_xfail_count=$#
+set X $at_fail_list; shift; at_fail_count=$#; at_fail_list=$*
+set X $at_skip_list; shift; at_skip_count=$#
+
+as_fn_arith $at_group_count - $at_skip_count && at_run_count=$as_val
+as_fn_arith $at_xpass_count + $at_fail_count && at_unexpected_count=$as_val
+as_fn_arith $at_xfail_count + $at_fail_count && at_total_fail_count=$as_val
+
+# Back to the top directory.
+cd "$at_dir"
+rm -rf "$at_helper_dir"
+
+# Compute the duration of the suite.
+at_stop_date=`date`
+at_stop_time=`date +%s 2>/dev/null`
+$as_echo "$as_me: ending at: $at_stop_date" >&5
+case $at_start_time,$at_stop_time in
+  [0-9]*,[0-9]*)
+    as_fn_arith $at_stop_time - $at_start_time && at_duration_s=$as_val
+    as_fn_arith $at_duration_s / 60 && at_duration_m=$as_val
+    as_fn_arith $at_duration_m / 60 && at_duration_h=$as_val
+    as_fn_arith $at_duration_s % 60 && at_duration_s=$as_val
+    as_fn_arith $at_duration_m % 60 && at_duration_m=$as_val
+    at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
+    $as_echo "$as_me: test suite duration: $at_duration" >&5
+    ;;
+esac
+
+echo
+$as_echo "## ------------- ##
+## Test results. ##
+## ------------- ##"
+echo
+{
+  echo
+  $as_echo "## ------------- ##
+## Test results. ##
+## ------------- ##"
+  echo
+} >&5
+
+if test $at_run_count = 1; then
+  at_result="1 test"
+  at_were=was
+else
+  at_result="$at_run_count tests"
+  at_were=were
+fi
+if $at_errexit_p && test $at_unexpected_count != 0; then
+  if test $at_xpass_count = 1; then
+    at_result="$at_result $at_were run, one passed"
+  else
+    at_result="$at_result $at_were run, one failed"
+  fi
+  at_result="$at_result unexpectedly and inhibited subsequent tests."
+  at_color=$at_red
+else
+  # Don't you just love exponential explosion of the number of cases?
+  at_color=$at_red
+  case $at_xpass_count:$at_fail_count:$at_xfail_count in
+    # So far, so good.
+    0:0:0) at_result="$at_result $at_were successful." at_color=$at_grn ;;
+    0:0:*) at_result="$at_result behaved as expected." at_color=$at_lgn ;;
+
+    # Some unexpected failures
+    0:*:0) at_result="$at_result $at_were run,
+$at_fail_count failed unexpectedly." ;;
+
+    # Some failures, both expected and unexpected
+    0:*:1) at_result="$at_result $at_were run,
+$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
+    0:*:*) at_result="$at_result $at_were run,
+$at_total_fail_count failed ($at_xfail_count expected failures)." ;;
+
+    # No unexpected failures, but some xpasses
+    *:0:*) at_result="$at_result $at_were run,
+$at_xpass_count passed unexpectedly." ;;
+
+    # No expected failures, but failures and xpasses
+    *:1:0) at_result="$at_result $at_were run,
+$at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;;
+    *:*:0) at_result="$at_result $at_were run,
+$at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;;
+
+    # All of them.
+    *:*:1) at_result="$at_result $at_were run,
+$at_xpass_count passed unexpectedly,
+$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
+    *:*:*) at_result="$at_result $at_were run,
+$at_xpass_count passed unexpectedly,
+$at_total_fail_count failed ($at_xfail_count expected failures)." ;;
+  esac
+
+  if test $at_skip_count = 0 && test $at_run_count -gt 1; then
+    at_result="All $at_result"
+  fi
+fi
+
+# Now put skips in the mix.
+case $at_skip_count in
+  0) ;;
+  1) at_result="$at_result
+1 test was skipped." ;;
+  *) at_result="$at_result
+$at_skip_count tests were skipped." ;;
+esac
+
+if test $at_unexpected_count = 0; then
+  echo "$at_color$at_result$at_std"
+  echo "$at_result" >&5
+else
+  echo "${at_color}ERROR: $at_result$at_std" >&2
+  echo "ERROR: $at_result" >&5
+  {
+    echo
+    $as_echo "## ------------------------ ##
+## Summary of the failures. ##
+## ------------------------ ##"
+
+    # Summary of failed and skipped tests.
+    if test $at_fail_count != 0; then
+      echo "Failed tests:"
+      $SHELL "$at_myself" $at_fail_list --list
+      echo
+    fi
+    if test $at_skip_count != 0; then
+      echo "Skipped tests:"
+      $SHELL "$at_myself" $at_skip_list --list
+      echo
+    fi
+    if test $at_xpass_count != 0; then
+      echo "Unexpected passes:"
+      $SHELL "$at_myself" $at_xpass_list --list
+      echo
+    fi
+    if test $at_fail_count != 0; then
+      $as_echo "## ---------------------- ##
+## Detailed failed tests. ##
+## ---------------------- ##"
+      echo
+      for at_group in $at_fail_list
+      do
+       at_group_normalized=$at_group
+
+  eval 'while :; do
+    case $at_group_normalized in #(
+    '"$at_format"'*) break;;
+    esac
+    at_group_normalized=0$at_group_normalized
+  done'
+
+       cat "$at_suite_dir/$at_group_normalized/$as_me.log"
+       echo
+      done
+      echo
+    fi
+    if test -n "$at_top_srcdir"; then
+      sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## ${at_top_build_prefix}config.log ##
+_ASBOX
+      sed 's/^/| /' ${at_top_build_prefix}config.log
+      echo
+    fi
+  } >&5
+
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## $as_me.log was created. ##
+_ASBOX
+
+  echo
+  if $at_debug_p; then
+    at_msg='per-test log files'
+  else
+    at_msg="\`${at_testdir+${at_testdir}/}$as_me.log'"
+  fi
+  $as_echo "Please send $at_msg and all information you think might help:
+
+   To: <rpm-maint@lists.rpm.org>
+   Subject: [rpm 4.14.1] $as_me: $at_fail_list${at_fail_list:+ failed${at_xpass_list:+, }}$at_xpass_list${at_xpass_list:+ passed unexpectedly}
+
+You may investigate any problem if you feel able to do so, in which
+case the test suite provides a good starting point.  Its output may
+be found below \`${at_testdir+${at_testdir}/}$as_me.dir'.
+"
+  exit 1
+fi
+
+exit 0
+
+## ------------- ##
+## Actual tests. ##
+## ------------- ##
+#AT_START_1
+at_fn_group_banner 1 'rpmgeneral.at:22' \
+  "rpm --version" "                                  " 1
+at_xfail=no
+(
+  $as_echo "1. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmgeneral.at:24: runroot rpm --version"
+at_fn_check_prepare_trace "rpmgeneral.at:24"
+( $at_check_trace; runroot rpm --version
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "RPM version 4.14.1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmgeneral.at:24"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_1
+#AT_START_2
+at_fn_group_banner 2 'rpmgeneral.at:31' \
+  "rpmbuild --version" "                             " 1
+at_xfail=no
+(
+  $as_echo "2. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmgeneral.at:33: runroot rpmbuild --version"
+at_fn_check_prepare_trace "rpmgeneral.at:33"
+( $at_check_trace; runroot rpmbuild --version
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "RPM version 4.14.1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmgeneral.at:33"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_2
+#AT_START_3
+at_fn_group_banner 3 'rpmgeneral.at:40' \
+  "rpm --showrc" "                                   " 1
+at_xfail=no
+(
+  $as_echo "3. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmgeneral.at:42: runroot rpm --showrc"
+at_fn_check_prepare_trace "rpmgeneral.at:42"
+( $at_check_trace; runroot rpm --showrc
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmgeneral.at:42"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_3
+#AT_START_4
+at_fn_group_banner 4 'rpmgeneral.at:50' \
+  "rpm --querytags" "                                " 1
+at_xfail=no
+(
+  $as_echo "4. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmgeneral.at:52: runroot rpm --querytags"
+at_fn_check_prepare_trace "rpmgeneral.at:52"
+( $at_check_trace; runroot rpm --querytags
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "ARCH
+ARCHIVESIZE
+BASENAMES
+BUGURL
+BUILDARCHS
+BUILDHOST
+BUILDTIME
+C
+CHANGELOGNAME
+CHANGELOGTEXT
+CHANGELOGTIME
+CLASSDICT
+CONFLICTFLAGS
+CONFLICTNAME
+CONFLICTNEVRS
+CONFLICTS
+CONFLICTVERSION
+COOKIE
+DBINSTANCE
+DEPENDSDICT
+DESCRIPTION
+DIRINDEXES
+DIRNAMES
+DISTRIBUTION
+DISTTAG
+DISTURL
+DSAHEADER
+E
+ENCODING
+ENHANCEFLAGS
+ENHANCENAME
+ENHANCENEVRS
+ENHANCES
+ENHANCEVERSION
+EPOCH
+EPOCHNUM
+EVR
+EXCLUDEARCH
+EXCLUDEOS
+EXCLUSIVEARCH
+EXCLUSIVEOS
+FILECAPS
+FILECLASS
+FILECOLORS
+FILECONTEXTS
+FILEDEPENDSN
+FILEDEPENDSX
+FILEDEVICES
+FILEDIGESTALGO
+FILEDIGESTS
+FILEFLAGS
+FILEGROUPNAME
+FILEINODES
+FILELANGS
+FILELINKTOS
+FILEMD5S
+FILEMODES
+FILEMTIMES
+FILENAMES
+FILENLINKS
+FILEPROVIDE
+FILERDEVS
+FILEREQUIRE
+FILESIGNATURELENGTH
+FILESIGNATURES
+FILESIZES
+FILESTATES
+FILETRIGGERCONDS
+FILETRIGGERFLAGS
+FILETRIGGERINDEX
+FILETRIGGERNAME
+FILETRIGGERPRIORITIES
+FILETRIGGERSCRIPTFLAGS
+FILETRIGGERSCRIPTPROG
+FILETRIGGERSCRIPTS
+FILETRIGGERTYPE
+FILETRIGGERVERSION
+FILEUSERNAME
+FILEVERIFYFLAGS
+FSCONTEXTS
+GIF
+GROUP
+HDRID
+HEADERCOLOR
+HEADERI18NTABLE
+HEADERIMAGE
+HEADERIMMUTABLE
+HEADERREGIONS
+HEADERSIGNATURES
+ICON
+INSTALLCOLOR
+INSTALLTID
+INSTALLTIME
+INSTFILENAMES
+INSTPREFIXES
+LICENSE
+LONGARCHIVESIZE
+LONGFILESIZES
+LONGSIGSIZE
+LONGSIZE
+N
+NAME
+NEVR
+NEVRA
+NOPATCH
+NOSOURCE
+NVR
+NVRA
+O
+OBSOLETEFLAGS
+OBSOLETENAME
+OBSOLETENEVRS
+OBSOLETES
+OBSOLETEVERSION
+OLDENHANCES
+OLDENHANCESFLAGS
+OLDENHANCESNAME
+OLDENHANCESVERSION
+OLDFILENAMES
+OLDSUGGESTS
+OLDSUGGESTSFLAGS
+OLDSUGGESTSNAME
+OLDSUGGESTSVERSION
+OPTFLAGS
+ORDERFLAGS
+ORDERNAME
+ORDERVERSION
+ORIGBASENAMES
+ORIGDIRINDEXES
+ORIGDIRNAMES
+ORIGFILENAMES
+OS
+P
+PACKAGER
+PATCH
+PATCHESFLAGS
+PATCHESNAME
+PATCHESVERSION
+PAYLOADCOMPRESSOR
+PAYLOADDIGEST
+PAYLOADDIGESTALGO
+PAYLOADFLAGS
+PAYLOADFORMAT
+PKGID
+PLATFORM
+POLICIES
+POLICYFLAGS
+POLICYNAMES
+POLICYTYPES
+POLICYTYPESINDEXES
+POSTIN
+POSTINFLAGS
+POSTINPROG
+POSTTRANS
+POSTTRANSFLAGS
+POSTTRANSPROG
+POSTUN
+POSTUNFLAGS
+POSTUNPROG
+PREFIXES
+PREIN
+PREINFLAGS
+PREINPROG
+PRETRANS
+PRETRANSFLAGS
+PRETRANSPROG
+PREUN
+PREUNFLAGS
+PREUNPROG
+PROVIDEFLAGS
+PROVIDENAME
+PROVIDENEVRS
+PROVIDES
+PROVIDEVERSION
+PUBKEYS
+R
+RECOMMENDFLAGS
+RECOMMENDNAME
+RECOMMENDNEVRS
+RECOMMENDS
+RECOMMENDVERSION
+RECONTEXTS
+RELEASE
+REMOVETID
+REQUIREFLAGS
+REQUIRENAME
+REQUIRENEVRS
+REQUIRES
+REQUIREVERSION
+RPMVERSION
+RSAHEADER
+SHA1HEADER
+SHA256HEADER
+SIGGPG
+SIGMD5
+SIGPGP
+SIGSIZE
+SIZE
+SOURCE
+SOURCEPACKAGE
+SOURCEPKGID
+SOURCERPM
+SUGGESTFLAGS
+SUGGESTNAME
+SUGGESTNEVRS
+SUGGESTS
+SUGGESTVERSION
+SUMMARY
+SUPPLEMENTFLAGS
+SUPPLEMENTNAME
+SUPPLEMENTNEVRS
+SUPPLEMENTS
+SUPPLEMENTVERSION
+TRANSFILETRIGGERCONDS
+TRANSFILETRIGGERFLAGS
+TRANSFILETRIGGERINDEX
+TRANSFILETRIGGERNAME
+TRANSFILETRIGGERPRIORITIES
+TRANSFILETRIGGERSCRIPTFLAGS
+TRANSFILETRIGGERSCRIPTPROG
+TRANSFILETRIGGERSCRIPTS
+TRANSFILETRIGGERTYPE
+TRANSFILETRIGGERVERSION
+TRIGGERCONDS
+TRIGGERFLAGS
+TRIGGERINDEX
+TRIGGERNAME
+TRIGGERSCRIPTFLAGS
+TRIGGERSCRIPTPROG
+TRIGGERSCRIPTS
+TRIGGERTYPE
+TRIGGERVERSION
+URL
+V
+VCS
+VENDOR
+VERBOSE
+VERIFYSCRIPT
+VERIFYSCRIPTFLAGS
+VERIFYSCRIPTPROG
+VERSION
+XPM
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmgeneral.at:52"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_4
+#AT_START_5
+at_fn_group_banner 5 'rpmio.at:21' \
+  "SIGPIPE from install scriptlet" "                 " 2
+at_xfail=no
+(
+  $as_echo "5. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmio.at:23:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/sigpipe.spec
+runroot rpm -U --nodeps /build/RPMS/noarch/sigpipe-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmio.at:23"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/sigpipe.spec
+runroot rpm -U --nodeps /build/RPMS/noarch/sigpipe-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmio.at:23"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_5
+#AT_START_6
+at_fn_group_banner 6 'rpmquery.at:22' \
+  "rpm --qf -p *.i386.rpm" "                         " 3
+at_xfail=no
+(
+  $as_echo "6. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:24:
+runroot rpm \\
+  -q --qf \"%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\\n\" \\
+  -p /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:24"
+( $at_check_trace;
+runroot rpm \
+  -q --qf "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n" \
+  -p /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello-1.0-1.i386
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:24"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_6
+#AT_START_7
+at_fn_group_banner 7 'rpmquery.at:36' \
+  "rpm --qf -p *.src.rpm" "                          " 3
+at_xfail=no
+(
+  $as_echo "7. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:38:
+runroot rpm \\
+  -q --qf \"%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\\n\" \\
+  -p /data/SRPMS/hello-1.0-1.src.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:38"
+( $at_check_trace;
+runroot rpm \
+  -q --qf "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n" \
+  -p /data/SRPMS/hello-1.0-1.src.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello-1.0-1.i386
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:38"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_7
+#AT_START_8
+at_fn_group_banner 8 'rpmquery.at:50' \
+  "rpm -ql -p *.src.rpm" "                           " 3
+at_xfail=no
+(
+  $as_echo "8. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:52:
+runroot rpm \\
+  -ql \\
+  -p /data/SRPMS/hello-1.0-1.src.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:52"
+( $at_check_trace;
+runroot rpm \
+  -ql \
+  -p /data/SRPMS/hello-1.0-1.src.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello-1.0.tar.gz
+hello.spec
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:52"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_8
+#AT_START_9
+at_fn_group_banner 9 'rpmquery.at:65' \
+  "rpmspec -q" "                                     " 3
+at_xfail=no
+(
+  $as_echo "9. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:67:
+runroot rpmspec \\
+  -q --qf \"%{name}\" /data/SPECS/hello.spec
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:67"
+( $at_check_trace;
+runroot rpmspec \
+  -q --qf "%{name}" /data/SPECS/hello.spec
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:67"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_9
+#AT_START_10
+at_fn_group_banner 10 'rpmquery.at:77' \
+  "rpm -ql -p *.i386.rpm" "                          " 3
+at_xfail=no
+(
+  $as_echo "10. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:79:
+runroot rpm \\
+  -ql \\
+  -p /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:79"
+( $at_check_trace;
+runroot rpm \
+  -ql \
+  -p /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "/usr/local/bin/hello
+/usr/share/doc/hello-1.0
+/usr/share/doc/hello-1.0/FAQ
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:79"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_10
+#AT_START_11
+at_fn_group_banner 11 'rpmquery.at:94' \
+  "rpm -qp <manifest>" "                             " 3
+at_xfail=no
+(
+  $as_echo "11. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:96:
+cat << EOF > \${RPMTEST}/query.mft
+/data/RPMS/hello-1.0-1.i386.rpm
+/data/RPMS/hello-1.0-1.ppc64.rpm
+/data/RPMS/foo-1.0-1.noarch.rpm
+EOF
+runroot rpm -qp --qf \"%{nvr}\\n\" /query.mft
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmquery.at:96"
+( $at_check_trace;
+cat << EOF > ${RPMTEST}/query.mft
+/data/RPMS/hello-1.0-1.i386.rpm
+/data/RPMS/hello-1.0-1.ppc64.rpm
+/data/RPMS/foo-1.0-1.noarch.rpm
+EOF
+runroot rpm -qp --qf "%{nvr}\n" /query.mft
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello-1.0-1
+hello-1.0-1
+foo-1.0-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:96"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_11
+#AT_START_12
+at_fn_group_banner 12 'rpmquery.at:115' \
+  "rpm -q --scripts -p *.i386.rpm" "                 " 3
+at_xfail=no
+(
+  $as_echo "12. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:117:
+runroot rpm \\
+  -q --scripts \\
+  -p /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:117"
+( $at_check_trace;
+runroot rpm \
+  -q --scripts \
+  -p /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "preinstall program: /bin/sh
+postinstall program: /bin/sh
+preuninstall program: /bin/sh
+postuninstall program: /bin/sh
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:117"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_12
+#AT_START_13
+at_fn_group_banner 13 'rpmquery.at:136' \
+  "rpm -q on installed package" "                    " 3
+at_xfail=no
+(
+  $as_echo "13. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:139:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm \\
+  --noscripts --nodeps --ignorearch --relocate=/usr=/check \\
+  -i /data/RPMS/hello-1.0-1.ppc64.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmquery.at:139"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm \
+  --noscripts --nodeps --ignorearch --relocate=/usr=/check \
+  -i /data/RPMS/hello-1.0-1.ppc64.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:139"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+# check common NVRA combinations
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:150:
+runroot rpm \\
+  -q hello hello-1.0 hello-1.0-1 \\
+     hello.ppc64 hello-1.0.ppc64 hello-1.0-1.ppc64
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:150"
+( $at_check_trace;
+runroot rpm \
+  -q hello hello-1.0 hello-1.0-1 \
+     hello.ppc64 hello-1.0.ppc64 hello-1.0-1.ppc64
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello-1.0-1.ppc64
+hello-1.0-1.ppc64
+hello-1.0-1.ppc64
+hello-1.0-1.ppc64
+hello-1.0-1.ppc64
+hello-1.0-1.ppc64
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:150"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:166:
+runroot rpm \\
+  -ql hello
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:166"
+( $at_check_trace;
+runroot rpm \
+  -ql hello
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "/check/local/bin/hello
+/check/share/doc/hello-1.0
+/check/share/doc/hello-1.0/FAQ
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:166"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_13
+#AT_START_14
+at_fn_group_banner 14 'rpmquery.at:180' \
+  "integer array query" "                            " 3
+at_xfail=no
+(
+  $as_echo "14. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:182:
+runroot rpm \\
+  --queryformat=\"[%{filemodes}\\n]\" \\
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:182"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%{filemodes}\n]" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "33257
+16877
+33188
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:182"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_14
+#AT_START_15
+at_fn_group_banner 15 'rpmquery.at:196' \
+  "formatted filesbypkg query" "                     " 3
+at_xfail=no
+(
+  $as_echo "15. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:198:
+runroot rpm \\
+  --queryformat=\"[%-10{=NAME} %{FILENAMES}\\n]\" \\
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:198"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%-10{=NAME} %{FILENAMES}\n]" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello      /usr/local/bin/hello
+hello      /usr/share/doc/hello-1.0
+hello      /usr/share/doc/hello-1.0/FAQ
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:198"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_15
+#AT_START_16
+at_fn_group_banner 16 'rpmquery.at:212' \
+  "hex formatted integer array extension query" "    " 3
+at_xfail=no
+(
+  $as_echo "16. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:214:
+runroot rpm \\
+  --queryformat=\"[%5{longfilesizes:hex}\\n]\" \\
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:214"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%5{longfilesizes:hex}\n]" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "  b40
+ 1000
+   24
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:214"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_16
+#AT_START_17
+at_fn_group_banner 17 'rpmquery.at:228' \
+  "base64 extension query" "                         " 3
+at_xfail=no
+(
+  $as_echo "17. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:230:
+runroot rpm \\
+  --queryformat=\"%{pkgid:base64}\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:230"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="%{pkgid:base64}" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "qt8W635v5FKy1pILrW+0uw==
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:230"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_17
+#AT_START_18
+at_fn_group_banner 18 'rpmquery.at:241' \
+  "pgpsig extension query" "                         " 3
+at_xfail=no
+(
+  $as_echo "18. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:243:
+runroot rpm \\
+    --queryformat=\"%{rsaheader:pgpsig}\" \\
+    -qp /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:243"
+( $at_check_trace;
+runroot rpm \
+    --queryformat="%{rsaheader:pgpsig}" \
+    -qp /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /data/RPMS/hello-2.0-1.x86_64-signed.rpm: Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "RSA/SHA256, Thu Apr  6 13:02:33 2017, Key ID 4344591e1964c5fc" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:243"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_18
+#AT_START_19
+at_fn_group_banner 19 'rpmquery.at:255' \
+  "integer array perms format query" "               " 3
+at_xfail=no
+(
+  $as_echo "19. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:257:
+runroot rpm \\
+  --queryformat=\"[%{filemodes:perms}\\n]\" \\
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:257"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%{filemodes:perms}\n]" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-rwxr-x--x
+drwxr-xr-x
+-rw-r--r--
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:257"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_19
+#AT_START_20
+at_fn_group_banner 20 'rpmquery.at:271' \
+  "string array query" "                             " 3
+at_xfail=no
+(
+  $as_echo "20. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:273:
+runroot rpm \\
+  --queryformat=\"[%{basenames} ]\" \\
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:273"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%{basenames} ]" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello hello-1.0 FAQ " | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:273"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_20
+#AT_START_21
+at_fn_group_banner 21 'rpmquery.at:284' \
+  "empty string array query" "                       " 3
+at_xfail=no
+(
+  $as_echo "21. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:286:
+runroot rpm \\
+  --queryformat=\"[%{basenames}]\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:286"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%{basenames}]" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:286"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_21
+#AT_START_22
+at_fn_group_banner 22 'rpmquery.at:297' \
+  "empty string array extension array format" "      " 3
+at_xfail=no
+(
+  $as_echo "22. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:299:
+runroot rpm \\
+  --queryformat=\"[%{filenames}]\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:299"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%{filenames}]" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:299"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_22
+#AT_START_23
+at_fn_group_banner 23 'rpmquery.at:310' \
+  "empty string array extension query" "             " 3
+at_xfail=no
+(
+  $as_echo "23. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:312:
+runroot rpm \\
+  --queryformat=\"%{filenames}\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:312"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="%{filenames}" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "(none)" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:312"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_23
+#AT_START_24
+at_fn_group_banner 24 'rpmquery.at:323' \
+  "different sizes arrays query 1" "                 " 3
+at_xfail=no
+(
+  $as_echo "24. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:325:
+runroot rpm \\
+  --queryformat=\"[%{basenames} %{changelogname}]\\n\" \\
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:325"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%{basenames} %{changelogname}]\n" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: incorrect format: array iterator used with different sized arrays
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:325"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_24
+#AT_START_25
+at_fn_group_banner 25 'rpmquery.at:339' \
+  "different sizes arrays query 2" "                 " 3
+at_xfail=no
+(
+  $as_echo "25. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:341:
+runroot rpm \\
+  --queryformat=\"[%{name} %{changelogtime}]\\n\" \\
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:341"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%{name} %{changelogtime}]\n" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello 908877600
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:341"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_25
+#AT_START_26
+at_fn_group_banner 26 'rpmquery.at:353' \
+  "different sizes arrays query 3" "                 " 3
+at_xfail=no
+(
+  $as_echo "26. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:355:
+runroot rpm \\
+  --queryformat=\"[%{name} %{basenames}]\\n\" \\
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:355"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%{name} %{basenames}]\n" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: incorrect format: array iterator used with different sized arrays
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:355"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_26
+#AT_START_27
+at_fn_group_banner 27 'rpmquery.at:367' \
+  "different sizes arrays query 4" "                 " 3
+at_xfail=no
+(
+  $as_echo "27. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:369:
+runroot rpm \\
+  --queryformat=\"[%{=name} %{basenames}\\n]\" \\
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:369"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="[%{=name} %{basenames}\n]" \
+  -qp /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello hello
+hello hello-1.0
+hello FAQ
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:369"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_27
+#AT_START_28
+at_fn_group_banner 28 'rpmquery.at:383' \
+  "non-existent string tag" "                        " 3
+at_xfail=no
+(
+  $as_echo "28. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:385:
+runroot rpm \\
+  --queryformat=\"%{vendor}\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:385"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="%{vendor}" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "(none)" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:385"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_28
+#AT_START_29
+at_fn_group_banner 29 'rpmquery.at:396' \
+  "non-existent integer tag query" "                 " 3
+at_xfail=no
+(
+  $as_echo "29. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:398:
+runroot rpm \\
+  --queryformat=\"%{installcolor}\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:398"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="%{installcolor}" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "(none)" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:398"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_29
+#AT_START_30
+at_fn_group_banner 30 'rpmquery.at:409' \
+  "conditional queryformat" "                        " 3
+at_xfail=no
+(
+  $as_echo "30. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:411:
+runroot rpm \\
+  --queryformat=\"%|name?{%{name}}:{no}| %|installtime?{%{installtime}}:{(not installed)}|\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:411"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="%|name?{%{name}}:{no}| %|installtime?{%{installtime}}:{(not installed)}|" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo (not installed)" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:411"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_30
+#AT_START_31
+at_fn_group_banner 31 'rpmquery.at:422' \
+  "invalid tag query" "                              " 3
+at_xfail=no
+(
+  $as_echo "31. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:424:
+runroot rpm \\
+  --queryformat=\"%{notag}\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:424"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="%{notag}" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: incorrect format: unknown tag: \"notag\"
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:424"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_31
+#AT_START_32
+at_fn_group_banner 32 'rpmquery.at:436' \
+  "invalid data for format query" "                  " 3
+at_xfail=no
+(
+  $as_echo "32. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:438:
+runroot rpm \\
+  --queryformat=\"%{name:depflags}\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:438"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="%{name:depflags}" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "(not a number)" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:438"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_32
+#AT_START_33
+at_fn_group_banner 33 'rpmquery.at:449' \
+  "invalid format width query" "                     " 3
+at_xfail=no
+(
+  $as_echo "33. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:451:
+runroot rpm \\
+  --queryformat=\"%ss{size}\" \\
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:451"
+( $at_check_trace;
+runroot rpm \
+  --queryformat="%ss{size}" \
+  -qp /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: incorrect format: invalid field width
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:451"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_33
+#AT_START_34
+at_fn_group_banner 34 'rpmquery.at:462' \
+  "xml format" "                                     " 3
+at_xfail=no
+(
+  $as_echo "34. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:464:
+runroot rpm -qp --xml  data/RPMS/hello-2.0-1.x86_64.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmquery.at:464"
+( $at_check_trace;
+runroot rpm -qp --xml  data/RPMS/hello-2.0-1.x86_64.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "<rpmHeader>
+  <rpmTag name=\"Headeri18ntable\">
+       <string>C</string>
+  </rpmTag>
+  <rpmTag name=\"Sigsize\">
+       <integer>5411</integer>
+  </rpmTag>
+  <rpmTag name=\"Sigmd5\">
+       <base64>E3yh2LNcygKhhUujAcVDLg==
+</base64>
+  </rpmTag>
+  <rpmTag name=\"Sha1header\">
+       <string>5cd9874c510b67b44483f9e382a1649ef7743bac</string>
+  </rpmTag>
+  <rpmTag name=\"Sha256header\">
+       <string>ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9</string>
+  </rpmTag>
+  <rpmTag name=\"Name\">
+       <string>hello</string>
+  </rpmTag>
+  <rpmTag name=\"Version\">
+       <string>2.0</string>
+  </rpmTag>
+  <rpmTag name=\"Release\">
+       <string>1</string>
+  </rpmTag>
+  <rpmTag name=\"Summary\">
+       <string>hello -- hello, world rpm</string>
+  </rpmTag>
+  <rpmTag name=\"Description\">
+       <string>Simple rpm demonstration.</string>
+  </rpmTag>
+  <rpmTag name=\"Buildtime\">
+       <integer>1227355200</integer>
+  </rpmTag>
+  <rpmTag name=\"Buildhost\">
+       <string>localhost</string>
+  </rpmTag>
+  <rpmTag name=\"Size\">
+       <integer>7243</integer>
+  </rpmTag>
+  <rpmTag name=\"License\">
+       <string>GPL</string>
+  </rpmTag>
+  <rpmTag name=\"Group\">
+       <string>Testing</string>
+  </rpmTag>
+  <rpmTag name=\"Os\">
+       <string>linux</string>
+  </rpmTag>
+  <rpmTag name=\"Arch\">
+       <string>x86_64</string>
+  </rpmTag>
+  <rpmTag name=\"Filesizes\">
+       <integer>7120</integer>
+       <integer>4096</integer>
+       <integer>48</integer>
+       <integer>36</integer>
+       <integer>39</integer>
+  </rpmTag>
+  <rpmTag name=\"Filemodes\">
+       <integer>33257</integer>
+       <integer>16877</integer>
+       <integer>33188</integer>
+       <integer>33188</integer>
+       <integer>33188</integer>
+  </rpmTag>
+  <rpmTag name=\"Filerdevs\">
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+  </rpmTag>
+  <rpmTag name=\"Filemtimes\">
+       <integer>1489670606</integer>
+       <integer>1489670606</integer>
+       <integer>908894882</integer>
+       <integer>908895030</integer>
+       <integer>908884468</integer>
+  </rpmTag>
+  <rpmTag name=\"Filedigests\">
+       <string>c89fa87aeb1143969c0b6be9334b21d932f77f74e8f60120b5de316406369cf0</string>
+       <string/>
+       <string>fac3b28492ecdc16da172a6f1a432ceed356ca4d9248157b2a962b395e37b3b0</string>
+       <string>678b87e217a415f05e43460e2c7b668245b412e2b4f18a75aa7399d9774ed0b4</string>
+       <string>d63fdc6c986106f57230f217d36b2395d83ecf491d2b7187af714dc8db9629e9</string>
+  </rpmTag>
+  <rpmTag name=\"Filelinktos\">
+       <string/>
+       <string/>
+       <string/>
+       <string/>
+       <string/>
+  </rpmTag>
+  <rpmTag name=\"Fileflags\">
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+  </rpmTag>
+  <rpmTag name=\"Fileusername\">
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+  </rpmTag>
+  <rpmTag name=\"Filegroupname\">
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+       <string>root</string>
+  </rpmTag>
+  <rpmTag name=\"Sourcerpm\">
+       <string>hello-2.0-1.src.rpm</string>
+  </rpmTag>
+  <rpmTag name=\"Fileverifyflags\">
+       <integer>4294967295</integer>
+       <integer>0</integer>
+       <integer>4294967295</integer>
+       <integer>4294967295</integer>
+       <integer>4294967295</integer>
+  </rpmTag>
+  <rpmTag name=\"Archivesize\">
+       <integer>8060</integer>
+  </rpmTag>
+  <rpmTag name=\"Providename\">
+       <string>hello</string>
+       <string>hello(x86-64)</string>
+  </rpmTag>
+  <rpmTag name=\"Requireflags\">
+       <integer>16384</integer>
+       <integer>16384</integer>
+       <integer>16777226</integer>
+       <integer>16777226</integer>
+       <integer>16777226</integer>
+       <integer>16384</integer>
+  </rpmTag>
+  <rpmTag name=\"Requirename\">
+       <string>libc.so.6()(64bit)</string>
+       <string>libc.so.6(GLIBC_2.2.5)(64bit)</string>
+       <string>rpmlib(CompressedFileNames)</string>
+       <string>rpmlib(FileDigests)</string>
+       <string>rpmlib(PayloadFilesHavePrefix)</string>
+       <string>rtld(GNU_HASH)</string>
+  </rpmTag>
+  <rpmTag name=\"Requireversion\">
+       <string/>
+       <string/>
+       <string>3.0.4-1</string>
+       <string>4.6.0-1</string>
+       <string>4.0-1</string>
+       <string/>
+  </rpmTag>
+  <rpmTag name=\"Rpmversion\">
+       <string>4.13.90</string>
+  </rpmTag>
+  <rpmTag name=\"Changelogtime\">
+       <integer>1227355200</integer>
+       <integer>908884800</integer>
+  </rpmTag>
+  <rpmTag name=\"Changelogname\">
+       <string>Panu Matilainen &lt;pmatilai@redhat.com&gt;</string>
+       <string>Jeff Johnson &lt;jbj@redhat.com&gt;</string>
+  </rpmTag>
+  <rpmTag name=\"Changelogtext\">
+       <string>- updated version</string>
+       <string>- create.</string>
+  </rpmTag>
+  <rpmTag name=\"Filedevices\">
+       <integer>1</integer>
+       <integer>1</integer>
+       <integer>1</integer>
+       <integer>1</integer>
+       <integer>1</integer>
+  </rpmTag>
+  <rpmTag name=\"Fileinodes\">
+       <integer>1</integer>
+       <integer>2</integer>
+       <integer>3</integer>
+       <integer>4</integer>
+       <integer>5</integer>
+  </rpmTag>
+  <rpmTag name=\"Filelangs\">
+       <string/>
+       <string/>
+       <string/>
+       <string/>
+       <string/>
+  </rpmTag>
+  <rpmTag name=\"Prefixes\">
+       <string>/usr</string>
+  </rpmTag>
+  <rpmTag name=\"Provideflags\">
+       <integer>8</integer>
+       <integer>8</integer>
+  </rpmTag>
+  <rpmTag name=\"Provideversion\">
+       <string>2.0-1</string>
+       <string>2.0-1</string>
+  </rpmTag>
+  <rpmTag name=\"Dirindexes\">
+       <integer>0</integer>
+       <integer>1</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+  </rpmTag>
+  <rpmTag name=\"Basenames\">
+       <string>hello</string>
+       <string>hello-2.0</string>
+       <string>COPYING</string>
+       <string>FAQ</string>
+       <string>README</string>
+  </rpmTag>
+  <rpmTag name=\"Dirnames\">
+       <string>/usr/bin/</string>
+       <string>/usr/share/doc/</string>
+       <string>/usr/share/doc/hello-2.0/</string>
+  </rpmTag>
+  <rpmTag name=\"Optflags\">
+       <string>-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic</string>
+  </rpmTag>
+  <rpmTag name=\"Payloadformat\">
+       <string>cpio</string>
+  </rpmTag>
+  <rpmTag name=\"Payloadcompressor\">
+       <string>gzip</string>
+  </rpmTag>
+  <rpmTag name=\"Payloadflags\">
+       <string>9</string>
+  </rpmTag>
+  <rpmTag name=\"Platform\">
+       <string>x86_64-redhat-linux-gnu</string>
+  </rpmTag>
+  <rpmTag name=\"Filecolors\">
+       <integer>2</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+  </rpmTag>
+  <rpmTag name=\"Fileclass\">
+       <integer>0</integer>
+       <integer>1</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+       <integer>2</integer>
+  </rpmTag>
+  <rpmTag name=\"Classdict\">
+       <string>ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=775fdcb927e4300adbe83cfacec3cfeb1f63fe17, stripped</string>
+       <string>directory</string>
+       <string>ASCII text</string>
+  </rpmTag>
+  <rpmTag name=\"Filedependsx\">
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+  </rpmTag>
+  <rpmTag name=\"Filedependsn\">
+       <integer>3</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+       <integer>0</integer>
+  </rpmTag>
+  <rpmTag name=\"Dependsdict\">
+       <integer>1375731713</integer>
+       <integer>1375731712</integer>
+       <integer>1375731717</integer>
+  </rpmTag>
+  <rpmTag name=\"Filedigestalgo\">
+       <integer>8</integer>
+  </rpmTag>
+  <rpmTag name=\"Encoding\">
+       <string>utf-8</string>
+  </rpmTag>
+  <rpmTag name=\"Payloaddigest\">
+       <string>84a7338287bf19715c4eed0243f5cdb447eeb0ade37b2af718d4060aefca2f7c</string>
+  </rpmTag>
+  <rpmTag name=\"Payloaddigestalgo\">
+       <integer>8</integer>
+  </rpmTag>
+</rpmHeader>
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:464"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_34
+#AT_START_35
+at_fn_group_banner 35 'rpmquery.at:761' \
+  "query file attribute filtering" "                 " 3
+at_xfail=no
+(
+  $as_echo "35. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmquery.at:763:
+runroot rpmbuild -bb --quiet \\
+  /data/SPECS/vattrtest.spec
+
+pkg=\"/build/RPMS/noarch/vattrtest-1.0-1.noarch.rpm\"
+cmd=\"rpm -qpl\"
+for filter in --noconfig --noghost --noartifact -A -c -d -L; do
+    echo \${filter}
+    runroot \${cmd} \${filter} \${pkg}
+done
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmquery.at:763"
+( $at_check_trace;
+runroot rpmbuild -bb --quiet \
+  /data/SPECS/vattrtest.spec
+
+pkg="/build/RPMS/noarch/vattrtest-1.0-1.noarch.rpm"
+cmd="rpm -qpl"
+for filter in --noconfig --noghost --noartifact -A -c -d -L; do
+    echo ${filter}
+    runroot ${cmd} ${filter} ${pkg}
+done
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "--noconfig
+/opt/vattrtest
+/opt/vattrtest/a
+/opt/vattrtest/d
+/opt/vattrtest/g
+/opt/vattrtest/l
+/opt/vattrtest/m
+/opt/vattrtest/r
+--noghost
+/opt/vattrtest
+/opt/vattrtest/a
+/opt/vattrtest/c
+/opt/vattrtest/cn
+/opt/vattrtest/d
+/opt/vattrtest/l
+/opt/vattrtest/m
+/opt/vattrtest/r
+--noartifact
+/opt/vattrtest
+/opt/vattrtest/c
+/opt/vattrtest/cn
+/opt/vattrtest/d
+/opt/vattrtest/g
+/opt/vattrtest/l
+/opt/vattrtest/m
+/opt/vattrtest/r
+-A
+/opt/vattrtest/a
+-c
+/opt/vattrtest/c
+/opt/vattrtest/cn
+-d
+/opt/vattrtest/d
+-L
+/opt/vattrtest/l
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmquery.at:763"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_35
+#AT_START_36
+at_fn_group_banner 36 'rpmverify.at:7' \
+  "dependency problems" "                            " 4
+at_xfail=no
+(
+  $as_echo "36. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:9:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs deptest-two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U --nodeps /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -Va --nofiles
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:9"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs deptest-two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U --nodeps /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -Va --nofiles
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "Unsatisfied dependencies for deptest-one-1.0-1.noarch:
+       deptest-two is needed by (installed) deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmverify.at:9"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_36
+#AT_START_37
+at_fn_group_banner 37 'rpmverify.at:32' \
+  "files with no problems" "                         " 4
+at_xfail=no
+(
+  $as_echo "37. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:34:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --nodeps --noscripts --ignorearch --ignoreos \\
+       /data/RPMS/hello-1.0-1.i386.rpm
+runroot rpm -Va --nodeps --nouser --nogroup
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:34"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --nodeps --noscripts --ignorearch --ignoreos \
+       /data/RPMS/hello-1.0-1.i386.rpm
+runroot rpm -Va --nodeps --nouser --nogroup
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmverify.at:34"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_37
+#AT_START_38
+at_fn_group_banner 38 'rpmverify.at:48' \
+  "files with no problems in verbose mode" "         " 4
+at_xfail=no
+(
+  $as_echo "38. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:50:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --nodeps --noscripts --ignorearch --ignoreos \\
+       /data/RPMS/hello-1.0-1.i386.rpm
+runroot rpm -Vva --nodeps --nouser --nogroup
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:50"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --nodeps --noscripts --ignorearch --ignoreos \
+       /data/RPMS/hello-1.0-1.i386.rpm
+runroot rpm -Vva --nodeps --nouser --nogroup
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo ".........    /usr/local/bin/hello
+.........    /usr/share/doc/hello-1.0
+.........  d /usr/share/doc/hello-1.0/FAQ
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmverify.at:50"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_38
+#AT_START_39
+at_fn_group_banner 39 'rpmverify.at:67' \
+  "directory replaced with a directory symlink" "    " 4
+at_xfail=no
+(
+  $as_echo "39. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:69:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+        --define \"filetype datadir\" \\
+        --define \"filedata README1\" \\
+        --define \"user \$(id -u -n)\" \\
+        --define \"grp \$(id -g -n)\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+mv \"\${RPMTEST}\"/opt/foo \"\${RPMTEST}\"/opt/was
+ln -s was \"\${RPMTEST}\"/opt/foo
+runroot rpm -Vv replacetest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:69"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+        --define "filetype datadir" \
+        --define "filedata README1" \
+        --define "user $(id -u -n)" \
+        --define "grp $(id -g -n)" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+mv "${RPMTEST}"/opt/foo "${RPMTEST}"/opt/was
+ln -s was "${RPMTEST}"/opt/foo
+runroot rpm -Vv replacetest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo ".........    /opt/foo
+.........    /opt/foo/README1
+.........    /opt/goo
+.........    /opt/zoo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmverify.at:69"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_39
+#AT_START_40
+at_fn_group_banner 40 'rpmverify.at:98' \
+  "directory replaced with an invalid directory symlink" "" 4
+at_xfail=no
+(
+  $as_echo "40. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:100:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+        --define \"filetype datadir\" \\
+        --define \"filedata README1\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+mv \"\${RPMTEST}\"/opt/foo \"\${RPMTEST}\"/opt/was
+ln -s was \"\${RPMTEST}\"/opt/foo
+runroot rpm -Vv --nouser --nogroup replacetest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:100"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+        --define "filetype datadir" \
+        --define "filedata README1" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+mv "${RPMTEST}"/opt/foo "${RPMTEST}"/opt/was
+ln -s was "${RPMTEST}"/opt/foo
+runroot rpm -Vv --nouser --nogroup replacetest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "....L....    /opt/foo
+.........    /opt/foo/README1
+.........    /opt/goo
+.........    /opt/zoo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmverify.at:100"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_40
+#AT_START_41
+at_fn_group_banner 41 'rpmverify.at:128' \
+  "verify from db, with problems present" "          " 4
+at_xfail=no
+(
+  $as_echo "41. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:130:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --nodeps --noscripts --ignorearch --ignoreos \\
+       /data/RPMS/hello-1.0-1.i386.rpm
+rm -f \"\${RPMTEST}\"/usr/share/doc/hello-1.0/FAQ
+chmod u-x \"\${RPMTEST}\"/usr/local/bin/hello
+dd if=/dev/zero of=\"\${RPMTEST}\"/usr/local/bin/hello \\
+   conv=notrunc bs=1 seek=5 count=6 2> /dev/null
+runroot rpm -Va --nodeps --nouser --nogroup
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:130"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --nodeps --noscripts --ignorearch --ignoreos \
+       /data/RPMS/hello-1.0-1.i386.rpm
+rm -f "${RPMTEST}"/usr/share/doc/hello-1.0/FAQ
+chmod u-x "${RPMTEST}"/usr/local/bin/hello
+dd if=/dev/zero of="${RPMTEST}"/usr/local/bin/hello \
+   conv=notrunc bs=1 seek=5 count=6 2> /dev/null
+runroot rpm -Va --nodeps --nouser --nogroup
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo ".M5....T.    /usr/local/bin/hello
+missing   d /usr/share/doc/hello-1.0/FAQ
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmverify.at:130"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_41
+#AT_START_42
+at_fn_group_banner 42 'rpmverify.at:150' \
+  "verify from package, with problems present" "     " 4
+at_xfail=no
+(
+  $as_echo "42. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:152:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --nodeps --noscripts --ignorearch --ignoreos \\
+       /data/RPMS/hello-1.0-1.i386.rpm
+rm -f \"\${RPMTEST}\"/usr/share/doc/hello-1.0/FAQ
+chmod u-x \"\${RPMTEST}\"/usr/local/bin/hello
+dd if=/dev/zero of=\"\${RPMTEST}\"/usr/local/bin/hello \\
+   conv=notrunc bs=1 seek=5 count=6 2> /dev/null
+runroot rpm -Vp --nodeps --nouser --nogroup /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:152"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --nodeps --noscripts --ignorearch --ignoreos \
+       /data/RPMS/hello-1.0-1.i386.rpm
+rm -f "${RPMTEST}"/usr/share/doc/hello-1.0/FAQ
+chmod u-x "${RPMTEST}"/usr/local/bin/hello
+dd if=/dev/zero of="${RPMTEST}"/usr/local/bin/hello \
+   conv=notrunc bs=1 seek=5 count=6 2> /dev/null
+runroot rpm -Vp --nodeps --nouser --nogroup /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo ".M5....T.    /usr/local/bin/hello
+missing   d /usr/share/doc/hello-1.0/FAQ
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmverify.at:152"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_42
+#AT_START_43
+at_fn_group_banner 43 'rpmverify.at:171' \
+  "verify file attribute filtering" "                " 4
+at_xfail=no
+(
+  $as_echo "43. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:173:
+runroot rpmbuild -bb --quiet \\
+  /data/SPECS/vattrtest.spec
+
+runroot rpm -U /build/RPMS/noarch/vattrtest-1.0-1.noarch.rpm
+runroot_other touch /opt/vattrtest/g
+runroot_other chmod 644 /opt/vattrtest/g
+
+cmd=\"rpm -Vv --nouser --nogroup\"
+for filter in --noconfig --noghost --noartifact; do
+    echo \${filter}
+    runroot \${cmd} \${filter} vattrtest
+done
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmverify.at:173"
+( $at_check_trace;
+runroot rpmbuild -bb --quiet \
+  /data/SPECS/vattrtest.spec
+
+runroot rpm -U /build/RPMS/noarch/vattrtest-1.0-1.noarch.rpm
+runroot_other touch /opt/vattrtest/g
+runroot_other chmod 644 /opt/vattrtest/g
+
+cmd="rpm -Vv --nouser --nogroup"
+for filter in --noconfig --noghost --noartifact; do
+    echo ${filter}
+    runroot ${cmd} ${filter} vattrtest
+done
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "--noconfig
+.........    /opt/vattrtest
+.........  a /opt/vattrtest/a
+.........  d /opt/vattrtest/d
+.........  g /opt/vattrtest/g
+.........  l /opt/vattrtest/l
+.........  m /opt/vattrtest/m
+.........  r /opt/vattrtest/r
+--noghost
+.........    /opt/vattrtest
+.........  a /opt/vattrtest/a
+.........  c /opt/vattrtest/c
+.........  c /opt/vattrtest/cn
+.........  d /opt/vattrtest/d
+.........  l /opt/vattrtest/l
+.........  m /opt/vattrtest/m
+.........  r /opt/vattrtest/r
+--noartifact
+.........    /opt/vattrtest
+.........  c /opt/vattrtest/c
+.........  c /opt/vattrtest/cn
+.........  d /opt/vattrtest/d
+.........  g /opt/vattrtest/g
+.........  l /opt/vattrtest/l
+.........  m /opt/vattrtest/m
+.........  r /opt/vattrtest/r
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_skip $at_status "$at_srcdir/rpmverify.at:173"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_43
+#AT_START_44
+at_fn_group_banner 44 'rpmverify.at:220' \
+  "verifyscript failure" "                           " 4
+at_xfail=no
+(
+  $as_echo "44. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:222:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+rm -rf \"\${TOPDIR}\"
+runroot rpmbuild --quiet -bb /data/SPECS/verifyscript.spec
+runroot rpm -U --nodeps /build/RPMS/noarch/verifyscript-1.0-1.noarch.rpm
+rm -f \"\${RPMTEST}\"/var/checkme
+runroot rpm -V --nodeps verifyscript
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:222"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+rm -rf "${TOPDIR}"
+runroot rpmbuild --quiet -bb /data/SPECS/verifyscript.spec
+runroot rpm -U --nodeps /build/RPMS/noarch/verifyscript-1.0-1.noarch.rpm
+rm -f "${RPMTEST}"/var/checkme
+runroot rpm -V --nodeps verifyscript
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmverify.at:222"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_44
+#AT_START_45
+at_fn_group_banner 45 'rpmverify.at:237' \
+  "verifyscript success" "                           " 4
+at_xfail=no
+(
+  $as_echo "45. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:239:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+rm -rf \"\${TOPDIR}\"
+runroot rpmbuild --quiet -bb /data/SPECS/verifyscript.spec
+runroot rpm -U --nodeps /build/RPMS/noarch/verifyscript-1.0-1.noarch.rpm
+touch \"\${RPMTEST}\"/var/checkme
+runroot rpm -V --nodeps verifyscript
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:239"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+rm -rf "${TOPDIR}"
+runroot rpmbuild --quiet -bb /data/SPECS/verifyscript.spec
+runroot rpm -U --nodeps /build/RPMS/noarch/verifyscript-1.0-1.noarch.rpm
+touch "${RPMTEST}"/var/checkme
+runroot rpm -V --nodeps verifyscript
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmverify.at:239"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_45
+#AT_START_46
+at_fn_group_banner 46 'rpmverify.at:256' \
+  "shared file timestamp behavior" "                 " 4
+at_xfail=no
+(
+  $as_echo "46. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:258:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+# create packages sharing a file but with different timestamp
+for p in \"one\" \"two\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"pkg \$p\" \\
+       --define \"filedata same_stuff\" \\
+          /data/SPECS/conflicttest.spec
+    sleep 1
+done
+
+# first instance of a shared file is the one that actually gets created,
+# force the order so we know what to expect as these dont depend on each other
+runroot rpm -U --noorder /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+runroot rpm -e conflicttwo
+runroot rpm -Va --nouser --nogroup
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:258"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+# create packages sharing a file but with different timestamp
+for p in "one" "two"; do
+    runroot rpmbuild --quiet -bb \
+        --define "pkg $p" \
+       --define "filedata same_stuff" \
+          /data/SPECS/conflicttest.spec
+    sleep 1
+done
+
+# first instance of a shared file is the one that actually gets created,
+# force the order so we know what to expect as these dont depend on each other
+runroot rpm -U --noorder /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+runroot rpm -e conflicttwo
+runroot rpm -Va --nouser --nogroup
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmverify.at:258"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_46
+#AT_START_47
+at_fn_group_banner 47 'rpmverify.at:285' \
+  "Upgraded verification with min_writes 1 (files)" "" 4
+at_xfail=no
+(
+  $as_echo "47. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:287:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${tf}\" \"\${tf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/replacetest.spec
+done
+
+for v in \"3.0\" \"4.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filetype file\" \\
+       --define \"filedata fox\" \\
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat \"\${tf}\"
+touch -t 201703171717 \${tf}
+
+runroot rpm -U \\
+       --define \"_minimize_writes 1\" \\
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -Va --nouser --nogroup replacetest
+cat \"\${tf}\"
+
+runroot rpm -U \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+cat \"\${tf}\"
+
+echo \"xx\" > \"\${tf}\"
+cat \"\${tf}\"
+
+runroot rpm -U \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+cat \"\${tf}\"
+
+touch -t 201703171717 \${tf}
+
+runroot rpm -U --oldpackage \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+cat \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:287"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${tf}" "${tf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+done
+
+for v in "3.0" "4.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype file" \
+       --define "filedata fox" \
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+touch -t 201703171717 ${tf}
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -Va --nouser --nogroup replacetest
+cat "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+cat "${tf}"
+
+echo "xx" > "${tf}"
+cat "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+cat "${tf}"
+
+touch -t 201703171717 ${tf}
+
+runroot rpm -U --oldpackage \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+cat "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+foo
+fox
+xx
+fox
+fox
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmverify.at:287"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_47
+#AT_START_48
+at_fn_group_banner 48 'rpmverify.at:357' \
+  "Upgraded verification with min_writes 2 (files)" "" 4
+at_xfail=no
+(
+  $as_echo "48. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:359:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${tf}\" \"\${tf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/replacetest.spec
+done
+
+for v in \"3.0\" \"4.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filetype file\" \\
+       --define \"filedata fox\" \\
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat \"\${tf}\"
+touch -t 201703171717 \${tf}
+
+runroot rpm -Uvv --fsmdebug \\
+       --define \"_minimize_writes 1\" \\
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm > output.txt 2>&1
+runroot rpm -Va --nouser --nogroup replacetest
+grep -c \"touch\" output.txt
+cat \"\${tf}\"
+
+
+runroot rpm -Uvv --fsmdebug \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c \"touch\" output.txt
+cat \"\${tf}\"
+echo \"xx\" > \"\${tf}\"
+cat \"\${tf}\"
+
+runroot rpm -Uvv --fsmdebug \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c \"touch\" output.txt
+cat \"\${tf}\"
+
+touch -t 201703171717 \${tf}
+
+runroot rpm -U -Uvv --fsmdebug  --oldpackage \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c  \"touch\" output.txt
+cat \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:359"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${tf}" "${tf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+done
+
+for v in "3.0" "4.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype file" \
+       --define "filedata fox" \
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+touch -t 201703171717 ${tf}
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm > output.txt 2>&1
+runroot rpm -Va --nouser --nogroup replacetest
+grep -c "touch" output.txt
+cat "${tf}"
+
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c "touch" output.txt
+cat "${tf}"
+echo "xx" > "${tf}"
+cat "${tf}"
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c "touch" output.txt
+cat "${tf}"
+
+touch -t 201703171717 ${tf}
+
+runroot rpm -U -Uvv --fsmdebug  --oldpackage \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c  "touch" output.txt
+cat "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+2
+foo
+1
+fox
+xx
+1
+fox
+2
+fox
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmverify.at:359"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_48
+#AT_START_49
+at_fn_group_banner 49 'rpmverify.at:436' \
+  "Upgraded verification with min_writes 3 (LINKs)" "" 4
+at_xfail=no
+(
+  $as_echo "49. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:438:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${tf}\" \"\${tf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filetype link\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/replacetest.spec
+done
+
+for v in \"3.0\" \"4.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filetype link\" \\
+       --define \"filedata fox\" \\
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink \"\${tf}\"
+
+runroot rpm -U \\
+       --define \"_minimize_writes 1\" \\
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -Va --nouser --nogroup replacetest
+readlink \"\${tf}\"
+
+runroot rpm -U \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+readlink \"\${tf}\"
+
+ln -sf \"xx\" \"\${tf}\"
+readlink \"\${tf}\"
+
+runroot rpm -U \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+readlink \"\${tf}\"
+
+runroot rpm -U --oldpackage \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+readlink \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:438"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${tf}" "${tf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype link" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+done
+
+for v in "3.0" "4.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype link" \
+       --define "filedata fox" \
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -Va --nouser --nogroup replacetest
+readlink "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+readlink "${tf}"
+
+ln -sf "xx" "${tf}"
+readlink "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+readlink "${tf}"
+
+runroot rpm -U --oldpackage \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+readlink "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+foo
+fox
+xx
+fox
+fox
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmverify.at:438"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_49
+#AT_START_50
+at_fn_group_banner 50 'rpmverify.at:503' \
+  "Upgraded verification with min_writes 4 (LINKs)" "" 4
+at_xfail=no
+(
+  $as_echo "50. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmverify.at:505:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${tf}\" \"\${tf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filetype link\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/replacetest.spec
+done
+
+for v in \"3.0\" \"4.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filetype link\" \\
+       --define \"filedata fox\" \\
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink \"\${tf}\"
+
+runroot rpm -Uvv --fsmdebug \\
+       --define \"_minimize_writes 1\" \\
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm > output.txt 2>&1
+runroot rpm -Va --nouser --nogroup replacetest
+grep -c \"touch\" output.txt
+readlink \"\${tf}\"
+
+
+runroot rpm -Uvv --fsmdebug \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c \"touch\" output.txt
+readlink \"\${tf}\"
+ln -sf \"xx\" \"\${tf}\"
+readlink \"\${tf}\"
+
+runroot rpm -Uvv --fsmdebug \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c \"touch\" output.txt
+readlink \"\${tf}\"
+
+runroot rpm -U -Uvv --fsmdebug  --oldpackage \\
+       --define \"_minimize_writes 1\" \\
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c  \"touch\" output.txt
+readlink \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmverify.at:505"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${tf}" "${tf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype link" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+done
+
+for v in "3.0" "4.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype link" \
+       --define "filedata fox" \
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm > output.txt 2>&1
+runroot rpm -Va --nouser --nogroup replacetest
+grep -c "touch" output.txt
+readlink "${tf}"
+
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c "touch" output.txt
+readlink "${tf}"
+ln -sf "xx" "${tf}"
+readlink "${tf}"
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c "touch" output.txt
+readlink "${tf}"
+
+runroot rpm -U -Uvv --fsmdebug  --oldpackage \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c  "touch" output.txt
+readlink "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+2
+foo
+1
+fox
+xx
+1
+fox
+2
+fox
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmverify.at:505"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_50
+#AT_START_51
+at_fn_group_banner 51 'rpmsigdig.at:7' \
+  "rpmkeys -Kv <unsigned> 1" "                       " 5
+at_xfail=no
+(
+  $as_echo "51. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:9:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64.rpm /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:9"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64.rpm /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/data/RPMS/hello-2.0-1.x86_64.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    MD5 digest: OK
+/data/RPMS/hello-1.0-1.i386.rpm:
+    Header SHA1 digest: OK
+    MD5 digest: OK
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmsigdig.at:9"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_51
+#AT_START_52
+at_fn_group_banner 52 'rpmsigdig.at:31' \
+  "rpmkeys -Kv <corrupted unsigned> 1" "             " 5
+at_xfail=no
+(
+  $as_echo "52. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:33:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+pkg=\"hello-2.0-1.x86_64.rpm\"
+cp \"\${RPMTEST}\"/data/RPMS/\${pkg} \"\${RPMTEST}\"/tmp/\${pkg}
+# conv=notrunc bs=1 seek=261 count=6 2> /dev/null
+dd if=/dev/zero of=\"\${RPMTEST}\"/tmp/\${pkg} \\
+   conv=notrunc bs=1 seek=333 count=4 2> /dev/null
+runroot rpmkeys -Kv /tmp/\${pkg}
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:33"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+# conv=notrunc bs=1 seek=261 count=6 2> /dev/null
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=333 count=4 2> /dev/null
+runroot rpmkeys -Kv /tmp/${pkg}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/tmp/hello-2.0-1.x86_64.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    MD5 digest: BAD (Expected 007ca1d8b35cca02a1854ba301c5432e != 137ca1d8b35cca02a1854ba301c5432e)
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmsigdig.at:33"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_52
+#AT_START_53
+at_fn_group_banner 53 'rpmsigdig.at:56' \
+  "rpmkeys -Kv <corrupted unsigned> 2" "             " 5
+at_xfail=no
+(
+  $as_echo "53. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:58:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+pkg=\"hello-2.0-1.x86_64.rpm\"
+cp \"\${RPMTEST}\"/data/RPMS/\${pkg} \"\${RPMTEST}\"/tmp/\${pkg}
+dd if=/dev/zero of=\"\${RPMTEST}\"/tmp/\${pkg} \\
+   conv=notrunc bs=1 seek=5555 count=6 2> /dev/null
+runroot rpmkeys -Kv /tmp/\${pkg}
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:58"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=5555 count=6 2> /dev/null
+runroot rpmkeys -Kv /tmp/${pkg}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/tmp/hello-2.0-1.x86_64.rpm:
+    Header SHA1 digest: BAD (Expected 5cd9874c510b67b44483f9e382a1649ef7743bac != 4261b2c1eb861a4152c2239bce20bfbcaa8971ba)
+    Header SHA256 digest: BAD (Expected ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9 != 29fdfe92782fb0470a9a164a6c94af87d3b138c63b39d4c30e0223ca1202ba82)
+    Payload SHA256 digest: OK
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != de65519eeb4ab52eb076ec054d42e34e)
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmsigdig.at:58"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_53
+#AT_START_54
+at_fn_group_banner 54 'rpmsigdig.at:81' \
+  "rpmkeys -Kv <corrupted unsigned> 3" "             " 5
+at_xfail=no
+(
+  $as_echo "54. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:83:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+pkg=\"hello-2.0-1.x86_64.rpm\"
+cp \"\${RPMTEST}\"/data/RPMS/\${pkg} \"\${RPMTEST}\"/tmp/\${pkg}
+dd if=/dev/zero of=\"\${RPMTEST}\"/tmp/\${pkg} \\
+   conv=notrunc bs=1 seek=7777 count=6 2> /dev/null
+runroot rpmkeys -Kv /tmp/\${pkg}
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:83"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=7777 count=6 2> /dev/null
+runroot rpmkeys -Kv /tmp/${pkg}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/tmp/hello-2.0-1.x86_64.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: BAD (Expected 84a7338287bf19715c4eed0243f5cdb447eeb0ade37b2af718d4060aefca2f7c != bea903609dceac36e1f26a983c493c98064d320fdfeb423034ed63d649b2c8dc)
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != d662cd0d81601a7107312684ad1ddf38)
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmsigdig.at:83"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_54
+#AT_START_55
+at_fn_group_banner 55 'rpmsigdig.at:106' \
+  "rpmkeys -Kv <unsigned> 2" "                       " 5
+at_xfail=no
+(
+  $as_echo "55. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:108:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild -bb --quiet \\
+       --define \"%optflags -O2 -g\" \\
+       --define \"%_target_platform noarch-linux\" \\
+       --define \"%_binary_payload w.ufdio\" \\
+       --define \"%_buildhost localhost\" \\
+       --define \"%source_date_epoch_from_changelog 1\" \\
+       --define \"%clamp_mtime_to_source_date_epoch 1\" \\
+       /data/SPECS/attrtest.spec
+runroot rpmkeys -Kv /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:108"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild -bb --quiet \
+       --define "%optflags -O2 -g" \
+       --define "%_target_platform noarch-linux" \
+       --define "%_binary_payload w.ufdio" \
+       --define "%_buildhost localhost" \
+       --define "%source_date_epoch_from_changelog 1" \
+       --define "%clamp_mtime_to_source_date_epoch 1" \
+       /data/SPECS/attrtest.spec
+runroot rpmkeys -Kv /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/build/RPMS/noarch/attrtest-1.0-1.noarch.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    MD5 digest: OK
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmsigdig.at:108"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_55
+#AT_START_56
+at_fn_group_banner 56 'rpmsigdig.at:135' \
+  "rpmkeys --import rsa" "                           " 5
+at_xfail=no
+(
+  $as_echo "56. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:137:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpm -qi gpg-pubkey-1964c5fc-58e63918|grep -v Date|grep -v Version:
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:137"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpm -qi gpg-pubkey-1964c5fc-58e63918|grep -v Date|grep -v Version:
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "Name        : gpg-pubkey
+Version     : 1964c5fc
+Release     : 58e63918
+Architecture: (none)
+Group       : Public Keys
+Size        : 0
+License     : pubkey
+Signature   : (none)
+Source RPM  : (none)
+Build Host  : localhost
+Relocations : (not relocatable)
+Packager    : rpm.org RSA testkey <rsa@rpm.org>
+Summary     : gpg(rpm.org RSA testkey <rsa@rpm.org>)
+Description :
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQENBFjmORgBCAC7TMEk6wnjSs8Dr4yqSScWdU2pjcqrkTxuzdWvowcIUPZI0w/g
+HkRqGd4apjvY2V15kjL10gk3QhFP3pZ/9p7zh8o8NHX7aGdSGDK7NOq1eFaErPRY
+91LW9RiZ0lbOjXEzIL0KHxUiTQEmdXJT43DJMFPyW9fkCWg0OltiX618FUdWWfI8
+eySdLur1utnqBvdEbCUvWK2RX3vQZQdvEBODnNk2pxqTyV0w6VPQ96W++lF/5Aas
+7rUv3HIyIXxIggc8FRrnH+y9XvvHDonhTIlGnYZN4ubm9i4y3gOkrZlGTrEw7elQ
+1QeMyG2QQEbze8YjpTm4iLABCBrRfPRaQpwrABEBAAG0IXJwbS5vcmcgUlNBIHRl
+c3RrZXkgPHJzYUBycG0ub3JnPokBNwQTAQgAIQUCWOY5GAIbAwULCQgHAgYVCAkK
+CwIEFgIDAQIeAQIXgAAKCRBDRFkeGWTF/MxxCACnjqFL+MmPh9W9JQKT2DcLbBzf
+Cqo6wcEBoCOcwgRSk8dSikhARoteoa55JRJhuMyeKhhEAogE9HRmCPFdjezFTwgB
+BDVBpO2dZ023mLXDVCYX3S8pShOgCP6Tn4wqCnYeAdLcGg106N4xcmgtcssJE+Pr
+XzTZksbZsrTVEmL/Ym+R5w5jBfFnGk7Yw7ndwfQsfNXQb5AZynClFxnX546lcyZX
+fEx3/e6ezw57WNOUK6WT+8b+EGovPkbetK/rGxNXuWaP6X4A/QUm8O98nCuHYFQq
++mvNdsCBqGf7mhaRGtpHk/JgCn5rFvArMDqLVrR9hX0LdCSsH7EGE+bR3r7wuQEN
+BFjmORgBCACk+vDZrIXQuFXEYToZVwb2attzbbJJCqD71vmZTLsW0QxuPKRgbcYY
+zp4K4lVBnHhFrF8MOUOxJ7kQWIJZMZFt+BDcptCYurbD2H4W2xvnWViiC+LzCMzz
+iMJT6165uefL4JHTDPxC2fFiM9yrc72LmylJNkM/vepT128J5Qv0gRUaQbHiQuS6
+Dm/+WRnUfx3i89SV4mnBxb/Ta93GVqoOciWwzWSnwEnWYAvOb95JL4U7c5J5f/+c
+KnQDHsW7sIiIdscsWzvgf6qs2Ra1Zrt7Fdk4+ZS2f/adagLhDO1C24sXf5XfMk5m
+L0OGwZSr9m5s17VXxfspgU5ugc8kBJfzABEBAAGJAR8EGAEIAAkFAljmORgCGwwA
+CgkQQ0RZHhlkxfzwDQf/Y5on5o+s/xD3tDyRYa6SErfT44lEArdCD7Yi+cygJFox
+3jyM8ovtJAkwRegwyxcaLN7zeG1p1Sk9ZAYWQEJT6qSU4Ppu+CVGHgxgnTcfUiu6
+EZZQE6srvua53IMY1lT50M7vx0T5VicHFRWBFV2C/Mc32p7cEE6nn45nEZgUXQNl
+ySEyvoRlsAJq6gFsfqucVz2vMJDTMVczUtq1CjvUqFbif8JVL36EoZCf1SeRw6d6
+s1Kp3AA33Rjd+Uw87HJ4EIB75zMFQX2H0ggAVdYTQcqGXHP5MZK1jJrHfxJyMi3d
+UNW2iqnN3BA7guhOv6OMiROF1+I7Q5nWT63mQC7IgQ==
+=Z6nu
+-----END PGP PUBLIC KEY BLOCK-----
+
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmsigdig.at:137"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_56
+#AT_START_57
+at_fn_group_banner 57 'rpmsigdig.at:196' \
+  "rpmkeys -K <signed> 1" "                          " 5
+at_xfail=no
+(
+  $as_echo "57. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:198:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmkeys -K /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -K /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:198"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmkeys -K /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -K /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/data/RPMS/hello-2.0-1.x86_64-signed.rpm: digests SIGNATURES NOT OK
+/data/RPMS/hello-2.0-1.x86_64-signed.rpm: digests signatures OK
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmsigdig.at:198"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_57
+#AT_START_58
+at_fn_group_banner 58 'rpmsigdig.at:216' \
+  "rpmkeys -Kv <signed> 1" "                         " 5
+at_xfail=no
+(
+  $as_echo "58. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:218:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys -Kv --nodigest /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys -Kv --nosignature /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:218"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys -Kv --nodigest /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+runroot rpmkeys -Kv --nosignature /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/data/RPMS/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    MD5 digest: OK
+/data/RPMS/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    MD5 digest: OK
+/data/RPMS/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+/data/RPMS/hello-2.0-1.x86_64-signed.rpm:
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    MD5 digest: OK
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmsigdig.at:218"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_58
+#AT_START_59
+at_fn_group_banner 59 'rpmsigdig.at:258' \
+  "rpmkeys -Kv <corrupted signed> 1" "               " 5
+at_xfail=no
+(
+  $as_echo "59. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:260:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+pkg=\"hello-2.0-1.x86_64-signed.rpm\"
+cp \"\${RPMTEST}\"/data/RPMS/\${pkg} \"\${RPMTEST}\"/tmp/\${pkg}
+dd if=/dev/zero of=\"\${RPMTEST}\"/tmp/\${pkg} \\
+   conv=notrunc bs=1 seek=264 count=6 2> /dev/null
+
+runroot rpmkeys -Kv /tmp/\${pkg}
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/\${pkg}
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:260"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=264 count=6 2> /dev/null
+
+runroot rpmkeys -Kv /tmp/${pkg}
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/${pkg}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header signature: BAD (package tag 268: invalid OpenPGP signature)
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    MD5 digest: OK
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header signature: BAD (package tag 268: invalid OpenPGP signature)
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    MD5 digest: OK
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmsigdig.at:260"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_59
+#AT_START_60
+at_fn_group_banner 60 'rpmsigdig.at:294' \
+  "rpmkeys -Kv <corrupted signed> 2" "               " 5
+at_xfail=no
+(
+  $as_echo "60. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:296:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+pkg=\"hello-2.0-1.x86_64-signed.rpm\"
+cp \"\${RPMTEST}\"/data/RPMS/\${pkg} \"\${RPMTEST}\"/tmp/\${pkg}
+dd if=/dev/zero of=\"\${RPMTEST}\"/tmp/\${pkg} \\
+   conv=notrunc bs=1 seek=5555 count=6 2> /dev/null
+
+runroot rpmkeys -Kv /tmp/\${pkg}
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/\${pkg}
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:296"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=5555 count=6 2> /dev/null
+
+runroot rpmkeys -Kv /tmp/${pkg}
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/${pkg}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    Header SHA1 digest: BAD (Expected 5cd9874c510b67b44483f9e382a1649ef7743bac != 4261b2c1eb861a4152c2239bce20bfbcaa8971ba)
+    Header SHA256 digest: BAD (Expected ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9 != 29fdfe92782fb0470a9a164a6c94af87d3b138c63b39d4c30e0223ca1202ba82)
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != de65519eeb4ab52eb076ec054d42e34e)
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    Header SHA1 digest: BAD (Expected 5cd9874c510b67b44483f9e382a1649ef7743bac != 4261b2c1eb861a4152c2239bce20bfbcaa8971ba)
+    Header SHA256 digest: BAD (Expected ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9 != 29fdfe92782fb0470a9a164a6c94af87d3b138c63b39d4c30e0223ca1202ba82)
+    Payload SHA256 digest: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != de65519eeb4ab52eb076ec054d42e34e)
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmsigdig.at:296"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_60
+#AT_START_61
+at_fn_group_banner 61 'rpmsigdig.at:331' \
+  "rpmkeys -Kv <corrupted signed> 3" "               " 5
+at_xfail=no
+(
+  $as_echo "61. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:333:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+pkg=\"hello-2.0-1.x86_64-signed.rpm\"
+cp \"\${RPMTEST}\"/data/RPMS/\${pkg} \"\${RPMTEST}\"/tmp/\${pkg}
+dd if=/dev/zero of=\"\${RPMTEST}\"/tmp/\${pkg} \\
+   conv=notrunc bs=1 seek=7777 count=6 2> /dev/null
+
+runroot rpmkeys -Kv /tmp/\${pkg}
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/\${pkg}
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:333"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=7777 count=6 2> /dev/null
+
+runroot rpmkeys -Kv /tmp/${pkg}
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/${pkg}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: BAD (Expected 84a7338287bf19715c4eed0243f5cdb447eeb0ade37b2af718d4060aefca2f7c != bea903609dceac36e1f26a983c493c98064d320fdfeb423034ed63d649b2c8dc)
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != d662cd0d81601a7107312684ad1ddf38)
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    Header SHA1 digest: OK
+    Header SHA256 digest: OK
+    Payload SHA256 digest: BAD (Expected 84a7338287bf19715c4eed0243f5cdb447eeb0ade37b2af718d4060aefca2f7c != bea903609dceac36e1f26a983c493c98064d320fdfeb423034ed63d649b2c8dc)
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+    MD5 digest: BAD (Expected 137ca1d8b35cca02a1854ba301c5432e != d662cd0d81601a7107312684ad1ddf38)
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmsigdig.at:333"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_61
+#AT_START_62
+at_fn_group_banner 62 'rpmsigdig.at:368' \
+  "rpmsign --addsign <unsigned>" "                   " 5
+at_xfail=no
+(
+  $as_echo "62. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:370:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+cp \"\${RPMTEST}\"/data/RPMS/hello-2.0-1.x86_64.rpm \"\${RPMTEST}\"/tmp/
+run rpmsign --key-id 1964C5FC --addsign \"\${RPMTEST}\"/tmp/hello-2.0-1.x86_64.rpm > /dev/null
+echo PRE-IMPORT
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64.rpm|grep -v digest
+echo POST-IMPORT
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64.rpm|grep -v digest
+run rpmsign --delsign \"\${RPMTEST}\"/tmp/hello-2.0-1.x86_64.rpm > /dev/null
+echo POST-DELSIGN
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64.rpm|grep -v digest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:370"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+cp "${RPMTEST}"/data/RPMS/hello-2.0-1.x86_64.rpm "${RPMTEST}"/tmp/
+run rpmsign --key-id 1964C5FC --addsign "${RPMTEST}"/tmp/hello-2.0-1.x86_64.rpm > /dev/null
+echo PRE-IMPORT
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64.rpm|grep -v digest
+echo POST-IMPORT
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64.rpm|grep -v digest
+run rpmsign --delsign "${RPMTEST}"/tmp/hello-2.0-1.x86_64.rpm > /dev/null
+echo POST-DELSIGN
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64.rpm|grep -v digest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "PRE-IMPORT
+/tmp/hello-2.0-1.x86_64.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+POST-IMPORT
+/tmp/hello-2.0-1.x86_64.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: OK
+POST-DELSIGN
+/tmp/hello-2.0-1.x86_64.rpm:
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmsigdig.at:370"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_62
+#AT_START_63
+at_fn_group_banner 63 'rpmsigdig.at:403' \
+  "rpmsign --delsign <package>" "                    " 5
+at_xfail=no
+(
+  $as_echo "63. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:405:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+cp \"\${RPMTEST}\"/data/RPMS/hello-2.0-1.x86_64-signed.rpm \"\${RPMTEST}\"/tmp/
+echo PRE-DELSIGN
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64-signed.rpm|grep -v digest
+echo POST-DELSIGN
+run rpmsign --delsign \"\${RPMTEST}\"/tmp/hello-2.0-1.x86_64-signed.rpm > /dev/null
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64-signed.rpm|grep -v digest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:405"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+cp "${RPMTEST}"/data/RPMS/hello-2.0-1.x86_64-signed.rpm "${RPMTEST}"/tmp/
+echo PRE-DELSIGN
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64-signed.rpm|grep -v digest
+echo POST-DELSIGN
+run rpmsign --delsign "${RPMTEST}"/tmp/hello-2.0-1.x86_64-signed.rpm > /dev/null
+runroot rpmkeys -Kv /tmp/hello-2.0-1.x86_64-signed.rpm|grep -v digest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "PRE-DELSIGN
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+    Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+    V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+POST-DELSIGN
+/tmp/hello-2.0-1.x86_64-signed.rpm:
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmsigdig.at:405"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_63
+#AT_START_64
+at_fn_group_banner 64 'rpmsigdig.at:430' \
+  "rpmsign --addsign <signed>" "                     " 5
+at_xfail=no
+(
+  $as_echo "64. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmsigdig.at:432:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+cp \"\${RPMTEST}\"/data/RPMS/hello-2.0-1.x86_64-signed.rpm \"\${RPMTEST}\"/tmp/
+run rpmsign --key-id 1964C5FC --addsign \"\${RPMTEST}\"/tmp/hello-2.0-1.x86_64-signed.rpm 2>&1 |grep -q \"already contains identical signature, skipping\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmsigdig.at:432"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+cp "${RPMTEST}"/data/RPMS/hello-2.0-1.x86_64-signed.rpm "${RPMTEST}"/tmp/
+run rpmsign --key-id 1964C5FC --addsign "${RPMTEST}"/tmp/hello-2.0-1.x86_64-signed.rpm 2>&1 |grep -q "already contains identical signature, skipping"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmsigdig.at:432"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_64
+#AT_START_65
+at_fn_group_banner 65 'rpmdb.at:23' \
+  "rpm --initdb" "                                   " 6
+at_xfail=no
+(
+  $as_echo "65. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:25:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:25"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:25"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_65
+#AT_START_66
+at_fn_group_banner 66 'rpmdb.at:36' \
+  "rpm -qa" "                                        " 6
+at_xfail=no
+(
+  $as_echo "66. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:38:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+runroot rpm \\
+  -qa
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:38"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+runroot rpm \
+  -qa
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:38"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_66
+#AT_START_67
+at_fn_group_banner 67 'rpmdb.at:49' \
+  "rpm -q foo" "                                     " 6
+at_xfail=no
+(
+  $as_echo "67. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:51:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \\
+  /data/RPMS/foo-1.0-1.noarch.rpm
+
+runroot rpm -q foo
+
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:51"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \
+  /data/RPMS/foo-1.0-1.noarch.rpm
+
+runroot rpm -q foo
+
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:51"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_67
+#AT_START_68
+at_fn_group_banner 68 'rpmdb.at:69' \
+  "rpm -q foo-" "                                    " 6
+at_xfail=no
+(
+  $as_echo "68. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:71:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \\
+  /data/RPMS/foo-1.0-1.noarch.rpm
+
+runroot rpm -q foo-
+
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:71"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \
+  /data/RPMS/foo-1.0-1.noarch.rpm
+
+runroot rpm -q foo-
+
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "package foo- is not installed
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdb.at:71"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_68
+#AT_START_69
+at_fn_group_banner 69 'rpmdb.at:90' \
+  "rpm -i *.noarch.rpm" "                            " 6
+at_xfail=no
+(
+  $as_echo "69. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:93:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \\
+  /data/RPMS/foo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:93"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \
+  /data/RPMS/foo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:93"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_69
+#AT_START_70
+at_fn_group_banner 70 'rpmdb.at:106' \
+  "rpm -U --replacepkgs 1" "                         " 6
+at_xfail=no
+(
+  $as_echo "70. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:109:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+tpkg=\"/data/RPMS/foo-1.0-1.noarch.rpm\"
+
+runroot rpm -i \"\${tpkg}\" &&
+  runroot rpm -U --replacepkgs \"\${tpkg}\" &&
+  runroot rpm -qa
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:109"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+tpkg="/data/RPMS/foo-1.0-1.noarch.rpm"
+
+runroot rpm -i "${tpkg}" &&
+  runroot rpm -U --replacepkgs "${tpkg}" &&
+  runroot rpm -qa
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:109"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_70
+#AT_START_71
+at_fn_group_banner 71 'rpmdb.at:128' \
+  "rpm -U --replacepkgs 2" "                         " 6
+at_xfail=no
+      test $RPM_XFAIL -ne 0 && at_xfail=yes
+(
+  $as_echo "71. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:131:
+
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+tpkg=\"/data/RPMS/hello-2.0-1.i686.rpm\"
+
+runroot rpm -U --nodeps --ignorearch \"\${tpkg}\" &&
+  runroot rpm -U --nodeps --ignorearch --nodocs --replacepkgs \"\${tpkg}\" &&
+  runroot rpm -e hello
+test -d \"\${RPMTEST}\"/usr/share/doc/hello-2.0
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:131"
+( $at_check_trace;
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+tpkg="/data/RPMS/hello-2.0-1.i686.rpm"
+
+runroot rpm -U --nodeps --ignorearch "${tpkg}" &&
+  runroot rpm -U --nodeps --ignorearch --nodocs --replacepkgs "${tpkg}" &&
+  runroot rpm -e hello
+test -d "${RPMTEST}"/usr/share/doc/hello-2.0
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdb.at:131"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_71
+#AT_START_72
+at_fn_group_banner 72 'rpmdb.at:150' \
+  "rpm --reinstall 1" "                              " 6
+at_xfail=no
+(
+  $as_echo "72. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:153:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+tpkg=\"/data/RPMS/hello-2.0-1.i686.rpm\"
+
+runroot rpm -U --nodeps --ignorearch \"\${tpkg}\" &&
+  runroot rpm --reinstall --nodeps --ignorearch --nodocs \"\${tpkg}\" &&
+  runroot rpm -e hello
+test -d \"\${RPMTEST}\"/usr/share/doc/hello-2.0
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:153"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+tpkg="/data/RPMS/hello-2.0-1.i686.rpm"
+
+runroot rpm -U --nodeps --ignorearch "${tpkg}" &&
+  runroot rpm --reinstall --nodeps --ignorearch --nodocs "${tpkg}" &&
+  runroot rpm -e hello
+test -d "${RPMTEST}"/usr/share/doc/hello-2.0
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdb.at:153"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_72
+#AT_START_73
+at_fn_group_banner 73 'rpmdb.at:173' \
+  "rpm -i --relocate=.. *.i386.rpm" "                " 6
+at_xfail=no
+(
+  $as_echo "73. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:175:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \\
+  --noscripts --nodeps --ignorearch --relocate=/usr=/check \\
+  /data/RPMS/hello-1.0-1.i386.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:175"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \
+  --noscripts --nodeps --ignorearch --relocate=/usr=/check \
+  /data/RPMS/hello-1.0-1.i386.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:175"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_73
+#AT_START_74
+at_fn_group_banner 74 'rpmdb.at:192' \
+  "rpm -i --relocate=.. *.ppc64.rpm" "               " 6
+at_xfail=no
+(
+  $as_echo "74. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:194:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \\
+  --noscripts --nodeps --ignorearch --relocate=/usr=/check \\
+  /data/RPMS/hello-1.0-1.ppc64.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:194"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \
+  --noscripts --nodeps --ignorearch --relocate=/usr=/check \
+  /data/RPMS/hello-1.0-1.ppc64.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:194"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_74
+#AT_START_75
+at_fn_group_banner 75 'rpmdb.at:208' \
+  "rpmdb --rebuilddb" "                              " 6
+at_xfail=no
+(
+  $as_echo "75. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:210:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --noscripts --nodeps --ignorearch \\
+  /data/RPMS/hello-1.0-1.i386.rpm
+runroot rpm -qa --qf \"%{nevra} %{dbinstance}\\n\"
+runroot rpm -U --noscripts --nodeps --ignorearch \\
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -qa --qf \"%{nevra} %{dbinstance}\\n\"
+runroot rpmdb --rebuilddb
+runroot rpm -qa --qf \"%{nevra} %{dbinstance}\\n\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:210"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --noscripts --nodeps --ignorearch \
+  /data/RPMS/hello-1.0-1.i386.rpm
+runroot rpm -qa --qf "%{nevra} %{dbinstance}\n"
+runroot rpm -U --noscripts --nodeps --ignorearch \
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -qa --qf "%{nevra} %{dbinstance}\n"
+runroot rpmdb --rebuilddb
+runroot rpm -qa --qf "%{nevra} %{dbinstance}\n"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello-1.0-1.i386 1
+hello-2.0-1.i686 2
+hello-2.0-1.i686 1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:210"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_75
+#AT_START_76
+at_fn_group_banner 76 'rpmdb.at:233' \
+  "rpmdb --rebuilddb and verify empty database" "    " 6
+at_xfail=no
+(
+  $as_echo "76. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:235:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+runroot rpmdb --rebuilddb
+runroot rpmdb --verifydb
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:235"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+runroot rpmdb --rebuilddb
+runroot rpmdb --verifydb
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:235"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_76
+#AT_START_77
+at_fn_group_banner 77 'rpmdb.at:248' \
+  "rpm -U and verify status" "                       " 6
+at_xfail=no
+(
+  $as_echo "77. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:250:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"pkg status\" \\
+       --define \"filedata same_stuff\" \\
+          /data/SPECS/conflicttest.spec
+
+runroot rpm -U /build/RPMS/noarch/conflictstatus-1.0-1.noarch.rpm
+runroot rpm -qls conflictstatus
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:250"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "pkg status" \
+       --define "filedata same_stuff" \
+          /data/SPECS/conflicttest.spec
+
+runroot rpm -U /build/RPMS/noarch/conflictstatus-1.0-1.noarch.rpm
+runroot rpm -qls conflictstatus
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "normal        /usr/share/my.version
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:250"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_77
+#AT_START_78
+at_fn_group_banner 78 'rpmdb.at:271' \
+  "rpm -U with _install_lang and verify status" "    " 6
+at_xfail=no
+(
+  $as_echo "78. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:273:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+          /data/SPECS/flangtest.spec
+
+runroot rpm -U --define \"_install_langs de:fi\" /build/RPMS/noarch/flangtest-1.0-1.noarch.rpm
+runroot rpm -qls flangtest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:273"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+          /data/SPECS/flangtest.spec
+
+runroot rpm -U --define "_install_langs de:fi" /build/RPMS/noarch/flangtest-1.0-1.noarch.rpm
+runroot rpm -qls flangtest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "normal        /usr/share/flangtest/de.txt
+normal        /usr/share/flangtest/empty.txt
+not installed /usr/share/flangtest/en.txt
+normal        /usr/share/flangtest/fi.txt
+normal        /usr/share/flangtest/none.txt
+not installed /usr/share/flangtest/pl.txt
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:273"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_78
+#AT_START_79
+at_fn_group_banner 79 'rpmdb.at:297' \
+  "rpm -U and verify files on disk" "                " 6
+at_xfail=no
+(
+  $as_echo "79. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:299:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+rm -rf \"\${RPMTEST}\"/opt/*
+
+runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+find \"\${RPMTEST}\"/opt | wc -l
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:299"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+rm -rf "${RPMTEST}"/opt/*
+
+runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+find "${RPMTEST}"/opt | wc -l
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "6
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:299"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_79
+#AT_START_80
+at_fn_group_banner 80 'rpmdb.at:318' \
+  "rpm -e and verify files removed" "                " 6
+at_xfail=no
+(
+  $as_echo "80. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdb.at:320:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+rm -rf \"\${RPMTEST}\"/opt/*
+
+runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+runroot rpm -e selfconflict
+find \"\${RPMTEST}\"/opt | wc -l
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdb.at:320"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+rm -rf "${RPMTEST}"/opt/*
+
+runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+runroot rpm -e selfconflict
+find "${RPMTEST}"/opt | wc -l
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdb.at:320"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_80
+#AT_START_81
+at_fn_group_banner 81 'rpmi.at:21' \
+  "rpm -U <manifest>" "                              " 7
+at_xfail=no
+(
+  $as_echo "81. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:23:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+echo /data/RPMS/hello-2.0-1.x86_64.rpm > \${RPMTEST}/tmp/test.mft
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /tmp/test.mft
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:23"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+echo /data/RPMS/hello-2.0-1.x86_64.rpm > ${RPMTEST}/tmp/test.mft
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/test.mft
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:23"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_81
+#AT_START_82
+at_fn_group_banner 82 'rpmi.at:36' \
+  "rpm -U <manifest notfound 1>" "                   " 7
+at_xfail=no
+(
+  $as_echo "82. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:38:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+echo /data/RPMS/hello-2.0-1.x86_64.rpm > \${RPMTEST}/tmp/test.mft
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /tmp/test-not-there.mft
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:38"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+echo /data/RPMS/hello-2.0-1.x86_64.rpm > ${RPMTEST}/tmp/test.mft
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/test-not-there.mft
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: open of /tmp/test-not-there.mft failed: No such file or directory
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmi.at:38"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_82
+#AT_START_83
+at_fn_group_banner 83 'rpmi.at:52' \
+  "rpm -U <manifest notfound 2>" "                   " 7
+at_xfail=no
+(
+  $as_echo "83. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:54:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+echo /data/RPMS/hello-not-there-2.0-1.x86_64.rpm > \${RPMTEST}/tmp/test.mft
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /tmp/test.mft
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:54"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+echo /data/RPMS/hello-not-there-2.0-1.x86_64.rpm > ${RPMTEST}/tmp/test.mft
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/test.mft
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: open of /data/RPMS/hello-not-there-2.0-1.x86_64.rpm failed: No such file or directory
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmi.at:54"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_83
+#AT_START_84
+at_fn_group_banner 84 'rpmi.at:68' \
+  "rpm -U <notfound>" "                              " 7
+at_xfail=no
+(
+  $as_echo "84. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:70:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /data/RPMS/hello-not-there-2.0-1.x86_64.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:70"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /data/RPMS/hello-not-there-2.0-1.x86_64.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: open of /data/RPMS/hello-not-there-2.0-1.x86_64.rpm failed: No such file or directory
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmi.at:70"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_84
+#AT_START_85
+at_fn_group_banner 85 'rpmi.at:83' \
+  "rpm -U <unsigned>" "                              " 7
+at_xfail=no
+(
+  $as_echo "85. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:85:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /data/RPMS/hello-2.0-1.x86_64.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:85"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /data/RPMS/hello-2.0-1.x86_64.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:85"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_85
+#AT_START_86
+at_fn_group_banner 86 'rpmi.at:97' \
+  "rpm -U <signed nokey>" "                          " 7
+at_xfail=no
+(
+  $as_echo "86. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:99:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:99"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /data/RPMS/hello-2.0-1.x86_64-signed.rpm: Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:99"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_86
+#AT_START_87
+at_fn_group_banner 87 'rpmi.at:112' \
+  "rpm -U <signed>" "                                " 7
+at_xfail=no
+(
+  $as_echo "87. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:114:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:114"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmkeys --import /data/keys/rpm.org-rsa-2048-test.pub
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /data/RPMS/hello-2.0-1.x86_64-signed.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:114"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_87
+#AT_START_88
+at_fn_group_banner 88 'rpmi.at:127' \
+  "rpm -U <corrupted signed 1>" "                    " 7
+at_xfail=no
+(
+  $as_echo "88. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:129:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+pkg=\"hello-2.0-1.x86_64-signed.rpm\"
+cp \"\${RPMTEST}\"/data/RPMS/\${pkg} \"\${RPMTEST}\"/tmp/\${pkg}
+dd if=/dev/zero of=\"\${RPMTEST}\"/tmp/\${pkg} \\
+   conv=notrunc bs=1 seek=264 count=2 2> /dev/null
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /tmp/\${pkg}
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:129"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=264 count=2 2> /dev/null
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/${pkg}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: /tmp/hello-2.0-1.x86_64-signed.rpm: Header signature: BAD (package tag 268: invalid OpenPGP signature)
+error: /tmp/hello-2.0-1.x86_64-signed.rpm cannot be installed
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmi.at:129"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_88
+#AT_START_89
+at_fn_group_banner 89 'rpmi.at:148' \
+  "rpm -U <corrupted signed 2>" "                    " 7
+at_xfail=no
+(
+  $as_echo "89. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:150:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+pkg=\"hello-2.0-1.x86_64-signed.rpm\"
+cp \"\${RPMTEST}\"/data/RPMS/\${pkg} \"\${RPMTEST}\"/tmp/\${pkg}
+dd if=/dev/zero of=\"\${RPMTEST}\"/tmp/\${pkg} \\
+   conv=notrunc bs=1 seek=5555 count=6 2> /dev/null
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /tmp/\${pkg}
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:150"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=5555 count=6 2> /dev/null
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/${pkg}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: /tmp/hello-2.0-1.x86_64-signed.rpm: Header V4 RSA/SHA256 Signature, key ID 1964c5fc: BAD
+error: /tmp/hello-2.0-1.x86_64-signed.rpm: Header SHA1 digest: BAD (Expected 5cd9874c510b67b44483f9e382a1649ef7743bac != 4261b2c1eb861a4152c2239bce20bfbcaa8971ba)
+error: /tmp/hello-2.0-1.x86_64-signed.rpm: Header SHA256 digest: BAD (Expected ef920781af3bf072ae9888eec3de1c589143101dff9cc0b561468d395fb766d9 != 29fdfe92782fb0470a9a164a6c94af87d3b138c63b39d4c30e0223ca1202ba82)
+error: /tmp/hello-2.0-1.x86_64-signed.rpm cannot be installed
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmi.at:150"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_89
+#AT_START_90
+at_fn_group_banner 90 'rpmi.at:173' \
+  "rpm -U <corrupted signed 3>" "                    " 7
+at_xfail=no
+(
+  $as_echo "90. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:175:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+pkg=\"hello-2.0-1.x86_64-signed.rpm\"
+cp \"\${RPMTEST}\"/data/RPMS/\${pkg} \"\${RPMTEST}\"/tmp/\${pkg}
+dd if=/dev/zero of=\"\${RPMTEST}\"/tmp/\${pkg} \\
+   conv=notrunc bs=1 seek=7788 count=6 2> /dev/null
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \\
+       /tmp/\${pkg}
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:175"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+pkg="hello-2.0-1.x86_64-signed.rpm"
+cp "${RPMTEST}"/data/RPMS/${pkg} "${RPMTEST}"/tmp/${pkg}
+dd if=/dev/zero of="${RPMTEST}"/tmp/${pkg} \
+   conv=notrunc bs=1 seek=7788 count=6 2> /dev/null
+
+runroot rpm -U --ignorearch --ignoreos --nodeps \
+       /tmp/${pkg}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /tmp/hello-2.0-1.x86_64-signed.rpm: Header V4 RSA/SHA256 Signature, key ID 1964c5fc: NOKEY
+error: unpacking of archive failed: cpio: Bad magic
+error: hello-2.0-1.x86_64: install failed
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmi.at:175"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_90
+#AT_START_91
+at_fn_group_banner 91 'rpmi.at:197' \
+  "rpm -U *.src.rpm" "                               " 7
+at_xfail=no
+(
+  $as_echo "91. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:199:
+rm -rf \${TOPDIR}
+
+runroot rpm \\
+  -U /data/SRPMS/hello-1.0-1.src.rpm
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmi.at:199"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+
+runroot rpm \
+  -U /data/SRPMS/hello-1.0-1.src.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:199"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_91
+#AT_START_92
+at_fn_group_banner 92 'rpmi.at:212' \
+  "rpm -i *.src.rpm" "                               " 7
+at_xfail=no
+(
+  $as_echo "92. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:214:
+rm -rf \${TOPDIR}
+
+runroot rpm \\
+  -i /data/SRPMS/hello-1.0-1.src.rpm
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmi.at:214"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+
+runroot rpm \
+  -i /data/SRPMS/hello-1.0-1.src.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:214"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_92
+#AT_START_93
+at_fn_group_banner 93 'rpmi.at:228' \
+  "rpm -i <nonexistent file>" "                      " 7
+at_xfail=no
+(
+  $as_echo "93. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:230:
+runroot rpm \\
+  -i no_such_file
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmi.at:230"
+( $at_check_trace;
+runroot rpm \
+  -i no_such_file
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 1 $at_status "$at_srcdir/rpmi.at:230"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_93
+#AT_START_94
+at_fn_group_banner 94 'rpmi.at:240' \
+  "rpm -i --nomanifest <garbage text file>" "        " 7
+at_xfail=no
+(
+  $as_echo "94. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:242:
+junk=\"\${RPMTEST}/textfile\"
+cat << EOF > \"\${junk}\"
+no_such.file
+not_an.rpm
+EOF
+
+runroot rpm \\
+  -Uvv --nomanifest /textfile
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmi.at:242"
+( $at_check_trace;
+junk="${RPMTEST}/textfile"
+cat << EOF > "${junk}"
+no_such.file
+not_an.rpm
+EOF
+
+runroot rpm \
+  -Uvv --nomanifest /textfile
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 1 $at_status "$at_srcdir/rpmi.at:242"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_94
+#AT_START_95
+at_fn_group_banner 95 'rpmi.at:257' \
+  "rpm -i <garbage text file" "                      " 7
+at_xfail=no
+(
+  $as_echo "95. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:259:
+junk=\"\${RPMTEST}/not_an.rpm\"
+cat << EOF > \"\${junk}\"
+no_such.file
+not_pkg.rpm
+EOF
+
+runroot rpm \\
+  -Uvv /not_an.rpm
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmi.at:259"
+( $at_check_trace;
+junk="${RPMTEST}/not_an.rpm"
+cat << EOF > "${junk}"
+no_such.file
+not_pkg.rpm
+EOF
+
+runroot rpm \
+  -Uvv /not_an.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 2 $at_status "$at_srcdir/rpmi.at:259"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_95
+#AT_START_96
+at_fn_group_banner 96 'rpmi.at:276' \
+  "rpm -U upgrade to newer" "                        " 7
+at_xfail=no
+(
+  $as_echo "96. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:277:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+          /data/SPECS/versiontest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -q versiontest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:277"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+          /data/SPECS/versiontest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -q versiontest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "versiontest-2.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:277"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_96
+#AT_START_97
+at_fn_group_banner 97 'rpmi.at:299' \
+  "rpm -U upgrade to older" "                        " 7
+at_xfail=no
+(
+  $as_echo "97. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:300:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:300"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        package versiontest-2.0-1.noarch (which is newer than versiontest-1.0-1.noarch) is already installed
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmi.at:300"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_97
+#AT_START_98
+at_fn_group_banner 98 'rpmi.at:314' \
+  "rpm -U --oldpackage downgrade" "                  " 7
+at_xfail=no
+(
+  $as_echo "98. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:315:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -q versiontest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:315"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -U --oldpackage /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -q versiontest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "versiontest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:315"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_98
+#AT_START_99
+at_fn_group_banner 99 'rpmi.at:330' \
+  "rpm -U two versions of same package 1" "          " 7
+at_xfail=no
+(
+  $as_echo "99. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:331:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -Uv \\
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm \\
+  /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -q versiontest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:331"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -Uv \
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -q versiontest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: package versiontest-1.0-1.noarch was already added, replacing with versiontest-2.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "Preparing packages...
+versiontest-2.0-1.noarch
+versiontest-2.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:331"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_99
+#AT_START_100
+at_fn_group_banner 100 'rpmi.at:350' \
+  "rpm -U two versions of same package 2" "          " 7
+at_xfail=no
+(
+  $as_echo "100. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:351:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -Uv \\
+  /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm \\
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -q versiontest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:351"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -Uv \
+  /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm \
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -q versiontest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: package versiontest-2.0-1.noarch was already added, skipping versiontest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "Preparing packages...
+versiontest-2.0-1.noarch
+versiontest-2.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:351"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_100
+#AT_START_101
+at_fn_group_banner 101 'rpmi.at:370' \
+  "rpm -U obsoleted package 1" "                     " 7
+at_xfail=no
+(
+  $as_echo "101. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:371:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"obs deptest-two\" \\
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       /data/SPECS/deptest.spec
+
+
+runroot rpm -Uv \\
+  /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm \\
+  /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -q deptest-one
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:371"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "obs deptest-two" \
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       /data/SPECS/deptest.spec
+
+
+runroot rpm -Uv \
+  /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -q deptest-one
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: package deptest-two-1.0-1.noarch was already added, replacing with deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "Preparing packages...
+deptest-one-1.0-1.noarch
+deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:371"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_101
+#AT_START_102
+at_fn_group_banner 102 'rpmi.at:399' \
+  "rpm -U obsoleted package 2" "                     " 7
+at_xfail=no
+(
+  $as_echo "102. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:400:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"obs deptest-two\" \\
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       /data/SPECS/deptest.spec
+
+
+runroot rpm -Uv \\
+  /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm \\
+  /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -q deptest-one
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:400"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "obs deptest-two" \
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       /data/SPECS/deptest.spec
+
+
+runroot rpm -Uv \
+  /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -q deptest-one
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: package deptest-one-1.0-1.noarch was already added, skipping deptest-two-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "Preparing packages...
+deptest-one-1.0-1.noarch
+deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:400"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_102
+#AT_START_103
+at_fn_group_banner 103 'rpmi.at:428' \
+  "rpm -i two versions of same package" "            " 7
+at_xfail=no
+(
+  $as_echo "103. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:429:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \\
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm \\
+  /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -q versiontest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:429"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/versiontest-2.0-1.noarch.rpm
+runroot rpm -q versiontest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "versiontest-2.0-1.noarch
+versiontest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:429"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_103
+#AT_START_104
+at_fn_group_banner 104 'rpmi.at:447' \
+  "rpm -i identical versions of same package" "      " 7
+at_xfail=no
+(
+  $as_echo "104. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:448:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \\
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm \\
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -q versiontest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:448"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -i \
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/versiontest-1.0-1.noarch.rpm
+runroot rpm -q versiontest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "versiontest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:448"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_104
+#AT_START_105
+at_fn_group_banner 105 'rpmi.at:465' \
+  "rpm -U with invalid --relocate" "                 " 7
+at_xfail=no
+(
+  $as_echo "105. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:467:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --test --ignoreos --relocate /usr=/opt \\
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:467"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --test --ignoreos --relocate /usr=/opt \
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        path /usr in package hello-script-1.0-1.noarch is not relocatable
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmi.at:467"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_105
+#AT_START_106
+at_fn_group_banner 106 'rpmi.at:482' \
+  "rpm -U --badreloc with invalid --relocate" "      " 7
+at_xfail=no
+(
+  $as_echo "106. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:484:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --test --ignoreos --badreloc --relocate /usr=/opt \\
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:484"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --test --ignoreos --badreloc --relocate /usr=/opt \
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:484"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_106
+#AT_START_107
+at_fn_group_banner 107 'rpmi.at:498' \
+  "rpm -i with/without --excludedocs" "              " 7
+at_xfail=no
+(
+  $as_echo "107. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmi.at:500:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/testdoc.spec
+
+runroot rpm -i --excludedocs \\
+  /build/RPMS/noarch/testdoc-1.0-1.noarch.rpm
+
+RPM_DOCDIR=\$(runroot rpm --eval '%_defaultdocdir')
+RPM_DATADIR=\$(runroot rpm --eval '%_datadir')
+
+test ! -e \${RPMTEST}\${RPM_DOCDIR}/testdoc || exit 1
+test -e \${RPMTEST}\${RPM_DATADIR}/testdoc/nodoc || exit 1
+
+runroot rpm -e testdoc
+
+runroot rpm -i \\
+  /build/RPMS/noarch/testdoc-1.0-1.noarch.rpm
+test -e \${RPMTEST}\${RPM_DOCDIR}/testdoc/documentation1 || exit 1
+test -e \${RPMTEST}\${RPM_DOCDIR}/testdoc/documentation2 || exit 1
+test -e \${RPMTEST}\${RPM_DOCDIR}/testdoc/examples/example1 || exit 1
+test -e \${RPMTEST}\${RPM_DOCDIR}/testdoc/examples/example2 || exit 1
+test -e \${RPMTEST}\${RPM_DATADIR}/testdoc/nodoc || exit 1
+
+runroot rpm -e testdoc
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmi.at:500"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/testdoc.spec
+
+runroot rpm -i --excludedocs \
+  /build/RPMS/noarch/testdoc-1.0-1.noarch.rpm
+
+RPM_DOCDIR=$(runroot rpm --eval '%_defaultdocdir')
+RPM_DATADIR=$(runroot rpm --eval '%_datadir')
+
+test ! -e ${RPMTEST}${RPM_DOCDIR}/testdoc || exit 1
+test -e ${RPMTEST}${RPM_DATADIR}/testdoc/nodoc || exit 1
+
+runroot rpm -e testdoc
+
+runroot rpm -i \
+  /build/RPMS/noarch/testdoc-1.0-1.noarch.rpm
+test -e ${RPMTEST}${RPM_DOCDIR}/testdoc/documentation1 || exit 1
+test -e ${RPMTEST}${RPM_DOCDIR}/testdoc/documentation2 || exit 1
+test -e ${RPMTEST}${RPM_DOCDIR}/testdoc/examples/example1 || exit 1
+test -e ${RPMTEST}${RPM_DOCDIR}/testdoc/examples/example2 || exit 1
+test -e ${RPMTEST}${RPM_DATADIR}/testdoc/nodoc || exit 1
+
+runroot rpm -e testdoc
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmi.at:500"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_107
+#AT_START_108
+at_fn_group_banner 108 'rpmorder.at:3' \
+  "basic install/erase order 1" "                    " 8
+at_xfail=no
+(
+  $as_echo "108. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmorder.at:5:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs deptest-two\" \\
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"reqs deptest-three\" \\
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+       /data/SPECS/deptest.spec
+
+echo INSTALL:
+runroot rpm -Uv --justdb \\
+       /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm \\
+       /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm \\
+       /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+echo ERASE:
+runroot rpm -ev --justdb \\
+        deptest-three \\
+       deptest-one \\
+       deptest-two
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmorder.at:5"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs deptest-two" \
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "reqs deptest-three" \
+       /data/SPECS/deptest.spec
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+       /data/SPECS/deptest.spec
+
+echo INSTALL:
+runroot rpm -Uv --justdb \
+       /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm \
+       /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm \
+       /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+echo ERASE:
+runroot rpm -ev --justdb \
+        deptest-three \
+       deptest-one \
+       deptest-two
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "INSTALL:
+Preparing packages...
+deptest-three-1.0-1.noarch
+deptest-two-1.0-1.noarch
+deptest-one-1.0-1.noarch
+ERASE:
+Preparing packages...
+deptest-one-1.0-1.noarch
+deptest-two-1.0-1.noarch
+deptest-three-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmorder.at:5"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_108
+#AT_START_109
+at_fn_group_banner 109 'rpmbuild.at:23' \
+  "rpmbuild -ba *.spec" "                            " 9
+at_xfail=no
+(
+  $as_echo "109. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:25:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+run rpmbuild \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:25"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+run rpmbuild \
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:25"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_109
+#AT_START_110
+at_fn_group_banner 110 'rpmbuild.at:41' \
+  "rpmbuild --rebuild" "                             " 9
+at_xfail=no
+(
+  $as_echo "110. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:43:
+rm -rf \${TOPDIR}
+
+run rpmbuild \\
+  --rebuild \"\${abs_srcdir}\"/data/SRPMS/hello-1.0-1.src.rpm
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:43"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+
+run rpmbuild \
+  --rebuild "${abs_srcdir}"/data/SRPMS/hello-1.0-1.src.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:43"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_110
+#AT_START_111
+at_fn_group_banner 111 'rpmbuild.at:54' \
+  "rpmbuild --short-circuit -bl" "                   " 9
+at_xfail=no
+(
+  $as_echo "111. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:56:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+run rpmbuild -bi \"\${abs_srcdir}\"/data/SPECS/hello.spec &> /dev/null
+run rpmbuild --quiet -bl --short-circuit \"\${abs_srcdir}\"/data/SPECS/hello.spec
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:56"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+run rpmbuild -bi "${abs_srcdir}"/data/SPECS/hello.spec &> /dev/null
+run rpmbuild --quiet -bl --short-circuit "${abs_srcdir}"/data/SPECS/hello.spec
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:56"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_111
+#AT_START_112
+at_fn_group_banner 112 'rpmbuild.at:72' \
+  "rpmbuild -tb <tar with bad spec>" "               " 9
+at_xfail=no
+(
+  $as_echo "112. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:74:
+rm -rf \${TOPDIR}
+
+run rpmbuild \\
+  -tb \"\${RPMDATA}/SOURCES/hello-1.0.tar.gz\"
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:74"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+
+run rpmbuild \
+  -tb "${RPMDATA}/SOURCES/hello-1.0.tar.gz"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: line 5: Unknown tag: Serial:     1
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 1 $at_status "$at_srcdir/rpmbuild.at:74"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_112
+#AT_START_113
+at_fn_group_banner 113 'rpmbuild.at:89' \
+  "rpmbuild -tb" "                                   " 9
+at_xfail=no
+(
+  $as_echo "113. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:91:
+rm -rf \${TOPDIR}
+
+run rpmbuild \\
+  -ta \"\${RPMDATA}/SOURCES/hello-2.0.tar.gz\"
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:91"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+
+run rpmbuild \
+  -ta "${RPMDATA}/SOURCES/hello-2.0.tar.gz"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:91"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_113
+#AT_START_114
+at_fn_group_banner 114 'rpmbuild.at:104' \
+  "rpmbuild %attr and %defattr" "                    " 9
+at_xfail=no
+(
+  $as_echo "114. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:106:
+rm -rf \${TOPDIR}
+
+runroot rpmbuild \\
+  -bb --quiet /data/SPECS/attrtest.spec
+
+runroot rpm -qp --qf \\
+  \"\\n[%{filemodes:perms} %-8{fileusername} %-8{filegroupname} %{filenames}\\n]\"\\
+  /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:106"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+
+runroot rpmbuild \
+  -bb --quiet /data/SPECS/attrtest.spec
+
+runroot rpm -qp --qf \
+  "\n[%{filemodes:perms} %-8{fileusername} %-8{filegroupname} %{filenames}\n]"\
+  /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "
+drwx------ root     root     /a/dir
+-r-------- root     root     /a/file
+drwx------ daemon   adm      /b/dir
+-r-------- daemon   adm      /b/file
+drwxr-x--- root     adm      /c/dir
+-rw-r----- daemon   root     /c/file
+drwxr-x--x daemon   bin      /d/dir
+-rw-r--r-- bin      daemon   /d/file
+drwx------ foo      bar      /e/dir
+-r-------- foo      bar      /e/file
+drwxrwx--- bar      foo      /f/dir
+-rw-rw---- bar      foo      /f/file
+drwx------ adm      foo      /g/dir
+-r-------- bar      adm      /g/file
+drwxr-xr-x foo      bar      /h/dir
+-rw-r--r-- foo      bar      /h/file
+drwxr-x--- adm      root     /i/dir
+-rwsr-xr-x root     adm      /i/file
+drwxrwxrwx zoot     zoot     /j/dir
+--w--w--w- zoot     zoot     /j/file
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:106"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_114
+#AT_START_115
+at_fn_group_banner 115 'rpmbuild.at:144' \
+  "rpmbuild hardlink" "                              " 9
+at_xfail=no
+(
+  $as_echo "115. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:146:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \${TOPDIR}
+
+runroot rpmbuild \\
+  -bb --quiet /data/SPECS/hlinktest.spec
+
+runroot rpm -i /build/RPMS/noarch/hlinktest-1.0-1.noarch.rpm
+
+runroot rpm -q --qf \"[%{filenlinks} %{filenames}\\n]%{longsize}\\n\" hlinktest
+runroot rpm -V --nouser --nogroup hlinktest
+ls -i \"\${RPMTEST}\"/foo/hello* | awk {'print \$1'} | sort -u | wc -l
+
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmbuild.at:146"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf ${TOPDIR}
+
+runroot rpmbuild \
+  -bb --quiet /data/SPECS/hlinktest.spec
+
+runroot rpm -i /build/RPMS/noarch/hlinktest-1.0-1.noarch.rpm
+
+runroot rpm -q --qf "[%{filenlinks} %{filenames}\n]%{longsize}\n" hlinktest
+runroot rpm -V --nouser --nogroup hlinktest
+ls -i "${RPMTEST}"/foo/hello* | awk {'print $1'} | sort -u | wc -l
+
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "2 /foo/aaaa
+1 /foo/copyllo
+4 /foo/hello
+4 /foo/hello-bar
+4 /foo/hello-foo
+4 /foo/hello-world
+2 /foo/zzzz
+87
+1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:146"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_115
+#AT_START_116
+at_fn_group_banner 116 'rpmbuild.at:175' \
+  "rpmbuild unpackaged files" "                      " 9
+at_xfail=no
+(
+  $as_echo "116. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:177:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \${TOPDIR}
+
+runroot rpmbuild \\
+  -bb --quiet --with unpackaged_files /data/SPECS/hlinktest.spec
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmbuild.at:177"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf ${TOPDIR}
+
+runroot rpmbuild \
+  -bb --quiet --with unpackaged_files /data/SPECS/hlinktest.spec
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Installed (but unpackaged) file(s) found:
+   /toot
+    Installed (but unpackaged) file(s) found:
+   /toot
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmbuild.at:177"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_116
+#AT_START_117
+at_fn_group_banner 117 'rpmbuild.at:195' \
+  "rpmbuild unpackaged directories" "                " 9
+at_xfail=no
+      test $RPM_XFAIL -ne 0 && at_xfail=yes
+(
+  $as_echo "117. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:198:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \${TOPDIR}
+
+runroot rpmbuild \\
+  -bb --quiet --with unpackaged_dirs /data/SPECS/hlinktest.spec
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmbuild.at:198"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf ${TOPDIR}
+
+runroot rpmbuild \
+  -bb --quiet --with unpackaged_dirs /data/SPECS/hlinktest.spec
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Installed (but unpackaged) file(s) found:
+   /zoo
+    Installed (but unpackaged) file(s) found:
+   /zoo
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmbuild.at:198"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_117
+#AT_START_118
+at_fn_group_banner 118 'rpmbuild.at:215' \
+  "rpmbuild glob" "                                  " 9
+at_xfail=no
+(
+  $as_echo "118. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:217:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \${TOPDIR}
+
+runroot rpmbuild -bb --quiet /data/SPECS/globtest.spec
+runroot rpm -qp \\
+       --qf \"[%{filemodes:perms} %{filenames}\\n]\" \\
+       /build/RPMS/noarch/globtest-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmbuild.at:217"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf ${TOPDIR}
+
+runroot rpmbuild -bb --quiet /data/SPECS/globtest.spec
+runroot rpm -qp \
+       --qf "[%{filemodes:perms} %{filenames}\n]" \
+       /build/RPMS/noarch/globtest-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-rw-r--r-- /opt/globtest/baf
+drwxr-xr-x /opt/globtest/bang
+-rw-r--r-- /opt/globtest/bif
+drwxr-xr-x /opt/globtest/bing
+drwxr-xr-x /opt/globtest/bong
+drwxr-xr-x /opt/globtest/foo
+-rw-r--r-- /opt/globtest/foo/one
+-rw-r--r-- /opt/globtest/foo/three
+-rw-r--r-- /opt/globtest/foo/two
+lrwxrwxrwx /opt/globtest/linkbad
+lrwxrwxrwx /opt/globtest/linkgood
+-rw-r--r-- /opt/globtest/weird%name
+-rw-r--r-- /opt/globtest/zab
+-rw-r--r-- /opt/globtest/zeb
+-rw-r--r-- /opt/globtest/zib
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:217"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_118
+#AT_START_119
+at_fn_group_banner 119 'rpmbuild.at:247' \
+  "rpmbuild prefixpostfix" "                         " 9
+at_xfail=no
+(
+  $as_echo "119. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:249:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \${TOPDIR}
+
+runroot rpmbuild -bb --quiet \\
+       /data/SPECS/prefixtest.spec
+runroot rpm -qp \\
+       --qf \"[%{filemodes:perms} %{filenames}\\n]\" \\
+       /build/RPMS/noarch/prefixtest-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmbuild.at:249"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf ${TOPDIR}
+
+runroot rpmbuild -bb --quiet \
+       /data/SPECS/prefixtest.spec
+runroot rpm -qp \
+       --qf "[%{filemodes:perms} %{filenames}\n]" \
+       /build/RPMS/noarch/prefixtest-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-rw-r--r-- /opt/prefixtest/ba
+drwxr-xr-x /opt/prefixtest/ban
+-rw-r--r-- /opt/prefixtest/bi
+drwxr-xr-x /opt/prefixtest/bin
+drwxr-xr-x /opt/prefixtest/bon
+drwxr-xr-x /opt/prefixtest/foo
+-rw-r--r-- /opt/prefixtest/foo/one
+-rw-r--r-- /opt/prefixtest/foo/three
+-rw-r--r-- /opt/prefixtest/foo/two
+lrwxrwxrwx /opt/prefixtest/linkbad
+lrwxrwxrwx /opt/prefixtest/linkgood
+-rw-r--r-- /opt/prefixtest/weird%name
+-rw-r--r-- /opt/prefixtest/zab
+-rw-r--r-- /opt/prefixtest/zeb
+-rw-r--r-- /opt/prefixtest/zib
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:249"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_119
+#AT_START_120
+at_fn_group_banner 120 'rpmbuild.at:282' \
+  "Weak and reverse requires" "                      " 9
+at_xfail=no
+(
+  $as_echo "120. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:284:
+
+runroot rpmbuild -bb --quiet \\
+       --define \"pkg weakdeps\" \\
+       --define \"recs foo > 1.2.3\" \\
+       --define \"sugs bar >= 0.1.2\" \\
+       --define \"sups baz\" \\
+       --define \"ens zap = 3\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -qp --recommends /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+runroot rpm -qp --suggests /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+runroot rpm -qp --supplements /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+runroot rpm -qp --enhances /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmbuild.at:284"
+( $at_check_trace;
+
+runroot rpmbuild -bb --quiet \
+       --define "pkg weakdeps" \
+       --define "recs foo > 1.2.3" \
+       --define "sugs bar >= 0.1.2" \
+       --define "sups baz" \
+       --define "ens zap = 3" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -qp --recommends /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+runroot rpm -qp --suggests /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+runroot rpm -qp --supplements /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+runroot rpm -qp --enhances /build/RPMS/noarch/deptest-weakdeps-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "foo > 1.2.3
+bar >= 0.1.2
+baz
+zap = 3
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:284"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_120
+#AT_START_121
+at_fn_group_banner 121 'rpmbuild.at:310' \
+  "Build requires" "                                 " 9
+at_xfail=no
+(
+  $as_echo "121. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:312:
+
+runroot rpmbuild -bb --quiet \\
+               --define \"pkg buildreq\" \\
+               --define \"buildreqs foo > 1.2.3\" \\
+               /data/SPECS/deptest.spec
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmbuild.at:312"
+( $at_check_trace;
+
+runroot rpmbuild -bb --quiet \
+               --define "pkg buildreq" \
+               --define "buildreqs foo > 1.2.3" \
+               /data/SPECS/deptest.spec
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed build dependencies:
+       foo > 1.2.3 is needed by deptest-buildreq-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmbuild.at:312"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_121
+#AT_START_122
+at_fn_group_banner 122 'rpmbuild.at:326' \
+  "Dependency generation" "                          " 9
+at_xfail=no
+(
+  $as_echo "122. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:328:
+
+runroot rpmbuild -bb --quiet \\
+               /data/SPECS/filedep.spec
+echo Requires:
+runroot rpm  -qp --requires /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+echo Provides:
+runroot rpm -qp --provides /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+echo Filerequires:
+runroot rpm -qp --qf '[\"%{FILENAMES}\\t%{FILEREQUIRE}\"\\n]' /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+echo Fileprovides:
+runroot rpm -qp --qf '[\"%{FILENAMES}\\t%{FILEPROVIDE}\"\\n]' /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmbuild.at:328"
+( $at_check_trace;
+
+runroot rpmbuild -bb --quiet \
+               /data/SPECS/filedep.spec
+echo Requires:
+runroot rpm  -qp --requires /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+echo Provides:
+runroot rpm -qp --provides /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+echo Filerequires:
+runroot rpm -qp --qf '["%{FILENAMES}\t%{FILEREQUIRE}"\n]' /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+echo Fileprovides:
+runroot rpm -qp --qf '["%{FILENAMES}\t%{FILEPROVIDE}"\n]' /build/RPMS/noarch/filedep-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "Requires:
+/bin/f00f
+/bin/sh
+rpmlib(CompressedFileNames) <= 3.0.4-1
+rpmlib(FileDigests) <= 4.6.0-1
+rpmlib(PayloadFilesHavePrefix) <= 4.0-1
+Provides:
+filedep = 1.0-1
+Filerequires:
+\"/etc/foo.conf        \"
+\"/usr/bin/bar /bin/f00f\"
+\"/usr/bin/foo /bin/sh\"
+\"/usr/share/doc/filedep       \"
+\"/usr/share/doc/filedep/README        \"
+Fileprovides:
+\"/etc/foo.conf        \"
+\"/usr/bin/bar \"
+\"/usr/bin/foo \"
+\"/usr/share/doc/filedep       \"
+\"/usr/share/doc/filedep/README        \"
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:328"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_122
+#AT_START_123
+at_fn_group_banner 123 'rpmbuild.at:369' \
+  "rpmspec query 1" "                                " 9
+at_xfail=no
+(
+  $as_echo "123. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:371:
+
+runroot rpmspec -q \\
+               --define \"pkg dep\" \\
+               --define \"reqs foo > 1.2.3 bar <= 2.3\" \\
+               --requires \\
+               /data/SPECS/deptest.spec
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmbuild.at:371"
+( $at_check_trace;
+
+runroot rpmspec -q \
+               --define "pkg dep" \
+               --define "reqs foo > 1.2.3 bar <= 2.3" \
+               --requires \
+               /data/SPECS/deptest.spec
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "bar <= 2.3
+foo > 1.2.3
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:371"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_123
+#AT_START_124
+at_fn_group_banner 124 'rpmbuild.at:389' \
+  "rpmbuild archive sanity" "                        " 9
+at_xfail=no
+(
+  $as_echo "124. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:391:
+rm -rf \${TOPDIR}
+
+runroot rpmbuild \\
+  -bb --quiet /data/SPECS/attrtest.spec
+
+runroot rpm2cpio \\
+  /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm > /tmp/attrtest.cpio
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:391"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+
+runroot rpmbuild \
+  -bb --quiet /data/SPECS/attrtest.spec
+
+runroot rpm2cpio \
+  /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm > /tmp/attrtest.cpio
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:391"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_124
+#AT_START_125
+at_fn_group_banner 125 'rpmbuild.at:407' \
+  "rpmbuild debuginfo minisymtab" "                  " 9
+at_xfail=no
+(
+  $as_echo "125. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:409:
+rm -rf \${TOPDIR}
+
+# Use macros.debug to generate a debuginfo package.
+export CFLAGS=\"-g\"
+rundebug rpmbuild --quiet \\
+  --rebuild \"\${abs_srcdir}\"/data/SRPMS/hello-1.0-1.src.rpm
+
+# Extract the main package and inspect the hello binary
+# It should contain .gnu_debugdata, but not the full .symtab
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm | cpio -diu
+test -f ./usr/local/bin/hello || exit 1
+readelf -S ./usr/local/bin/hello |\\
+   grep -q .gnu_debugdata; test \$? == 0 || exit 1
+readelf -S ./usr/local/bin/hello \\
+  | grep -q .symtab; test \$? == 1 || exit 1
+
+# And the opposite for the debuginfo package
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+test -f ./usr/lib/debug/usr/local/bin/hello*.debug || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \\
+  | grep -q .gnu_debugdata; test \$? == 1 || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \\
+  | grep -q .symtab; test \$? == 0 || exit 1
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:409"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+
+# Use macros.debug to generate a debuginfo package.
+export CFLAGS="-g"
+rundebug rpmbuild --quiet \
+  --rebuild "${abs_srcdir}"/data/SRPMS/hello-1.0-1.src.rpm
+
+# Extract the main package and inspect the hello binary
+# It should contain .gnu_debugdata, but not the full .symtab
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm | cpio -diu
+test -f ./usr/local/bin/hello || exit 1
+readelf -S ./usr/local/bin/hello |\
+   grep -q .gnu_debugdata; test $? == 0 || exit 1
+readelf -S ./usr/local/bin/hello \
+  | grep -q .symtab; test $? == 1 || exit 1
+
+# And the opposite for the debuginfo package
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+test -f ./usr/lib/debug/usr/local/bin/hello*.debug || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \
+  | grep -q .gnu_debugdata; test $? == 1 || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \
+  | grep -q .symtab; test $? == 0 || exit 1
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:409"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_125
+#AT_START_126
+at_fn_group_banner 126 'rpmbuild.at:444' \
+  "rpmbuild debuginfo minisymtab strip -g" "         " 9
+at_xfail=no
+(
+  $as_echo "126. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:446:
+rm -rf \${TOPDIR}
+
+# Use macros.debug to generate a debuginfo package.
+export CFLAGS=\"-g\"
+rundebug rpmbuild --quiet \\
+  --define=\"_find_debuginfo_opts -g\" \\
+  --rebuild \"\${abs_srcdir}\"/data/SRPMS/hello-1.0-1.src.rpm
+
+# Extract the main package and inspect the hello binary
+# It should contain .symtab (because of strip -g), so doesn't .gnu_debugdata.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm | cpio -diu
+test -f ./usr/local/bin/hello || exit 1
+readelf -S ./usr/local/bin/hello \\
+  | grep -q .gnu_debugdata; test \$? == 1 || exit 1
+readelf -S ./usr/local/bin/hello \\
+  | grep -q .symtab; test \$? == 0 || exit 1
+
+# The debuginfo package should contain neither. The .symtab is NOBITS.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+test -f ./usr/lib/debug/usr/local/bin/hello*.debug || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \\
+  | grep -q .gnu_debugdata; test \$? == 1 || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \\
+  | grep .symtab | grep -q NOBITS; test \$? == 0 || exit 1
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:446"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+
+# Use macros.debug to generate a debuginfo package.
+export CFLAGS="-g"
+rundebug rpmbuild --quiet \
+  --define="_find_debuginfo_opts -g" \
+  --rebuild "${abs_srcdir}"/data/SRPMS/hello-1.0-1.src.rpm
+
+# Extract the main package and inspect the hello binary
+# It should contain .symtab (because of strip -g), so doesn't .gnu_debugdata.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm | cpio -diu
+test -f ./usr/local/bin/hello || exit 1
+readelf -S ./usr/local/bin/hello \
+  | grep -q .gnu_debugdata; test $? == 1 || exit 1
+readelf -S ./usr/local/bin/hello \
+  | grep -q .symtab; test $? == 0 || exit 1
+
+# The debuginfo package should contain neither. The .symtab is NOBITS.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+test -f ./usr/lib/debug/usr/local/bin/hello*.debug || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \
+  | grep -q .gnu_debugdata; test $? == 1 || exit 1
+readelf -S ./usr/lib/debug/usr/local/bin/hello*.debug \
+  | grep .symtab | grep -q NOBITS; test $? == 0 || exit 1
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:446"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_126
+#AT_START_127
+at_fn_group_banner 127 'rpmbuild.at:483' \
+  "rpmbuild debuginfo dwz" "                         " 9
+at_xfail=no
+(
+  $as_echo "127. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:485:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --undefine \"_unique_debug_names\" \\
+  --undefine \"_unique_debug_srcs\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2.spec
+
+# The debuginfo package should contain a .debug file for each binary
+# and a dwz multi file that contains the shared debuginfo between them.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+
+hello_file_debug=./usr/lib/debug/usr/local/bin/hello.debug
+hello2_file_debug=./usr/lib/debug/usr/local/bin/hello2.debug
+hello_multi_file=./usr/lib/debug/.dwz/hello2-1.0-1.*
+test -f \$hello_file_debug || echo \"no hello debug file: \$hello_file_debug\"
+test -f \$hello2_file_debug || echo \"no hello2 debug file: \$hello2_file_debug\"
+test -f \$hello_multi_file || echo \"no dwz multi file: \$hello_multi_file\"
+
+# Make sure the main package binaries contain the correct build-ids
+# linking them to the debug packages.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu
+hello_file=./usr/local/bin/hello
+hello2_file=./usr/local/bin/hello2
+test -f \$hello_file || echo \"no hello file: \$hello_file\"
+test -f \$hello2_file || echo \"no hello2 file: \$hello2_file\"
+
+id1=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+id2=\$(file \$hello2_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+id1debug=\$(file \$hello_file_debug | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+id2debug=\$(file \$hello2_file_debug | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+idmulti=\$(file \$hello_multi_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+test \"\$id1\" = \"\$id1debug\" || echo \"id1: \$id1 != id1debug: \$id1debug\"
+test \"\$id2\" = \"\$id2debug\" || echo \"id2: \$id2 != id2debug: \$id2debug\"
+
+# The build-id files should link to the .debug files.
+id1file=\"./usr/lib/debug/.build-id/\${id1:0:2}/\${id1:2}\"
+canonid1file=\$(readlink -f \${id1file})
+canonfile1=\$(readlink -f \$hello_file)
+canonid1debug=\$(readlink -f \${id1file}.debug)
+canondebug1=\$(readlink -f \$hello_file_debug)
+
+test \"\$canonid1file\" = \"\$canonfile1\" \\
+  || echo \"canonid1file: \$canonid1file != \$canonfile1\"
+test \"\$canonid1debug\" = \"\$canondebug1\" \\
+  || echo \"canonid1debug: \$canonid1debug != \$canondebug1\"
+
+id2file=\"./usr/lib/debug/.build-id/\${id2:0:2}/\${id2:2}\"
+canonid2file=\$(readlink -f \${id2file})
+canonfile2=\$(readlink -f \$hello2_file)
+canonid2debug=\$(readlink -f \${id2file}.debug)
+canondebug2=\$(readlink -f \$hello2_file_debug)
+
+test \"\$canonid2file\" = \"\$canonfile2\" \\
+  || echo \"canonid2: \$canonid2file != \$canonfile2\"
+test \"\$canonid2debug\" = \"\$canondebug2\" \\
+  || echo \"canonid2debug: \$canonid2debug\" != \"\$canondebug2\"
+
+# Both .debug files should point to the dwz multi file.
+# It would be nice to also test that they contain the correct dwz build-id
+# but that is a bit hard to grep out of the section data.
+multiref1=\$(readelf --string-dump=.gnu_debugaltlink \$hello_file_debug \\
+  | grep '     0' | cut -c13-)
+multiref2=\$(readelf --string-dump=.gnu_debugaltlink \$hello2_file_debug \\
+  | grep '     0' | cut -c13-)
+
+test \"\$multiref1\" = \"\$multiref2\" || echo \"multiref: \$multiref1 != \$multiref2\"
+
+canonmultiref=\$(readlink -f \$(dirname \$canondebug1)/\$multiref1)
+canonmultifile=\$(readlink -f \$hello_multi_file)
+
+test \"\$canonmultiref\" = \"\$canonmultifile\" \\
+  || echo \"canonmultiref: \$canonmultiref\" != \"\$canonmultifile\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuild.at:485"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# The debuginfo package should contain a .debug file for each binary
+# and a dwz multi file that contains the shared debuginfo between them.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+hello_file_debug=./usr/lib/debug/usr/local/bin/hello.debug
+hello2_file_debug=./usr/lib/debug/usr/local/bin/hello2.debug
+hello_multi_file=./usr/lib/debug/.dwz/hello2-1.0-1.*
+test -f $hello_file_debug || echo "no hello debug file: $hello_file_debug"
+test -f $hello2_file_debug || echo "no hello2 debug file: $hello2_file_debug"
+test -f $hello_multi_file || echo "no dwz multi file: $hello_multi_file"
+
+# Make sure the main package binaries contain the correct build-ids
+# linking them to the debug packages.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu
+hello_file=./usr/local/bin/hello
+hello2_file=./usr/local/bin/hello2
+test -f $hello_file || echo "no hello file: $hello_file"
+test -f $hello2_file || echo "no hello2 file: $hello2_file"
+
+id1=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+id2=$(file $hello2_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+id1debug=$(file $hello_file_debug | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+id2debug=$(file $hello2_file_debug | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+idmulti=$(file $hello_multi_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+test "$id1" = "$id1debug" || echo "id1: $id1 != id1debug: $id1debug"
+test "$id2" = "$id2debug" || echo "id2: $id2 != id2debug: $id2debug"
+
+# The build-id files should link to the .debug files.
+id1file="./usr/lib/debug/.build-id/${id1:0:2}/${id1:2}"
+canonid1file=$(readlink -f ${id1file})
+canonfile1=$(readlink -f $hello_file)
+canonid1debug=$(readlink -f ${id1file}.debug)
+canondebug1=$(readlink -f $hello_file_debug)
+
+test "$canonid1file" = "$canonfile1" \
+  || echo "canonid1file: $canonid1file != $canonfile1"
+test "$canonid1debug" = "$canondebug1" \
+  || echo "canonid1debug: $canonid1debug != $canondebug1"
+
+id2file="./usr/lib/debug/.build-id/${id2:0:2}/${id2:2}"
+canonid2file=$(readlink -f ${id2file})
+canonfile2=$(readlink -f $hello2_file)
+canonid2debug=$(readlink -f ${id2file}.debug)
+canondebug2=$(readlink -f $hello2_file_debug)
+
+test "$canonid2file" = "$canonfile2" \
+  || echo "canonid2: $canonid2file != $canonfile2"
+test "$canonid2debug" = "$canondebug2" \
+  || echo "canonid2debug: $canonid2debug" != "$canondebug2"
+
+# Both .debug files should point to the dwz multi file.
+# It would be nice to also test that they contain the correct dwz build-id
+# but that is a bit hard to grep out of the section data.
+multiref1=$(readelf --string-dump=.gnu_debugaltlink $hello_file_debug \
+  | grep '     0' | cut -c13-)
+multiref2=$(readelf --string-dump=.gnu_debugaltlink $hello2_file_debug \
+  | grep '     0' | cut -c13-)
+
+test "$multiref1" = "$multiref2" || echo "multiref: $multiref1 != $multiref2"
+
+canonmultiref=$(readlink -f $(dirname $canondebug1)/$multiref1)
+canonmultifile=$(readlink -f $hello_multi_file)
+
+test "$canonmultiref" = "$canonmultifile" \
+  || echo "canonmultiref: $canonmultiref" != "$canonmultifile"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:485"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_127
+#AT_START_128
+at_fn_group_banner 128 'rpmbuild.at:575' \
+  "rpmbuild debuginfo dwz unique debug names" "      " 9
+at_xfail=no
+(
+  $as_echo "128. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:577:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --define \"_unique_debug_names 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2.spec
+
+# The debuginfo package should contain a .debug file for each binary
+# and a dwz multi file that contains the shared debuginfo between them.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+
+hello_file_debug=./usr/lib/debug/usr/local/bin/hello-*.debug
+hello2_file_debug=./usr/lib/debug/usr/local/bin/hello2-*.debug
+hello_multi_file=./usr/lib/debug/.dwz/hello2-1.0-1.*
+test -f \$hello_file_debug || echo \"no hello debug file: \$hello_file_debug\"
+test -f \$hello2_file_debug || echo \"no hello2 debug file: \$hello2_file_debug\"
+test -f \$hello_multi_file || echo \"no dwz multi file: \$hello_multi_file\"
+
+# Make sure the main package binaries contain the correct build-ids
+# linking them to the debug packages.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu
+hello_file=./usr/local/bin/hello
+hello2_file=./usr/local/bin/hello2
+test -f \$hello_file || echo \"no hello file: \$hello_file\"
+test -f \$hello2_file || echo \"no hello2 file: \$hello2_file\"
+
+id1=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+id2=\$(file \$hello2_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+id1debug=\$(file \$hello_file_debug | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+id2debug=\$(file \$hello2_file_debug | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+idmulti=\$(file \$hello_multi_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+test \"\$id1\" = \"\$id1debug\" || echo \"id1: \$id1 != id1debug: \$id1debug\"
+test \"\$id2\" = \"\$id2debug\" || echo \"id2: \$id2 != id2debug: \$id2debug\"
+
+# The build-id files should link to the .debug files.
+id1file=\"./usr/lib/debug/.build-id/\${id1:0:2}/\${id1:2}\"
+canonid1file=\$(readlink -f \${id1file})
+canonfile1=\$(readlink -f \$hello_file)
+canonid1debug=\$(readlink -f \${id1file}.debug)
+canondebug1=\$(readlink -f \$hello_file_debug)
+
+test \"\$canonid1file\" = \"\$canonfile1\" \\
+  || echo \"canonid1file: \$canonid1file != \$canonfile1\"
+test \"\$canonid1debug\" = \"\$canondebug1\" \\
+  || echo \"canonid1debug: \$canonid1debug != \$canondebug1\"
+
+id2file=\"./usr/lib/debug/.build-id/\${id2:0:2}/\${id2:2}\"
+canonid2file=\$(readlink -f \${id2file})
+canonfile2=\$(readlink -f \$hello2_file)
+canonid2debug=\$(readlink -f \${id2file}.debug)
+canondebug2=\$(readlink -f \$hello2_file_debug)
+
+test \"\$canonid2file\" = \"\$canonfile2\" \\
+  || echo \"canonid2: \$canonid2file != \$canonfile2\"
+test \"\$canonid2debug\" = \"\$canondebug2\" \\
+  || echo \"canonid2debug: \$canonid2debug\" != \"\$canondebug2\"
+
+# Both .debug files should point to the dwz multi file.
+# It would be nice to also test that they contain the correct dwz build-id
+# but that is a bit hard to grep out of the section data.
+multiref1=\$(readelf --string-dump=.gnu_debugaltlink \$hello_file_debug \\
+  | grep '     0' | cut -c13-)
+multiref2=\$(readelf --string-dump=.gnu_debugaltlink \$hello2_file_debug \\
+  | grep '     0' | cut -c13-)
+
+test \"\$multiref1\" = \"\$multiref2\" || echo \"multiref: \$multiref1 != \$multiref2\"
+
+canonmultiref=\$(readlink -f \$(dirname \$canondebug1)/\$multiref1)
+canonmultifile=\$(readlink -f \$hello_multi_file)
+
+test \"\$canonmultiref\" = \"\$canonmultifile\" \\
+  || echo \"canonmultiref: \$canonmultiref\" != \"\$canonmultifile\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuild.at:577"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# The debuginfo package should contain a .debug file for each binary
+# and a dwz multi file that contains the shared debuginfo between them.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+hello_file_debug=./usr/lib/debug/usr/local/bin/hello-*.debug
+hello2_file_debug=./usr/lib/debug/usr/local/bin/hello2-*.debug
+hello_multi_file=./usr/lib/debug/.dwz/hello2-1.0-1.*
+test -f $hello_file_debug || echo "no hello debug file: $hello_file_debug"
+test -f $hello2_file_debug || echo "no hello2 debug file: $hello2_file_debug"
+test -f $hello_multi_file || echo "no dwz multi file: $hello_multi_file"
+
+# Make sure the main package binaries contain the correct build-ids
+# linking them to the debug packages.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu
+hello_file=./usr/local/bin/hello
+hello2_file=./usr/local/bin/hello2
+test -f $hello_file || echo "no hello file: $hello_file"
+test -f $hello2_file || echo "no hello2 file: $hello2_file"
+
+id1=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+id2=$(file $hello2_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+id1debug=$(file $hello_file_debug | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+id2debug=$(file $hello2_file_debug | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+idmulti=$(file $hello_multi_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+test "$id1" = "$id1debug" || echo "id1: $id1 != id1debug: $id1debug"
+test "$id2" = "$id2debug" || echo "id2: $id2 != id2debug: $id2debug"
+
+# The build-id files should link to the .debug files.
+id1file="./usr/lib/debug/.build-id/${id1:0:2}/${id1:2}"
+canonid1file=$(readlink -f ${id1file})
+canonfile1=$(readlink -f $hello_file)
+canonid1debug=$(readlink -f ${id1file}.debug)
+canondebug1=$(readlink -f $hello_file_debug)
+
+test "$canonid1file" = "$canonfile1" \
+  || echo "canonid1file: $canonid1file != $canonfile1"
+test "$canonid1debug" = "$canondebug1" \
+  || echo "canonid1debug: $canonid1debug != $canondebug1"
+
+id2file="./usr/lib/debug/.build-id/${id2:0:2}/${id2:2}"
+canonid2file=$(readlink -f ${id2file})
+canonfile2=$(readlink -f $hello2_file)
+canonid2debug=$(readlink -f ${id2file}.debug)
+canondebug2=$(readlink -f $hello2_file_debug)
+
+test "$canonid2file" = "$canonfile2" \
+  || echo "canonid2: $canonid2file != $canonfile2"
+test "$canonid2debug" = "$canondebug2" \
+  || echo "canonid2debug: $canonid2debug" != "$canondebug2"
+
+# Both .debug files should point to the dwz multi file.
+# It would be nice to also test that they contain the correct dwz build-id
+# but that is a bit hard to grep out of the section data.
+multiref1=$(readelf --string-dump=.gnu_debugaltlink $hello_file_debug \
+  | grep '     0' | cut -c13-)
+multiref2=$(readelf --string-dump=.gnu_debugaltlink $hello2_file_debug \
+  | grep '     0' | cut -c13-)
+
+test "$multiref1" = "$multiref2" || echo "multiref: $multiref1 != $multiref2"
+
+canonmultiref=$(readlink -f $(dirname $canondebug1)/$multiref1)
+canonmultifile=$(readlink -f $hello_multi_file)
+
+test "$canonmultiref" = "$canonmultifile" \
+  || echo "canonmultiref: $canonmultiref" != "$canonmultifile"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:577"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_128
+#AT_START_129
+at_fn_group_banner 129 'rpmbuild.at:664' \
+  "rpmbuild debuginfo dwz gnu_debuglink crc" "       " 9
+at_xfail=no
+(
+  $as_echo "129. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:666:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2.spec
+
+# Unpack the main and debuginfo rpms so we can check binaries and .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu
+
+# Check that dwz has ran and a multi file has been produced
+test -f ./usr/lib/debug/.dwz/hello2-1.0-1.* || exit 1
+
+# Run sepdbugcrcfix on the binaries, both should have correct CRC already.
+\${abs_top_builddir}/sepdebugcrcfix ./usr/lib/debug \\
+  ./usr/local/bin/hello ./usr/local/bin/hello2 | grep CRC32 | cut -f2 -d:
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:666"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the main and debuginfo rpms so we can check binaries and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check that dwz has ran and a multi file has been produced
+test -f ./usr/lib/debug/.dwz/hello2-1.0-1.* || exit 1
+
+# Run sepdbugcrcfix on the binaries, both should have correct CRC already.
+${abs_top_builddir}/sepdebugcrcfix ./usr/lib/debug \
+  ./usr/local/bin/hello ./usr/local/bin/hello2 | grep CRC32 | cut -f2 -d:
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo " Updated 0 CRC32s, 2 CRC32s did match.
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:666"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_129
+#AT_START_130
+at_fn_group_banner 130 'rpmbuild.at:698' \
+  "rpmbuild implicit suid binary" "                  " 9
+at_xfail=no
+(
+  $as_echo "130. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:700:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2-suid.spec
+
+# Unpack rpm so we can check the included binaries.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# List all binaries with suid bit set (should be one, hello).
+echo \"suid:\"
+find usr -executable -type f -perm /4000
+# List all binaries without suid bit set (should also be one, hello2).
+echo \"no-suid:\"
+find usr -executable -type f \\! -perm /4000
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:700"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  -ba "${abs_srcdir}"/data/SPECS/hello2-suid.spec
+
+# Unpack rpm so we can check the included binaries.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# List all binaries with suid bit set (should be one, hello).
+echo "suid:"
+find usr -executable -type f -perm /4000
+# List all binaries without suid bit set (should also be one, hello2).
+echo "no-suid:"
+find usr -executable -type f \! -perm /4000
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "suid:
+usr/local/bin/hello
+no-suid:
+usr/local/bin/hello2
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:700"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_130
+#AT_START_131
+at_fn_group_banner 131 'rpmbuild.at:732' \
+  "rpmbuild debuginfo gdb index included" "          " 9
+at_xfail=no
+(
+  $as_echo "131. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:734:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --define \"_include_gdb_index 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# Check that gdb-add-index has ran and a .gdb_index section has been added
+readelf -S ./usr/lib/debug/usr/local/bin/hello2*.debug \\
+  | grep gdb_index | cut -c8-17
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:734"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_include_gdb_index 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that gdb-add-index has ran and a .gdb_index section has been added
+readelf -S ./usr/lib/debug/usr/local/bin/hello2*.debug \
+  | grep gdb_index | cut -c8-17
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo ".gdb_index
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:734"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_131
+#AT_START_132
+at_fn_group_banner 132 'rpmbuild.at:761' \
+  "rpmbuild debuginfo no gdb index included" "       " 9
+at_xfail=no
+(
+  $as_echo "132. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:763:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --undefine \"_include_gdb_index\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# Check that gdb-add-index has not ran and no .gdb_index section has been added
+readelf -S ./usr/lib/debug/usr/local/bin/hello2*.debug \\
+  | grep gdb_index | cut -c8-17
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:763"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --undefine "_include_gdb_index" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that gdb-add-index has not ran and no .gdb_index section has been added
+readelf -S ./usr/lib/debug/usr/local/bin/hello2*.debug \
+  | grep gdb_index | cut -c8-17
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:763"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_132
+#AT_START_133
+at_fn_group_banner 133 'rpmbuild.at:789' \
+  "rpmbuild debuginfo unique debug src dir" "        " 9
+at_xfail=no
+(
+  $as_echo "133. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:791:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Note that the spec defines hello2 as name, but the source is hello-1.0.
+# Disable dwz to make debuginfo path rewrite checking easier.
+rundebug rpmbuild --quiet \\
+  --undefine \"_find_debuginfo_dwz_opts\" \\
+  --define \"_unique_debug_srcs 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# Check that the source path is \"unique\"
+# Drop the final arch prefix to make the test arch-independent.
+ls ./usr/src/debug/ | cut -f1,2 -d\\.
+
+# Check that the source path has been rewritten in the .debug file.
+# Drop the final arch prefix to make the test arch-independent.
+readelf --debug-dump=info ./usr/lib/debug/usr/local/bin/hello2*.debug \\
+  | grep comp_dir | sed -e 's/\\t\$//' | cut -f5- -d/ | cut -f1,2 -d\\.
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:791"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Note that the spec defines hello2 as name, but the source is hello-1.0.
+# Disable dwz to make debuginfo path rewrite checking easier.
+rundebug rpmbuild --quiet \
+  --undefine "_find_debuginfo_dwz_opts" \
+  --define "_unique_debug_srcs 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that the source path is "unique"
+# Drop the final arch prefix to make the test arch-independent.
+ls ./usr/src/debug/ | cut -f1,2 -d\.
+
+# Check that the source path has been rewritten in the .debug file.
+# Drop the final arch prefix to make the test arch-independent.
+readelf --debug-dump=info ./usr/lib/debug/usr/local/bin/hello2*.debug \
+  | grep comp_dir | sed -e 's/\t$//' | cut -f5- -d/ | cut -f1,2 -d\.
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello2-1.0-1
+hello2-1.0-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:791"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_133
+#AT_START_134
+at_fn_group_banner 134 'rpmbuild.at:828' \
+  "rpmbuild debuginfo no unique debug src dir" "     " 9
+at_xfail=no
+(
+  $as_echo "134. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:830:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Note that the spec defines hello2 as name, but the source is hello-1.0.
+# Disable dwz to make debuginfo path rewrite checking easier.
+rundebug rpmbuild --quiet \\
+  --undefine \"_find_debuginfo_dwz_opts\" \\
+  --undefine \"_unique_debug_srcs\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# Check that the source path is \"unique\"
+ls ./usr/src/debug/
+
+# Check that the source path has been rewritten in the .debug file.
+readelf --debug-dump=info ./usr/lib/debug/usr/local/bin/hello2*.debug \\
+  | grep comp_dir | sed -e 's/\\t\$//' | cut -f5- -d/
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:830"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Note that the spec defines hello2 as name, but the source is hello-1.0.
+# Disable dwz to make debuginfo path rewrite checking easier.
+rundebug rpmbuild --quiet \
+  --undefine "_find_debuginfo_dwz_opts" \
+  --undefine "_unique_debug_srcs" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debuginfo rpms so we can check the .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that the source path is "unique"
+ls ./usr/src/debug/
+
+# Check that the source path has been rewritten in the .debug file.
+readelf --debug-dump=info ./usr/lib/debug/usr/local/bin/hello2*.debug \
+  | grep comp_dir | sed -e 's/\t$//' | cut -f5- -d/
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello-1.0
+hello-1.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:830"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_134
+#AT_START_135
+at_fn_group_banner 135 'rpmbuild.at:864' \
+  "rpmbuild debugsource" "                           " 9
+at_xfail=no
+(
+  $as_echo "135. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:866:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --define \"_debugsource_packages 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2.spec
+
+# Unpack the debugsource rpm so we can check the sources are there.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debugsource-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# Check that hello.c is there.
+ls ./usr/src/debug/hello2-1.0*/
+
+# The debuginfo package should recommend the debugsource package (ignore arch).
+echo -n \"Recommends: \"
+run rpm -qp --recommends \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\\(.*\\) = ([-.0-9]+)/\\1\\(ignore-arch\\) = \\2/'
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:866"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Build a package that has some debuginfo
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_debugsource_packages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2.spec
+
+# Unpack the debugsource rpm so we can check the sources are there.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debugsource-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that hello.c is there.
+ls ./usr/src/debug/hello2-1.0*/
+
+# The debuginfo package should recommend the debugsource package (ignore arch).
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\(.*\) = ([-.0-9]+)/\1\(ignore-arch\) = \2/'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello.c
+Recommends: hello2-debugsource(ignore-arch) = 1.0-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:866"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_135
+#AT_START_136
+at_fn_group_banner 136 'rpmbuild.at:899' \
+  "rpmbuild debugsource debugsourcefiles.list path" "" 9
+at_xfail=no
+(
+  $as_echo "136. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:901:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello.c \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --define \"_debugsource_packages 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello-cd.spec
+
+# Unpack the debuginfo rpms so we can check the sources are there.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-debugsource-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# Check that hello.c is there.
+ls ./usr/src/debug/test-1.0*/
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuild.at:901"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_debugsource_packages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-cd.spec
+
+# Unpack the debuginfo rpms so we can check the sources are there.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debugsource-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# Check that hello.c is there.
+ls ./usr/src/debug/test-1.0*/
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello.c
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:901"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_136
+#AT_START_137
+at_fn_group_banner 137 'rpmbuild.at:927' \
+  "rpmbuild debuginfo subpackages single" "          " 9
+at_xfail=no
+(
+  $as_echo "137. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:929:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello.c \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --undefine \"_unique_debug_names\" \\
+  --undefine \"_unique_debug_srcs\" \\
+  --undefine \"_debugsource_packages\" \\
+  --undefine \"_debuginfo_subpackages\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/test-subpackages.spec
+
+# Check that there is just one debuginfo package.
+ls \${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# Which contains hello.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello debug exists\"
+else
+  echo \"No hello: \$debug_name\"
+fi
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuild.at:929"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --undefine "_debugsource_packages" \
+  --undefine "_debuginfo_subpackages" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages.spec
+
+# Check that there is just one debuginfo package.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# Which contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "1
+hello debug exists
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:929"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_137
+#AT_START_138
+at_fn_group_banner 138 'rpmbuild.at:969' \
+  "rpmbuild debuginfo subpackages multiple" "        " 9
+at_xfail=no
+(
+  $as_echo "138. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:971:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello.c \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --undefine \"_unique_debug_names\" \\
+  --undefine \"_unique_debug_srcs\" \\
+  --undefine \"_debugsource_packages\" \\
+  --define \"_debuginfo_subpackages 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/test-subpackages.spec
+
+# Check that there are 3 debuginfo packages.
+ls \${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello debug exists\"
+else
+  echo \"No hello: \$debug_name\"
+fi
+
+# Second contains hello2.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello2 debug exists\"
+else
+  echo \"No hello2: \$debug_name\"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n \"Recommends: \"
+run rpm -qp --recommends \${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\\(.*\\) = ([-.0-9]+)/\\1\\(ignore-arch\\) = \\2/'
+
+# Third contains hello3.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test3-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello3 | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello3 debug exists\"
+else
+  echo \"No hello3: \$debug_name\"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n \"Recommends: \"
+run rpm -qp --recommends \${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\\(.*\\) = ([-.0-9]+)/\\1\\(ignore-arch\\) = \\2/'
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuild.at:971"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --undefine "_debugsource_packages" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages.spec
+
+# Check that there are 3 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# Second contains hello2.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello2 debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\(.*\) = ([-.0-9]+)/\1\(ignore-arch\) = \2/'
+
+# Third contains hello3.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello3 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello3 debug exists"
+else
+  echo "No hello3: $debug_name"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\(.*\) = ([-.0-9]+)/\1\(ignore-arch\) = \2/'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "3
+hello debug exists
+hello2 debug exists
+Recommends: test-debuginfo(ignore-arch) = 1.0-1
+hello3 debug exists
+Recommends: test-debuginfo(ignore-arch) = 1.0-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:971"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_138
+#AT_START_139
+at_fn_group_banner 139 'rpmbuild.at:1053' \
+  "rpmbuild debuginfo subpackages multiple unique" " " 9
+at_xfail=no
+(
+  $as_echo "139. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:1055:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello.c \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --define \"_unique_debug_names 1\" \\
+  --define \"_unique_debug_srcs 1\" \\
+  --undefine \"_debugsource_packages\" \\
+  --define \"_debuginfo_subpackages 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/test-subpackages.spec
+
+# Check that there are 3 debuginfo packages.
+ls \${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello debug exists\"
+else
+  echo \"No hello: \$debug_name\"
+fi
+
+# Second contains hello2.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello2 debug exists\"
+else
+  echo \"No hello2: \$debug_name\"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n \"Recommends: \"
+run rpm -qp --recommends \${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\\(.*\\) = ([-.0-9]+)/\\1\\(ignore-arch\\) = \\2/'
+
+# Third contains hello3.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test3-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello3 | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello3 debug exists\"
+else
+  echo \"No hello3: \$debug_name\"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n \"Recommends: \"
+run rpm -qp --recommends \${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\\(.*\\) = ([-.0-9]+)/\\1\\(ignore-arch\\) = \\2/'
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuild.at:1055"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --undefine "_debugsource_packages" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages.spec
+
+# Check that there are 3 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# Second contains hello2.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello2 debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\(.*\) = ([-.0-9]+)/\1\(ignore-arch\) = \2/'
+
+# Third contains hello3.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello3 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello3 debug exists"
+else
+  echo "No hello3: $debug_name"
+fi
+
+# No debugsource package, so sources are in the main debuginfo package.
+# Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\(.*\) = ([-.0-9]+)/\1\(ignore-arch\) = \2/'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "3
+hello debug exists
+hello2 debug exists
+Recommends: test-debuginfo(ignore-arch) = 1.0-1
+hello3 debug exists
+Recommends: test-debuginfo(ignore-arch) = 1.0-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:1055"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_139
+#AT_START_140
+at_fn_group_banner 140 'rpmbuild.at:1137' \
+  "rpmbuild debuginfo subpackages multiple unique debugsource" "" 9
+at_xfail=no
+(
+  $as_echo "140. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:1139:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello.c \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --define \"_unique_debug_names 1\" \\
+  --define \"_unique_debug_srcs 1\" \\
+  --define \"_debugsource_packages 1\" \\
+  --define \"_debuginfo_subpackages 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/test-subpackages.spec
+
+# Check that there are 3 debuginfo packages.
+ls \${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello debug exists\"
+else
+  echo \"No hello: \$debug_name\"
+fi
+
+# Sources are in debugsource package. Make sure it is recommended.
+echo -n \"Recommends: \"
+run rpm -qp --recommends \${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\\(.*\\) = ([-.0-9]+)/\\1\\(ignore-arch\\) = \\2/'
+
+# Second contains hello2.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello2 debug exists\"
+else
+  echo \"No hello2: \$debug_name\"
+fi
+
+# Sources are in debugsource package. Make sure it is recommended.
+echo -n \"Recommends: \"
+run rpm -qp --recommends \${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\\(.*\\) = ([-.0-9]+)/\\1\\(ignore-arch\\) = \\2/'
+
+# Third contains hello3.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test3-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello3 | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello3 debug exists\"
+else
+  echo \"No hello3: \$debug_name\"
+fi
+
+# Sources are in debugsource package. Make sure it is recommended.
+echo -n \"Recommends: \"
+run rpm -qp --recommends \${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\\(.*\\) = ([-.0-9]+)/\\1\\(ignore-arch\\) = \\2/'
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuild.at:1139"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --define "_debugsource_packages 1" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages.spec
+
+# Check that there are 3 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# Sources are in debugsource package. Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\(.*\) = ([-.0-9]+)/\1\(ignore-arch\) = \2/'
+
+# Second contains hello2.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello2 debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+# Sources are in debugsource package. Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\(.*\) = ([-.0-9]+)/\1\(ignore-arch\) = \2/'
+
+# Third contains hello3.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello3 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello3 debug exists"
+else
+  echo "No hello3: $debug_name"
+fi
+
+# Sources are in debugsource package. Make sure it is recommended.
+echo -n "Recommends: "
+run rpm -qp --recommends ${abs_builddir}/testing/build/RPMS/*/test-test3-debuginfo-1.0-1.*.rpm | sed -E 's/([-.a-z0-9]+)\(.*\) = ([-.0-9]+)/\1\(ignore-arch\) = \2/'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "3
+hello debug exists
+Recommends: test-debugsource(ignore-arch) = 1.0-1
+hello2 debug exists
+Recommends: test-debugsource(ignore-arch) = 1.0-1
+hello3 debug exists
+Recommends: test-debugsource(ignore-arch) = 1.0-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:1139"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_140
+#AT_START_141
+at_fn_group_banner 141 'rpmbuild.at:1224' \
+  "rpmbuild debuginfo subpackages multiple excluded" "" 9
+at_xfail=no
+(
+  $as_echo "141. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:1226:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello.c \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --define \"_unique_debug_names 1\" \\
+  --define \"_unique_debug_srcs 1\" \\
+  --define \"_debugsource_packages 1\" \\
+  --define \"_debuginfo_subpackages 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/test-subpackages-exclude.spec
+
+# Check that there are 2 debuginfo packages.
+ls \${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello debug exists\"
+else
+  echo \"No hello: \$debug_name\"
+fi
+
+# Second contains hello2.debug but NOT hello3.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello2 debug exists\"
+else
+  echo \"No hello2: \$debug_name\"
+fi
+
+if test -f ./usr/lib/debug/bin/hello3*; then
+  echo \"hello3 debug exists\"
+else
+  echo \"No hello3 debug\"
+fi
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuild.at:1226"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --define "_debugsource_packages 1" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages-exclude.spec
+
+# Check that there are 2 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# Second contains hello2.debug but NOT hello3.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello2 | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello2 debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+if test -f ./usr/lib/debug/bin/hello3*; then
+  echo "hello3 debug exists"
+else
+  echo "No hello3 debug"
+fi
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "2
+hello debug exists
+hello2 debug exists
+No hello3 debug
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:1226"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_141
+#AT_START_142
+at_fn_group_banner 142 'rpmbuild.at:1288' \
+  "rpmbuild debuginfo subpackages multiple excluded" "" 9
+at_xfail=no
+(
+  $as_echo "142. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuild.at:1290:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello.c \${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \\
+  --define \"_unique_debug_names 1\" \\
+  --define \"_unique_debug_srcs 1\" \\
+  --define \"_debugsource_packages 1\" \\
+  --define \"_debuginfo_subpackages 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/test-subpackages-pathpostfixes.spec
+
+# Check that there are 2 debuginfo packages.
+ls \${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello debug exists\"
+else
+  echo \"No hello: \$debug_name\"
+fi
+
+# remove it, we are going to check the other debuginfo package.
+rm ./bin/hello
+rm ./usr/lib/debug/bin/\$debug_name
+orig_debugname=\$debugname
+
+# Second contains hello.foobar.debug but NOT hello.debug
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=\$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/\$debug_name; then
+  echo \"hello.foobar debug exists\"
+else
+  echo \"No hello2: \$debug_name\"
+fi
+
+if test -f ./usr/lib/debug/bin/\$orig_debugname; then
+  echo \"\$orig_debugname exists\"
+else
+  echo \"No hello.debug\"
+fi
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuild.at:1290"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+rundebug rpmbuild --quiet \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --define "_debugsource_packages 1" \
+  --define "_debuginfo_subpackages 1" \
+  -ba "${abs_srcdir}"/data/SPECS/test-subpackages-pathpostfixes.spec
+
+# Check that there are 2 debuginfo packages.
+ls ${abs_builddir}/testing/build/RPMS/*/*debuginfo*rpm | wc --lines
+
+# First contains hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello debug exists"
+else
+  echo "No hello: $debug_name"
+fi
+
+# remove it, we are going to check the other debuginfo package.
+rm ./bin/hello
+rm ./usr/lib/debug/bin/$debug_name
+orig_debugname=$debugname
+
+# Second contains hello.foobar.debug but NOT hello.debug
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+# Extract the debug name from the exe (.gnu_debuglink section, first string)
+debug_name=$(readelf -p .gnu_debuglink ./bin/hello | grep hello | cut -c13-)
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/test-test2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+if test -f ./usr/lib/debug/bin/$debug_name; then
+  echo "hello.foobar debug exists"
+else
+  echo "No hello2: $debug_name"
+fi
+
+if test -f ./usr/lib/debug/bin/$orig_debugname; then
+  echo "$orig_debugname exists"
+else
+  echo "No hello.debug"
+fi
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "2
+hello debug exists
+hello.foobar debug exists
+No hello.debug
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuild.at:1290"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_142
+#AT_START_143
+at_fn_group_banner 143 'rpmbuildid.at:23' \
+  "rpmbuild buildid none" "                          " 10
+at_xfail=no
+(
+  $as_echo "143. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:25:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \\
+  --define=\"_build_id_links none\" \\
+  --quiet -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+# There should be zero build-id files in both the main and debuginfo package
+echo -n \"hello build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+echo -n \"hello debuginfo build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuildid.at:25"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links none" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be zero build-id files in both the main and debuginfo package
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello build-id files: 0
+hello debuginfo build-id files: 0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:25"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_143
+#AT_START_144
+at_fn_group_banner 144 'rpmbuildid.at:57' \
+  "rpmbuild buildid alldebug" "                      " 10
+at_xfail=no
+(
+  $as_echo "144. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:59:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \\
+  --define=\"_build_id_links alldebug\" \\
+  --undefine \"_unique_debug_names\" \\
+  --undefine \"_unique_debug_srcs\" \\
+  --quiet -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+# There should be zero build-id files in the main package
+# Main and debug should be in the debuginfo package,
+# plus the .build-id/xx subdir, 3 in total.
+echo -n \"hello build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+echo -n \"hello debuginfo build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f \"\${main_file}\" || echo \"No main file \${main_file}\"
+
+# Extract the build-id from the main file
+id_main=\$(file \$main_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+id_main_file=\"./usr/lib/debug/.build-id/\${id_main:0:2}/\${id_main:2}\"
+test -L \"\$id_main_file\" || echo \"No build-id file \$id_main_file\"
+
+canon_main_file=\$(readlink -f \${main_file})
+
+test -f \"\$canon_main_file\" \\
+  || echo \"Cannot resolve main file \${main_file} -> \${canon_main_file}\"
+
+canon_main_id_file=\$(readlink -f \${id_main_file})
+
+test -f \"\$canon_main_id_file\" \\
+  || echo \"Cannot resolve main build-id file \${id_main_file} -> \${canon_main_id_file}\"
+
+test \"\$canon_main_file\" = \"\$canon_main_id_file\" \\
+  || echo \"main and build-id file not linked\"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello.debug
+test -f \${debug_file} || echo \"No debug file \${debug_file}\"
+
+# Extract the build-id from the .debug file
+id_debug=\$(file \$debug_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+test \${id_main} = \${id_debug} || echo \"unequal main and debug id\"
+
+id_debug_file=\"./usr/lib/debug/.build-id/\${id_debug:0:2}/\${id_debug:2}.debug\"
+test -L \"\$id_debug_file\" || echo \"No build-id file \$id_debug_file\"
+
+canon_debug_file=\$(readlink -f \${debug_file})
+
+test -f \"\$canon_debug_file\" \\
+  || echo \"Cannot resolve debug file \${debug_file} -> \${canon_debug_file}\"
+
+canon_debug_id_file=\$(readlink -f \${id_debug_file})
+
+test -f \"\$canon_debug_id_file\" \\
+  || echo \"Cannot resolve debug build-id file \${id_debug_file} -> \${canon_debug_id_file}\"
+
+test \"\$canon_debug_file\" = \"\$canon_debug_id_file\" \\
+  || echo \"debug and build-id not linked\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:59"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links alldebug" \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be zero build-id files in the main package
+# Main and debug should be in the debuginfo package,
+# plus the .build-id/xx subdir, 3 in total.
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+id_main_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello build-id files: 0
+hello debuginfo build-id files: 3
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:59"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_144
+#AT_START_145
+at_fn_group_banner 145 'rpmbuildid.at:149' \
+  "rpmbuild buildid alldebug unique debug names" "   " 10
+at_xfail=no
+(
+  $as_echo "145. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:151:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \\
+  --define=\"_build_id_links alldebug\" \\
+  --define=\"_unique_debug_names 1\" \\
+  --quiet -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+# There should be zero build-id files in the main package
+# Main and debug should be in the debuginfo package,
+# plus the .build-id/xx subdir, 3 in total.
+echo -n \"hello build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+echo -n \"hello debuginfo build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f \"\${main_file}\" || echo \"No main file \${main_file}\"
+
+# Extract the build-id from the main file
+id_main=\$(file \$main_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+id_main_file=\"./usr/lib/debug/.build-id/\${id_main:0:2}/\${id_main:2}\"
+test -L \"\$id_main_file\" || echo \"No build-id file \$id_main_file\"
+
+canon_main_file=\$(readlink -f \${main_file})
+
+test -f \"\$canon_main_file\" \\
+  || echo \"Cannot resolve main file \${main_file} -> \${canon_main_file}\"
+
+canon_main_id_file=\$(readlink -f \${id_main_file})
+
+test -f \"\$canon_main_id_file\" \\
+  || echo \"Cannot resolve main build-id file \${id_main_file} -> \${canon_main_id_file}\"
+
+test \"\$canon_main_file\" = \"\$canon_main_id_file\" \\
+  || echo \"main and build-id file not linked\"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello-*.debug
+test -f \${debug_file} || echo \"No debug file \${debug_file}\"
+
+# Extract the build-id from the .debug file
+id_debug=\$(file \$debug_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+test \${id_main} = \${id_debug} || echo \"unequal main and debug id\"
+
+id_debug_file=\"./usr/lib/debug/.build-id/\${id_debug:0:2}/\${id_debug:2}.debug\"
+test -L \"\$id_debug_file\" || echo \"No build-id file \$id_debug_file\"
+
+canon_debug_file=\$(readlink -f \${debug_file})
+
+test -f \"\$canon_debug_file\" \\
+  || echo \"Cannot resolve debug file \${debug_file} -> \${canon_debug_file}\"
+
+canon_debug_id_file=\$(readlink -f \${id_debug_file})
+
+test -f \"\$canon_debug_id_file\" \\
+  || echo \"Cannot resolve debug build-id file \${id_debug_file} -> \${canon_debug_id_file}\"
+
+test \"\$canon_debug_file\" = \"\$canon_debug_id_file\" \\
+  || echo \"debug and build-id not linked\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:151"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links alldebug" \
+  --define="_unique_debug_names 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be zero build-id files in the main package
+# Main and debug should be in the debuginfo package,
+# plus the .build-id/xx subdir, 3 in total.
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+id_main_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello-*.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello build-id files: 0
+hello debuginfo build-id files: 3
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:151"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_145
+#AT_START_146
+at_fn_group_banner 146 'rpmbuildid.at:240' \
+  "rpmbuild buildid separate" "                      " 10
+at_xfail=no
+(
+  $as_echo "146. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:242:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \\
+  --define=\"_build_id_links separate\" \\
+  --undefine \"_unique_debug_names\" \\
+  --undefine \"_unique_debug_srcs\" \\
+  --quiet -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package
+# plus the .build-id/xx subdir, 2 in total.
+echo -n \"hello build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+echo -n \"hello debuginfo build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f \"\${main_file}\" || echo \"No main file \${main_file}\"
+
+# Extract the build-id from the main file
+id_main=\$(file \$main_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+id_main_file=\"./usr/lib/.build-id/\${id_main:0:2}/\${id_main:2}\"
+test -L \"\$id_main_file\" || echo \"No build-id file \$id_main_file\"
+
+canon_main_file=\$(readlink -f \${main_file})
+
+test -f \"\$canon_main_file\" \\
+  || echo \"Cannot resolve main file \${main_file} -> \${canon_main_file}\"
+
+canon_main_id_file=\$(readlink -f \${id_main_file})
+
+test -f \"\$canon_main_id_file\" \\
+  || echo \"Cannot resolve main build-id file \${id_main_file} -> \${canon_main_id_file}\"
+
+test \"\$canon_main_file\" = \"\$canon_main_id_file\" \\
+  || echo \"main and build-id file not linked\"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello.debug
+test -f \${debug_file} || echo \"No debug file \${debug_file}\"
+
+# Extract the build-id from the .debug file
+id_debug=\$(file \$debug_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+test \${id_main} = \${id_debug} || echo \"unequal main and debug id\"
+
+id_debug_file=\"./usr/lib/debug/.build-id/\${id_debug:0:2}/\${id_debug:2}.debug\"
+test -L \"\$id_debug_file\" || echo \"No build-id file \$id_debug_file\"
+
+canon_debug_file=\$(readlink -f \${debug_file})
+
+test -f \"\$canon_debug_file\" \\
+  || echo \"Cannot resolve debug file \${debug_file} -> \${canon_debug_file}\"
+
+canon_debug_id_file=\$(readlink -f \${id_debug_file})
+
+test -f \"\$canon_debug_id_file\" \\
+  || echo \"Cannot resolve debug build-id file \${id_debug_file} -> \${canon_debug_id_file}\"
+
+test \"\$canon_debug_file\" = \"\$canon_debug_id_file\" \\
+  || echo \"debug and build-id not linked\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:242"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links separate" \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package
+# plus the .build-id/xx subdir, 2 in total.
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello build-id files: 2
+hello debuginfo build-id files: 2
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:242"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_146
+#AT_START_147
+at_fn_group_banner 147 'rpmbuildid.at:331' \
+  "rpmbuild buildid separate unique debug names" "   " 10
+at_xfail=no
+(
+  $as_echo "147. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:333:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \\
+  --define=\"_build_id_links separate\" \\
+  --define=\"_unique_debug_names 1\" \\
+  --quiet -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package
+# plus the .build-id/xx subdir, 2 in total.
+echo -n \"hello build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+echo -n \"hello debuginfo build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f \"\${main_file}\" || echo \"No main file \${main_file}\"
+
+# Extract the build-id from the main file
+id_main=\$(file \$main_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+id_main_file=\"./usr/lib/.build-id/\${id_main:0:2}/\${id_main:2}\"
+test -L \"\$id_main_file\" || echo \"No build-id file \$id_main_file\"
+
+canon_main_file=\$(readlink -f \${main_file})
+
+test -f \"\$canon_main_file\" \\
+  || echo \"Cannot resolve main file \${main_file} -> \${canon_main_file}\"
+
+canon_main_id_file=\$(readlink -f \${id_main_file})
+
+test -f \"\$canon_main_id_file\" \\
+  || echo \"Cannot resolve main build-id file \${id_main_file} -> \${canon_main_id_file}\"
+
+test \"\$canon_main_file\" = \"\$canon_main_id_file\" \\
+  || echo \"main and build-id file not linked\"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello-*.debug
+test -f \${debug_file} || echo \"No debug file \${debug_file}\"
+
+# Extract the build-id from the .debug file
+id_debug=\$(file \$debug_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+test \${id_main} = \${id_debug} || echo \"unequal main and debug id\"
+
+id_debug_file=\"./usr/lib/debug/.build-id/\${id_debug:0:2}/\${id_debug:2}.debug\"
+test -L \"\$id_debug_file\" || echo \"No build-id file \$id_debug_file\"
+
+canon_debug_file=\$(readlink -f \${debug_file})
+
+test -f \"\$canon_debug_file\" \\
+  || echo \"Cannot resolve debug file \${debug_file} -> \${canon_debug_file}\"
+
+canon_debug_id_file=\$(readlink -f \${id_debug_file})
+
+test -f \"\$canon_debug_id_file\" \\
+  || echo \"Cannot resolve debug build-id file \${id_debug_file} -> \${canon_debug_id_file}\"
+
+test \"\$canon_debug_file\" = \"\$canon_debug_id_file\" \\
+  || echo \"debug and build-id not linked\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:333"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links separate" \
+  --define="_unique_debug_names 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package
+# plus the .build-id/xx subdir, 2 in total.
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello-*.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello build-id files: 2
+hello debuginfo build-id files: 2
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:333"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_147
+#AT_START_148
+at_fn_group_banner 148 'rpmbuildid.at:421' \
+  "rpmbuild buildid compat" "                        " 10
+at_xfail=no
+(
+  $as_echo "148. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:423:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \\
+  --define=\"_build_id_links compat\" \\
+  --undefine \"_unique_debug_names\" \\
+  --undefine \"_unique_debug_srcs\" \\
+  --quiet -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package.
+# the debuginfo package has one extra main build-id compat symlink
+# plus the .build-id/xx subdir, 2 in total in main, 3 in total in debug
+echo -n \"hello build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+echo -n \"hello debuginfo build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f \"\${main_file}\" || echo \"No main file \${main_file}\"
+
+# Extract the build-id from the main file
+id_main=\$(file \$main_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+id_main_file=\"./usr/lib/.build-id/\${id_main:0:2}/\${id_main:2}\"
+test -L \"\$id_main_file\" || echo \"No build-id file \$id_main_file\"
+
+canon_main_file=\$(readlink -f \${main_file})
+
+test -f \"\$canon_main_file\" \\
+  || echo \"Cannot resolve main file \${main_file} -> \${canon_main_file}\"
+
+canon_main_id_file=\$(readlink -f \${id_main_file})
+
+test -f \"\$canon_main_id_file\" \\
+  || echo \"Cannot resolve main build-id file \${id_main_file} -> \${canon_main_id_file}\"
+
+test \"\$canon_main_file\" = \"\$canon_main_id_file\" \\
+  || echo \"main and build-id file not linked\"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello.debug
+test -f \${debug_file} || echo \"No debug file \${debug_file}\"
+
+# Extract the build-id from the .debug file
+id_debug=\$(file \$debug_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+test \${id_main} = \${id_debug} || echo \"unequal main and debug id\"
+
+id_debug_file=\"./usr/lib/debug/.build-id/\${id_debug:0:2}/\${id_debug:2}.debug\"
+test -L \"\$id_debug_file\" || echo \"No build-id file \$id_debug_file\"
+
+canon_debug_file=\$(readlink -f \${debug_file})
+
+test -f \"\$canon_debug_file\" \\
+  || echo \"Cannot resolve debug file \${debug_file} -> \${canon_debug_file}\"
+
+canon_debug_id_file=\$(readlink -f \${id_debug_file})
+
+test -f \"\$canon_debug_id_file\" \\
+  || echo \"Cannot resolve debug build-id file \${id_debug_file} -> \${canon_debug_id_file}\"
+
+test \"\$canon_debug_file\" = \"\$canon_debug_id_file\" \\
+  || echo \"debug and build-id not linked\"
+
+# The compat link should also point to the same (indirectly).
+id_compat_file=\"./usr/lib/debug/.build-id/\${id_main:0:2}/\${id_main:2}\"
+test -L \"\$id_compat_file\" || echo \"No build-id compat file \$id_compat_file\"
+
+canon_compat_file=\$(readlink -f \${id_compat_file})
+
+test -f \"\$canon_compat_file\" \\
+  || echo \"Cannot resolve compat file \${id_compat_file} -> \${canon_compat_file}\"
+
+test \"\$canon_compat_file\" = \"\$canon_main_file\" \\
+  || echo \"compat and build-id not linked\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:423"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links compat" \
+  --undefine "_unique_debug_names" \
+  --undefine "_unique_debug_srcs" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package.
+# the debuginfo package has one extra main build-id compat symlink
+# plus the .build-id/xx subdir, 2 in total in main, 3 in total in debug
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello.debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+
+# The compat link should also point to the same (indirectly).
+id_compat_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_compat_file" || echo "No build-id compat file $id_compat_file"
+
+canon_compat_file=$(readlink -f ${id_compat_file})
+
+test -f "$canon_compat_file" \
+  || echo "Cannot resolve compat file ${id_compat_file} -> ${canon_compat_file}"
+
+test "$canon_compat_file" = "$canon_main_file" \
+  || echo "compat and build-id not linked"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello build-id files: 2
+hello debuginfo build-id files: 3
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:423"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_148
+#AT_START_149
+at_fn_group_banner 149 'rpmbuildid.at:525' \
+  "rpmbuild buildid compat unique debug names" "     " 10
+at_xfail=no
+(
+  $as_echo "149. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:527:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \\
+  --define=\"_build_id_links compat\" \\
+  --define=\"_unique_debug_names 1\" \\
+  --quiet -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package.
+# the debuginfo package has one extra main build-id compat symlink
+# plus the .build-id/xx subdir, 2 in total in main, 3 in total in debug
+echo -n \"hello build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+echo -n \"hello debuginfo build-id files: \"
+run rpm -ql -p \"\${TOPDIR}\"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f \"\${main_file}\" || echo \"No main file \${main_file}\"
+
+# Extract the build-id from the main file
+id_main=\$(file \$main_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+id_main_file=\"./usr/lib/.build-id/\${id_main:0:2}/\${id_main:2}\"
+test -L \"\$id_main_file\" || echo \"No build-id file \$id_main_file\"
+
+canon_main_file=\$(readlink -f \${main_file})
+
+test -f \"\$canon_main_file\" \\
+  || echo \"Cannot resolve main file \${main_file} -> \${canon_main_file}\"
+
+canon_main_id_file=\$(readlink -f \${id_main_file})
+
+test -f \"\$canon_main_id_file\" \\
+  || echo \"Cannot resolve main build-id file \${id_main_file} -> \${canon_main_id_file}\"
+
+test \"\$canon_main_file\" = \"\$canon_main_id_file\" \\
+  || echo \"main and build-id file not linked\"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello-*debug
+test -f \${debug_file} || echo \"No debug file \${debug_file}\"
+
+# Extract the build-id from the .debug file
+id_debug=\$(file \$debug_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+test \${id_main} = \${id_debug} || echo \"unequal main and debug id\"
+
+id_debug_file=\"./usr/lib/debug/.build-id/\${id_debug:0:2}/\${id_debug:2}.debug\"
+test -L \"\$id_debug_file\" || echo \"No build-id file \$id_debug_file\"
+
+canon_debug_file=\$(readlink -f \${debug_file})
+
+test -f \"\$canon_debug_file\" \\
+  || echo \"Cannot resolve debug file \${debug_file} -> \${canon_debug_file}\"
+
+canon_debug_id_file=\$(readlink -f \${id_debug_file})
+
+test -f \"\$canon_debug_id_file\" \\
+  || echo \"Cannot resolve debug build-id file \${id_debug_file} -> \${canon_debug_id_file}\"
+
+test \"\$canon_debug_file\" = \"\$canon_debug_id_file\" \\
+  || echo \"debug and build-id not linked\"
+
+# The compat link should also point to the same (indirectly).
+id_compat_file=\"./usr/lib/debug/.build-id/\${id_main:0:2}/\${id_main:2}\"
+test -L \"\$id_compat_file\" || echo \"No build-id compat file \$id_compat_file\"
+
+canon_compat_file=\$(readlink -f \${id_compat_file})
+
+test -f \"\$canon_compat_file\" \\
+  || echo \"Cannot resolve compat file \${id_compat_file} -> \${canon_compat_file}\"
+
+test \"\$canon_compat_file\" = \"\$canon_main_file\" \\
+  || echo \"compat and build-id not linked\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:527"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links compat" \
+  --define="_unique_debug_names 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+# There should be one build-id files in the main and debuginfo package.
+# the debuginfo package has one extra main build-id compat symlink
+# plus the .build-id/xx subdir, 2 in total in main, 3 in total in debug
+echo -n "hello build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+echo -n "hello debuginfo build-id files: "
+run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | grep /.build-id/ | wc --lines
+
+# Extract the both packages to check the build-id files link to the
+# main and .debug files.
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \
+  | cpio -diu
+
+# Check there is a build-id symlink for the main file.
+main_file=./usr/local/bin/hello
+test -f "${main_file}" || echo "No main file ${main_file}"
+
+# Extract the build-id from the main file
+id_main=$(file $main_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_main_file" || echo "No build-id file $id_main_file"
+
+canon_main_file=$(readlink -f ${main_file})
+
+test -f "$canon_main_file" \
+  || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}"
+
+canon_main_id_file=$(readlink -f ${id_main_file})
+
+test -f "$canon_main_id_file" \
+  || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}"
+
+test "$canon_main_file" = "$canon_main_id_file" \
+  || echo "main and build-id file not linked"
+
+# And check the same for the debug file.
+debug_file=./usr/lib/debug/usr/local/bin/hello-*debug
+test -f ${debug_file} || echo "No debug file ${debug_file}"
+
+# Extract the build-id from the .debug file
+id_debug=$(file $debug_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+test ${id_main} = ${id_debug} || echo "unequal main and debug id"
+
+id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug"
+test -L "$id_debug_file" || echo "No build-id file $id_debug_file"
+
+canon_debug_file=$(readlink -f ${debug_file})
+
+test -f "$canon_debug_file" \
+  || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}"
+
+canon_debug_id_file=$(readlink -f ${id_debug_file})
+
+test -f "$canon_debug_id_file" \
+  || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}"
+
+test "$canon_debug_file" = "$canon_debug_id_file" \
+  || echo "debug and build-id not linked"
+
+# The compat link should also point to the same (indirectly).
+id_compat_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}"
+test -L "$id_compat_file" || echo "No build-id compat file $id_compat_file"
+
+canon_compat_file=$(readlink -f ${id_compat_file})
+
+test -f "$canon_compat_file" \
+  || echo "Cannot resolve compat file ${id_compat_file} -> ${canon_compat_file}"
+
+test "$canon_compat_file" = "$canon_main_file" \
+  || echo "compat and build-id not linked"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "hello build-id files: 2
+hello debuginfo build-id files: 3
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:527"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_149
+#AT_START_150
+at_fn_group_banner 150 'rpmbuildid.at:629' \
+  "rpmbuild buildid duplicate alldebug" "            " 10
+at_xfail=no
+(
+  $as_echo "150. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:631:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Should create two warnings
+rundebug rpmbuild --quiet \\
+  --define=\"_build_id_links alldebug\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2cp.spec 2>&1 | grep \"^warning: \" \\
+  | cut -f1-3 -d' '
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# alldebug not here...
+id_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}\"
+test -L \"\$id_file\" && echo \"main id in main package\"
+id_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1\"
+test -L \"\$id_dup_file\" && echo \"main dup id in main package\"
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# alldebug, so they are all here
+test -L \"\$id_file\" && echo \"main id in debug package\"
+test -L \"\$id_dup_file\" && echo \"main dup id in debug package\"
+
+debug_id_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.debug\"
+test -L \"\$debug_id_file\" && echo \"debug id in debug package\"
+debug_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1.debug\"
+test -L \"\$debug_dup_file\" && echo \"debug dup id in debug package\"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=\$(readlink -f \${id_file})
+canon_dup_file=\$(readlink -f \${id_dup_file})
+test \"\$canon_id_file\" != \"\$canon_dup_file\" \\
+  || echo \"id and dup same\"
+
+canon_debug_id_file=\$(readlink -f \${debug_id_file})
+canon_debug_dup_file=\$(readlink -f \${debug_dup_file})
+test \"\$canon_debug_id_file\" != \"\$canon_debug_dup_file\" \\
+  || echo \"debug id and dup same\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:631"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Should create two warnings
+rundebug rpmbuild --quiet \
+  --define="_build_id_links alldebug" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2cp.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# alldebug not here...
+id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# alldebug, so they are all here
+test -L "$id_file" && echo "main id in debug package"
+test -L "$id_dup_file" && echo "main dup id in debug package"
+
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "warning: Duplicate build-ids
+warning: Duplicate build-ids
+main id in debug package
+main dup id in debug package
+debug id in debug package
+debug dup id in debug package
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:631"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_150
+#AT_START_151
+at_fn_group_banner 151 'rpmbuildid.at:697' \
+  "rpmbuild buildid hardlink alldebug" "             " 10
+at_xfail=no
+(
+  $as_echo "151. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:699:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \\
+  --define=\"_build_id_links alldebug\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2ln.spec 2>&1 | grep \"^warning: \" \\
+  | cut -f1-3 -d' '
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# alldebug not here...
+id_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}\"
+test -L \"\$id_file\" && echo \"main id in main package\"
+id_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1\"
+test -L \"\$id_dup_file\" && echo \"main dup id in main package\"
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# alldebug, so they are all here
+test -L \"\$id_file\" && echo \"main id in debug package\"
+test -L \"\$id_dup_file\" && echo \"main dup id in debug package\"
+
+debug_id_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.debug\"
+test -L \"\$debug_id_file\" && echo \"debug id in debug package\"
+debug_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1.debug\"
+test -L \"\$debug_dup_file\" && echo \"debug dup id in debug package\"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=\$(readlink -f \${id_file})
+canon_dup_file=\$(readlink -f \${id_dup_file})
+test \"\$canon_id_file\" != \"\$canon_dup_file\" \\
+  || echo \"id and dup same\"
+
+canon_debug_id_file=\$(readlink -f \${debug_id_file})
+canon_debug_dup_file=\$(readlink -f \${debug_dup_file})
+test \"\$canon_debug_id_file\" != \"\$canon_debug_dup_file\" \\
+  || echo \"debug id and dup same\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:699"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --define="_build_id_links alldebug" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2ln.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# alldebug not here...
+id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# alldebug, so they are all here
+test -L "$id_file" && echo "main id in debug package"
+test -L "$id_dup_file" && echo "main dup id in debug package"
+
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "main id in debug package
+main dup id in debug package
+debug id in debug package
+debug dup id in debug package
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:699"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_151
+#AT_START_152
+at_fn_group_banner 152 'rpmbuildid.at:762' \
+  "rpmbuild buildid duplicate separate" "            " 10
+at_xfail=no
+(
+  $as_echo "152. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:764:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Should create two warnings
+rundebug rpmbuild --quiet \\
+  --define=\"_build_id_links separate\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2cp.spec 2>&1 | grep \"^warning: \" \\
+  | cut -f1-3 -d' '
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# separate build-ids split...
+id_file=\"./usr/lib/.build-id/\${id:0:2}/\${id:2}\"
+test -L \"\$id_file\" && echo \"main id in main package\"
+id_dup_file=\"./usr/lib/.build-id/\${id:0:2}/\${id:2}.1\"
+test -L \"\$id_dup_file\" && echo \"main dup id in main package\"
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# separate, so debug ids are here
+debug_id_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.debug\"
+test -L \"\$debug_id_file\" && echo \"debug id in debug package\"
+debug_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1.debug\"
+test -L \"\$debug_dup_file\" && echo \"debug dup id in debug package\"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=\$(readlink -f \${id_file})
+canon_dup_file=\$(readlink -f \${id_dup_file})
+test \"\$canon_id_file\" != \"\$canon_dup_file\" \\
+  || echo \"id and dup same\"
+
+canon_debug_id_file=\$(readlink -f \${debug_id_file})
+canon_debug_dup_file=\$(readlink -f \${debug_dup_file})
+test \"\$canon_debug_id_file\" != \"\$canon_debug_dup_file\" \\
+  || echo \"debug id and dup same\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:764"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Should create two warnings
+rundebug rpmbuild --quiet \
+  --define="_build_id_links separate" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2cp.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# separate build-ids split...
+id_file="./usr/lib/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# separate, so debug ids are here
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "warning: Duplicate build-ids
+warning: Duplicate build-ids
+main id in main package
+main dup id in main package
+debug id in debug package
+debug dup id in debug package
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:764"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_152
+#AT_START_153
+at_fn_group_banner 153 'rpmbuildid.at:827' \
+  "rpmbuild buildid hardlink separate" "             " 10
+at_xfail=no
+(
+  $as_echo "153. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:829:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \\
+  --define=\"_build_id_links separate\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2ln.spec 2>&1 | grep \"^warning: \" \\
+  | cut -f1-3 -d' '
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# separate build-ids split...
+id_file=\"./usr/lib/.build-id/\${id:0:2}/\${id:2}\"
+test -L \"\$id_file\" && echo \"main id in main package\"
+id_dup_file=\"./usr/lib/.build-id/\${id:0:2}/\${id:2}.1\"
+test -L \"\$id_dup_file\" && echo \"main dup id in main package\"
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# separate, so debug ids are here
+debug_id_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.debug\"
+test -L \"\$debug_id_file\" && echo \"debug id in debug package\"
+debug_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1.debug\"
+test -L \"\$debug_dup_file\" && echo \"debug dup id in debug package\"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=\$(readlink -f \${id_file})
+canon_dup_file=\$(readlink -f \${id_dup_file})
+test \"\$canon_id_file\" != \"\$canon_dup_file\" \\
+  || echo \"id and dup same\"
+
+canon_debug_id_file=\$(readlink -f \${debug_id_file})
+canon_debug_dup_file=\$(readlink -f \${debug_dup_file})
+test \"\$canon_debug_id_file\" != \"\$canon_debug_dup_file\" \\
+  || echo \"debug id and dup same\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:829"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --define="_build_id_links separate" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2ln.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# separate build-ids split...
+id_file="./usr/lib/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# separate, so debug ids are here
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "main id in main package
+main dup id in main package
+debug id in debug package
+debug dup id in debug package
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:829"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_153
+#AT_START_154
+at_fn_group_banner 154 'rpmbuildid.at:889' \
+  "rpmbuild buildid duplicate compat" "              " 10
+at_xfail=no
+(
+  $as_echo "154. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:891:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Should create two warnings
+rundebug rpmbuild --quiet \\
+  --define=\"_build_id_links compat\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2cp.spec 2>&1 | grep \"^warning: \" \\
+  | cut -f1-3 -d' '
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# compat build-ids split...
+id_file=\"./usr/lib/.build-id/\${id:0:2}/\${id:2}\"
+test -L \"\$id_file\" && echo \"main id in main package\"
+id_dup_file=\"./usr/lib/.build-id/\${id:0:2}/\${id:2}.1\"
+test -L \"\$id_dup_file\" && echo \"main dup id in main package\"
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# compat, so main (and debug) ids are (also) here
+compat_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}\"
+test -L \"\$compat_file\" && echo \"compat id in debug package\"
+compat_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1\"
+test -L \"\$compat_dup_file\" && echo \"compat dup id in debug package\"
+
+debug_id_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.debug\"
+test -L \"\$debug_id_file\" && echo \"debug id in debug package\"
+debug_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1.debug\"
+test -L \"\$debug_dup_file\" && echo \"debug dup id in debug package\"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=\$(readlink -f \${id_file})
+canon_dup_file=\$(readlink -f \${id_dup_file})
+test \"\$canon_id_file\" != \"\$canon_dup_file\" \\
+  || echo \"id and dup same\"
+
+canon_debug_id_file=\$(readlink -f \${debug_id_file})
+canon_debug_dup_file=\$(readlink -f \${debug_dup_file})
+test \"\$canon_debug_id_file\" != \"\$canon_debug_dup_file\" \\
+  || echo \"debug id and dup same\"
+
+canon_compat_file=\$(readlink -f \${compat_file})
+canon_compat_dup_file=\$(readlink -f \${compat_dup_file})
+test \"\$canon_compat_file\" != \"\$canon_compat_dup_file\" \\
+  || echo \"compat id and dup same\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:891"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Should create two warnings
+rundebug rpmbuild --quiet \
+  --define="_build_id_links compat" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2cp.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# compat build-ids split...
+id_file="./usr/lib/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# compat, so main (and debug) ids are (also) here
+compat_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}"
+test -L "$compat_file" && echo "compat id in debug package"
+compat_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1"
+test -L "$compat_dup_file" && echo "compat dup id in debug package"
+
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+
+canon_compat_file=$(readlink -f ${compat_file})
+canon_compat_dup_file=$(readlink -f ${compat_dup_file})
+test "$canon_compat_file" != "$canon_compat_dup_file" \
+  || echo "compat id and dup same"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "warning: Duplicate build-ids
+warning: Duplicate build-ids
+main id in main package
+main dup id in main package
+compat id in debug package
+compat dup id in debug package
+debug id in debug package
+debug dup id in debug package
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:891"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_154
+#AT_START_155
+at_fn_group_banner 155 'rpmbuildid.at:966' \
+  "rpmbuild buildid hardlink compat" "               " 10
+at_xfail=no
+(
+  $as_echo "155. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:968:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \\
+  --define=\"_build_id_links compat\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello2ln.spec 2>&1 | grep \"^warning: \" \\
+  | cut -f1-3 -d' '
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# compat build-ids split...
+id_file=\"./usr/lib/.build-id/\${id:0:2}/\${id:2}\"
+test -L \"\$id_file\" && echo \"main id in main package\"
+id_dup_file=\"./usr/lib/.build-id/\${id:0:2}/\${id:2}.1\"
+test -L \"\$id_dup_file\" && echo \"main dup id in main package\"
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+# compat, so main (and debug) ids are (also) here
+compat_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}\"
+test -L \"\$compat_file\" && echo \"compat id in debug package\"
+compat_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1\"
+test -L \"\$compat_dup_file\" && echo \"compat dup id in debug package\"
+
+debug_id_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.debug\"
+test -L \"\$debug_id_file\" && echo \"debug id in debug package\"
+debug_dup_file=\"./usr/lib/debug/.build-id/\${id:0:2}/\${id:2}.1.debug\"
+test -L \"\$debug_dup_file\" && echo \"debug dup id in debug package\"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=\$(readlink -f \${id_file})
+canon_dup_file=\$(readlink -f \${id_dup_file})
+test \"\$canon_id_file\" != \"\$canon_dup_file\" \\
+  || echo \"id and dup same\"
+
+canon_debug_id_file=\$(readlink -f \${debug_id_file})
+canon_debug_dup_file=\$(readlink -f \${debug_dup_file})
+test \"\$canon_debug_id_file\" != \"\$canon_debug_dup_file\" \\
+  || echo \"debug id and dup same\"
+
+canon_compat_file=\$(readlink -f \${compat_file})
+canon_compat_dup_file=\$(readlink -f \${compat_dup_file})
+test \"\$canon_compat_file\" != \"\$canon_compat_dup_file\" \\
+  || echo \"compat id and dup same\"
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:968"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --define="_build_id_links compat" \
+  -ba "${abs_srcdir}"/data/SPECS/hello2ln.spec 2>&1 | grep "^warning: " \
+  | cut -f1-3 -d' '
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+id=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# compat build-ids split...
+id_file="./usr/lib/.build-id/${id:0:2}/${id:2}"
+test -L "$id_file" && echo "main id in main package"
+id_dup_file="./usr/lib/.build-id/${id:0:2}/${id:2}.1"
+test -L "$id_dup_file" && echo "main dup id in main package"
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+# compat, so main (and debug) ids are (also) here
+compat_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}"
+test -L "$compat_file" && echo "compat id in debug package"
+compat_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1"
+test -L "$compat_dup_file" && echo "compat dup id in debug package"
+
+debug_id_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
+test -L "$debug_id_file" && echo "debug id in debug package"
+debug_dup_file="./usr/lib/debug/.build-id/${id:0:2}/${id:2}.1.debug"
+test -L "$debug_dup_file" && echo "debug dup id in debug package"
+
+# We don't know which points to which, but we do know they point
+# to different files.
+canon_id_file=$(readlink -f ${id_file})
+canon_dup_file=$(readlink -f ${id_dup_file})
+test "$canon_id_file" != "$canon_dup_file" \
+  || echo "id and dup same"
+
+canon_debug_id_file=$(readlink -f ${debug_id_file})
+canon_debug_dup_file=$(readlink -f ${debug_dup_file})
+test "$canon_debug_id_file" != "$canon_debug_dup_file" \
+  || echo "debug id and dup same"
+
+canon_compat_file=$(readlink -f ${compat_file})
+canon_compat_dup_file=$(readlink -f ${compat_dup_file})
+test "$canon_compat_file" != "$canon_compat_dup_file" \
+  || echo "compat id and dup same"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "main id in main package
+main dup id in main package
+compat id in debug package
+compat dup id in debug package
+debug id in debug package
+debug dup id in debug package
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:968"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_155
+#AT_START_156
+at_fn_group_banner 156 'rpmbuildid.at:1039' \
+  "rpmbuild buildid recompute" "                     " 10
+at_xfail=no
+(
+  $as_echo "156. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:1041:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# Make sure we get debuginfo
+export CFLAGS=\"-g\"
+
+# Unique 1
+rundebug rpmbuild --quiet \\
+  --define=\"_unique_build_ids 1\" \\
+  --undefine=\"_no_recompute_build_ids\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f \$hello_file || echo \"No \$hello_file\"
+id1=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# Make sure we generate a new one
+rm \$hello_file
+
+# Unique 2
+# Build the \"next\" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \\
+  --define=\"_unique_build_ids 1\" \\
+  --undefine=\"_no_recompute_build_ids\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello-r2.spec
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \\
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f \$hello_file || echo \"No \$hello_file\"
+id2=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# Two unique builds should not be equal
+if test \"\$id1\" == \"\$id2\"; then
+  echo \"uniques equal\";
+else
+  echo \"uniques unequal\";
+fi
+
+# Make sure we generate a new one
+rm \$hello_file
+
+# no-recompute 1
+rundebug rpmbuild --quiet \\
+  --undefine=\"_unique_build_ids\" \\
+  --undefine=\"_unique_debug_names\" \\
+  --undefine=\"_unique_debug_srcs\" \\
+  --define=\"_no_recompute_build_ids 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f \$hello_file || echo \"No \$hello_file\"
+id3=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# An unique and no-recompute build should be unequal
+if test \"\$id2\" == \"\$id3\"; then
+  echo \"no-recompute unique equal\";
+else
+  echo \"no-recompute unique unequal\";
+fi
+
+# Make sure we generate a new one
+rm \$hello_file
+
+# no-recompute 2
+# Build the \"next\" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \\
+  --undefine=\"_unique_build_ids\" \\
+  --undefine=\"_unique_debug_names\" \\
+  --undefine=\"_unique_debug_srcs\" \\
+  --define=\"_no_recompute_build_ids 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello-r2.spec
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \\
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f \$hello_file || echo \"No \$hello_file\"
+id4=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# Two no-recompute builds should be equal. Even for different \"releases\".
+if test \"\$id3\" == \"\$id4\"; then
+  echo \"no-recomputes equal\";
+else
+  echo \"no-recomputes unequal\";
+fi
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:1041"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# Make sure we get debuginfo
+export CFLAGS="-g"
+
+# Unique 1
+rundebug rpmbuild --quiet \
+  --define="_unique_build_ids 1" \
+  --undefine="_no_recompute_build_ids" \
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id1=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# Make sure we generate a new one
+rm $hello_file
+
+# Unique 2
+# Build the "next" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \
+  --define="_unique_build_ids 1" \
+  --undefine="_no_recompute_build_ids" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id2=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# Two unique builds should not be equal
+if test "$id1" == "$id2"; then
+  echo "uniques equal";
+else
+  echo "uniques unequal";
+fi
+
+# Make sure we generate a new one
+rm $hello_file
+
+# no-recompute 1
+rundebug rpmbuild --quiet \
+  --undefine="_unique_build_ids" \
+  --undefine="_unique_debug_names" \
+  --undefine="_unique_debug_srcs" \
+  --define="_no_recompute_build_ids 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id3=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# An unique and no-recompute build should be unequal
+if test "$id2" == "$id3"; then
+  echo "no-recompute unique equal";
+else
+  echo "no-recompute unique unequal";
+fi
+
+# Make sure we generate a new one
+rm $hello_file
+
+# no-recompute 2
+# Build the "next" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \
+  --undefine="_unique_build_ids" \
+  --undefine="_unique_debug_names" \
+  --undefine="_unique_debug_srcs" \
+  --define="_no_recompute_build_ids 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id4=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# Two no-recompute builds should be equal. Even for different "releases".
+if test "$id3" == "$id4"; then
+  echo "no-recomputes equal";
+else
+  echo "no-recomputes unequal";
+fi
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "uniques unequal
+no-recompute unique unequal
+no-recomputes equal
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:1041"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_156
+#AT_START_157
+at_fn_group_banner 157 'rpmbuildid.at:1153' \
+  "rpmbuild buildid unique r1 r2" "                  " 10
+at_xfail=no
+(
+  $as_echo "157. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:1155:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \\
+  --define=\"_unique_build_ids 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f \$hello_file || echo \"No \$hello_file\"
+id1=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# Make sure we generate a new one
+rm \$hello_file
+
+# Build the \"next\" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \\
+  --define=\"_unique_build_ids 1\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello-r2.spec
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \\
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f \$hello_file || echo \"No \$hello_file\"
+id2=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+if test \"\$id1\" == \"\$id2\"; then echo \"equal \$id1\"; else echo \"unequal\"; fi
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:1155"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --define="_unique_build_ids 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id1=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# Make sure we generate a new one
+rm $hello_file
+
+# Build the "next" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \
+  --define="_unique_build_ids 1" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id2=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+if test "$id1" == "$id2"; then echo "equal $id1"; else echo "unequal"; fi
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "unequal
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:1155"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_157
+#AT_START_158
+at_fn_group_banner 158 'rpmbuildid.at:1201' \
+  "rpmbuild buildid non-unique r1 r2" "              " 10
+at_xfail=no
+(
+  $as_echo "158. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:1203:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp \"\${abs_srcdir}\"/data/SOURCES/hello-1.0.tar.gz \"\${abs_srcdir}\"/data/SOURCES/hello-1.0-modernize.patch \${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \\
+  --undefine=\"_unique_build_ids\" \\
+  --undefine=\"_unique_debug_names\" \\
+  --undefine=\"_unique_debug_srcs\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello.spec
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \\
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f \$hello_file || echo \"No \$hello_file\"
+id1=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+# Make sure we generate a new one
+rm \$hello_file
+
+# Build the \"next\" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \\
+  --undefine=\"_unique_build_ids\" \\
+  --undefine=\"_unique_debug_names\" \\
+  --undefine=\"_unique_debug_srcs\" \\
+  -ba \"\${abs_srcdir}\"/data/SPECS/hello-r2.spec
+
+rpm2cpio \${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \\
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f \$hello_file || echo \"No \$hello_file\"
+id2=\$(file \$hello_file | sed 's/.*, BuildID\\[.*\\]=\\([0-9a-f]*\\),.*/\\1/')
+
+if test \"\$id1\" == \"\$id2\"; then echo \"equal\"; else echo \"unequal \$id1 \$id2\"; fi
+"
+at_fn_check_prepare_notrace 'a $(...) command substitution' "rpmbuildid.at:1203"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
+
+# No warnings for hard links
+rundebug rpmbuild --quiet \
+  --undefine="_unique_build_ids" \
+  --undefine="_unique_debug_names" \
+  --undefine="_unique_debug_srcs" \
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
+  | cpio -diu --quiet
+
+hello_file=./usr/local/bin/hello
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id1=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+# Make sure we generate a new one
+rm $hello_file
+
+# Build the "next" release, which has no changes except for the release update.
+rundebug rpmbuild --quiet \
+  --undefine="_unique_build_ids" \
+  --undefine="_unique_debug_names" \
+  --undefine="_unique_debug_srcs" \
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
+
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
+  | cpio -diu --quiet
+
+# Extract the build-id from the main file
+test -f $hello_file || echo "No $hello_file"
+id2=$(file $hello_file | sed 's/.*, BuildID\[.*\]=\([0-9a-f]*\),.*/\1/')
+
+if test "$id1" == "$id2"; then echo "equal"; else echo "unequal $id1 $id2"; fi
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "equal
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:1203"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_158
+#AT_START_159
+at_fn_group_banner 159 'rpmbuildid.at:1253' \
+  "rpmbuild buildid attrs" "                         " 10
+at_xfail=no
+(
+  $as_echo "159. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:1255:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello.c \${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \\
+  --define=\"_build_id_links compat\" \\
+  --define \"_unique_debug_names 1\" \\
+  --define \"_unique_debug_srcs 1\" \\
+  --quiet -ba \"\${abs_srcdir}\"/data/SPECS/hello-attr-buildid.spec
+
+run rpm -qp --qf \"[%{filenames} %{filemodes:perms}\\n]\" \\
+        \${abs_builddir}/testing/build/RPMS/*/test-1.0-1*rpm \\
+       | grep \"build-id d\"
+
+run rpm -qp --qf \"[%{filenames} %{filemodes:perms}\\n]\" \\
+        \${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1*rpm \\
+       | grep \"build-id d\"
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuildid.at:1255"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links compat" \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello-attr-buildid.spec
+
+run rpm -qp --qf "[%{filenames} %{filemodes:perms}\n]" \
+        ${abs_builddir}/testing/build/RPMS/*/test-1.0-1*rpm \
+       | grep "build-id d"
+
+run rpm -qp --qf "[%{filenames} %{filemodes:perms}\n]" \
+        ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1*rpm \
+       | grep "build-id d"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "/usr/lib/.build-id drwxr-xr-x
+/usr/lib/debug/.build-id drwxr-xr-x
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:1255"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_159
+#AT_START_160
+at_fn_group_banner 160 'rpmbuildid.at:1287' \
+  "rpmbuild buildid config attrs" "                  " 10
+at_xfail=no
+(
+  $as_echo "160. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmbuildid.at:1289:
+rm -rf \${TOPDIR}
+as_dir=\${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp \"\${abs_srcdir}\"/data/SOURCES/hello.c \${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \\
+  --define=\"_build_id_links compat\" \\
+  --define \"_unique_debug_names 1\" \\
+  --define \"_unique_debug_srcs 1\" \\
+  --quiet -ba \"\${abs_srcdir}\"/data/SPECS/hello-config-buildid.spec
+
+# Should contain one config file.
+run rpm -c -qp \${abs_builddir}/testing/build/RPMS/*/test-1.0-1*rpm
+# Should not contain config files.
+run rpm -c -qp \${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1*rpm
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmbuildid.at:1289"
+( $at_check_trace;
+rm -rf ${TOPDIR}
+as_dir=${TOPDIR}/SOURCES; as_fn_mkdir_p
+
+# Setup sources
+cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES
+
+# Build, contains one ELF which should have a buildid.
+rundebug rpmbuild \
+  --define="_build_id_links compat" \
+  --define "_unique_debug_names 1" \
+  --define "_unique_debug_srcs 1" \
+  --quiet -ba "${abs_srcdir}"/data/SPECS/hello-config-buildid.spec
+
+# Should contain one config file.
+run rpm -c -qp ${abs_builddir}/testing/build/RPMS/*/test-1.0-1*rpm
+# Should not contain config files.
+run rpm -c -qp ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1*rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo >>"$at_stdout"; $as_echo "/etc/config.file
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmbuildid.at:1289"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_160
+#AT_START_161
+at_fn_group_banner 161 'rpmscript.at:7' \
+  "basic scripts and arguments" "                    " 11
+at_xfail=no
+(
+  $as_echo "161. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmscript.at:9:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+runroot rpmbuild --quiet -bb --define \"rel 1\" /data/SPECS/scripts.spec
+runroot rpmbuild --quiet -bb --define \"rel 2\" /data/SPECS/scripts.spec
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+runroot rpm -Vvp /build/RPMS/noarch/scripts-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-2.noarch.rpm
+runroot rpm -Vv scripts
+runroot rpm -e scripts
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmscript.at:9"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+runroot rpmbuild --quiet -bb --define "rel 1" /data/SPECS/scripts.spec
+runroot rpmbuild --quiet -bb --define "rel 2" /data/SPECS/scripts.spec
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+runroot rpm -Vvp /build/RPMS/noarch/scripts-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-2.noarch.rpm
+runroot rpm -Vv scripts
+runroot rpm -e scripts
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "scripts-1.0-1 VERIFY 0
+scripts-1.0-1 PRETRANS 1
+scripts-1.0-1 PRE 1
+scripts-1.0-1 POST 1
+scripts-1.0-1 POSTTRANS 1
+scripts-1.0-2 PRETRANS 2
+scripts-1.0-2 PRE 2
+scripts-1.0-2 POST 2
+scripts-1.0-1 PREUN 1
+scripts-1.0-1 POSTUN 1
+scripts-1.0-2 POSTTRANS 1
+scripts-1.0-2 VERIFY 1
+scripts-1.0-2 PREUN 0
+scripts-1.0-2 POSTUN 0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmscript.at:9"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_161
+#AT_START_162
+at_fn_group_banner 162 'rpmscript.at:44' \
+  "basic trigger scripts and arguments" "            " 11
+at_xfail=no
+(
+  $as_echo "162. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmscript.at:46:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+runroot rpmbuild --quiet -bb --define \"rel 1\" /data/SPECS/scripts.spec
+runroot rpmbuild --quiet -bb --define \"rel 2\" /data/SPECS/scripts.spec
+runroot rpmbuild --quiet -bb --define \"rel 1\" --define \"trigpkg scripts\" /data/SPECS/triggers.spec
+runroot rpmbuild --quiet -bb --define \"rel 2\" --define \"trigpkg scripts\" /data/SPECS/triggers.spec
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+echo TRIGGERS 1
+runroot rpm -U /build/RPMS/noarch/triggers-1.0-1.noarch.rpm
+echo SCRIPTS 1
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-1.noarch.rpm
+echo SCRIPTS 2
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-2.noarch.rpm
+echo TRIGGERS 2
+runroot rpm -U /build/RPMS/noarch/triggers-1.0-2.noarch.rpm
+echo ERASE
+runroot rpm -e scripts
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmscript.at:46"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+runroot rpmbuild --quiet -bb --define "rel 1" /data/SPECS/scripts.spec
+runroot rpmbuild --quiet -bb --define "rel 2" /data/SPECS/scripts.spec
+runroot rpmbuild --quiet -bb --define "rel 1" --define "trigpkg scripts" /data/SPECS/triggers.spec
+runroot rpmbuild --quiet -bb --define "rel 2" --define "trigpkg scripts" /data/SPECS/triggers.spec
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+echo TRIGGERS 1
+runroot rpm -U /build/RPMS/noarch/triggers-1.0-1.noarch.rpm
+echo SCRIPTS 1
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-1.noarch.rpm
+echo SCRIPTS 2
+runroot rpm -U /build/RPMS/noarch/scripts-1.0-2.noarch.rpm
+echo TRIGGERS 2
+runroot rpm -U /build/RPMS/noarch/triggers-1.0-2.noarch.rpm
+echo ERASE
+runroot rpm -e scripts
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "TRIGGERS 1
+SCRIPTS 1
+scripts-1.0-1 PRETRANS 1
+triggers-1.0-1 TRIGGERPREIN 1 0
+scripts-1.0-1 PRE 1
+scripts-1.0-1 POST 1
+triggers-1.0-1 TRIGGERIN 1 1
+scripts-1.0-1 POSTTRANS 1
+SCRIPTS 2
+scripts-1.0-2 PRETRANS 2
+triggers-1.0-1 TRIGGERPREIN 1 1
+scripts-1.0-2 PRE 2
+scripts-1.0-2 POST 2
+triggers-1.0-1 TRIGGERIN 1 2
+triggers-1.0-1 TRIGGERUN 1 1
+scripts-1.0-1 PREUN 1
+scripts-1.0-1 POSTUN 1
+triggers-1.0-1 TRIGGERPOSTUN 1 1
+scripts-1.0-2 POSTTRANS 1
+TRIGGERS 2
+triggers-1.0-2 TRIGGERPREIN 1 1
+triggers-1.0-2 TRIGGERIN 2 1
+triggers-1.0-1 TRIGGERUN 1 1
+ERASE
+triggers-1.0-2 TRIGGERUN 1 0
+scripts-1.0-2 PREUN 0
+scripts-1.0-2 POSTUN 0
+triggers-1.0-2 TRIGGERPOSTUN 1 0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmscript.at:46"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_162
+#AT_START_163
+at_fn_group_banner 163 'rpmscript.at:102' \
+  "basic file trigger scripts" "                     " 11
+at_xfail=no
+(
+  $as_echo "163. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmscript.at:104:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+runroot rpmbuild --quiet -bb /data/SPECS/hlinktest.spec
+runroot rpmbuild --quiet -bb /data/SPECS/filetriggers.spec
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/filetriggers-1.0-1.noarch.rpm
+echo INSTALLATION
+runroot rpm -U /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm \\
+/build/RPMS/noarch/hlinktest-1.0-1.noarch.rpm
+echo ERASE
+runroot rpm -e hello-script hlinktest
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmscript.at:104"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+runroot rpmbuild --quiet -bb /data/SPECS/hlinktest.spec
+runroot rpmbuild --quiet -bb /data/SPECS/filetriggers.spec
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/filetriggers-1.0-1.noarch.rpm
+echo INSTALLATION
+runroot rpm -U /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm \
+/build/RPMS/noarch/hlinktest-1.0-1.noarch.rpm
+echo ERASE
+runroot rpm -e hello-script hlinktest
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "INSTALLATION
+filetriggerin(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerin(/foo*)<lua>:
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerin(/usr/bin*):
+/usr/bin/hello
+
+filetriggerin(/usr/bin*)<lua>:
+/usr/bin/hello
+
+transfiletriggerin(/usr/bin*):
+/usr/bin/hello
+
+transfiletriggerin(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+ERASE
+transfiletriggerun(/usr/bin*):
+/usr/bin/hello
+
+transfiletriggerun(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerun(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerpostun(/foo*):
+/foo/aaaa
+/foo/copyllo
+/foo/hello
+/foo/hello-bar
+/foo/hello-foo
+/foo/hello-world
+/foo/zzzz
+
+filetriggerun(/usr/bin*):
+/usr/bin/hello
+
+filetriggerpostun(/usr/bin*):
+/usr/bin/hello
+
+transfiletriggerpostun(/usr/bin*):
+
+transfiletriggerpostun(/foo*):
+
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmscript.at:104"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_163
+#AT_START_164
+at_fn_group_banner 164 'rpmscript.at:205' \
+  "basic file triggers 2" "                          " 11
+at_xfail=no
+(
+  $as_echo "164. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmscript.at:207:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+for v in 1.0 2.0 3.0; do
+    runroot rpmbuild --quiet -bb --define \"ver \${v}\" /data/SPECS/parallel.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+runroot rpm -i \\
+       /build/RPMS/noarch/parallel-1.0-1.noarch.rpm \\
+       /build/RPMS/noarch/parallel-2.0-1.noarch.rpm \\
+       /build/RPMS/noarch/parallel-3.0-1.noarch.rpm
+
+echo INSTALL:
+runroot rpm -U /build/RPMS/noarch/parallel-trigger-1.0-1.noarch.rpm
+echo UPGRADE:
+runroot rpm -U /build/RPMS/noarch/parallel-trigger-2.0-1.noarch.rpm
+echo ERASE:
+runroot rpm -e parallel-trigger
+
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmscript.at:207"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb /data/SPECS/fakeshell.spec
+for v in 1.0 2.0 3.0; do
+    runroot rpmbuild --quiet -bb --define "ver ${v}" /data/SPECS/parallel.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/fakeshell-1.0-1.noarch.rpm
+runroot rpm -i \
+       /build/RPMS/noarch/parallel-1.0-1.noarch.rpm \
+       /build/RPMS/noarch/parallel-2.0-1.noarch.rpm \
+       /build/RPMS/noarch/parallel-3.0-1.noarch.rpm
+
+echo INSTALL:
+runroot rpm -U /build/RPMS/noarch/parallel-trigger-1.0-1.noarch.rpm
+echo UPGRADE:
+runroot rpm -U /build/RPMS/noarch/parallel-trigger-2.0-1.noarch.rpm
+echo ERASE:
+runroot rpm -e parallel-trigger
+
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "INSTALL:
+%filetriggerin: 0 0
+36
+%transfiletriggerin: 0 0
+36
+UPGRADE:
+%transfiletriggerun: 0 0
+36
+%filetriggerin: 0 0
+36
+%transfiletriggerin: 0 0
+36
+ERASE:
+%transfiletriggerun: 0 0
+36
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmscript.at:207"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_164
+#AT_START_165
+at_fn_group_banner 165 'rpmvercmp.at:13' \
+  "rpmvercmp(1.0, 1.0) = 0" "                        " 12
+at_xfail=no
+(
+  $as_echo "165. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:13: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0\", \"1.0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:13"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0", "1.0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:13"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_165
+#AT_START_166
+at_fn_group_banner 166 'rpmvercmp.at:14' \
+  "rpmvercmp(1.0, 2.0) = -1" "                       " 12
+at_xfail=no
+(
+  $as_echo "166. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:14: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0\", \"2.0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:14"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0", "2.0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:14"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_166
+#AT_START_167
+at_fn_group_banner 167 'rpmvercmp.at:15' \
+  "rpmvercmp(2.0, 1.0) = 1" "                        " 12
+at_xfail=no
+(
+  $as_echo "167. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:15: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2.0\", \"1.0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:15"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2.0", "1.0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:15"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_167
+#AT_START_168
+at_fn_group_banner 168 'rpmvercmp.at:17' \
+  "rpmvercmp(2.0.1, 2.0.1) = 0" "                    " 12
+at_xfail=no
+(
+  $as_echo "168. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:17: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2.0.1\", \"2.0.1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:17"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2.0.1", "2.0.1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:17"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_168
+#AT_START_169
+at_fn_group_banner 169 'rpmvercmp.at:18' \
+  "rpmvercmp(2.0, 2.0.1) = -1" "                     " 12
+at_xfail=no
+(
+  $as_echo "169. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:18: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2.0\", \"2.0.1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:18"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2.0", "2.0.1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:18"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_169
+#AT_START_170
+at_fn_group_banner 170 'rpmvercmp.at:19' \
+  "rpmvercmp(2.0.1, 2.0) = 1" "                      " 12
+at_xfail=no
+(
+  $as_echo "170. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:19: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2.0.1\", \"2.0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:19"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2.0.1", "2.0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:19"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_170
+#AT_START_171
+at_fn_group_banner 171 'rpmvercmp.at:21' \
+  "rpmvercmp(2.0.1a, 2.0.1a) = 0" "                  " 12
+at_xfail=no
+(
+  $as_echo "171. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:21: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2.0.1a\", \"2.0.1a\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:21"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2.0.1a", "2.0.1a"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:21"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_171
+#AT_START_172
+at_fn_group_banner 172 'rpmvercmp.at:22' \
+  "rpmvercmp(2.0.1a, 2.0.1) = 1" "                   " 12
+at_xfail=no
+(
+  $as_echo "172. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:22: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2.0.1a\", \"2.0.1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:22"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2.0.1a", "2.0.1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:22"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_172
+#AT_START_173
+at_fn_group_banner 173 'rpmvercmp.at:23' \
+  "rpmvercmp(2.0.1, 2.0.1a) = -1" "                  " 12
+at_xfail=no
+(
+  $as_echo "173. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:23: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2.0.1\", \"2.0.1a\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:23"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2.0.1", "2.0.1a"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:23"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_173
+#AT_START_174
+at_fn_group_banner 174 'rpmvercmp.at:25' \
+  "rpmvercmp(5.5p1, 5.5p1) = 0" "                    " 12
+at_xfail=no
+(
+  $as_echo "174. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:25: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.5p1\", \"5.5p1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:25"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.5p1", "5.5p1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:25"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_174
+#AT_START_175
+at_fn_group_banner 175 'rpmvercmp.at:26' \
+  "rpmvercmp(5.5p1, 5.5p2) = -1" "                   " 12
+at_xfail=no
+(
+  $as_echo "175. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:26: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.5p1\", \"5.5p2\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:26"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.5p1", "5.5p2"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:26"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_175
+#AT_START_176
+at_fn_group_banner 176 'rpmvercmp.at:27' \
+  "rpmvercmp(5.5p2, 5.5p1) = 1" "                    " 12
+at_xfail=no
+(
+  $as_echo "176. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:27: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.5p2\", \"5.5p1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:27"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.5p2", "5.5p1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:27"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_176
+#AT_START_177
+at_fn_group_banner 177 'rpmvercmp.at:29' \
+  "rpmvercmp(5.5p10, 5.5p10) = 0" "                  " 12
+at_xfail=no
+(
+  $as_echo "177. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:29: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.5p10\", \"5.5p10\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:29"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.5p10", "5.5p10"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:29"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_177
+#AT_START_178
+at_fn_group_banner 178 'rpmvercmp.at:30' \
+  "rpmvercmp(5.5p1, 5.5p10) = -1" "                  " 12
+at_xfail=no
+(
+  $as_echo "178. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:30: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.5p1\", \"5.5p10\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:30"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.5p1", "5.5p10"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:30"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_178
+#AT_START_179
+at_fn_group_banner 179 'rpmvercmp.at:31' \
+  "rpmvercmp(5.5p10, 5.5p1) = 1" "                   " 12
+at_xfail=no
+(
+  $as_echo "179. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:31: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.5p10\", \"5.5p1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:31"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.5p10", "5.5p1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:31"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_179
+#AT_START_180
+at_fn_group_banner 180 'rpmvercmp.at:33' \
+  "rpmvercmp(10xyz, 10.1xyz) = -1" "                 " 12
+at_xfail=no
+(
+  $as_echo "180. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:33: runroot rpm --eval '%{lua: print(rpm.vercmp(\"10xyz\", \"10.1xyz\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:33"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("10xyz", "10.1xyz"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:33"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_180
+#AT_START_181
+at_fn_group_banner 181 'rpmvercmp.at:34' \
+  "rpmvercmp(10.1xyz, 10xyz) = 1" "                  " 12
+at_xfail=no
+(
+  $as_echo "181. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:34: runroot rpm --eval '%{lua: print(rpm.vercmp(\"10.1xyz\", \"10xyz\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:34"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("10.1xyz", "10xyz"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:34"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_181
+#AT_START_182
+at_fn_group_banner 182 'rpmvercmp.at:36' \
+  "rpmvercmp(xyz10, xyz10) = 0" "                    " 12
+at_xfail=no
+(
+  $as_echo "182. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:36: runroot rpm --eval '%{lua: print(rpm.vercmp(\"xyz10\", \"xyz10\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:36"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("xyz10", "xyz10"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:36"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_182
+#AT_START_183
+at_fn_group_banner 183 'rpmvercmp.at:37' \
+  "rpmvercmp(xyz10, xyz10.1) = -1" "                 " 12
+at_xfail=no
+(
+  $as_echo "183. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:37: runroot rpm --eval '%{lua: print(rpm.vercmp(\"xyz10\", \"xyz10.1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:37"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("xyz10", "xyz10.1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:37"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_183
+#AT_START_184
+at_fn_group_banner 184 'rpmvercmp.at:38' \
+  "rpmvercmp(xyz10.1, xyz10) = 1" "                  " 12
+at_xfail=no
+(
+  $as_echo "184. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:38: runroot rpm --eval '%{lua: print(rpm.vercmp(\"xyz10.1\", \"xyz10\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:38"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("xyz10.1", "xyz10"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:38"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_184
+#AT_START_185
+at_fn_group_banner 185 'rpmvercmp.at:40' \
+  "rpmvercmp(xyz.4, xyz.4) = 0" "                    " 12
+at_xfail=no
+(
+  $as_echo "185. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:40: runroot rpm --eval '%{lua: print(rpm.vercmp(\"xyz.4\", \"xyz.4\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:40"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("xyz.4", "xyz.4"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:40"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_185
+#AT_START_186
+at_fn_group_banner 186 'rpmvercmp.at:41' \
+  "rpmvercmp(xyz.4, 8) = -1" "                       " 12
+at_xfail=no
+(
+  $as_echo "186. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:41: runroot rpm --eval '%{lua: print(rpm.vercmp(\"xyz.4\", \"8\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:41"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("xyz.4", "8"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:41"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_186
+#AT_START_187
+at_fn_group_banner 187 'rpmvercmp.at:42' \
+  "rpmvercmp(8, xyz.4) = 1" "                        " 12
+at_xfail=no
+(
+  $as_echo "187. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:42: runroot rpm --eval '%{lua: print(rpm.vercmp(\"8\", \"xyz.4\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:42"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("8", "xyz.4"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:42"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_187
+#AT_START_188
+at_fn_group_banner 188 'rpmvercmp.at:43' \
+  "rpmvercmp(xyz.4, 2) = -1" "                       " 12
+at_xfail=no
+(
+  $as_echo "188. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:43: runroot rpm --eval '%{lua: print(rpm.vercmp(\"xyz.4\", \"2\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:43"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("xyz.4", "2"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:43"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_188
+#AT_START_189
+at_fn_group_banner 189 'rpmvercmp.at:44' \
+  "rpmvercmp(2, xyz.4) = 1" "                        " 12
+at_xfail=no
+(
+  $as_echo "189. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:44: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2\", \"xyz.4\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:44"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2", "xyz.4"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:44"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_189
+#AT_START_190
+at_fn_group_banner 190 'rpmvercmp.at:46' \
+  "rpmvercmp(5.5p2, 5.6p1) = -1" "                   " 12
+at_xfail=no
+(
+  $as_echo "190. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:46: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.5p2\", \"5.6p1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:46"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.5p2", "5.6p1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:46"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_190
+#AT_START_191
+at_fn_group_banner 191 'rpmvercmp.at:47' \
+  "rpmvercmp(5.6p1, 5.5p2) = 1" "                    " 12
+at_xfail=no
+(
+  $as_echo "191. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:47: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.6p1\", \"5.5p2\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:47"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.6p1", "5.5p2"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:47"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_191
+#AT_START_192
+at_fn_group_banner 192 'rpmvercmp.at:49' \
+  "rpmvercmp(5.6p1, 6.5p1) = -1" "                   " 12
+at_xfail=no
+(
+  $as_echo "192. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:49: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.6p1\", \"6.5p1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:49"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.6p1", "6.5p1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:49"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_192
+#AT_START_193
+at_fn_group_banner 193 'rpmvercmp.at:50' \
+  "rpmvercmp(6.5p1, 5.6p1) = 1" "                    " 12
+at_xfail=no
+(
+  $as_echo "193. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:50: runroot rpm --eval '%{lua: print(rpm.vercmp(\"6.5p1\", \"5.6p1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:50"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("6.5p1", "5.6p1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:50"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_193
+#AT_START_194
+at_fn_group_banner 194 'rpmvercmp.at:52' \
+  "rpmvercmp(6.0.rc1, 6.0) = 1" "                    " 12
+at_xfail=no
+(
+  $as_echo "194. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:52: runroot rpm --eval '%{lua: print(rpm.vercmp(\"6.0.rc1\", \"6.0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:52"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("6.0.rc1", "6.0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:52"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_194
+#AT_START_195
+at_fn_group_banner 195 'rpmvercmp.at:53' \
+  "rpmvercmp(6.0, 6.0.rc1) = -1" "                   " 12
+at_xfail=no
+(
+  $as_echo "195. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:53: runroot rpm --eval '%{lua: print(rpm.vercmp(\"6.0\", \"6.0.rc1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:53"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("6.0", "6.0.rc1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:53"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_195
+#AT_START_196
+at_fn_group_banner 196 'rpmvercmp.at:55' \
+  "rpmvercmp(10b2, 10a1) = 1" "                      " 12
+at_xfail=no
+(
+  $as_echo "196. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:55: runroot rpm --eval '%{lua: print(rpm.vercmp(\"10b2\", \"10a1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:55"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("10b2", "10a1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:55"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_196
+#AT_START_197
+at_fn_group_banner 197 'rpmvercmp.at:56' \
+  "rpmvercmp(10a2, 10b2) = -1" "                     " 12
+at_xfail=no
+(
+  $as_echo "197. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:56: runroot rpm --eval '%{lua: print(rpm.vercmp(\"10a2\", \"10b2\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:56"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("10a2", "10b2"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:56"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_197
+#AT_START_198
+at_fn_group_banner 198 'rpmvercmp.at:58' \
+  "rpmvercmp(1.0aa, 1.0aa) = 0" "                    " 12
+at_xfail=no
+(
+  $as_echo "198. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:58: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0aa\", \"1.0aa\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:58"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0aa", "1.0aa"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:58"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_198
+#AT_START_199
+at_fn_group_banner 199 'rpmvercmp.at:59' \
+  "rpmvercmp(1.0a, 1.0aa) = -1" "                    " 12
+at_xfail=no
+(
+  $as_echo "199. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:59: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0a\", \"1.0aa\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:59"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0a", "1.0aa"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:59"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_199
+#AT_START_200
+at_fn_group_banner 200 'rpmvercmp.at:60' \
+  "rpmvercmp(1.0aa, 1.0a) = 1" "                     " 12
+at_xfail=no
+(
+  $as_echo "200. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:60: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0aa\", \"1.0a\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:60"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0aa", "1.0a"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:60"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_200
+#AT_START_201
+at_fn_group_banner 201 'rpmvercmp.at:62' \
+  "rpmvercmp(10.0001, 10.0001) = 0" "                " 12
+at_xfail=no
+(
+  $as_echo "201. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:62: runroot rpm --eval '%{lua: print(rpm.vercmp(\"10.0001\", \"10.0001\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:62"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("10.0001", "10.0001"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:62"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_201
+#AT_START_202
+at_fn_group_banner 202 'rpmvercmp.at:63' \
+  "rpmvercmp(10.0001, 10.1) = 0" "                   " 12
+at_xfail=no
+(
+  $as_echo "202. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:63: runroot rpm --eval '%{lua: print(rpm.vercmp(\"10.0001\", \"10.1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:63"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("10.0001", "10.1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:63"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_202
+#AT_START_203
+at_fn_group_banner 203 'rpmvercmp.at:64' \
+  "rpmvercmp(10.1, 10.0001) = 0" "                   " 12
+at_xfail=no
+(
+  $as_echo "203. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:64: runroot rpm --eval '%{lua: print(rpm.vercmp(\"10.1\", \"10.0001\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:64"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("10.1", "10.0001"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:64"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_203
+#AT_START_204
+at_fn_group_banner 204 'rpmvercmp.at:65' \
+  "rpmvercmp(10.0001, 10.0039) = -1" "               " 12
+at_xfail=no
+(
+  $as_echo "204. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:65: runroot rpm --eval '%{lua: print(rpm.vercmp(\"10.0001\", \"10.0039\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:65"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("10.0001", "10.0039"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:65"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_204
+#AT_START_205
+at_fn_group_banner 205 'rpmvercmp.at:66' \
+  "rpmvercmp(10.0039, 10.0001) = 1" "                " 12
+at_xfail=no
+(
+  $as_echo "205. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:66: runroot rpm --eval '%{lua: print(rpm.vercmp(\"10.0039\", \"10.0001\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:66"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("10.0039", "10.0001"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:66"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_205
+#AT_START_206
+at_fn_group_banner 206 'rpmvercmp.at:68' \
+  "rpmvercmp(4.999.9, 5.0) = -1" "                   " 12
+at_xfail=no
+(
+  $as_echo "206. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:68: runroot rpm --eval '%{lua: print(rpm.vercmp(\"4.999.9\", \"5.0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:68"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("4.999.9", "5.0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:68"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_206
+#AT_START_207
+at_fn_group_banner 207 'rpmvercmp.at:69' \
+  "rpmvercmp(5.0, 4.999.9) = 1" "                    " 12
+at_xfail=no
+(
+  $as_echo "207. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:69: runroot rpm --eval '%{lua: print(rpm.vercmp(\"5.0\", \"4.999.9\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:69"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("5.0", "4.999.9"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:69"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_207
+#AT_START_208
+at_fn_group_banner 208 'rpmvercmp.at:71' \
+  "rpmvercmp(20101121, 20101121) = 0" "              " 12
+at_xfail=no
+(
+  $as_echo "208. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:71: runroot rpm --eval '%{lua: print(rpm.vercmp(\"20101121\", \"20101121\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:71"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("20101121", "20101121"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:71"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_208
+#AT_START_209
+at_fn_group_banner 209 'rpmvercmp.at:72' \
+  "rpmvercmp(20101121, 20101122) = -1" "             " 12
+at_xfail=no
+(
+  $as_echo "209. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:72: runroot rpm --eval '%{lua: print(rpm.vercmp(\"20101121\", \"20101122\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:72"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("20101121", "20101122"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:72"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_209
+#AT_START_210
+at_fn_group_banner 210 'rpmvercmp.at:73' \
+  "rpmvercmp(20101122, 20101121) = 1" "              " 12
+at_xfail=no
+(
+  $as_echo "210. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:73: runroot rpm --eval '%{lua: print(rpm.vercmp(\"20101122\", \"20101121\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:73"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("20101122", "20101121"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:73"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_210
+#AT_START_211
+at_fn_group_banner 211 'rpmvercmp.at:75' \
+  "rpmvercmp(2_0, 2_0) = 0" "                        " 12
+at_xfail=no
+(
+  $as_echo "211. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:75: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2_0\", \"2_0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:75"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2_0", "2_0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:75"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_211
+#AT_START_212
+at_fn_group_banner 212 'rpmvercmp.at:76' \
+  "rpmvercmp(2.0, 2_0) = 0" "                        " 12
+at_xfail=no
+(
+  $as_echo "212. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:76: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2.0\", \"2_0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:76"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2.0", "2_0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:76"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_212
+#AT_START_213
+at_fn_group_banner 213 'rpmvercmp.at:77' \
+  "rpmvercmp(2_0, 2.0) = 0" "                        " 12
+at_xfail=no
+(
+  $as_echo "213. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:77: runroot rpm --eval '%{lua: print(rpm.vercmp(\"2_0\", \"2.0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:77"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("2_0", "2.0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:77"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_213
+#AT_START_214
+at_fn_group_banner 214 'rpmvercmp.at:80' \
+  "rpmvercmp(a, a) = 0" "                            " 12
+at_xfail=no
+(
+  $as_echo "214. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:80: runroot rpm --eval '%{lua: print(rpm.vercmp(\"a\", \"a\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:80"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("a", "a"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:80"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_214
+#AT_START_215
+at_fn_group_banner 215 'rpmvercmp.at:81' \
+  "rpmvercmp(a+, a+) = 0" "                          " 12
+at_xfail=no
+(
+  $as_echo "215. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:81: runroot rpm --eval '%{lua: print(rpm.vercmp(\"a+\", \"a+\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:81"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("a+", "a+"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:81"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_215
+#AT_START_216
+at_fn_group_banner 216 'rpmvercmp.at:82' \
+  "rpmvercmp(a+, a_) = 0" "                          " 12
+at_xfail=no
+(
+  $as_echo "216. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:82: runroot rpm --eval '%{lua: print(rpm.vercmp(\"a+\", \"a_\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:82"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("a+", "a_"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:82"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_216
+#AT_START_217
+at_fn_group_banner 217 'rpmvercmp.at:83' \
+  "rpmvercmp(a_, a+) = 0" "                          " 12
+at_xfail=no
+(
+  $as_echo "217. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:83: runroot rpm --eval '%{lua: print(rpm.vercmp(\"a_\", \"a+\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:83"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("a_", "a+"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:83"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_217
+#AT_START_218
+at_fn_group_banner 218 'rpmvercmp.at:84' \
+  "rpmvercmp(+a, +a) = 0" "                          " 12
+at_xfail=no
+(
+  $as_echo "218. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:84: runroot rpm --eval '%{lua: print(rpm.vercmp(\"+a\", \"+a\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:84"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("+a", "+a"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:84"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_218
+#AT_START_219
+at_fn_group_banner 219 'rpmvercmp.at:85' \
+  "rpmvercmp(+a, _a) = 0" "                          " 12
+at_xfail=no
+(
+  $as_echo "219. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:85: runroot rpm --eval '%{lua: print(rpm.vercmp(\"+a\", \"_a\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:85"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("+a", "_a"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:85"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_219
+#AT_START_220
+at_fn_group_banner 220 'rpmvercmp.at:86' \
+  "rpmvercmp(_a, +a) = 0" "                          " 12
+at_xfail=no
+(
+  $as_echo "220. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:86: runroot rpm --eval '%{lua: print(rpm.vercmp(\"_a\", \"+a\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:86"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("_a", "+a"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:86"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_220
+#AT_START_221
+at_fn_group_banner 221 'rpmvercmp.at:87' \
+  "rpmvercmp(+_, +_) = 0" "                          " 12
+at_xfail=no
+(
+  $as_echo "221. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:87: runroot rpm --eval '%{lua: print(rpm.vercmp(\"+_\", \"+_\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:87"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("+_", "+_"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:87"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_221
+#AT_START_222
+at_fn_group_banner 222 'rpmvercmp.at:88' \
+  "rpmvercmp(_+, +_) = 0" "                          " 12
+at_xfail=no
+(
+  $as_echo "222. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:88: runroot rpm --eval '%{lua: print(rpm.vercmp(\"_+\", \"+_\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:88"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("_+", "+_"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:88"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_222
+#AT_START_223
+at_fn_group_banner 223 'rpmvercmp.at:89' \
+  "rpmvercmp(_+, _+) = 0" "                          " 12
+at_xfail=no
+(
+  $as_echo "223. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:89: runroot rpm --eval '%{lua: print(rpm.vercmp(\"_+\", \"_+\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:89"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("_+", "_+"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:89"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_223
+#AT_START_224
+at_fn_group_banner 224 'rpmvercmp.at:90' \
+  "rpmvercmp(+, _) = 0" "                            " 12
+at_xfail=no
+(
+  $as_echo "224. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:90: runroot rpm --eval '%{lua: print(rpm.vercmp(\"+\", \"_\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:90"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("+", "_"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:90"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_224
+#AT_START_225
+at_fn_group_banner 225 'rpmvercmp.at:91' \
+  "rpmvercmp(_, +) = 0" "                            " 12
+at_xfail=no
+(
+  $as_echo "225. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:91: runroot rpm --eval '%{lua: print(rpm.vercmp(\"_\", \"+\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:91"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("_", "+"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:91"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_225
+#AT_START_226
+at_fn_group_banner 226 'rpmvercmp.at:94' \
+  "rpmvercmp(1.0~rc1, 1.0~rc1) = 0" "                " 12
+at_xfail=no
+(
+  $as_echo "226. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:94: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0~rc1\", \"1.0~rc1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:94"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0~rc1", "1.0~rc1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:94"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_226
+#AT_START_227
+at_fn_group_banner 227 'rpmvercmp.at:95' \
+  "rpmvercmp(1.0~rc1, 1.0) = -1" "                   " 12
+at_xfail=no
+(
+  $as_echo "227. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:95: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0~rc1\", \"1.0\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:95"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0~rc1", "1.0"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:95"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_227
+#AT_START_228
+at_fn_group_banner 228 'rpmvercmp.at:96' \
+  "rpmvercmp(1.0, 1.0~rc1) = 1" "                    " 12
+at_xfail=no
+(
+  $as_echo "228. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:96: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0\", \"1.0~rc1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:96"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0", "1.0~rc1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:96"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_228
+#AT_START_229
+at_fn_group_banner 229 'rpmvercmp.at:97' \
+  "rpmvercmp(1.0~rc1, 1.0~rc2) = -1" "               " 12
+at_xfail=no
+(
+  $as_echo "229. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:97: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0~rc1\", \"1.0~rc2\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:97"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0~rc1", "1.0~rc2"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:97"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_229
+#AT_START_230
+at_fn_group_banner 230 'rpmvercmp.at:98' \
+  "rpmvercmp(1.0~rc2, 1.0~rc1) = 1" "                " 12
+at_xfail=no
+(
+  $as_echo "230. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:98: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0~rc2\", \"1.0~rc1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:98"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0~rc2", "1.0~rc1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:98"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_230
+#AT_START_231
+at_fn_group_banner 231 'rpmvercmp.at:99' \
+  "rpmvercmp(1.0~rc1~git123, 1.0~rc1~git123) = 0" "  " 12
+at_xfail=no
+(
+  $as_echo "231. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:99: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0~rc1~git123\", \"1.0~rc1~git123\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:99"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0~rc1~git123", "1.0~rc1~git123"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:99"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_231
+#AT_START_232
+at_fn_group_banner 232 'rpmvercmp.at:100' \
+  "rpmvercmp(1.0~rc1~git123, 1.0~rc1) = -1" "        " 12
+at_xfail=no
+(
+  $as_echo "232. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:100: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0~rc1~git123\", \"1.0~rc1\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:100"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0~rc1~git123", "1.0~rc1"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:100"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_232
+#AT_START_233
+at_fn_group_banner 233 'rpmvercmp.at:101' \
+  "rpmvercmp(1.0~rc1, 1.0~rc1~git123) = 1" "         " 12
+at_xfail=no
+(
+  $as_echo "233. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmvercmp.at:101: runroot rpm --eval '%{lua: print(rpm.vercmp(\"1.0~rc1\", \"1.0~rc1~git123\"))}'"
+at_fn_check_prepare_trace "rpmvercmp.at:101"
+( $at_check_trace; runroot rpm --eval '%{lua: print(rpm.vercmp("1.0~rc1", "1.0~rc1~git123"))}'
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmvercmp.at:101"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_233
+#AT_START_234
+at_fn_group_banner 234 'rpmdeps.at:7' \
+  "missing dependency" "                             " 13
+at_xfail=no
+(
+  $as_echo "234. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:9:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs deptest-two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:9"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs deptest-two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       deptest-two is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdeps.at:9"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_234
+#AT_START_235
+at_fn_group_banner 235 'rpmdeps.at:30' \
+  "cross-depending packages" "                       " 13
+at_xfail=no
+(
+  $as_echo "235. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:32:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs deptest-two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"reqs deptest-one\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:32"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs deptest-two" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "reqs deptest-one" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:32"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_235
+#AT_START_236
+at_fn_group_banner 236 'rpmdeps.at:56' \
+  "unsatisfied versioned require" "                  " 13
+at_xfail=no
+(
+  $as_echo "236. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:58:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs deptest-two >= 2.0\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"provs deptest-foo = 1.0\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:58"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs deptest-two >= 2.0" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs deptest-foo = 1.0" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       deptest-two >= 2.0 is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmdeps.at:58"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_236
+#AT_START_237
+at_fn_group_banner 237 'rpmdeps.at:84' \
+  "satisfied versioned require" "                    " 13
+at_xfail=no
+(
+  $as_echo "237. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:86:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs deptest-foo >= 2.0\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"provs deptest-foo = 2.0\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:86"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs deptest-foo >= 2.0" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs deptest-foo = 2.0" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:86"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_237
+#AT_START_238
+at_fn_group_banner 238 'rpmdeps.at:110' \
+  "versioned conflict in transaction" "              " 13
+at_xfail=no
+(
+  $as_echo "238. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:112:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"cfls deptest-two < 2.0\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:112"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "cfls deptest-two < 2.0" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       deptest-two < 2.0 conflicts with deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmdeps.at:112"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_238
+#AT_START_239
+at_fn_group_banner 239 'rpmdeps.at:137' \
+  "versioned conflict in database" "                 " 13
+at_xfail=no
+(
+  $as_echo "239. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:139:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"cfls deptest-two < 2.0\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:139"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "cfls deptest-two < 2.0" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       deptest-two < 2.0 conflicts with (installed) deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdeps.at:139"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_239
+#AT_START_240
+at_fn_group_banner 240 'rpmdeps.at:163' \
+  "install and verify self-conflicting package" "    " 13
+at_xfail=no
+(
+  $as_echo "240. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:165:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"provs something\" \\
+       --define \"cfls something\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -V --nofiles deptest-one
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:165"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "provs something" \
+       --define "cfls something" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -V --nofiles deptest-one
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:165"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_240
+#AT_START_241
+at_fn_group_banner 241 'rpmdeps.at:185' \
+  "explicit file conflicts" "                        " 13
+at_xfail=no
+(
+  $as_echo "241. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:187:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"cfls /opt/bar\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U --test \\
+       /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm \\
+       /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -e deptest-one
+# XXX FIXME: rpm's problem message for this case is higly bogus.
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -e deptest-two
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:187"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "cfls /opt/bar" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U --test \
+       /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm \
+       /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -e deptest-one
+# XXX FIXME: rpm's problem message for this case is higly bogus.
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -e deptest-two
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       /opt/bar conflicts with deptest-one-1.0-1.noarch
+error: Failed dependencies:
+       /opt/bar conflicts with (installed) deptest-one-1.0-1.noarch
+error: Failed dependencies:
+       /opt/bar conflicts with deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:187"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_241
+#AT_START_242
+at_fn_group_banner 242 'rpmdeps.at:224' \
+  "erase to break dependencies" "                    " 13
+at_xfail=no
+(
+  $as_echo "242. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:226:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs deptest-foo >= 2.0\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"provs deptest-foo = 2.0\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -e deptest-two
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:226"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs deptest-foo >= 2.0" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs deptest-foo = 2.0" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+runroot rpm -e deptest-two
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       deptest-foo >= 2.0 is needed by (installed) deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdeps.at:226"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_242
+#AT_START_243
+at_fn_group_banner 243 'rpmdeps.at:252' \
+  "erase to break colored file dependency" "         " 13
+at_xfail=no
+(
+  $as_echo "243. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:254:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg hello\" \\
+       --define \"reqs /usr/bin/hello\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+       --define \"_transaction_color 3\" \\
+       --define \"_prefer_color 2\" \\
+       /data/RPMS/hello-2.0-1.i686.rpm \\
+       /data/RPMS/hello-2.0-1.x86_64.rpm \\
+       /build/RPMS/noarch/deptest-hello-1.0-1.noarch.rpm
+
+runroot rpm -e hello.x86_64
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:254"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg hello" \
+       --define "reqs /usr/bin/hello" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+       --define "_transaction_color 3" \
+       --define "_prefer_color 2" \
+       /data/RPMS/hello-2.0-1.i686.rpm \
+       /data/RPMS/hello-2.0-1.x86_64.rpm \
+       /build/RPMS/noarch/deptest-hello-1.0-1.noarch.rpm
+
+runroot rpm -e hello.x86_64
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       /usr/bin/hello is needed by (installed) deptest-hello-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdeps.at:254"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_243
+#AT_START_244
+at_fn_group_banner 244 'rpmdeps.at:281' \
+  "erase on wrong-colored file dependency" "         " 13
+at_xfail=no
+(
+  $as_echo "244. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:283:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg hello\" \\
+       --define \"reqs /usr/bin/hello\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+       --define \"_transaction_color 3\" \\
+       --define \"_prefer_color 2\" \\
+       /data/RPMS/hello-2.0-1.i686.rpm \\
+       /data/RPMS/hello-2.0-1.x86_64.rpm \\
+       /build/RPMS/noarch/deptest-hello-1.0-1.noarch.rpm
+
+runroot rpm -e hello.i686
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:283"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg hello" \
+       --define "reqs /usr/bin/hello" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+       --define "_transaction_color 3" \
+       --define "_prefer_color 2" \
+       /data/RPMS/hello-2.0-1.i686.rpm \
+       /data/RPMS/hello-2.0-1.x86_64.rpm \
+       /build/RPMS/noarch/deptest-hello-1.0-1.noarch.rpm
+
+runroot rpm -e hello.i686
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:283"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_244
+#AT_START_245
+at_fn_group_banner 245 'rpmdeps.at:309' \
+  "unsatisfied WITH require" "                       " 13
+at_xfail=no
+(
+  $as_echo "245. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:311:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two with flavor = dekstop)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"provs flavor = server\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+       --define \"provs flavor = desktop\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:311"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two with flavor = dekstop)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = server" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+       --define "provs flavor = desktop" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two with flavor = dekstop) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 3 $at_status "$at_srcdir/rpmdeps.at:311"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_245
+#AT_START_246
+at_fn_group_banner 246 'rpmdeps.at:340' \
+  "unsatisfied WITH require (rpmdb)" "               " 13
+at_xfail=no
+(
+  $as_echo "246. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:342:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two with flavor = dekstop)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"provs flavor = server\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+       --define \"provs flavor = desktop\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:342"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two with flavor = dekstop)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = server" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+       --define "provs flavor = desktop" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two with flavor = dekstop) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdeps.at:342"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_246
+#AT_START_247
+at_fn_group_banner 247 'rpmdeps.at:373' \
+  "satisfied WITH require" "                         " 13
+at_xfail=no
+(
+  $as_echo "247. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:375:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two with flavor = desktop)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"provs flavor = desktop\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:375"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two with flavor = desktop)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = desktop" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:375"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_247
+#AT_START_248
+at_fn_group_banner 248 'rpmdeps.at:397' \
+  "satisfied WITH require (rpmdb)" "                 " 13
+at_xfail=no
+(
+  $as_echo "248. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:399:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two with flavor = desktop)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"provs flavor = desktop\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:399"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two with flavor = desktop)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = desktop" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:399"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_248
+#AT_START_249
+at_fn_group_banner 249 'rpmdeps.at:425' \
+  "unsatisfied WITHOUT require" "                    " 13
+at_xfail=no
+(
+  $as_echo "249. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:427:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two without flavor)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"provs flavor = server\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:427"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two without flavor)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = server" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two without flavor) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmdeps.at:427"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_249
+#AT_START_250
+at_fn_group_banner 250 'rpmdeps.at:451' \
+  "unsatisfied WITHOUT require (rpmdb)" "            " 13
+at_xfail=no
+(
+  $as_echo "250. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:453:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two without flavor)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+       --define \"provs flavor = server\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:453"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two without flavor)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+       --define "provs flavor = server" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two without flavor) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdeps.at:453"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_250
+#AT_START_251
+at_fn_group_banner 251 'rpmdeps.at:479' \
+  "satisfied WITHOUT require" "                      " 13
+at_xfail=no
+(
+  $as_echo "251. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:481:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two without flavor)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:481"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two without flavor)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:481"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_251
+#AT_START_252
+at_fn_group_banner 252 'rpmdeps.at:502' \
+  "satisfied WITHOUT require (rpmdb)" "              " 13
+at_xfail=no
+(
+  $as_echo "252. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:504:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two without flavor)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:504"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two without flavor)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:504"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_252
+#AT_START_253
+at_fn_group_banner 253 'rpmdeps.at:529' \
+  "unsatisfied AND require - all missing" "          " 13
+at_xfail=no
+(
+  $as_echo "253. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:531:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two and deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:531"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two and deptest-three) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdeps.at:531"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_253
+#AT_START_254
+at_fn_group_banner 254 'rpmdeps.at:550' \
+  "unsatisfied AND require - first is missing" "     " 13
+at_xfail=no
+(
+  $as_echo "254. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:552:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two and deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:552"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two and deptest-three) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmdeps.at:552"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_254
+#AT_START_255
+at_fn_group_banner 255 'rpmdeps.at:575' \
+  "unsatisfied AND require - second is missing" "    " 13
+at_xfail=no
+(
+  $as_echo "255. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:577:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two and deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:577"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two and deptest-three) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmdeps.at:577"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_255
+#AT_START_256
+at_fn_group_banner 256 'rpmdeps.at:600' \
+  "satisfied AND require" "                          " 13
+at_xfail=no
+(
+  $as_echo "256. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:602:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two and deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:602"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:602"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_256
+#AT_START_257
+at_fn_group_banner 257 'rpmdeps.at:629' \
+  "unsatisfied OR require - all missing" "           " 13
+at_xfail=no
+(
+  $as_echo "257. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:631:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two or deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:631"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two or deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two or deptest-three) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdeps.at:631"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_257
+#AT_START_258
+at_fn_group_banner 258 'rpmdeps.at:650' \
+  "satisfied OR require - first is missing" "        " 13
+at_xfail=no
+(
+  $as_echo "258. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:652:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two or deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:652"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two or deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:652"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_258
+#AT_START_259
+at_fn_group_banner 259 'rpmdeps.at:673' \
+  "satisfied OR require - second is missing" "       " 13
+at_xfail=no
+(
+  $as_echo "259. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:675:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two or deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:675"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two or deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:675"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_259
+#AT_START_260
+at_fn_group_banner 260 'rpmdeps.at:696' \
+  "satisfied OR require - both present" "            " 13
+at_xfail=no
+(
+  $as_echo "260. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:698:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two or deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:698"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two or deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:698"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_260
+#AT_START_261
+at_fn_group_banner 261 'rpmdeps.at:725' \
+  "unsatisfied IF require" "                         " 13
+at_xfail=no
+(
+  $as_echo "261. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:727:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two if deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:727"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two if deptest-three) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmdeps.at:727"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_261
+#AT_START_262
+at_fn_group_banner 262 'rpmdeps.at:750' \
+  "satisfied IF require" "                           " 13
+at_xfail=no
+(
+  $as_echo "262. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:752:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two if deptest-three)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:752"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:752"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_262
+#AT_START_263
+at_fn_group_banner 263 'rpmdeps.at:777' \
+  "unsatisfied IF-ELSE require" "                    " 13
+at_xfail=no
+(
+  $as_echo "263. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:779:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two if deptest-three else deptest-four)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:779"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three else deptest-four)" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two if deptest-three else deptest-four) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmdeps.at:779"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_263
+#AT_START_264
+at_fn_group_banner 264 'rpmdeps.at:798' \
+  "satisfied IF-ELSE require - right clause" "       " 13
+at_xfail=no
+(
+  $as_echo "264. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:800:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two if deptest-three else deptest-four)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg four\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-four-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:800"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three else deptest-four)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg four" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-four-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:800"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_264
+#AT_START_265
+at_fn_group_banner 265 'rpmdeps.at:821' \
+  "satisfied IF-ELSE require - left clause" "        " 13
+at_xfail=no
+(
+  $as_echo "265. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:823:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two if deptest-three else deptest-four)\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:823"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two if deptest-three else deptest-four)" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:823"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_265
+#AT_START_266
+at_fn_group_banner 266 'rpmdeps.at:850' \
+  "unsatisfied nested AND-OR require" "              " 13
+at_xfail=no
+(
+  $as_echo "266. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:852:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two and (deptest-three or deptest-four))\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:852"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and (deptest-three or deptest-four))" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Failed dependencies:
+       (deptest-two and (deptest-three or deptest-four)) is needed by deptest-one-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmdeps.at:852"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_266
+#AT_START_267
+at_fn_group_banner 267 'rpmdeps.at:875' \
+  "satisfied nested AND-OR require" "                " 13
+at_xfail=no
+(
+  $as_echo "267. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:877:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two and (deptest-three or deptest-four))\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:877"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and (deptest-three or deptest-four))" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:877"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_267
+#AT_START_268
+at_fn_group_banner 268 'rpmdeps.at:904' \
+  "satisfied nested AND-IF require - without right clause" "" 13
+at_xfail=no
+(
+  $as_echo "268. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:906:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two and (deptest-three if deptest-four))\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:906"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and (deptest-three if deptest-four))" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:906"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_268
+#AT_START_269
+at_fn_group_banner 269 'rpmdeps.at:927' \
+  "satisfied nested AND-IF require - with right clause" "" 13
+at_xfail=no
+(
+  $as_echo "269. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdeps.at:929:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg one\" \\
+       --define \"reqs (deptest-two and (deptest-three if deptest-four))\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg two\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg four\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \\
+       --define \"pkg three\" \\
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-four-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmdeps.at:929"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg one" \
+       --define "reqs (deptest-two and (deptest-three if deptest-four))" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg two" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg four" \
+         /data/SPECS/deptest.spec
+
+runroot rpmbuild --quiet -bb \
+       --define "pkg three" \
+         /data/SPECS/deptest.spec
+
+runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-four-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdeps.at:929"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_269
+#AT_START_270
+at_fn_group_banner 270 'rpmconflict.at:7' \
+  "package with file conflict" "                     " 14
+at_xfail=no
+(
+  $as_echo "270. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:9:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+for p in \"one\" \"two\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"pkg \$p\" \\
+       --define \"filedata \$p\" \\
+          /data/SPECS/conflicttest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:9"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+for p in "one" "two"; do
+    runroot rpmbuild --quiet -bb \
+        --define "pkg $p" \
+       --define "filedata $p" \
+          /data/SPECS/conflicttest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 1 $at_status "$at_srcdir/rpmconflict.at:9"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_270
+#AT_START_271
+at_fn_group_banner 271 'rpmconflict.at:31' \
+  "two packages with a conflicting file" "           " 14
+at_xfail=no
+(
+  $as_echo "271. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:33:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U \\
+  /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm \\
+  /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:33"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U \
+  /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 2 $at_status "$at_srcdir/rpmconflict.at:33"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_271
+#AT_START_272
+at_fn_group_banner 272 'rpmconflict.at:48' \
+  "package with shareable file" "                    " 14
+at_xfail=no
+(
+  $as_echo "272. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:50:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+for p in \"one\" \"two\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"pkg \$p\" \\
+       --define \"filedata same_stuff\" \\
+          /data/SPECS/conflicttest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:50"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+for p in "one" "two"; do
+    runroot rpmbuild --quiet -bb \
+        --define "pkg $p" \
+       --define "filedata same_stuff" \
+          /data/SPECS/conflicttest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:50"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_272
+#AT_START_273
+at_fn_group_banner 273 'rpmconflict.at:72' \
+  "two packages with shareable file" "               " 14
+at_xfail=no
+(
+  $as_echo "273. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:74:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U \\
+  /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm \\
+  /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:74"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U \
+  /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm \
+  /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo stderr:; cat "$at_stderr"
+echo stdout:; cat "$at_stdout"
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:74"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_273
+#AT_START_274
+at_fn_group_banner 274 'rpmconflict.at:89' \
+  "non-conflicting identical basenames" "            " 14
+at_xfail=no
+(
+  $as_echo "274. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:91:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
+rm -rf \"\${RPMTEST}\"/opt/mydir
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:91"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
+rm -rf "${RPMTEST}"/opt/mydir
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:91"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_274
+#AT_START_275
+at_fn_group_banner 275 'rpmconflict.at:107' \
+  "conflicting identical basenames" "                " 14
+at_xfail=no
+(
+  $as_echo "275. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:109:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
+rm -rf \"\${RPMTEST}\"/opt/mydir
+mkdir -p \"\${RPMTEST}\"/opt/mydir/one
+ln -s one \"\${RPMTEST}\"/opt/mydir/two
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:109"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb /data/SPECS/selfconflict.spec
+rm -rf "${RPMTEST}"/opt/mydir
+mkdir -p "${RPMTEST}"/opt/mydir/one
+ln -s one "${RPMTEST}"/opt/mydir/two
+runroot rpm -U /build/RPMS/noarch/selfconflict-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /opt/mydir/two/somefile conflicts between attempted installs of selfconflict-1.0-1.noarch and selfconflict-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmconflict.at:109"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_275
+#AT_START_276
+at_fn_group_banner 276 'rpmconflict.at:127' \
+  "multilib elf conflict, prefer 64bit 1" "          " 14
+at_xfail=no
+(
+  $as_echo "276. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:129:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /data/RPMS/hello-2.0-1.i686.rpm \\
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.i686 hello.x86_64
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:129"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /data/RPMS/hello-2.0-1.i686.rpm \
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.i686 hello.x86_64
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "wrong color,normal,normal,normal,normal,
+normal,normal,normal,normal,normal,
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:129"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_276
+#AT_START_277
+at_fn_group_banner 277 'rpmconflict.at:149' \
+  "multilib elf conflict, prefer 64bit 2" "          " 14
+at_xfail=no
+(
+  $as_echo "277. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:151:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.i686
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.i686 hello.x86_64
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:151"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.i686
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.i686 hello.x86_64
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "normal,normal,normal,normal,normal,
+wrong color,normal,normal,normal,normal,
+normal,normal,normal,normal,normal,
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:151"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_277
+#AT_START_278
+at_fn_group_banner 278 'rpmconflict.at:176' \
+  "multilib elf conflict, prefer 64bit 3" "          " 14
+at_xfail=no
+(
+  $as_echo "278. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:178:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.x86_64
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.i686 hello.x86_64
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:178"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.x86_64
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.i686 hello.x86_64
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "normal,normal,normal,normal,normal,
+wrong color,normal,normal,normal,normal,
+normal,normal,normal,normal,normal,
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:178"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_278
+#AT_START_279
+at_fn_group_banner 279 'rpmconflict.at:203' \
+  "multilib elf conflict, prefer 32bit 1" "          " 14
+at_xfail=no
+(
+  $as_echo "279. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:205:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 1\" \\
+  /data/RPMS/hello-2.0-1.i686.rpm \\
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.i686 hello.x86_64
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:205"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 1" \
+  /data/RPMS/hello-2.0-1.i686.rpm \
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.i686 hello.x86_64
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "normal,normal,normal,normal,normal,
+wrong color,normal,normal,normal,normal,
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:205"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_279
+#AT_START_280
+at_fn_group_banner 280 'rpmconflict.at:225' \
+  "multilib elf conflict, prefer 32bit 2" "          " 14
+at_xfail=no
+(
+  $as_echo "280. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:227:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 1\" \\
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.i686
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 1\" \\
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.i686 hello.x86_64
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:227"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 1" \
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.i686
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 1" \
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.i686 hello.x86_64
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "normal,normal,normal,normal,normal,
+normal,normal,normal,normal,normal,
+wrong color,normal,normal,normal,normal,
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:227"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_280
+#AT_START_281
+at_fn_group_banner 281 'rpmconflict.at:252' \
+  "multilib elf conflict, prefer 32bit 3" "          " 14
+at_xfail=no
+(
+  $as_echo "281. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:254:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 1\" \\
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.x86_64
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 1\" \\
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -q --qf \"[%{filestates:fstate},]\\n\" hello.i686 hello.x86_64
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:254"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 1" \
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.x86_64
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 1" \
+  /data/RPMS/hello-2.0-1.i686.rpm
+runroot rpm -q --qf "[%{filestates:fstate},]\n" hello.i686 hello.x86_64
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "normal,normal,normal,normal,normal,
+normal,normal,normal,normal,normal,
+wrong color,normal,normal,normal,normal,
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:254"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_281
+#AT_START_282
+at_fn_group_banner 282 'rpmconflict.at:279' \
+  "multilib elf vs non-elf file conflict 1" "        " 14
+at_xfail=no
+(
+  $as_echo "282. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:281:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /data/RPMS/hello-2.0-1.x86_64.rpm \\
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:281"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /data/RPMS/hello-2.0-1.x86_64.rpm \
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /usr/bin/hello conflicts between attempted installs of hello-2.0-1.x86_64 and hello-script-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmconflict.at:281"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_282
+#AT_START_283
+at_fn_group_banner 283 'rpmconflict.at:300' \
+  "multilib elf vs non-elf file conflict 2" "        " 14
+at_xfail=no
+(
+  $as_echo "283. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:302:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:302"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /usr/bin/hello from install of hello-script-1.0-1.noarch conflicts with file from package hello-2.0-1.x86_64
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmconflict.at:302"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_283
+#AT_START_284
+at_fn_group_banner 284 'rpmconflict.at:325' \
+  "multilib elf vs non-elf file conflict 3" "        " 14
+at_xfail=no
+(
+  $as_echo "284. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:327:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \\
+  --define \"_transaction_color 3\" \\
+  --define \"_prefer_color 2\" \\
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:327"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+runroot rpmbuild --quiet -bb /data/SPECS/hello-script.spec
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /build/RPMS/noarch/hello-script-1.0-1.noarch.rpm
+
+runroot rpm -U --ignoreos --ignorearch --nodeps \
+  --define "_transaction_color 3" \
+  --define "_prefer_color 2" \
+  /data/RPMS/hello-2.0-1.x86_64.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /usr/bin/hello from install of hello-2.0-1.x86_64 conflicts with file from package hello-script-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmconflict.at:327"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_284
+#AT_START_285
+at_fn_group_banner 285 'rpmconflict.at:351' \
+  "replacing directory with symlink" "               " 14
+at_xfail=no
+(
+  $as_echo "285. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:353:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+rm -rf \"\${RPMTEST}\"/usr/{share,lib}/symlinktest*
+
+runroot rpmbuild --quiet -bb \\
+    --define \"rel 1\" --without symlink /data/SPECS/symlinktest.spec
+runroot rpmbuild --quiet -bb \\
+    --define \"rel 2\" --with symlink /data/SPECS/symlinktest.spec
+
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-2.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:353"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+rm -rf "${RPMTEST}"/usr/{share,lib}/symlinktest*
+
+runroot rpmbuild --quiet -bb \
+    --define "rel 1" --without symlink /data/SPECS/symlinktest.spec
+runroot rpmbuild --quiet -bb \
+    --define "rel 2" --with symlink /data/SPECS/symlinktest.spec
+
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-2.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /usr/share/symlinktest from install of symlinktest-1.0-2.noarch conflicts with file from package symlinktest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmconflict.at:353"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_285
+#AT_START_286
+at_fn_group_banner 286 'rpmconflict.at:375' \
+  "replacing symlink with directory" "               " 14
+at_xfail=no
+(
+  $as_echo "286. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:377:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+rm -rf \"\${TOPDIR}\"
+rm -rf \"\${RPMTEST}\"/usr/{share,lib}/symlinktest*
+
+runroot rpmbuild --quiet -bb \\
+    --define \"rel 1\" --with symlink /data/SPECS/symlinktest.spec
+runroot rpmbuild --quiet -bb \\
+    --define \"rel 2\" --without symlink /data/SPECS/symlinktest.spec
+
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-2.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:377"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+rm -rf "${TOPDIR}"
+rm -rf "${RPMTEST}"/usr/{share,lib}/symlinktest*
+
+runroot rpmbuild --quiet -bb \
+    --define "rel 1" --with symlink /data/SPECS/symlinktest.spec
+runroot rpmbuild --quiet -bb \
+    --define "rel 2" --without symlink /data/SPECS/symlinktest.spec
+
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-1.noarch.rpm
+runroot rpm -U /build/RPMS/noarch/symlinktest-1.0-2.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /usr/share/symlinktest from install of symlinktest-1.0-2.noarch conflicts with file from package symlinktest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmconflict.at:377"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_286
+#AT_START_287
+at_fn_group_banner 287 'rpmconflict.at:400' \
+  "real file with shared ghost" "                    " 14
+at_xfail=no
+(
+  $as_echo "287. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconflict.at:402:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+fn=\"\${RPMTEST}\"/usr/share/my.version
+rm -rf \"\${TOPDIR}\" \"\${fn}\"
+
+runroot rpmbuild --quiet -bb \\
+    --define \"pkg one\" --define \"filedata one\" \\
+    /data/SPECS/conflicttest.spec
+runroot rpmbuild --quiet -bb \\
+    --define \"pkg two\" --define \"filedata two\" --define \"fileattr %ghost\"\\
+    /data/SPECS/conflicttest.spec
+
+test ! -f \"\${fn}\" && echo OK
+runroot rpm -U \\
+    /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+cat \"\${fn}\"
+runroot rpm -e conflicttwo
+cat \"\${fn}\"
+runroot rpm -e conflictone
+test ! -f \"\${fn}\" && echo OK
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconflict.at:402"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+fn="${RPMTEST}"/usr/share/my.version
+rm -rf "${TOPDIR}" "${fn}"
+
+runroot rpmbuild --quiet -bb \
+    --define "pkg one" --define "filedata one" \
+    /data/SPECS/conflicttest.spec
+runroot rpmbuild --quiet -bb \
+    --define "pkg two" --define "filedata two" --define "fileattr %ghost"\
+    /data/SPECS/conflicttest.spec
+
+test ! -f "${fn}" && echo OK
+runroot rpm -U \
+    /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+cat "${fn}"
+runroot rpm -e conflicttwo
+cat "${fn}"
+runroot rpm -e conflictone
+test ! -f "${fn}" && echo OK
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "OK
+one
+one
+OK
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconflict.at:402"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_287
+#AT_START_288
+at_fn_group_banner 288 'rpmreplace.at:4' \
+  "upgrade to/from regular file" "                   " 15
+at_xfail=no
+(
+  $as_echo "288. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:6:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${tf}\" \"\${tf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata bar\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+cat \"\${tf}\"
+runroot rpm -U --oldpackage /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:6"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${tf}" "${tf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype file" \
+       --define "filedata bar" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+cat "${tf}"
+runroot rpm -U --oldpackage /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+bar
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:6"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_288
+#AT_START_289
+at_fn_group_banner 289 'rpmreplace.at:40' \
+  "upgrade regular file to/from broken link" "       " 15
+at_xfail=no
+(
+  $as_echo "289. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:42:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata stuff\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink \"\${tf}\"
+runroot rpm -U --oldpackage /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:42"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata stuff" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink "${tf}"
+runroot rpm -U --oldpackage /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+stuff
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:42"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_289
+#AT_START_290
+at_fn_group_banner 290 'rpmreplace.at:76' \
+  "upgrade regular file to/from file link" "         " 15
+at_xfail=no
+(
+  $as_echo "290. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:78:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata goo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink \"\${tf}\"
+runroot rpm -U --oldpackage /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:78"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata goo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink "${tf}"
+runroot rpm -U --oldpackage /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+goo
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:78"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_290
+#AT_START_291
+at_fn_group_banner 291 'rpmreplace.at:112' \
+  "upgrade broken link to broken link" "             " 15
+at_xfail=no
+(
+  $as_echo "291. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:114:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata stiff\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata stuff\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:114"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype link" \
+       --define "filedata stiff" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata stuff" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "stiff
+stuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:114"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_291
+#AT_START_292
+at_fn_group_banner 292 'rpmreplace.at:145' \
+  "upgrade file link to file link" "                 " 15
+at_xfail=no
+(
+  $as_echo "292. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:147:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata goo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata goo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:147"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype link" \
+       --define "filedata goo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata goo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "goo
+goo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:147"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_292
+#AT_START_293
+at_fn_group_banner 293 'rpmreplace.at:178' \
+  "upgrade directory link to directory link" "       " 15
+at_xfail=no
+(
+  $as_echo "293. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:180:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata zoo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata zoo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:180"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype link" \
+       --define "filedata zoo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata zoo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "zoo
+zoo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:180"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_293
+#AT_START_294
+at_fn_group_banner 294 'rpmreplace.at:211' \
+  "upgrade regular file to directory" "              " 15
+at_xfail=no
+(
+  $as_echo "294. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:213:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:213"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:213"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_294
+#AT_START_295
+at_fn_group_banner 295 'rpmreplace.at:242' \
+  "upgrade broken link to directory" "               " 15
+at_xfail=no
+(
+  $as_echo "295. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:244:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata other\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:244"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype link" \
+       --define "filedata other" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "other
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:244"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_295
+#AT_START_296
+at_fn_group_banner 296 'rpmreplace.at:273' \
+  "upgrade file link to directory" "                 " 15
+at_xfail=no
+(
+  $as_echo "296. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:275:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata goo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:275"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype link" \
+       --define "filedata goo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "goo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:275"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_296
+#AT_START_297
+at_fn_group_banner 297 'rpmreplace.at:304' \
+  "upgrade directory link to directory" "            " 15
+at_xfail=no
+(
+  $as_echo "297. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:306:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata zoo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink \"\${tf}\"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:306"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype link" \
+       --define "filedata zoo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /opt/foo from install of replacetest-2.0-1.noarch conflicts with file from package replacetest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "zoo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmreplace.at:306"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_297
+#AT_START_298
+at_fn_group_banner 298 'rpmreplace.at:335' \
+  "upgrade empty directory to empty directory" "     " 15
+at_xfail=no
+(
+  $as_echo "298. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:337:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d \"\${tf}\" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:337"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:337"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_298
+#AT_START_299
+at_fn_group_banner 299 'rpmreplace.at:363' \
+  "upgrade empty directory to regular file" "        " 15
+at_xfail=no
+(
+  $as_echo "299. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:365:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata woot\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d \"\${tf}\" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:365"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype file" \
+       --define "filedata woot" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /opt/foo from install of replacetest-2.0-1.noarch conflicts with file from package replacetest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmreplace.at:365"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_299
+#AT_START_300
+at_fn_group_banner 300 'rpmreplace.at:392' \
+  "upgrade locally symlinked directory" "            " 15
+at_xfail=no
+(
+  $as_echo "300. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:394:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype datadir\" \\
+       --define \"filedata README1\" \\
+       --define \"user \$(id -u -n)\" \\
+       --define \"grp \$(id -g -n)\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype datadir\" \\
+       --define \"filedata README2\" \\
+       --define \"user \$(id -u -n)\" \\
+       --define \"grp \$(id -g -n)\" \\
+          /data/SPECS/replacetest.spec
+
+mkdir \"\${RPMTEST}\"/opt/f00f
+ln -s f00f \"\${RPMTEST}\"/opt/foo
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -L \"\${tf}\" && test -d \"\${tf}\" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -L \"\${tf}\" && test -d \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:394"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype datadir" \
+       --define "filedata README1" \
+       --define "user $(id -u -n)" \
+       --define "grp $(id -g -n)" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype datadir" \
+       --define "filedata README2" \
+       --define "user $(id -u -n)" \
+       --define "grp $(id -g -n)" \
+          /data/SPECS/replacetest.spec
+
+mkdir "${RPMTEST}"/opt/f00f
+ln -s f00f "${RPMTEST}"/opt/foo
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -L "${tf}" && test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -L "${tf}" && test -d "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:394"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_300
+#AT_START_301
+at_fn_group_banner 301 'rpmreplace.at:428' \
+  "upgrade invalid locally symlinked directory" "    " 15
+at_xfail=no
+(
+  $as_echo "301. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:430:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype datadir\" \\
+       --define \"filedata README1\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype datadir\" \\
+       --define \"filedata README2\" \\
+          /data/SPECS/replacetest.spec
+
+mkdir \"\${RPMTEST}\"/opt/f00f
+ln -s f00f \"\${RPMTEST}\"/opt/foo
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -L \"\${tf}\" && test -d \"\${tf}\" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:430"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype datadir" \
+       --define "filedata README1" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype datadir" \
+       --define "filedata README2" \
+          /data/SPECS/replacetest.spec
+
+mkdir "${RPMTEST}"/opt/f00f
+ln -s f00f "${RPMTEST}"/opt/foo
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -L "${tf}" && test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+test -d "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:430"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_301
+#AT_START_302
+at_fn_group_banner 302 'rpmreplace.at:460' \
+  "upgrade empty directory to broken link" "         " 15
+at_xfail=no
+(
+  $as_echo "302. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:462:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata woot\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d \"\${tf}\" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:462"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata woot" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /opt/foo from install of replacetest-2.0-1.noarch conflicts with file from package replacetest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmreplace.at:462"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_302
+#AT_START_303
+at_fn_group_banner 303 'rpmreplace.at:489' \
+  "upgrade empty directory to file link" "           " 15
+at_xfail=no
+(
+  $as_echo "303. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:491:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata woot\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d \"\${tf}\" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:491"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata woot" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "        file /opt/foo from install of replacetest-2.0-1.noarch conflicts with file from package replacetest-1.0-1.noarch
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/rpmreplace.at:491"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_303
+#AT_START_304
+at_fn_group_banner 304 'rpmreplace.at:518' \
+  "upgrade removed empty directory to file link" "   " 15
+at_xfail=no
+(
+  $as_echo "304. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:520:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata goo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d \"\${tf}\" && rmdir \"\${tf}\" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:520"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata goo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && rmdir "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "goo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:520"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_304
+#AT_START_305
+at_fn_group_banner 305 'rpmreplace.at:548' \
+  "upgrade replaced empty directory to file link" "  " 15
+at_xfail=no
+(
+  $as_echo "305. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:550:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata goo\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d \"\${tf}\" && rmdir \"\${tf}\" && ln -sf goo \"\${tf}\" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:550"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata goo" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && rmdir "${tf}" && ln -sf goo "${tf}" && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "goo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:550"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_305
+#AT_START_306
+at_fn_group_banner 306 'rpmreplace.at:578' \
+  "upgrade empty directory to file link with pretrans" "" 15
+at_xfail=no
+(
+  $as_echo "306. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmreplace.at:580:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+tf=\"\${RPMTEST}\"/opt/foo
+rm -rf \"\${RPMTEST}\"/opt/*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata goo\" \\
+       --define \"fixit posix.rmdir('/opt/foo')\" \\
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d \"\${tf}\" && runroot rpm -U --test /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink \"\${tf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmreplace.at:580"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype dir" \
+          /data/SPECS/replacetest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata goo" \
+       --define "fixit posix.rmdir('/opt/foo')" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+test -d "${tf}" && runroot rpm -U --test /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm && runroot rpm -U /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+readlink "${tf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "goo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmreplace.at:580"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_306
+#AT_START_307
+at_fn_group_banner 307 'rpmconfig.at:6' \
+  "install config on existiting file" "              " 16
+at_xfail=no
+(
+  $as_echo "307. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:8:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+echo \"otherstuff\" > \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -e configtest
+cat \"\${cf}.rpmorig\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:8"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+echo "otherstuff" > "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -e configtest
+cat "${cf}.rpmorig"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmorig
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:8"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_307
+#AT_START_308
+at_fn_group_banner 308 'rpmconfig.at:35' \
+  "install config(noreplace) on existing file" "     " 16
+at_xfail=no
+(
+  $as_echo "308. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:37:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+
+echo \"otherstuff\" > \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+cat \"\${cf}.rpmnew\"
+runroot rpm -e configtest
+cat \"\${cf}.rpmsave\"
+cat \"\${cf}.rpmnew\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:37"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+
+echo "otherstuff" > "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+cat "${cf}.rpmnew"
+runroot rpm -e configtest
+cat "${cf}.rpmsave"
+cat "${cf}.rpmnew"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf created as /etc/my.conf.rpmnew
+warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "otherstuff
+foo
+otherstuff
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:37"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_308
+#AT_START_309
+at_fn_group_banner 309 'rpmconfig.at:70' \
+  "install config on existiting identical file" "    " 16
+at_xfail=no
+(
+  $as_echo "309. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:72:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+echo \"foo\" > \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -e configtest
+test ! -f \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:72"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+echo "foo" > "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -e configtest
+test ! -f "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:72"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_309
+#AT_START_310
+at_fn_group_banner 310 'rpmconfig.at:97' \
+  "erase unchanged config" "                         " 16
+at_xfail=no
+(
+  $as_echo "310. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:99:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -e configtest
+test ! -f \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:99"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -e configtest
+test ! -f "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:99"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_310
+#AT_START_311
+at_fn_group_banner 311 'rpmconfig.at:123' \
+  "erase changed config" "                           " 16
+at_xfail=no
+(
+  $as_echo "311. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:125:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${cf}\"
+runroot rpm -e configtest
+cat \"\${cf}.rpmsave\"
+test ! -f \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:125"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${cf}"
+runroot rpm -e configtest
+cat "${cf}.rpmsave"
+test ! -f "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:125"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_311
+#AT_START_312
+at_fn_group_banner 312 'rpmconfig.at:153' \
+  "erase changed config(noreplace)" "                " 16
+at_xfail=no
+(
+  $as_echo "312. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:155:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${cf}\"
+runroot rpm -e configtest
+cat \"\${cf}.rpmsave\"
+test ! -f \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:155"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${cf}"
+runroot rpm -e configtest
+cat "${cf}.rpmsave"
+test ! -f "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:155"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_312
+#AT_START_313
+at_fn_group_banner 313 'rpmconfig.at:185' \
+  "upgrade unchanged config" "                       " 16
+at_xfail=no
+(
+  $as_echo "313. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:187:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:187"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:187"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_313
+#AT_START_314
+at_fn_group_banner 314 'rpmconfig.at:215' \
+  "upgrade unchanged config - touching test" "       " 16
+at_xfail=no
+(
+  $as_echo "314. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:217:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -Uvv --fsmdebug /build/RPMS/noarch/configtest-2.0-1.noarch.rpm > output.txt 2>&1
+grep -c  \"touch\" output.txt
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:217"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -Uvv --fsmdebug /build/RPMS/noarch/configtest-2.0-1.noarch.rpm > output.txt 2>&1
+grep -c  "touch" output.txt
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:217"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_314
+#AT_START_315
+at_fn_group_banner 315 'rpmconfig.at:243' \
+  "upgrade modified config" "                        " 16
+at_xfail=no
+(
+  $as_echo "315. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:245:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${cf}\"
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:245"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${cf}"
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:245"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_315
+#AT_START_316
+at_fn_group_banner 316 'rpmconfig.at:276' \
+  "upgrade changing config" "                        " 16
+at_xfail=no
+(
+  $as_echo "316. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:278:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:278"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:278"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_316
+#AT_START_317
+at_fn_group_banner 317 'rpmconfig.at:306' \
+  "upgrade changing, modified config 1" "            " 16
+at_xfail=no
+(
+  $as_echo "317. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:308:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${RPMTEST}\"/etc/my.conf
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+cat \"\${cf}.rpmsave\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:308"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${RPMTEST}"/etc/my.conf
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+cat "${cf}.rpmsave"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+otherstuff
+foo-2.0
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:308"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_317
+#AT_START_318
+at_fn_group_banner 318 'rpmconfig.at:342' \
+  "upgrade changing, modified config 2" "            " 16
+at_xfail=no
+(
+  $as_echo "318. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:344:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"foo-2.0\" > \"\${RPMTEST}\"/etc/my.conf
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:344"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "foo-2.0" > "${RPMTEST}"/etc/my.conf
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:344"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_318
+#AT_START_319
+at_fn_group_banner 319 'rpmconfig.at:377' \
+  "upgrade unchanged config(noreplace)" "            " 16
+at_xfail=no
+(
+  $as_echo "319. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:379:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:379"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:379"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_319
+#AT_START_320
+at_fn_group_banner 320 'rpmconfig.at:409' \
+  "upgrade modified config(noreplace)" "             " 16
+at_xfail=no
+(
+  $as_echo "320. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:411:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${cf}\"
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:411"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${cf}"
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:411"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_320
+#AT_START_321
+at_fn_group_banner 321 'rpmconfig.at:443' \
+  "upgrade changing config(noreplace)" "             " 16
+at_xfail=no
+(
+  $as_echo "321. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:445:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:445"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:445"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_321
+#AT_START_322
+at_fn_group_banner 322 'rpmconfig.at:474' \
+  "upgrade changing, modified config(noreplace) 1" " " 16
+at_xfail=no
+(
+  $as_echo "322. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:476:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${RPMTEST}\"/etc/my.conf
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+cat \"\${cf}.rpmnew\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:476"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${RPMTEST}"/etc/my.conf
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+cat "${cf}.rpmnew"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf created as /etc/my.conf.rpmnew
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+otherstuff
+otherstuff
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:476"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_322
+#AT_START_323
+at_fn_group_banner 323 'rpmconfig.at:511' \
+  "upgrade changing, modified config(noreplace) 2" " " 16
+at_xfail=no
+(
+  $as_echo "323. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:513:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"foo-2.0\" > \"\${RPMTEST}\"/etc/my.conf
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:513"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "foo-2.0" > "${RPMTEST}"/etc/my.conf
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:513"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_323
+#AT_START_324
+at_fn_group_banner 324 'rpmconfig.at:546' \
+  "upgrade unchanged shared config" "                " 16
+at_xfail=no
+(
+  $as_echo "324. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:548:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:548"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:548"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_324
+#AT_START_325
+at_fn_group_banner 325 'rpmconfig.at:584' \
+  "upgrade modified shared config" "                 " 16
+at_xfail=no
+(
+  $as_echo "325. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:586:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${cf}\"
+cat \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:586"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${cf}"
+cat "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:586"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_325
+#AT_START_326
+at_fn_group_banner 326 'rpmconfig.at:624' \
+  "upgrade changing shared config" "                 " 16
+at_xfail=no
+(
+  $as_echo "326. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:626:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:626"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:626"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_326
+#AT_START_327
+at_fn_group_banner 327 'rpmconfig.at:661' \
+  "upgrade changing, modified shared config 1" "     " 16
+at_xfail=no
+(
+  $as_echo "327. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:663:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${RPMTEST}\"/etc/my.conf
+cat \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat \"\${cf}\"
+cat \"\${cf}.rpmsave\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:663"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${RPMTEST}"/etc/my.conf
+cat "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat "${cf}"
+cat "${cf}.rpmsave"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+otherstuff
+foo-2.0
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:663"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_327
+#AT_START_328
+at_fn_group_banner 328 'rpmconfig.at:704' \
+  "upgrade changing, modified shared config 2" "     " 16
+at_xfail=no
+(
+  $as_echo "328. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:706:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"foo-2.0\" > \"\${RPMTEST}\"/etc/my.conf
+cat \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:706"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat "${cf}"
+echo "foo-2.0" > "${RPMTEST}"/etc/my.conf
+cat "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:706"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_328
+#AT_START_329
+at_fn_group_banner 329 'rpmconfig.at:745' \
+  "upgrade changing, modified shared config(noreplace) 1" "" 16
+at_xfail=no
+(
+  $as_echo "329. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:747:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+           --define \"noreplace 1\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${RPMTEST}\"/etc/my.conf
+cat \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat \"\${cf}\"
+cat \"\${cf}.rpmnew\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:747"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+           --define "noreplace 1" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${RPMTEST}"/etc/my.conf
+cat "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat "${cf}"
+cat "${cf}.rpmnew"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf created as /etc/my.conf.rpmnew
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+otherstuff
+otherstuff
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:747"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_329
+#AT_START_330
+at_fn_group_banner 330 'rpmconfig.at:789' \
+  "upgrade changing, modified shared config(noreplace) 2" "" 16
+at_xfail=no
+(
+  $as_echo "330. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:791:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+           --define \"noreplace 1\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"foo-2.0\" > \"\${RPMTEST}\"/etc/my.conf
+cat \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:791"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+           --define "noreplace 1" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+cat "${cf}"
+echo "foo-2.0" > "${RPMTEST}"/etc/my.conf
+cat "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:791"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_330
+#AT_START_331
+at_fn_group_banner 331 'rpmconfig.at:830' \
+  "install/upgrade/erase ghost config" "             " 16
+at_xfail=no
+(
+  $as_echo "331. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig.at:832:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in 1.0 2.0; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \${v}\" \\
+        --define \"filetype file\" \\
+        --define \"filedata buster\" \\
+        --define \"fileattr %ghost\" \\
+          /data/SPECS/configtest.spec
+done
+
+# pre-existing config, install, erase
+test ! -f \"\${cf}\" && echo OK1
+echo \"keaton\" > \"\${cf}\"
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -e configtest
+cat \"\${cf}\"
+rm -f \"\${cf}\"
+
+# post-install config, upgrade, erase
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+test ! -f \"\${cf}\" && echo OK2
+echo \"buster\" > \"\${cf}\"
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -e configtest
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig.at:832"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in 1.0 2.0; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver ${v}" \
+        --define "filetype file" \
+        --define "filedata buster" \
+        --define "fileattr %ghost" \
+          /data/SPECS/configtest.spec
+done
+
+# pre-existing config, install, erase
+test ! -f "${cf}" && echo OK1
+echo "keaton" > "${cf}"
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -e configtest
+cat "${cf}"
+rm -f "${cf}"
+
+# post-install config, upgrade, erase
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+test ! -f "${cf}" && echo OK2
+echo "buster" > "${cf}"
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -e configtest
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "OK1
+keaton
+keaton
+keaton
+OK2
+buster
+buster
+buster
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig.at:832"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_331
+#AT_START_332
+at_fn_group_banner 332 'rpmconfig2.at:6' \
+  "install config on existiting symlink" "           " 17
+at_xfail=no
+(
+  $as_echo "332. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:8:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+
+ln -s \"otherstuff\" \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -e configtest
+readlink \"\${cf}.rpmorig\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:8"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+
+ln -s "otherstuff" "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -e configtest
+readlink "${cf}.rpmorig"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmorig
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:8"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_332
+#AT_START_333
+at_fn_group_banner 333 'rpmconfig2.at:36' \
+  "install config on existiting identical link" "    " 17
+at_xfail=no
+(
+  $as_echo "333. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:38:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+
+ln -s \"foo\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -e configtest
+test ! -L \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:38"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+
+ln -s "foo" "${cf}"
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -e configtest
+test ! -L "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:38"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_333
+#AT_START_334
+at_fn_group_banner 334 'rpmconfig2.at:66' \
+  "erase unchanged config link" "                    " 17
+at_xfail=no
+(
+  $as_echo "334. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:68:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -e configtest
+test ! -L \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:68"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -e configtest
+test ! -L "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:68"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_334
+#AT_START_335
+at_fn_group_banner 335 'rpmconfig2.at:93' \
+  "erase changed config link" "                      " 17
+at_xfail=no
+(
+  $as_echo "335. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:95:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filedata foo\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"otherstuff\" \"\${cf}\"
+runroot rpm -e configtest
+readlink \"\${cf}.rpmsave\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:95"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filedata foo" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "otherstuff" "${cf}"
+runroot rpm -e configtest
+readlink "${cf}.rpmsave"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:95"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_335
+#AT_START_336
+at_fn_group_banner 336 'rpmconfig2.at:124' \
+  "upgrade unchanged config link" "                  " 17
+at_xfail=no
+(
+  $as_echo "336. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:126:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:126"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:126"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_336
+#AT_START_337
+at_fn_group_banner 337 'rpmconfig2.at:155' \
+  "upgrade unchanged config link - touching test" "  " 17
+at_xfail=no
+(
+  $as_echo "337. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:157:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -Uvv --fsmdebug /build/RPMS/noarch/configtest-2.0-1.noarch.rpm > output.txt 2>&1
+grep -c  \"touch\" output.txt
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:157"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+runroot rpm -Uvv --fsmdebug /build/RPMS/noarch/configtest-2.0-1.noarch.rpm > output.txt 2>&1
+grep -c  "touch" output.txt
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:157"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_337
+#AT_START_338
+at_fn_group_banner 338 'rpmconfig2.at:185' \
+  "upgrade modified config link" "                   " 17
+at_xfail=no
+(
+  $as_echo "338. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:187:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"otherstuff\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:187"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "otherstuff" "${cf}"
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:187"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_338
+#AT_START_339
+at_fn_group_banner 339 'rpmconfig2.at:219' \
+  "upgrade changing config link" "                   " 17
+at_xfail=no
+(
+  $as_echo "339. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:221:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:221"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:221"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_339
+#AT_START_340
+at_fn_group_banner 340 'rpmconfig2.at:250' \
+  "upgrade changing, modified config link 1" "       " 17
+at_xfail=no
+(
+  $as_echo "340. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:252:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"otherstuff\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+readlink \"\${cf}.rpmsave\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:252"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "otherstuff" "${cf}"
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+readlink "${cf}.rpmsave"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+otherstuff
+foo-2.0
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:252"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_340
+#AT_START_341
+at_fn_group_banner 341 'rpmconfig2.at:287' \
+  "upgrade changing, modified config link 2" "       " 17
+at_xfail=no
+(
+  $as_echo "341. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:289:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+       --define \"filetype link\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"foo-2.0\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:289"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+       --define "filetype link" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "foo-2.0" "${cf}"
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:289"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_341
+#AT_START_342
+at_fn_group_banner 342 'rpmconfig2.at:323' \
+  "upgrade unchanged config(noreplace) link" "       " 17
+at_xfail=no
+(
+  $as_echo "342. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:325:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+       --define \"filetype link\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:325"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+       --define "filetype link" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:325"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_342
+#AT_START_343
+at_fn_group_banner 343 'rpmconfig2.at:356' \
+  "upgrade modified config(noreplace) link" "        " 17
+at_xfail=no
+(
+  $as_echo "343. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:358:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo\" \\
+       --define \"filetype link\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"otherstuff\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:358"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo" \
+       --define "filetype link" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "otherstuff" "${cf}"
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:358"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_343
+#AT_START_344
+at_fn_group_banner 344 'rpmconfig2.at:391' \
+  "upgrade changing config(noreplace) link" "        " 17
+at_xfail=no
+(
+  $as_echo "344. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:393:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+       --define \"filetype link\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:393"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+       --define "filetype link" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:393"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_344
+#AT_START_345
+at_fn_group_banner 345 'rpmconfig2.at:423' \
+  "upgrade changing, modified config(noreplace) link 1" "" 17
+at_xfail=no
+(
+  $as_echo "345. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:425:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+       --define \"filetype link\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"otherstuff\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+readlink \"\${cf}.rpmnew\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:425"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+       --define "filetype link" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "otherstuff" "${cf}"
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+readlink "${cf}.rpmnew"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf created as /etc/my.conf.rpmnew
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+otherstuff
+otherstuff
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:425"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_345
+#AT_START_346
+at_fn_group_banner 346 'rpmconfig2.at:461' \
+  "upgrade changing, modified config(noreplace) link 2" "" 17
+at_xfail=no
+(
+  $as_echo "346. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:463:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for v in \"1.0\" \"2.0\"; do
+    runroot rpmbuild --quiet -bb \\
+        --define \"ver \$v\" \\
+       --define \"filedata foo-\$v\" \\
+       --define \"filetype link\" \\
+       --define \"noreplace 1\" \\
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"foo-2.0\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+test ! -L \"\${cf}.rpmnew\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:463"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filedata foo-$v" \
+       --define "filetype link" \
+       --define "noreplace 1" \
+          /data/SPECS/configtest.spec
+done
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "foo-2.0" "${cf}"
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+test ! -L "${cf}.rpmnew"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:463"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_346
+#AT_START_347
+at_fn_group_banner 347 'rpmconfig2.at:498' \
+  "upgrade unchanged shared config link" "           " 17
+at_xfail=no
+(
+  $as_echo "347. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:500:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo\" \\
+           --define \"filetype link\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:500"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo" \
+           --define "filetype link" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:500"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_347
+#AT_START_348
+at_fn_group_banner 348 'rpmconfig2.at:537' \
+  "upgrade modified shared config link" "            " 17
+at_xfail=no
+(
+  $as_echo "348. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:539:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo\" \\
+           --define \"filetype link\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"otherstuff\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:539"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo" \
+           --define "filetype link" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "otherstuff" "${cf}"
+readlink "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:539"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_348
+#AT_START_349
+at_fn_group_banner 349 'rpmconfig2.at:578' \
+  "upgrade changing shared config link" "            " 17
+at_xfail=no
+(
+  $as_echo "349. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:580:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+           --define \"filetype link\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:580"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+           --define "filetype link" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:580"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_349
+#AT_START_350
+at_fn_group_banner 350 'rpmconfig2.at:616' \
+  "upgrade changing, modified shared config link 1" "" 17
+at_xfail=no
+(
+  $as_echo "350. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:618:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+           --define \"filetype link\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"otherstuff\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+readlink \"\${cf}.rpmsave\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:618"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+           --define "filetype link" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "otherstuff" "${cf}"
+readlink "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink "${cf}"
+readlink "${cf}.rpmsave"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+otherstuff
+foo-2.0
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:618"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_350
+#AT_START_351
+at_fn_group_banner 351 'rpmconfig2.at:660' \
+  "upgrade changing, modified shared config link 2" "" 17
+at_xfail=no
+(
+  $as_echo "351. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:662:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+           --define \"filetype link\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"foo-2.0\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:662"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+           --define "filetype link" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "foo-2.0" "${cf}"
+readlink "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:662"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_351
+#AT_START_352
+at_fn_group_banner 352 'rpmconfig2.at:702' \
+  "upgrade changing, modified shared config(noreplace) link 1" "" 17
+at_xfail=no
+(
+  $as_echo "352. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:704:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+           --define \"filetype link\" \\
+           --define \"noreplace 1\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"otherstuff\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+readlink \"\${cf}.rpmnew\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:704"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+           --define "filetype link" \
+           --define "noreplace 1" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "otherstuff" "${cf}"
+readlink "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink "${cf}"
+readlink "${cf}.rpmnew"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf created as /etc/my.conf.rpmnew
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+otherstuff
+otherstuff
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:704"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_352
+#AT_START_353
+at_fn_group_banner 353 'rpmconfig2.at:747' \
+  "upgrade changing, modified shared config(noreplace) link 2" "" 17
+at_xfail=no
+(
+  $as_echo "353. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig2.at:749:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+for s in \"A\" \"B\"; do
+    for v in \"1.0\" \"2.0\"; do
+        runroot rpmbuild --quiet -bb \\
+            --define \"sub \$s\" \\
+            --define \"ver \$v\" \\
+           --define \"filedata foo-\$v\" \\
+           --define \"filetype link\" \\
+           --define \"noreplace 1\" \\
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"foo-2.0\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U \\
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \\
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+test ! -L \"\${cf}.rpmnew\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig2.at:749"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+for s in "A" "B"; do
+    for v in "1.0" "2.0"; do
+        runroot rpmbuild --quiet -bb \
+            --define "sub $s" \
+            --define "ver $v" \
+           --define "filedata foo-$v" \
+           --define "filetype link" \
+           --define "noreplace 1" \
+              /data/SPECS/configtest.spec
+    done
+done
+
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-1.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "foo-2.0" "${cf}"
+readlink "${cf}"
+runroot rpm -U \
+    /build/RPMS/noarch/configtest-A-2.0-1.noarch.rpm \
+    /build/RPMS/noarch/configtest-B-2.0-1.noarch.rpm
+readlink "${cf}"
+test ! -L "${cf}.rpmnew"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0
+foo-2.0
+foo-2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig2.at:749"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_353
+#AT_START_354
+at_fn_group_banner 354 'rpmconfig3.at:6' \
+  "upgrade config to/from non-config" "              " 18
+at_xfail=no
+(
+  $as_echo "354. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig3.at:8:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata bar\" \\
+       --define \"noconfig 1\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig3.at:8"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype file" \
+       --define "filedata bar" \
+       --define "noconfig 1" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+bar
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig3.at:8"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_354
+#AT_START_355
+at_fn_group_banner 355 'rpmconfig3.at:44' \
+  "upgrade modified config to/from non-config 1" "   " 18
+at_xfail=no
+(
+  $as_echo "355. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig3.at:46:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata bar\" \\
+       --define \"noconfig 1\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${cf}\"
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+cat \"\${cf}.rpmsave\"
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig3.at:46"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype file" \
+       --define "filedata bar" \
+       --define "noconfig 1" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${cf}"
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+cat "${cf}.rpmsave"
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+bar
+otherstuff
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig3.at:46"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_355
+#AT_START_356
+at_fn_group_banner 356 'rpmconfig3.at:88' \
+  "upgrade modified config to/from non-config 2" "   " 18
+at_xfail=no
+(
+  $as_echo "356. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig3.at:90:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata bar\" \\
+       --define \"noconfig 1\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"bar\" > \"\${cf}\"
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig3.at:90"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype file" \
+       --define "filedata bar" \
+       --define "noconfig 1" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "bar" > "${cf}"
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+bar
+bar
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig3.at:90"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_356
+#AT_START_357
+at_fn_group_banner 357 'rpmconfig3.at:129' \
+  "upgrade config to/from config link" "             " 18
+at_xfail=no
+(
+  $as_echo "357. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig3.at:131:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata bar\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig3.at:131"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata bar" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+runroot rpm -U --oldpackage /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+bar
+foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig3.at:131"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_357
+#AT_START_358
+at_fn_group_banner 358 'rpmconfig3.at:166' \
+  "upgrade modified config to config link" "         " 18
+at_xfail=no
+(
+  $as_echo "358. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig3.at:168:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata bar\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${cf}\"
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink \"\${cf}\"
+cat \"\${cf}.rpmsave\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig3.at:168"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype link" \
+       --define "filedata bar" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${cf}"
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+readlink "${cf}"
+cat "${cf}.rpmsave"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+bar
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig3.at:168"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_358
+#AT_START_359
+at_fn_group_banner 359 'rpmconfig3.at:206' \
+  "upgrade modified config link to config" "         " 18
+at_xfail=no
+(
+  $as_echo "359. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig3.at:208:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype link\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata bar\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink \"\${cf}\"
+ln -sf \"otherstuff\" \"\${cf}\"
+readlink \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat \"\${cf}\"
+readlink \"\${cf}.rpmsave\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig3.at:208"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype link" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype file" \
+       --define "filedata bar" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+readlink "${cf}"
+ln -sf "otherstuff" "${cf}"
+readlink "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+cat "${cf}"
+readlink "${cf}.rpmsave"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+bar
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig3.at:208"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_359
+#AT_START_360
+at_fn_group_banner 360 'rpmconfig3.at:246' \
+  "upgrade config to directory" "                    " 18
+at_xfail=no
+(
+  $as_echo "360. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig3.at:248:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+test -d \"\${cf}\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig3.at:248"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype dir" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+test -d "${cf}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig3.at:248"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_360
+#AT_START_361
+at_fn_group_banner 361 'rpmconfig3.at:278' \
+  "upgrade modified config to directory" "           " 18
+at_xfail=no
+(
+  $as_echo "361. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmconfig3.at:280:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+cf=\"\${RPMTEST}\"/etc/my.conf
+rm -rf \"\${cf}\" \"\${cf}\".rpm*
+rm -rf \"\${TOPDIR}\"
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 1.0\" \\
+       --define \"filetype file\" \\
+       --define \"filedata foo\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \\
+        --define \"ver 2.0\" \\
+       --define \"filetype dir\" \\
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat \"\${cf}\"
+echo \"otherstuff\" > \"\${cf}\"
+cat \"\${cf}\"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+test -d \"\${cf}\"
+cat \"\${cf}.rpmsave\"
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmconfig3.at:280"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+cf="${RPMTEST}"/etc/my.conf
+rm -rf "${cf}" "${cf}".rpm*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/configtest.spec
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 2.0" \
+       --define "filetype dir" \
+          /data/SPECS/configtest.spec
+
+runroot rpm -U /build/RPMS/noarch/configtest-1.0-1.noarch.rpm
+cat "${cf}"
+echo "otherstuff" > "${cf}"
+cat "${cf}"
+runroot rpm -U /build/RPMS/noarch/configtest-2.0-1.noarch.rpm
+test -d "${cf}"
+cat "${cf}.rpmsave"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "warning: /etc/my.conf saved as /etc/my.conf.rpmsave
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+otherstuff
+otherstuff
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmconfig3.at:280"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_361
+#AT_START_362
+at_fn_group_banner 362 'rpmmacro.at:6' \
+  "simple rpm --eval" "                              " 19
+at_xfail=no
+(
+  $as_echo "362. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:8:
+runroot rpm --define \"this that\" --eval '%{this}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:8"
+( $at_check_trace;
+runroot rpm --define "this that" --eval '%{this}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "that
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:8"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_362
+#AT_START_363
+at_fn_group_banner 363 'rpmmacro.at:17' \
+  "invalid rpm --eval" "                             " 19
+at_xfail=no
+(
+  $as_echo "363. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:19:
+runroot rpm --eval '%define _ that'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:19"
+( $at_check_trace;
+runroot rpm --eval '%define _ that'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Macro %_ has illegal name (%define)
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmmacro.at:19"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_363
+#AT_START_364
+at_fn_group_banner 364 'rpmmacro.at:29' \
+  "invalid rpm --define" "                           " 19
+at_xfail=no
+(
+  $as_echo "364. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:31:
+runroot rpm --define \"_ that\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:31"
+( $at_check_trace;
+runroot rpm --define "_ that"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: Macro %_ has illegal name (%define)
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmmacro.at:31"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_364
+#AT_START_365
+at_fn_group_banner 365 'rpmmacro.at:40' \
+  "rpm --undefine" "                                 " 19
+at_xfail=no
+(
+  $as_echo "365. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:42:
+runroot rpm --define \"this that\" --eval '1. %{this}' --undefine 'this' --eval '2. %{this'}
+runroot rpm --eval '1. %{this}' --define \"this that\" --eval '2. %{this}' --undefine 'this' --eval '3. %{this'}
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:42"
+( $at_check_trace;
+runroot rpm --define "this that" --eval '1. %{this}' --undefine 'this' --eval '2. %{this'}
+runroot rpm --eval '1. %{this}' --define "this that" --eval '2. %{this}' --undefine 'this' --eval '3. %{this'}
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1. that
+2. %{this}
+1. %{this}
+2. that
+3. %{this}
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:42"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_365
+#AT_START_366
+at_fn_group_banner 366 'rpmmacro.at:55' \
+  "simple true conditional rpm --eval" "             " 19
+at_xfail=no
+(
+  $as_echo "366. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:57:
+runroot rpm --define \"this that\" --eval '%{?this}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:57"
+( $at_check_trace;
+runroot rpm --define "this that" --eval '%{?this}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "that
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:57"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_366
+#AT_START_367
+at_fn_group_banner 367 'rpmmacro.at:65' \
+  "simple false conditional rpm --eval" "            " 19
+at_xfail=no
+(
+  $as_echo "367. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:67:
+runroot rpm --define \"this that\" --eval '%{?that}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:67"
+( $at_check_trace;
+runroot rpm --define "this that" --eval '%{?that}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:67"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_367
+#AT_START_368
+at_fn_group_banner 368 'rpmmacro.at:75' \
+  "nested macro in name" "                           " 19
+at_xfail=no
+(
+  $as_echo "368. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:77:
+runroot rpm --define \"this that\" --define \"that_that foo\" --eval '%{expand:%{%{this}_that}}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:77"
+( $at_check_trace;
+runroot rpm --define "this that" --define "that_that foo" --eval '%{expand:%{%{this}_that}}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:77"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_368
+#AT_START_369
+at_fn_group_banner 369 'rpmmacro.at:85' \
+  "parametrized macro 1" "                           " 19
+at_xfail=no
+(
+  $as_echo "369. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:87:
+cat << EOF > \${abs_builddir}/testing/mtest
+%bar() bar
+%foo()\\\\
+%bar\\\\
+foo 1\\\\
+%{bar}\\\\
+foo 2\\\\
+%bar x\\\\
+foo 3\\\\
+%{bar x}\\\\
+foo 4\\\\
+%bar \\\\
+foo 5
+EOF
+
+runroot rpm --eval '%{load:mtest}%{foo}'
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmmacro.at:87"
+( $at_check_trace;
+cat << EOF > ${abs_builddir}/testing/mtest
+%bar() bar
+%foo()\\
+%bar\\
+foo 1\\
+%{bar}\\
+foo 2\\
+%bar x\\
+foo 3\\
+%{bar x}\\
+foo 4\\
+%bar \\
+foo 5
+EOF
+
+runroot rpm --eval '%{load:mtest}%{foo}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "
+bar
+foo 1
+bar
+foo 2
+bar
+foo 3
+bar
+foo 4
+bar
+foo 5
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:87"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_369
+#AT_START_370
+at_fn_group_banner 370 'rpmmacro.at:121' \
+  "parametrized macro 2" "                           " 19
+at_xfail=no
+(
+  $as_echo "370. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:123:
+runroot rpm \\
+    --define '%bar() \"Bar %#: %{?1} %{?2}\"' \\
+    --define '%foo() \"Foo %#: %{?1} %{?2}\" %bar a' \\
+    --eval '%foo 1 2'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:123"
+( $at_check_trace;
+runroot rpm \
+    --define '%bar() "Bar %#: %{?1} %{?2}"' \
+    --define '%foo() "Foo %#: %{?1} %{?2}" %bar a' \
+    --eval '%foo 1 2'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "\"Foo 2: 1 2\" \"Bar 1: a \"
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:123"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_370
+#AT_START_371
+at_fn_group_banner 371 'rpmmacro.at:134' \
+  "parametrized macro 3" "                           " 19
+at_xfail=no
+(
+  $as_echo "371. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:136:
+runroot rpm \\
+    --define '%foo() 1:%1 2:%2' \\
+    --eval '%foo %nil bar'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:136"
+( $at_check_trace;
+runroot rpm \
+    --define '%foo() 1:%1 2:%2' \
+    --eval '%foo %nil bar'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1:bar 2:%2
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:136"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_371
+#AT_START_372
+at_fn_group_banner 372 'rpmmacro.at:146' \
+  "parametrized macro 4" "                           " 19
+at_xfail=no
+(
+  $as_echo "372. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:148:
+runroot rpm \\
+    --define '%bar yyy' \\
+    --define '%foo() %1' \\
+    --eval '%foo %bar' \\
+    --eval '%foo %%bar'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:148"
+( $at_check_trace;
+runroot rpm \
+    --define '%bar yyy' \
+    --define '%foo() %1' \
+    --eval '%foo %bar' \
+    --eval '%foo %%bar'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "yyy
+%bar
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:148"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_372
+#AT_START_373
+at_fn_group_banner 373 'rpmmacro.at:161' \
+  "parametrized macro 5" "                           " 19
+at_xfail=no
+(
+  $as_echo "373. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:163:
+runroot rpm \\
+    --define '%foo() %#:%{?1:\"%1\"}%{?2: \"%2\"}' \\
+    --define 'bar zzz' \\
+    --eval '%foo 1' \\
+    --eval '%foo   2  ' \\
+    --eval '%foo 1 2' \\
+    --eval '%foo %{nil}' \\
+    --eval '%foo %{nil} xx' \\
+    --eval '%foo %{bar} xx' \\
+    --eval '%foo %{quote:   2 3  5} %{quote:%{nil}}' \\
+    --eval '%foo x%{quote:y}z 123' \\
+    --eval '%foo x%{quote:%{nil}}z' \\
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:163"
+( $at_check_trace;
+runroot rpm \
+    --define '%foo() %#:%{?1:"%1"}%{?2: "%2"}' \
+    --define 'bar zzz' \
+    --eval '%foo 1' \
+    --eval '%foo   2  ' \
+    --eval '%foo 1 2' \
+    --eval '%foo %{nil}' \
+    --eval '%foo %{nil} xx' \
+    --eval '%foo %{bar} xx' \
+    --eval '%foo %{quote:   2 3  5} %{quote:%{nil}}' \
+    --eval '%foo x%{quote:y}z 123' \
+    --eval '%foo x%{quote:%{nil}}z' \
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1:\"1\"
+1:\"2\"
+2:\"1\" \"2\"
+0:
+1:\"xx\"
+2:\"zzz\" \"xx\"
+2:\"   2 3  5\" \"\"
+2:\"xyz\" \"123\"
+1:\"xz\"
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:163"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_373
+#AT_START_374
+at_fn_group_banner 374 'rpmmacro.at:190' \
+  "uncompress macro" "                               " 19
+at_xfail=no
+(
+  $as_echo "374. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:192:
+runroot rpm \\
+    --define \"__gzip /my/bin/gzip\" \\
+    --eval \"%{uncompress:/data/SOURCES/hello-2.0.tar.gz}\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:192"
+( $at_check_trace;
+runroot rpm \
+    --define "__gzip /my/bin/gzip" \
+    --eval "%{uncompress:/data/SOURCES/hello-2.0.tar.gz}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/my/bin/gzip -dc /data/SOURCES/hello-2.0.tar.gz
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:192"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_374
+#AT_START_375
+at_fn_group_banner 375 'rpmmacro.at:202' \
+  "basename macro" "                                 " 19
+at_xfail=no
+(
+  $as_echo "375. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:204:
+runroot rpm \\
+    --eval \"%{basename:/data/SOURCES/hello-2.0.tar.gz}\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:204"
+( $at_check_trace;
+runroot rpm \
+    --eval "%{basename:/data/SOURCES/hello-2.0.tar.gz}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello-2.0.tar.gz
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:204"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_375
+#AT_START_376
+at_fn_group_banner 376 'rpmmacro.at:213' \
+  "shrink macro" "                                   " 19
+at_xfail=no
+(
+  $as_echo "376. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:215:
+runroot rpm \\
+    --eval \"%{shrink:  h e  l   lo  }\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:215"
+( $at_check_trace;
+runroot rpm \
+    --eval "%{shrink:  h e  l   lo  }"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "h e l lo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:215"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_376
+#AT_START_377
+at_fn_group_banner 377 'rpmmacro.at:224' \
+  "suffix macro" "                                   " 19
+at_xfail=no
+(
+  $as_echo "377. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:226:
+runroot rpm \\
+    --eval \"%{suffix:/data/SOURCES/hello-2.0.tar.gz}\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:226"
+( $at_check_trace;
+runroot rpm \
+    --eval "%{suffix:/data/SOURCES/hello-2.0.tar.gz}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "gz
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:226"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_377
+#AT_START_378
+at_fn_group_banner 378 'rpmmacro.at:235' \
+  "url2path macro" "                                 " 19
+at_xfail=no
+(
+  $as_echo "378. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:237:
+runroot rpm \\
+    --eval \"%{url2path:http://hello.org/releases/hello-2.0.tar.gz}\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:237"
+( $at_check_trace;
+runroot rpm \
+    --eval "%{url2path:http://hello.org/releases/hello-2.0.tar.gz}"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "/releases/hello-2.0.tar.gz
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:237"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_378
+#AT_START_379
+at_fn_group_banner 379 'rpmmacro.at:246' \
+  "shell expansion" "                                " 19
+at_xfail=no
+(
+  $as_echo "379. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:248:
+runroot rpm \\
+    --eval \"%(echo foo)\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:248"
+( $at_check_trace;
+runroot rpm \
+    --eval "%(echo foo)"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:248"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_379
+#AT_START_380
+at_fn_group_banner 380 'rpmmacro.at:257' \
+  "simple lua --eval" "                              " 19
+at_xfail=no
+(
+  $as_echo "380. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:259:
+runroot rpm --eval '%{lua:print(5*5)}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:259"
+( $at_check_trace;
+runroot rpm --eval '%{lua:print(5*5)}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "25
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:259"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_380
+#AT_START_381
+at_fn_group_banner 381 'rpmmacro.at:267' \
+  "lua rpm extensions" "                             " 19
+at_xfail=no
+(
+  $as_echo "381. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:269:
+runroot rpm --eval '%{lua: rpm.define(\"foo bar\") print(rpm.expand(\"%{foo}\"))}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:269"
+( $at_check_trace;
+runroot rpm --eval '%{lua: rpm.define("foo bar") print(rpm.expand("%{foo}"))}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "bar
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:269"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_381
+#AT_START_382
+at_fn_group_banner 382 'rpmmacro.at:277' \
+  "lua posix extensions" "                           " 19
+at_xfail=no
+(
+  $as_echo "382. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:279:
+runroot rpm \\
+  --eval '%{lua: posix.putenv(\"LUATEST=ok\") print(posix.getenv(\"LUATEST\"))}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:279"
+( $at_check_trace;
+runroot rpm \
+  --eval '%{lua: posix.putenv("LUATEST=ok") print(posix.getenv("LUATEST"))}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "ok
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:279"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_382
+#AT_START_383
+at_fn_group_banner 383 'rpmmacro.at:288' \
+  "lua script exit behavior" "                       " 19
+at_xfail=no
+(
+  $as_echo "383. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:290:
+runroot rpm \\
+  --eval '%{lua: os.exit()}))}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:290"
+( $at_check_trace;
+runroot rpm \
+  --eval '%{lua: os.exit()}))}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "error: lua script failed: [string \"<lua>\"]:1: exit not permitted in this context
+" | \
+  $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 1 $at_status "$at_srcdir/rpmmacro.at:290"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_383
+#AT_START_384
+at_fn_group_banner 384 'rpmmacro.at:300' \
+  "%define + %undefine in nested levels 1" "         " 19
+at_xfail=no
+(
+  $as_echo "384. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:302:
+# basic %define in nested scoping level
+runroot rpm \\
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand:%undefine xxx} %{echo:%xxx}' \\
+    --eval .'%foo'.
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:302"
+( $at_check_trace;
+# basic %define in nested scoping level
+runroot rpm \
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand:%undefine xxx} %{echo:%xxx}' \
+    --eval .'%foo'.
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+%xxx
+.   .
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:302"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_384
+#AT_START_385
+at_fn_group_banner 385 'rpmmacro.at:315' \
+  "%define + %undefine in nested levels 2" "         " 19
+at_xfail=no
+(
+  $as_echo "385. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:317:
+# %define macro once in a nested scope
+runroot rpm \\
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx}' \\
+    --eval .'%foo'. \\
+    --eval '%xxx'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:317"
+( $at_check_trace;
+# %define macro once in a nested scope
+runroot rpm \
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx}' \
+    --eval .'%foo'. \
+    --eval '%xxx'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+. .
+%xxx
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:317"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_385
+#AT_START_386
+at_fn_group_banner 386 'rpmmacro.at:331' \
+  "%define + %undefine in nested levels 3" "         " 19
+at_xfail=no
+      test $RPM_XFAIL -ne 0 && at_xfail=yes
+(
+  $as_echo "386. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:333:
+
+# %define macro twice in a nested scope
+runroot rpm \\
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %define xxx 2} %{echo:%xxx}' \\
+    --eval .'%foo'. \\
+    --eval '%xxx'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:333"
+( $at_check_trace;
+
+# %define macro twice in a nested scope
+runroot rpm \
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %define xxx 2} %{echo:%xxx}' \
+    --eval .'%foo'. \
+    --eval '%xxx'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+2
+.    .
+%xxx
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:333"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_386
+#AT_START_387
+at_fn_group_banner 387 'rpmmacro.at:349' \
+  "%define + %undefine in nested levels 4" "         " 19
+at_xfail=no
+      test $RPM_XFAIL -ne 0 && at_xfail=yes
+(
+  $as_echo "387. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:351:
+
+# %define in a nested level covered by %global
+runroot rpm \\
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %global xxx 2} %{echo:%xxx}' \\
+    --eval .'%foo'. \\
+    --eval '%xxx' \\
+    --eval .'%undefine xxx'. \\
+    --eval '%xxx'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:351"
+( $at_check_trace;
+
+# %define in a nested level covered by %global
+runroot rpm \
+    --define '%foo() %{expand:%define xxx 1} %{echo:%xxx} %{expand: %global xxx 2} %{echo:%xxx}' \
+    --eval .'%foo'. \
+    --eval '%xxx' \
+    --eval .'%undefine xxx'. \
+    --eval '%xxx'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1
+2
+.    .
+2
+..
+%xxx
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:351"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_387
+#AT_START_388
+at_fn_group_banner 388 'rpmmacro.at:371' \
+  "%define in conditional macro" "                   " 19
+at_xfail=no
+(
+  $as_echo "388. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:373:
+runroot rpm \\
+    --define 'dofoo() true'\\
+    --eval '.%{!?foo: %define foo bar}.'\\
+    --eval '%foo' \\
+    --eval '%dofoo'\\
+    --eval '%foo'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:373"
+( $at_check_trace;
+runroot rpm \
+    --define 'dofoo() true'\
+    --eval '.%{!?foo: %define foo bar}.'\
+    --eval '%foo' \
+    --eval '%dofoo'\
+    --eval '%foo'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo ". .
+bar
+true
+bar
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:373"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_388
+#AT_START_389
+at_fn_group_banner 389 'rpmmacro.at:389' \
+  "%verbose negative test" "                         " 19
+at_xfail=no
+(
+  $as_echo "389. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:391:
+runroot rpm \\
+  --eval '%{verbose:%{echo:is verbose}}' \\
+  --eval '%{verbose:is verbose text}'\\
+  --eval '%{!verbose:%{echo:is not verbose}}'\\
+  --eval '%{!verbose:is not verbose text}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:391"
+( $at_check_trace;
+runroot rpm \
+  --eval '%{verbose:%{echo:is verbose}}' \
+  --eval '%{verbose:is verbose text}'\
+  --eval '%{!verbose:%{echo:is not verbose}}'\
+  --eval '%{!verbose:is not verbose text}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "
+
+is not verbose
+
+is not verbose text
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:391"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_389
+#AT_START_390
+at_fn_group_banner 390 'rpmmacro.at:407' \
+  "%verbose positive test" "                         " 19
+at_xfail=no
+(
+  $as_echo "390. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmmacro.at:409:
+runroot rpm -v \\
+  --eval '%{!verbose:%{echo:is not verbose}}' \\
+  --eval '%{!verbose:is not verbose text}'\\
+  --eval '%{verbose:%{echo:is verbose}}'\\
+  --eval '%{verbose:is verbose text}'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "rpmmacro.at:409"
+( $at_check_trace;
+runroot rpm -v \
+  --eval '%{!verbose:%{echo:is not verbose}}' \
+  --eval '%{!verbose:is not verbose text}'\
+  --eval '%{verbose:%{echo:is verbose}}'\
+  --eval '%{verbose:is verbose text}'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "
+
+is verbose
+
+is verbose text
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmmacro.at:409"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_390
+#AT_START_391
+at_fn_group_banner 391 'rpmpython.at:6' \
+  "module import" "                                  " 20
+at_xfail=no
+(
+  $as_echo "391. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:6:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+myprint(rpm.__version__)
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:6"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+myprint(rpm.__version__)
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "4.14.1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:6"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_391
+#AT_START_392
+at_fn_group_banner 392 'rpmpython.at:12' \
+  "macro manipulation" "                             " 20
+at_xfail=no
+(
+  $as_echo "392. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:12:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+def prexp(m):
+    myprint(rpm.expandMacro('%%{?%s}' % m))
+
+mname = '__no_such_macro_yet'
+prexp(mname)
+rpm.addMacro(mname, '/bin/sh')
+prexp(mname)
+rpm.addMacro(mname, '/bin/false')
+prexp(mname)
+rpm.delMacro(mname)
+prexp(mname)
+rpm.delMacro(mname)
+prexp(mname)
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:12"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+def prexp(m):
+    myprint(rpm.expandMacro('%%{?%s}' % m))
+
+mname = '__no_such_macro_yet'
+prexp(mname)
+rpm.addMacro(mname, '/bin/sh')
+prexp(mname)
+rpm.addMacro(mname, '/bin/false')
+prexp(mname)
+rpm.delMacro(mname)
+prexp(mname)
+rpm.delMacro(mname)
+prexp(mname)
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "
+/bin/sh
+/bin/false
+/bin/sh
+
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:12"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_392
+#AT_START_393
+at_fn_group_banner 393 'rpmpython.at:35' \
+  "basic rpmio" "                                    " 20
+at_xfail=no
+(
+  $as_echo "393. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:35:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+msg = 'Killroy was here\\n'
+data = msg * 10
+# TODO: test other compression types too if built in
+for iot in [ 'fpio', 'fdio', 'ufdio', 'gzdio' ]:
+    fn = 'pyio.%s' % iot
+    fd = rpm.fd(fn, 'w', iot)
+    pos = fd.tell()
+    if pos != -2 and pos != 0:
+        myprint('bad start pos %d' % fd.tell())
+    if fd.write(data) != len(data):
+        myprint('%s write fail' % iot)
+    if fn != fd.name:
+        myprint('bad file name %s' % fd.name)
+    fd.flush()
+    pos = fd.tell()
+    if pos != -2 and pos != len(data):
+        myprint('bad end pos %d' % fd.tell())
+    fd = rpm.fd(fn, 'r', iot)
+    rdata = fd.read()
+    if rdata != data:
+        myprint('%s read fail (got %d bytes)\\n%s' % (iot, len(rdata), rdata))
+    # compressed io types can't seek
+    if iot == 'ufdio':
+        fd.seek(0)
+    else:
+        fd = rpm.fd(fn, 'r', iot)
+    if fn != fd.name:
+        myprint('bad file name %s' % fd.name)
+    rdata = fd.read(len(msg))
+    if rdata != msg:
+        myprint('%s sized read fail (got %d bytes)\\n%s' % (iot, len(rdata), rdata))
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:35"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+msg = 'Killroy was here\n'
+data = msg * 10
+# TODO: test other compression types too if built in
+for iot in [ 'fpio', 'fdio', 'ufdio', 'gzdio' ]:
+    fn = 'pyio.%s' % iot
+    fd = rpm.fd(fn, 'w', iot)
+    pos = fd.tell()
+    if pos != -2 and pos != 0:
+        myprint('bad start pos %d' % fd.tell())
+    if fd.write(data) != len(data):
+        myprint('%s write fail' % iot)
+    if fn != fd.name:
+        myprint('bad file name %s' % fd.name)
+    fd.flush()
+    pos = fd.tell()
+    if pos != -2 and pos != len(data):
+        myprint('bad end pos %d' % fd.tell())
+    fd = rpm.fd(fn, 'r', iot)
+    rdata = fd.read()
+    if rdata != data:
+        myprint('%s read fail (got %d bytes)\n%s' % (iot, len(rdata), rdata))
+    # compressed io types can't seek
+    if iot == 'ufdio':
+        fd.seek(0)
+    else:
+        fd = rpm.fd(fn, 'r', iot)
+    if fn != fd.name:
+        myprint('bad file name %s' % fd.name)
+    rdata = fd.read(len(msg))
+    if rdata != msg:
+        myprint('%s sized read fail (got %d bytes)\n%s' % (iot, len(rdata), rdata))
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:35"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_393
+#AT_START_394
+at_fn_group_banner 394 'rpmpython.at:70' \
+  "spec parse" "                                     " 20
+at_xfail=no
+(
+  $as_echo "394. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:70:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+# TODO: add a better test spec with sub-packages etc
+spec = rpm.spec('\${RPMDATA}/SPECS/hello.spec')
+for (name, num, flags) in spec.sources:
+    myprint('src %s %d %d' % (name, num, flags))
+for pkg in spec.packages:
+    myprint(pkg.header.format('%{nvr}'))
+myprint(spec.sourceHeader.format('%{nvr}'))
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:70"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+# TODO: add a better test spec with sub-packages etc
+spec = rpm.spec('${RPMDATA}/SPECS/hello.spec')
+for (name, num, flags) in spec.sources:
+    myprint('src %s %d %d' % (name, num, flags))
+for pkg in spec.packages:
+    myprint(pkg.header.format('%{nvr}'))
+myprint(spec.sourceHeader.format('%{nvr}'))
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "src hello-1.0-modernize.patch 0 2
+src hello-1.0.tar.gz 0 1
+hello-1.0-1
+hello-1.0-1
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:70"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_394
+#AT_START_395
+at_fn_group_banner 395 'rpmpython.at:85' \
+  "basic header manipulation" "                      " 20
+at_xfail=no
+(
+  $as_echo "395. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:85:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+h = rpm.hdr()
+h['name'] = 'testpkg'
+h['version'] = '1.0'
+h['release'] = '1'
+h['epoch'] = 5
+h['arch'] = 'noarch'
+myprint(h['nevra'])
+del h['epoch']
+myprint(h['nevra'])
+for a in ['name', 'bugurl', '__class__', '__foo__', ]:
+    try:
+        x = getattr(h, a)
+        myprint(x)
+    except AttributeError, exc:
+        myprint(exc)
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:85"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+h = rpm.hdr()
+h['name'] = 'testpkg'
+h['version'] = '1.0'
+h['release'] = '1'
+h['epoch'] = 5
+h['arch'] = 'noarch'
+myprint(h['nevra'])
+del h['epoch']
+myprint(h['nevra'])
+for a in ['name', 'bugurl', '__class__', '__foo__', ]:
+    try:
+        x = getattr(h, a)
+        myprint(x)
+    except AttributeError, exc:
+        myprint(exc)
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "testpkg-5:1.0-1.noarch
+testpkg-1.0-1.noarch
+testpkg
+None
+<type 'rpm.hdr'>
+'rpm.hdr' object has no attribute '__foo__'
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:85"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_395
+#AT_START_396
+at_fn_group_banner 396 'rpmpython.at:110' \
+  "invalid header data" "                            " 20
+at_xfail=no
+(
+  $as_echo "396. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:110:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+h1 = rpm.hdr()
+h1['basenames'] = ['bing', 'bang', 'bong']
+h1['dirnames'] = ['/opt/', '/flopt/']
+h1['dirindexes'] = [ 1, 0, 3 ]
+h2 = rpm.hdr()
+h2['basenames'] = ['bing', 'bang', 'bong']
+h2['dirnames'] = ['/opt/', '/flopt/']
+h2['dirindexes'] = [ 0, 0, 1 ]
+for h in [h1, h2]:
+    try:
+        myprint(','.join(h['filenames']))
+    except rpm.error, exc:
+        myprint(exc)
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:110"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+h1 = rpm.hdr()
+h1['basenames'] = ['bing', 'bang', 'bong']
+h1['dirnames'] = ['/opt/', '/flopt/']
+h1['dirindexes'] = [ 1, 0, 3 ]
+h2 = rpm.hdr()
+h2['basenames'] = ['bing', 'bang', 'bong']
+h2['dirnames'] = ['/opt/', '/flopt/']
+h2['dirindexes'] = [ 0, 0, 1 ]
+for h in [h1, h2]:
+    try:
+        myprint(','.join(h['filenames']))
+    except rpm.error, exc:
+        myprint(exc)
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "invalid header data
+/opt/bing,/opt/bang,/flopt/bong
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:110"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_396
+#AT_START_397
+at_fn_group_banner 397 'rpmpython.at:129' \
+  "reading a package file" "                         " 20
+at_xfail=no
+(
+  $as_echo "397. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:129:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('\${RPMDATA}/RPMS/hello-1.0-1.ppc64.rpm')
+myprint(h['arch'])
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:129"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-1.0-1.ppc64.rpm')
+myprint(h['arch'])
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "ppc64
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:129"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_397
+#AT_START_398
+at_fn_group_banner 398 'rpmpython.at:137' \
+  "reading a signed package file 1" "                " 20
+at_xfail=no
+(
+  $as_echo "398. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:137:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+# avoid rpmlog spew with absolute path to package
+sink = open('/dev/null', 'w')
+rpm.setLogFile(sink)
+try:
+    h = ts.hdrFromFdno('\${RPMDATA}/RPMS/hello-2.0-1.x86_64-signed.rpm')
+    myprint(h['arch'])
+except rpm.error, e:
+    myprint(e)
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:137"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+# avoid rpmlog spew with absolute path to package
+sink = open('/dev/null', 'w')
+rpm.setLogFile(sink)
+try:
+    h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.x86_64-signed.rpm')
+    myprint(h['arch'])
+except rpm.error, e:
+    myprint(e)
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "public key not available
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:137"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_398
+#AT_START_399
+at_fn_group_banner 399 'rpmpython.at:152' \
+  "reading a signed package file 2" "                " 20
+at_xfail=no
+(
+  $as_echo "399. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:152:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+
+keydata = open('\${RPMDATA}/keys/rpm.org-rsa-2048-test.pub').read()
+pubkey = rpm.pubkey(keydata)
+keyring = rpm.keyring()
+keyring.addKey(pubkey)
+
+ts = rpm.ts()
+ts.setKeyring(keyring)
+try:
+    h = ts.hdrFromFdno('\${RPMDATA}/RPMS/hello-2.0-1.x86_64-signed.rpm')
+    myprint(h['arch'])
+except rpm.error, e:
+    myprint(e)
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:152"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+
+keydata = open('${RPMDATA}/keys/rpm.org-rsa-2048-test.pub').read()
+pubkey = rpm.pubkey(keydata)
+keyring = rpm.keyring()
+keyring.addKey(pubkey)
+
+ts = rpm.ts()
+ts.setKeyring(keyring)
+try:
+    h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.x86_64-signed.rpm')
+    myprint(h['arch'])
+except rpm.error, e:
+    myprint(e)
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "x86_64
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:152"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_399
+#AT_START_400
+at_fn_group_banner 400 'rpmpython.at:170' \
+  "add package to transaction" "                     " 20
+at_xfail=no
+(
+  $as_echo "400. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:170:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+ts.addInstall('\${RPMDATA}/RPMS/foo-1.0-1.noarch.rpm', 'u')
+for e in ts:
+    myprint(e.NEVRA())
+ts.clear()
+for e in ts:
+    myprint(e.NEVRA())
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:170"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+ts.addInstall('${RPMDATA}/RPMS/foo-1.0-1.noarch.rpm', 'u')
+for e in ts:
+    myprint(e.NEVRA())
+ts.clear()
+for e in ts:
+    myprint(e.NEVRA())
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:170"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_400
+#AT_START_401
+at_fn_group_banner 401 'rpmpython.at:182' \
+  "add bogus package to transaction 1" "             " 20
+at_xfail=no
+(
+  $as_echo "401. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:182:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+h = rpm.hdr()
+h['name'] = \"foo\"
+try:
+    ts.addInstall(h, 'foo', 'u')
+except rpm.error, err:
+    myprint(err)
+for e in ts:
+    myprint(e.NEVRA())
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:182"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+h = rpm.hdr()
+h['name'] = "foo"
+try:
+    ts.addInstall(h, 'foo', 'u')
+except rpm.error, err:
+    myprint(err)
+for e in ts:
+    myprint(e.NEVRA())
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "adding package to transaction failed
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:182"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_401
+#AT_START_402
+at_fn_group_banner 402 'rpmpython.at:196' \
+  "add bogus package to transaction 2" "             " 20
+at_xfail=no
+(
+  $as_echo "402. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:196:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+h = rpm.hdr()
+h['name'] = 'foo'
+h['version'] = '1.0'
+h['release'] = '1'
+h['os'] = 'linux'
+h['arch'] = 'noarch'
+h['basenames'] = ['bing', 'bang', 'bong']
+h['dirnames'] = ['/opt' '/flopt']
+h['dirindexes'] = [ 1, 2, 3 ]
+try:
+    ts.addInstall(h, 'foo', 'u')
+except rpm.error, err:
+    myprint(err)
+for e in ts:
+    myprint(e.NEVRA())
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:196"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+h = rpm.hdr()
+h['name'] = 'foo'
+h['version'] = '1.0'
+h['release'] = '1'
+h['os'] = 'linux'
+h['arch'] = 'noarch'
+h['basenames'] = ['bing', 'bang', 'bong']
+h['dirnames'] = ['/opt' '/flopt']
+h['dirindexes'] = [ 1, 2, 3 ]
+try:
+    ts.addInstall(h, 'foo', 'u')
+except rpm.error, err:
+    myprint(err)
+for e in ts:
+    myprint(e.NEVRA())
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "adding package to transaction failed
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:196"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_402
+#AT_START_403
+at_fn_group_banner 403 'rpmpython.at:217' \
+  "database iterators" "                             " 20
+at_xfail=no
+(
+  $as_echo "403. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:219:
+
+rm -rf \"\${abs_builddir}\"/testing\`rpm --eval '%_dbpath'\`/*
+
+
+runroot rpm --initdb
+
+runroot rpm -i \\
+  --justdb --nodeps --ignorearch --ignoreos \\
+  /data/RPMS/foo-1.0-1.noarch.rpm \\
+  /data/RPMS/hello-2.0-1.i686.rpm
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "rpmpython.at:219"
+( $at_check_trace;
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+runroot rpm -i \
+  --justdb --nodeps --ignorearch --ignoreos \
+  /data/RPMS/foo-1.0-1.noarch.rpm \
+  /data/RPMS/hello-2.0-1.i686.rpm
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:219"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:231:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+ix = 0
+mi = ts.dbMatch()
+mi.pattern('name', rpm.RPMMIRE_STRCMP, 'hello')
+for h in mi:
+    ix = h['dbinstance']
+    break
+del mi
+for h in ts.dbMatch('packages', ix):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:231"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+ix = 0
+mi = ts.dbMatch()
+mi.pattern('name', rpm.RPMMIRE_STRCMP, 'hello')
+for h in mi:
+    ix = h['dbinstance']
+    break
+del mi
+for h in ts.dbMatch('packages', ix):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello-2.0-1.i686
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:231"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:247:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+mi = ts.dbMatch()
+mi.pattern('name', rpm.RPMMIRE_DEFAULT, 'f*')
+for h in mi:
+    myprint(h['nevra'])
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:247"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+mi = ts.dbMatch()
+mi.pattern('name', rpm.RPMMIRE_DEFAULT, 'f*')
+for h in mi:
+    myprint(h['nevra'])
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:247"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:258:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+for h in ts.dbMatch('name'):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:258"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+for h in ts.dbMatch('name'):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0-1.noarch
+hello-2.0-1.i686
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:258"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:268:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+for h in ts.dbMatch('obsoletes'):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:268"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+for h in ts.dbMatch('obsoletes'):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:268"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:277:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+for h in ts.dbMatch('provides', 'hi'):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:277"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+for h in ts.dbMatch('provides', 'hi'):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo-1.0-1.noarch
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:277"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:286:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+for h in ts.dbMatch('basenames', '/usr/share/doc/hello-2.0/FAQ'):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:286"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+for h in ts.dbMatch('basenames', '/usr/share/doc/hello-2.0/FAQ'):
+    myprint(h['nevra'])
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "hello-2.0-1.i686
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:286"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:294:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+for di in sorted(ts.dbIndex('obsoletes')):
+    myprint(di)
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:294"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+for di in sorted(ts.dbIndex('obsoletes')):
+    myprint(di)
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "howdy
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:294"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:303:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+for di in sorted(ts.dbIndex('provides')):
+    myprint(di)
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:303"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+for di in sorted(ts.dbIndex('provides')):
+    myprint(di)
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "foo
+hello
+hello(x86-32)
+hi
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:303"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_403
+#AT_START_404
+at_fn_group_banner 404 'rpmpython.at:316' \
+  "dependency sets 1" "                              " 20
+at_xfail=no
+(
+  $as_echo "404. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:316:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('\${RPMDATA}/RPMS/hello-1.0-1.ppc64.rpm')
+for dep in rpm.ds(h, 'requires'):
+    myprint(dep.DNEVR())
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:316"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-1.0-1.ppc64.rpm')
+for dep in rpm.ds(h, 'requires'):
+    myprint(dep.DNEVR())
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "R /bin/sh
+R /bin/sh
+R /bin/sh
+R /bin/sh
+R libc.so.6
+R libc.so.6(GLIBC_2.0)
+R rpmlib(CompressedFileNames) <= 3.0.4-1
+R rpmlib(PayloadFilesHavePrefix) <= 4.0-1
+R rtld(GNU_HASH)
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:316"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_404
+#AT_START_405
+at_fn_group_banner 405 'rpmpython.at:333' \
+  "dependency sets 2" "                              " 20
+at_xfail=no
+(
+  $as_echo "405. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:333:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('\${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
+ds = rpm.ds(h, 'provides')
+myprint('%d %d' % (ds.Instance(), ds.Count()))
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:333"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
+ds = rpm.ds(h, 'provides')
+myprint('%d %d' % (ds.Instance(), ds.Count()))
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "0 2
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:333"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_405
+#AT_START_406
+at_fn_group_banner 406 'rpmpython.at:343' \
+  "file info sets 1" "                               " 20
+at_xfail=no
+(
+  $as_echo "406. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:343:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('\${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
+fi = rpm.fi(h)
+myprint(fi.FC())
+for f in fi:
+   myprint('%x: %s' % (fi.FFlags(), fi.FN()))
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:343"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
+fi = rpm.fi(h)
+myprint(fi.FC())
+for f in fi:
+   myprint('%x: %s' % (fi.FFlags(), fi.FN()))
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "5
+0: /usr/bin/hello
+0: /usr/share/doc/hello-2.0
+2: /usr/share/doc/hello-2.0/COPYING
+2: /usr/share/doc/hello-2.0/FAQ
+2: /usr/share/doc/hello-2.0/README
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:343"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_406
+#AT_START_407
+at_fn_group_banner 407 'rpmpython.at:360' \
+  "string pool 1" "                                  " 20
+at_xfail=no
+(
+  $as_echo "407. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:360:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+p = rpm.strpool()
+for s in ['foo', 'bar', 'foo', 'zoo']:
+    p.str2id(s)
+myprint('%s' % len(p))
+for i in range(1, len(p)+1):
+    myprint('%s: %s' % (i, p[i]))
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:360"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+p = rpm.strpool()
+for s in ['foo', 'bar', 'foo', 'zoo']:
+    p.str2id(s)
+myprint('%s' % len(p))
+for i in range(1, len(p)+1):
+    myprint('%s: %s' % (i, p[i]))
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "3
+1: foo
+2: bar
+3: zoo
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:360"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_407
+#AT_START_408
+at_fn_group_banner 408 'rpmpython.at:375' \
+  "string pool 2" "                                  " 20
+at_xfail=no
+(
+  $as_echo "408. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:375:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+p = rpm.strpool()
+d1 = rpm.ds(('foo', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
+d2 = rpm.ds(('bar', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
+d3 = rpm.ds(('bar', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
+myprint('%s' % len(p))
+del p
+myprint(d1.DNEVR())
+myprint(d2.DNEVR())
+myprint(d3.DNEVR())
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:375"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+p = rpm.strpool()
+d1 = rpm.ds(('foo', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
+d2 = rpm.ds(('bar', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
+d3 = rpm.ds(('bar', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
+myprint('%s' % len(p))
+del p
+myprint(d1.DNEVR())
+myprint(d2.DNEVR())
+myprint(d3.DNEVR())
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "3
+P foo = 2.0
+P bar = 2.0
+P bar = 2.0
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:375"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_408
+#AT_START_409
+at_fn_group_banner 409 'rpmpython.at:393' \
+  "archive 1" "                                      " 20
+at_xfail=no
+(
+  $as_echo "409. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:393:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+import hashlib
+ts = rpm.ts()
+fd = rpm.fd.open('\${RPMDATA}/SRPMS/hello-1.0-1.src.rpm')
+h = ts.hdrFromFdno(fd)
+payload = rpm.fd.open(fd, flags=h['payloadcompressor'])
+files = rpm.files(h)
+archive = files.archive(payload)
+for f in archive:
+    if not f.fflags & rpm.RPMFILE_SPECFILE:
+        continue
+    spec = archive.read()
+    hash = hashlib.md5(spec)
+    if f.digest != hash.hexdigest():
+        myprint('%s should be %s' % (hash.hexdigest(), f.digest))
+    break
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:393"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+import hashlib
+ts = rpm.ts()
+fd = rpm.fd.open('${RPMDATA}/SRPMS/hello-1.0-1.src.rpm')
+h = ts.hdrFromFdno(fd)
+payload = rpm.fd.open(fd, flags=h['payloadcompressor'])
+files = rpm.files(h)
+archive = files.archive(payload)
+for f in archive:
+    if not f.fflags & rpm.RPMFILE_SPECFILE:
+        continue
+    spec = archive.read()
+    hash = hashlib.md5(spec)
+    if f.digest != hash.hexdigest():
+        myprint('%s should be %s' % (hash.hexdigest(), f.digest))
+    break
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:393"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_409
+#AT_START_410
+at_fn_group_banner 410 'rpmpython.at:413' \
+  "header unload" "                                  " 20
+at_xfail=no
+(
+  $as_echo "410. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmpython.at:413:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('\${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
+# Add some garbage to header to make it non-sorted
+h['installtime'] = 0
+# RhBug:1061730 causes export of non-sorted header to be larger than it should
+len1 = len(h.unload())
+# Accessing the header before export forces sorting to take place even on
+# buggy versions
+t = h['installtime']
+len2 = len(h.unload())
+myprint(len1 == len2)
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmpython.at:413"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+ts = rpm.ts()
+h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
+# Add some garbage to header to make it non-sorted
+h['installtime'] = 0
+# RhBug:1061730 causes export of non-sorted header to be larger than it should
+len1 = len(h.unload())
+# Accessing the header before export forces sorting to take place even on
+# buggy versions
+t = h['installtime']
+len2 = len(h.unload())
+myprint(len1 == len2)
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "True
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmpython.at:413"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_410
+#AT_START_411
+at_fn_group_banner 411 'rpmdepmatch.at:4' \
+  "provide - require pairs" "                        " 21
+at_xfail=no
+(
+  $as_echo "411. $at_setup_line: testing $at_desc ..."
+  $at_traceon
+
+
+
+rm -rf "${abs_builddir}"/testing`rpm --eval '%_dbpath'`/*
+
+
+runroot rpm --initdb
+
+
+{ set +x
+$as_echo "$at_srcdir/rpmdepmatch.at:4:
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '\${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\\n' % msg)
+
+# ((provides), (requires), match) expected values
+tests = [
+    # Different names never match
+    (('b',),                   ('a',),                 0),
+    (('b',),                   ('a', '=', '1.2'),      0),
+    (('b',),                   ('a', '>=', '1.2'),     0),
+    (('b',),                   ('a', '<=', '1.2'),     0),
+    (('b',),                   ('a', '<', '1.2'),      0),
+    (('b',),                   ('a', '>', '1.2'),      0),
+    (('b',),                   ('a', '<>', '1.2'),     0),
+
+    # Unversioned provide matches all versions
+    (('a',),                   ('a',),                 1),
+    (('a',),                   ('a', '=', '1.2'),      1),
+    (('a',),                   ('a', '>=', '1.2'),     1),
+    (('a',),                   ('a', '<=', '1.2'),     1),
+    (('a',),                   ('a', '<', '1.2'),      1),
+    (('a',),                   ('a', '>', '1.2'),      1),
+    (('a',),                   ('a', '<>', '1.2'),     1),
+
+    # Unversioned require matches all versions
+    (('a', '=', '1.2'),                ('a',),                 1),
+    (('a', '<', '1.2'),                ('a',),                 1),
+    (('a', '>', '1.2'),                ('a',),                 1),
+    (('a', '<=', '1.2'),       ('a',),                 1),
+    (('a', '>=', '1.2'),       ('a',),                 1),
+    (('a', '<>', '1.2'),       ('a',),                 1),
+
+    # Simple, obvious version comparisons
+    (('a', '=', '1.2'),                ('a', '=', '1.2'),      1),
+    (('a', '=', '1.2'),                ('a', '>=', '1.2'),     1),
+    (('a', '=', '1.2'),                ('a', '<=', '1.2'),     1),
+    (('a', '=', '1.2'),                ('a', '<', '1.2'),      0),
+    (('a', '=', '1.2'),                ('a', '>', '1.2'),      0),
+    (('a', '=', '1.2'),                ('a', '<>', '1.2'),     0),
+
+    (('a', '=', '1.2'),                ('a', '=', '1.3'),      0),
+    (('a', '=', '1.2'),                ('a', '>=', '1.3'),     0),
+    (('a', '=', '1.2'),                ('a', '<=', '1.3'),     1),
+    (('a', '=', '1.2'),                ('a', '<', '1.3'),      1),
+    (('a', '=', '1.2'),                ('a', '>', '1.3'),      0),
+    (('a', '=', '1.2'),                ('a', '<>', '1.3'),     1),
+
+    # Simple, obvious version-release comparisons
+    (('a', '=', '1.2-1'),      ('a', '=', '1.2-1'),    1),
+    (('a', '=', '1.2-1'),      ('a', '>=', '1.2-1'),   1),
+    (('a', '=', '1.2-1'),      ('a', '<=', '1.2-1'),   1),
+    (('a', '=', '1.2-1'),      ('a', '<', '1.2-1'),    0),
+    (('a', '=', '1.2-1'),      ('a', '>', '1.2-1'),    0),
+    (('a', '=', '1.2-1'),      ('a', '<>', '1.2-1'),   0),
+
+    (('a', '=', '1.2-1'),      ('a', '=', '1.2-2'),    0),
+    (('a', '=', '1.2-1'),      ('a', '>=', '1.2-2'),   0),
+    (('a', '=', '1.2-1'),      ('a', '<=', '1.2-2'),   1),
+    (('a', '=', '1.2-1'),      ('a', '<', '1.2-2'),    1),
+    (('a', '=', '1.2-1'),      ('a', '>', '1.2-2'),    0),
+    (('a', '=', '1.2-1'),      ('a', '<>', '1.2-2'),   1),
+
+    (('a', '=', '1.3-1'),      ('a', '=', '1.2-2'),    0),
+    (('a', '=', '1.3-1'),      ('a', '>=', '1.2-2'),   1),
+    (('a', '=', '1.3-1'),      ('a', '<=', '1.2-2'),   0),
+    (('a', '=', '1.3-1'),      ('a', '<', '1.2-2'),    0),
+    (('a', '=', '1.3-1'),      ('a', '>', '1.2-2'),    1),
+    (('a', '=', '1.3-1'),      ('a', '<>', '1.2-2'),   1),
+
+    # Zero epoch is same as no epoch
+    (('a', '=', '0:1.2'),      ('a', '=', '1.2'),      1),
+    (('a', '=', '0:1.2'),      ('a', '>=', '1.2'),     1),
+    (('a', '=', '0:1.2'),      ('a', '<=', '1.2'),     1),
+    (('a', '=', '0:1.2'),      ('a', '<', '1.2'),      0),
+    (('a', '=', '0:1.2'),      ('a', '>', '1.2'),      0),
+    (('a', '=', '0:1.2'),      ('a', '<>', '1.2'),     0),
+
+    (('a', '=', '1.2'),                ('a', '=', '0:1.2'),    1),
+    (('a', '=', '1.2'),                ('a', '>=', '0:1.2'),   1),
+    (('a', '=', '1.2'),                ('a', '<=', '0:1.2'),   1),
+    (('a', '=', '1.2'),                ('a', '<', '0:1.2'),    0),
+    (('a', '=', '1.2'),                ('a', '>', '0:1.2'),    0),
+    (('a', '=', '1.2'),                ('a', '<>', '0:1.2'),   0),
+
+    # Non-zero epochs
+    (('a', '=', '1:1.2'),      ('a', '=', '1.2'),      0),
+    (('a', '=', '1:1.2'),      ('a', '>=', '1.2'),     1),
+    (('a', '=', '1:1.2'),      ('a', '<=', '1.2'),     0),
+    (('a', '=', '1:1.2'),      ('a', '<', '1.2'),      0),
+    (('a', '=', '1:1.2'),      ('a', '>', '1.2'),      1),
+    (('a', '=', '1:1.2'),      ('a', '<>', '1.2'),     1),
+
+    (('a', '=', '1.2'),                ('a', '=', '1:1.2'),    0),
+    (('a', '=', '1.2'),                ('a', '>=', '1:1.2'),   0),
+    (('a', '=', '1.2'),                ('a', '<=', '1:1.2'),   1),
+    (('a', '=', '1.2'),                ('a', '<', '1:1.2'),    1),
+    (('a', '=', '1.2'),                ('a', '>', '1:1.2'),    0),
+    (('a', '=', '1.2'),                ('a', '<>', '1:1.2'),   1),
+
+    (('a', '=', '2:1.2'),      ('a', '=', '2:1.2'),    1),
+    (('a', '=', '2:1.2'),      ('a', '>=', '2:1.2'),   1),
+    (('a', '=', '2:1.2'),      ('a', '<=', '2:1.2'),   1),
+    (('a', '=', '2:1.2'),      ('a', '<', '2:1.2'),    0),
+    (('a', '=', '2:1.2'),      ('a', '>', '2:1.2'),    0),
+    (('a', '=', '2:1.2'),      ('a', '<>', '2:1.2'),   0),
+
+    # Simple, obvious version comparisons with provide ranges
+    (('a', '>', '1.2'),                ('a', '=', '1.2'),      0),
+    (('a', '>', '1.2'),                ('a', '>=', '1.2'),     1),
+    (('a', '>', '1.2'),                ('a', '<=', '1.2'),     0),
+    (('a', '>', '1.2'),                ('a', '<', '1.2'),      0),
+    (('a', '>', '1.2'),                ('a', '>', '1.2'),      1),
+    (('a', '>', '1.2'),                ('a', '<>', '1.2'),     1),
+
+    (('a', '<', '1.2'),                ('a', '=', '1.2'),      0),
+    (('a', '<', '1.2'),                ('a', '>=', '1.2'),     0),
+    (('a', '<', '1.2'),                ('a', '<=', '1.2'),     1),
+    (('a', '<', '1.2'),                ('a', '<', '1.2'),      1),
+    (('a', '<', '1.2'),                ('a', '>', '1.2'),      0),
+    (('a', '<', '1.2'),                ('a', '<>', '1.2'),     1),
+
+    (('a', '>=', '1.2'),       ('a', '=', '1.2'),      1),
+    (('a', '>=', '1.2'),       ('a', '>=', '1.2'),     1),
+    (('a', '>=', '1.2'),       ('a', '<=', '1.2'),     1),
+    (('a', '>=', '1.2'),       ('a', '<', '1.2'),      0),
+    (('a', '>=', '1.2'),       ('a', '>', '1.2'),      1),
+    (('a', '>=', '1.2'),       ('a', '<>', '1.2'),     1),
+
+    (('a', '<=', '1.2'),       ('a', '=', '1.2'),      1),
+    (('a', '<=', '1.2'),       ('a', '>=', '1.2'),     1),
+    (('a', '<=', '1.2'),       ('a', '<=', '1.2'),     1),
+    (('a', '<=', '1.2'),       ('a', '<', '1.2'),      1),
+    (('a', '<=', '1.2'),       ('a', '>', '1.2'),      0),
+    (('a', '<=', '1.2'),       ('a', '<>', '1.2'),     1),
+
+    (('a', '<>', '1.2'),       ('a', '=', '1.2'),      0),
+    (('a', '<>', '1.2'),       ('a', '>=', '1.2'),     1),
+    (('a', '<>', '1.2'),       ('a', '<=', '1.2'),     1),
+    (('a', '<>', '1.2'),       ('a', '<', '1.2'),      1),
+    (('a', '<>', '1.2'),       ('a', '>', '1.2'),      1),
+    (('a', '<>', '1.2'),       ('a', '<>', '1.2'),     1),
+
+    # Missing release should be considered \"any release will do\"
+    # but this is not always so (the cases with \"???\")
+    (('a', '=', '1.2-1'),      ('a', '=', '1.2'),      1),
+    (('a', '=', '1.2-1'),      ('a', '>=', '1.2'),     1),
+    (('a', '=', '1.2-1'),      ('a', '<=', '1.2'),     1),
+    (('a', '=', '1.2-1'),      ('a', '<', '1.2'),      0),
+    (('a', '=', '1.2-1'),      ('a', '>', '1.2'),      0),
+    (('a', '=', '1.2-1'),      ('a', '<>', '1.2'),     0),
+
+    (('a', '>', '1.2-1'),      ('a', '=', '1.2'),      1),
+    (('a', '>', '1.2-1'),      ('a', '>=', '1.2'),     1),
+    (('a', '>', '1.2-1'),      ('a', '<=', '1.2'),     1),
+    (('a', '>', '1.2-1'),      ('a', '<', '1.2'),      0),
+    (('a', '>', '1.2-1'),      ('a', '>', '1.2'),      1),
+    (('a', '>', '1.2-1'),      ('a', '<>', '1.2'),     1),
+
+    (('a', '<', '1.2-1'),      ('a', '=', '1.2'),      1),
+    (('a', '<', '1.2-1'),      ('a', '>=', '1.2'),     1),
+    (('a', '<', '1.2-1'),      ('a', '<=', '1.2'),     1),
+    (('a', '<', '1.2-1'),      ('a', '<', '1.2'),      1),
+    (('a', '<', '1.2-1'),      ('a', '>', '1.2'),      0),
+    (('a', '<', '1.2-1'),      ('a', '<>', '1.2'),     1),
+
+    (('a', '>=', '1.2-1'),     ('a', '=', '1.2'),      1),
+    (('a', '>=', '1.2-1'),     ('a', '>=', '1.2'),     1),
+    (('a', '>=', '1.2-1'),     ('a', '<=', '1.2'),     1),
+    (('a', '>=', '1.2-1'),     ('a', '<', '1.2'),      0),
+    (('a', '>=', '1.2-1'),     ('a', '>', '1.2'),      1),
+    (('a', '>=', '1.2-1'),     ('a', '<>', '1.2'),     1),
+
+    (('a', '<=', '1.2-1'),     ('a', '=', '1.2'),      1),
+    (('a', '<=', '1.2-1'),     ('a', '>=', '1.2'),     1),
+    (('a', '<=', '1.2-1'),     ('a', '<=', '1.2'),     1),
+    (('a', '<=', '1.2-1'),     ('a', '<', '1.2'),      1),
+    (('a', '<=', '1.2-1'),     ('a', '>', '1.2'),      0),
+    (('a', '<=', '1.2-1'),     ('a', '<>', '1.2'),     1),
+
+    (('a', '<>', '1.2-1'),     ('a', '=', '1.2'),      1),
+    (('a', '<>', '1.2-1'),     ('a', '>=', '1.2'),     1),
+    (('a', '<>', '1.2-1'),     ('a', '<=', '1.2'),     1),
+    (('a', '<>', '1.2-1'),     ('a', '<', '1.2'),      1),
+    (('a', '<>', '1.2-1'),     ('a', '>', '1.2'),      1),
+    (('a', '<>', '1.2-1'),     ('a', '<>', '1.2'),     1),
+
+    (('a', '=', '1.2'),                ('a', '=', '1.2-1'),    1),
+    (('a', '=', '1.2'),                ('a', '>=', '1.2-1'),   1),
+    (('a', '=', '1.2'),                ('a', '<=', '1.2-1'),   1),
+    (('a', '=', '1.2'),                ('a', '<', '1.2-1'),    1),
+    (('a', '=', '1.2'),                ('a', '>', '1.2-1'),    1),
+    (('a', '=', '1.2'),                ('a', '<>', '1.2-1'),   1),
+
+    (('a', '>', '1.2'),                ('a', '=', '1.2-1'),    0),
+    (('a', '>', '1.2'),                ('a', '>=', '1.2-1'),   1),
+    (('a', '>', '1.2'),                ('a', '<=', '1.2-1'),   0),
+    (('a', '>', '1.2'),                ('a', '<', '1.2-1'),    0),
+    (('a', '>', '1.2'),                ('a', '>', '1.2-1'),    1),
+    (('a', '>', '1.2'),                ('a', '<>', '1.2-1'),   1),
+
+    (('a', '<', '1.2'),                ('a', '=', '1.2-1'),    0),
+    (('a', '<', '1.2'),                ('a', '>=', '1.2-1'),   0),
+    (('a', '<', '1.2'),                ('a', '<=', '1.2-1'),   1),
+    (('a', '<', '1.2'),                ('a', '<', '1.2-1'),    1),
+    (('a', '<', '1.2'),                ('a', '>', '1.2-1'),    0),
+    (('a', '<', '1.2'),                ('a', '<>', '1.2-1'),   1),
+
+    (('a', '>=', '1.2'),       ('a', '=', '1.2-1'),    1),
+    (('a', '>=', '1.2'),       ('a', '>=', '1.2-1'),   1),
+    (('a', '>=', '1.2'),       ('a', '<=', '1.2-1'),   1),
+    (('a', '>=', '1.2'),       ('a', '<', '1.2-1'),    1),
+    (('a', '>=', '1.2'),       ('a', '>', '1.2-1'),    1),
+    (('a', '>=', '1.2'),       ('a', '<>', '1.2-1'),   1),
+
+    (('a', '<=', '1.2'),       ('a', '=', '1.2-1'),    1),
+    (('a', '<=', '1.2'),       ('a', '>=', '1.2-1'),   1),
+    (('a', '<=', '1.2'),       ('a', '<=', '1.2-1'),   1),
+    (('a', '<=', '1.2'),       ('a', '<', '1.2-1'),    1),
+    (('a', '<=', '1.2'),       ('a', '>', '1.2-1'),    1),
+    (('a', '<=', '1.2'),       ('a', '<>', '1.2-1'),   1),
+
+    (('a', '<>', '1.2'),       ('a', '=', '1.2-1'),    0),
+    (('a', '<>', '1.2'),       ('a', '>=', '1.2-1'),   1),
+    (('a', '<>', '1.2'),       ('a', '<=', '1.2-1'),   1),
+    (('a', '<>', '1.2'),       ('a', '<', '1.2-1'),    1),
+    (('a', '<>', '1.2'),       ('a', '>', '1.2-1'),    1),
+    (('a', '<>', '1.2'),       ('a', '<>', '1.2-1'),   1),
+]
+
+ms = ['no match', 'match']
+
+myprint() # dumb kludge to fixup expected output
+for p, r, res in tests:
+    d1 = rpm.ds(p, 'provides')
+    d2 = rpm.ds(r, 'requires')
+    match = d1.Compare(d2)
+    if match != res:
+        myprint('FAILED: %s with %s: %s' % (d1.DNEVR(), d2.DNEVR(),ms[res]))
+
+EOF
+python test.py
+"
+at_fn_check_prepare_notrace 'a ${...} parameter expansion' "rpmdepmatch.at:4"
+( $at_check_trace;
+cat << EOF > test.py
+import rpm, sys
+dbpath=rpm.expandMacro('%_dbpath')
+rpm.addMacro('_dbpath', '${abs_builddir}/testing%s' % dbpath)
+def myprint(msg = ''):
+    sys.stdout.write('%s\n' % msg)
+
+# ((provides), (requires), match) expected values
+tests = [
+    # Different names never match
+    (('b',),                   ('a',),                 0),
+    (('b',),                   ('a', '=', '1.2'),      0),
+    (('b',),                   ('a', '>=', '1.2'),     0),
+    (('b',),                   ('a', '<=', '1.2'),     0),
+    (('b',),                   ('a', '<', '1.2'),      0),
+    (('b',),                   ('a', '>', '1.2'),      0),
+    (('b',),                   ('a', '<>', '1.2'),     0),
+
+    # Unversioned provide matches all versions
+    (('a',),                   ('a',),                 1),
+    (('a',),                   ('a', '=', '1.2'),      1),
+    (('a',),                   ('a', '>=', '1.2'),     1),
+    (('a',),                   ('a', '<=', '1.2'),     1),
+    (('a',),                   ('a', '<', '1.2'),      1),
+    (('a',),                   ('a', '>', '1.2'),      1),
+    (('a',),                   ('a', '<>', '1.2'),     1),
+
+    # Unversioned require matches all versions
+    (('a', '=', '1.2'),                ('a',),                 1),
+    (('a', '<', '1.2'),                ('a',),                 1),
+    (('a', '>', '1.2'),                ('a',),                 1),
+    (('a', '<=', '1.2'),       ('a',),                 1),
+    (('a', '>=', '1.2'),       ('a',),                 1),
+    (('a', '<>', '1.2'),       ('a',),                 1),
+
+    # Simple, obvious version comparisons
+    (('a', '=', '1.2'),                ('a', '=', '1.2'),      1),
+    (('a', '=', '1.2'),                ('a', '>=', '1.2'),     1),
+    (('a', '=', '1.2'),                ('a', '<=', '1.2'),     1),
+    (('a', '=', '1.2'),                ('a', '<', '1.2'),      0),
+    (('a', '=', '1.2'),                ('a', '>', '1.2'),      0),
+    (('a', '=', '1.2'),                ('a', '<>', '1.2'),     0),
+
+    (('a', '=', '1.2'),                ('a', '=', '1.3'),      0),
+    (('a', '=', '1.2'),                ('a', '>=', '1.3'),     0),
+    (('a', '=', '1.2'),                ('a', '<=', '1.3'),     1),
+    (('a', '=', '1.2'),                ('a', '<', '1.3'),      1),
+    (('a', '=', '1.2'),                ('a', '>', '1.3'),      0),
+    (('a', '=', '1.2'),                ('a', '<>', '1.3'),     1),
+
+    # Simple, obvious version-release comparisons
+    (('a', '=', '1.2-1'),      ('a', '=', '1.2-1'),    1),
+    (('a', '=', '1.2-1'),      ('a', '>=', '1.2-1'),   1),
+    (('a', '=', '1.2-1'),      ('a', '<=', '1.2-1'),   1),
+    (('a', '=', '1.2-1'),      ('a', '<', '1.2-1'),    0),
+    (('a', '=', '1.2-1'),      ('a', '>', '1.2-1'),    0),
+    (('a', '=', '1.2-1'),      ('a', '<>', '1.2-1'),   0),
+
+    (('a', '=', '1.2-1'),      ('a', '=', '1.2-2'),    0),
+    (('a', '=', '1.2-1'),      ('a', '>=', '1.2-2'),   0),
+    (('a', '=', '1.2-1'),      ('a', '<=', '1.2-2'),   1),
+    (('a', '=', '1.2-1'),      ('a', '<', '1.2-2'),    1),
+    (('a', '=', '1.2-1'),      ('a', '>', '1.2-2'),    0),
+    (('a', '=', '1.2-1'),      ('a', '<>', '1.2-2'),   1),
+
+    (('a', '=', '1.3-1'),      ('a', '=', '1.2-2'),    0),
+    (('a', '=', '1.3-1'),      ('a', '>=', '1.2-2'),   1),
+    (('a', '=', '1.3-1'),      ('a', '<=', '1.2-2'),   0),
+    (('a', '=', '1.3-1'),      ('a', '<', '1.2-2'),    0),
+    (('a', '=', '1.3-1'),      ('a', '>', '1.2-2'),    1),
+    (('a', '=', '1.3-1'),      ('a', '<>', '1.2-2'),   1),
+
+    # Zero epoch is same as no epoch
+    (('a', '=', '0:1.2'),      ('a', '=', '1.2'),      1),
+    (('a', '=', '0:1.2'),      ('a', '>=', '1.2'),     1),
+    (('a', '=', '0:1.2'),      ('a', '<=', '1.2'),     1),
+    (('a', '=', '0:1.2'),      ('a', '<', '1.2'),      0),
+    (('a', '=', '0:1.2'),      ('a', '>', '1.2'),      0),
+    (('a', '=', '0:1.2'),      ('a', '<>', '1.2'),     0),
+
+    (('a', '=', '1.2'),                ('a', '=', '0:1.2'),    1),
+    (('a', '=', '1.2'),                ('a', '>=', '0:1.2'),   1),
+    (('a', '=', '1.2'),                ('a', '<=', '0:1.2'),   1),
+    (('a', '=', '1.2'),                ('a', '<', '0:1.2'),    0),
+    (('a', '=', '1.2'),                ('a', '>', '0:1.2'),    0),
+    (('a', '=', '1.2'),                ('a', '<>', '0:1.2'),   0),
+
+    # Non-zero epochs
+    (('a', '=', '1:1.2'),      ('a', '=', '1.2'),      0),
+    (('a', '=', '1:1.2'),      ('a', '>=', '1.2'),     1),
+    (('a', '=', '1:1.2'),      ('a', '<=', '1.2'),     0),
+    (('a', '=', '1:1.2'),      ('a', '<', '1.2'),      0),
+    (('a', '=', '1:1.2'),      ('a', '>', '1.2'),      1),
+    (('a', '=', '1:1.2'),      ('a', '<>', '1.2'),     1),
+
+    (('a', '=', '1.2'),                ('a', '=', '1:1.2'),    0),
+    (('a', '=', '1.2'),                ('a', '>=', '1:1.2'),   0),
+    (('a', '=', '1.2'),                ('a', '<=', '1:1.2'),   1),
+    (('a', '=', '1.2'),                ('a', '<', '1:1.2'),    1),
+    (('a', '=', '1.2'),                ('a', '>', '1:1.2'),    0),
+    (('a', '=', '1.2'),                ('a', '<>', '1:1.2'),   1),
+
+    (('a', '=', '2:1.2'),      ('a', '=', '2:1.2'),    1),
+    (('a', '=', '2:1.2'),      ('a', '>=', '2:1.2'),   1),
+    (('a', '=', '2:1.2'),      ('a', '<=', '2:1.2'),   1),
+    (('a', '=', '2:1.2'),      ('a', '<', '2:1.2'),    0),
+    (('a', '=', '2:1.2'),      ('a', '>', '2:1.2'),    0),
+    (('a', '=', '2:1.2'),      ('a', '<>', '2:1.2'),   0),
+
+    # Simple, obvious version comparisons with provide ranges
+    (('a', '>', '1.2'),                ('a', '=', '1.2'),      0),
+    (('a', '>', '1.2'),                ('a', '>=', '1.2'),     1),
+    (('a', '>', '1.2'),                ('a', '<=', '1.2'),     0),
+    (('a', '>', '1.2'),                ('a', '<', '1.2'),      0),
+    (('a', '>', '1.2'),                ('a', '>', '1.2'),      1),
+    (('a', '>', '1.2'),                ('a', '<>', '1.2'),     1),
+
+    (('a', '<', '1.2'),                ('a', '=', '1.2'),      0),
+    (('a', '<', '1.2'),                ('a', '>=', '1.2'),     0),
+    (('a', '<', '1.2'),                ('a', '<=', '1.2'),     1),
+    (('a', '<', '1.2'),                ('a', '<', '1.2'),      1),
+    (('a', '<', '1.2'),                ('a', '>', '1.2'),      0),
+    (('a', '<', '1.2'),                ('a', '<>', '1.2'),     1),
+
+    (('a', '>=', '1.2'),       ('a', '=', '1.2'),      1),
+    (('a', '>=', '1.2'),       ('a', '>=', '1.2'),     1),
+    (('a', '>=', '1.2'),       ('a', '<=', '1.2'),     1),
+    (('a', '>=', '1.2'),       ('a', '<', '1.2'),      0),
+    (('a', '>=', '1.2'),       ('a', '>', '1.2'),      1),
+    (('a', '>=', '1.2'),       ('a', '<>', '1.2'),     1),
+
+    (('a', '<=', '1.2'),       ('a', '=', '1.2'),      1),
+    (('a', '<=', '1.2'),       ('a', '>=', '1.2'),     1),
+    (('a', '<=', '1.2'),       ('a', '<=', '1.2'),     1),
+    (('a', '<=', '1.2'),       ('a', '<', '1.2'),      1),
+    (('a', '<=', '1.2'),       ('a', '>', '1.2'),      0),
+    (('a', '<=', '1.2'),       ('a', '<>', '1.2'),     1),
+
+    (('a', '<>', '1.2'),       ('a', '=', '1.2'),      0),
+    (('a', '<>', '1.2'),       ('a', '>=', '1.2'),     1),
+    (('a', '<>', '1.2'),       ('a', '<=', '1.2'),     1),
+    (('a', '<>', '1.2'),       ('a', '<', '1.2'),      1),
+    (('a', '<>', '1.2'),       ('a', '>', '1.2'),      1),
+    (('a', '<>', '1.2'),       ('a', '<>', '1.2'),     1),
+
+    # Missing release should be considered "any release will do"
+    # but this is not always so (the cases with "???")
+    (('a', '=', '1.2-1'),      ('a', '=', '1.2'),      1),
+    (('a', '=', '1.2-1'),      ('a', '>=', '1.2'),     1),
+    (('a', '=', '1.2-1'),      ('a', '<=', '1.2'),     1),
+    (('a', '=', '1.2-1'),      ('a', '<', '1.2'),      0),
+    (('a', '=', '1.2-1'),      ('a', '>', '1.2'),      0),
+    (('a', '=', '1.2-1'),      ('a', '<>', '1.2'),     0),
+
+    (('a', '>', '1.2-1'),      ('a', '=', '1.2'),      1),
+    (('a', '>', '1.2-1'),      ('a', '>=', '1.2'),     1),
+    (('a', '>', '1.2-1'),      ('a', '<=', '1.2'),     1),
+    (('a', '>', '1.2-1'),      ('a', '<', '1.2'),      0),
+    (('a', '>', '1.2-1'),      ('a', '>', '1.2'),      1),
+    (('a', '>', '1.2-1'),      ('a', '<>', '1.2'),     1),
+
+    (('a', '<', '1.2-1'),      ('a', '=', '1.2'),      1),
+    (('a', '<', '1.2-1'),      ('a', '>=', '1.2'),     1),
+    (('a', '<', '1.2-1'),      ('a', '<=', '1.2'),     1),
+    (('a', '<', '1.2-1'),      ('a', '<', '1.2'),      1),
+    (('a', '<', '1.2-1'),      ('a', '>', '1.2'),      0),
+    (('a', '<', '1.2-1'),      ('a', '<>', '1.2'),     1),
+
+    (('a', '>=', '1.2-1'),     ('a', '=', '1.2'),      1),
+    (('a', '>=', '1.2-1'),     ('a', '>=', '1.2'),     1),
+    (('a', '>=', '1.2-1'),     ('a', '<=', '1.2'),     1),
+    (('a', '>=', '1.2-1'),     ('a', '<', '1.2'),      0),
+    (('a', '>=', '1.2-1'),     ('a', '>', '1.2'),      1),
+    (('a', '>=', '1.2-1'),     ('a', '<>', '1.2'),     1),
+
+    (('a', '<=', '1.2-1'),     ('a', '=', '1.2'),      1),
+    (('a', '<=', '1.2-1'),     ('a', '>=', '1.2'),     1),
+    (('a', '<=', '1.2-1'),     ('a', '<=', '1.2'),     1),
+    (('a', '<=', '1.2-1'),     ('a', '<', '1.2'),      1),
+    (('a', '<=', '1.2-1'),     ('a', '>', '1.2'),      0),
+    (('a', '<=', '1.2-1'),     ('a', '<>', '1.2'),     1),
+
+    (('a', '<>', '1.2-1'),     ('a', '=', '1.2'),      1),
+    (('a', '<>', '1.2-1'),     ('a', '>=', '1.2'),     1),
+    (('a', '<>', '1.2-1'),     ('a', '<=', '1.2'),     1),
+    (('a', '<>', '1.2-1'),     ('a', '<', '1.2'),      1),
+    (('a', '<>', '1.2-1'),     ('a', '>', '1.2'),      1),
+    (('a', '<>', '1.2-1'),     ('a', '<>', '1.2'),     1),
+
+    (('a', '=', '1.2'),                ('a', '=', '1.2-1'),    1),
+    (('a', '=', '1.2'),                ('a', '>=', '1.2-1'),   1),
+    (('a', '=', '1.2'),                ('a', '<=', '1.2-1'),   1),
+    (('a', '=', '1.2'),                ('a', '<', '1.2-1'),    1),
+    (('a', '=', '1.2'),                ('a', '>', '1.2-1'),    1),
+    (('a', '=', '1.2'),                ('a', '<>', '1.2-1'),   1),
+
+    (('a', '>', '1.2'),                ('a', '=', '1.2-1'),    0),
+    (('a', '>', '1.2'),                ('a', '>=', '1.2-1'),   1),
+    (('a', '>', '1.2'),                ('a', '<=', '1.2-1'),   0),
+    (('a', '>', '1.2'),                ('a', '<', '1.2-1'),    0),
+    (('a', '>', '1.2'),                ('a', '>', '1.2-1'),    1),
+    (('a', '>', '1.2'),                ('a', '<>', '1.2-1'),   1),
+
+    (('a', '<', '1.2'),                ('a', '=', '1.2-1'),    0),
+    (('a', '<', '1.2'),                ('a', '>=', '1.2-1'),   0),
+    (('a', '<', '1.2'),                ('a', '<=', '1.2-1'),   1),
+    (('a', '<', '1.2'),                ('a', '<', '1.2-1'),    1),
+    (('a', '<', '1.2'),                ('a', '>', '1.2-1'),    0),
+    (('a', '<', '1.2'),                ('a', '<>', '1.2-1'),   1),
+
+    (('a', '>=', '1.2'),       ('a', '=', '1.2-1'),    1),
+    (('a', '>=', '1.2'),       ('a', '>=', '1.2-1'),   1),
+    (('a', '>=', '1.2'),       ('a', '<=', '1.2-1'),   1),
+    (('a', '>=', '1.2'),       ('a', '<', '1.2-1'),    1),
+    (('a', '>=', '1.2'),       ('a', '>', '1.2-1'),    1),
+    (('a', '>=', '1.2'),       ('a', '<>', '1.2-1'),   1),
+
+    (('a', '<=', '1.2'),       ('a', '=', '1.2-1'),    1),
+    (('a', '<=', '1.2'),       ('a', '>=', '1.2-1'),   1),
+    (('a', '<=', '1.2'),       ('a', '<=', '1.2-1'),   1),
+    (('a', '<=', '1.2'),       ('a', '<', '1.2-1'),    1),
+    (('a', '<=', '1.2'),       ('a', '>', '1.2-1'),    1),
+    (('a', '<=', '1.2'),       ('a', '<>', '1.2-1'),   1),
+
+    (('a', '<>', '1.2'),       ('a', '=', '1.2-1'),    0),
+    (('a', '<>', '1.2'),       ('a', '>=', '1.2-1'),   1),
+    (('a', '<>', '1.2'),       ('a', '<=', '1.2-1'),   1),
+    (('a', '<>', '1.2'),       ('a', '<', '1.2-1'),    1),
+    (('a', '<>', '1.2'),       ('a', '>', '1.2-1'),    1),
+    (('a', '<>', '1.2'),       ('a', '<>', '1.2-1'),   1),
+]
+
+ms = ['no match', 'match']
+
+myprint() # dumb kludge to fixup expected output
+for p, r, res in tests:
+    d1 = rpm.ds(p, 'provides')
+    d2 = rpm.ds(r, 'requires')
+    match = d1.Compare(d2)
+    if match != res:
+        myprint('FAILED: %s with %s: %s' % (d1.DNEVR(), d2.DNEVR(),ms[res]))
+
+EOF
+python test.py
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "
+" | \
+  $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/rpmdepmatch.at:4"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+  set +x
+  $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_411
index b51266a2de8405243f13b47abd96064a89c61198..7467922347213fa549ff4020f18cd4630f9c1b64 100644 (file)
@@ -1,9 +1,13 @@
 m4_include([rpmgeneral.at])
+m4_include([rpmio.at])
 m4_include([rpmquery.at])
 m4_include([rpmverify.at])
+m4_include([rpmsigdig.at])
 m4_include([rpmdb.at])
 m4_include([rpmi.at])
+m4_include([rpmorder.at])
 m4_include([rpmbuild.at])
+m4_include([rpmbuildid.at])
 m4_include([rpmscript.at])
 m4_include([rpmvercmp.at])
 m4_include([rpmdeps.at])
index 473ac494ffc4f03b431fba267f21567b1dbc0a45..7e6a1b0dca3771092bd13796eb9b0c5df9cd2997 100644 (file)
@@ -16,8 +16,8 @@ runroot rpmbuild --quiet -bb \
        --define "reqs deptest-two" \
          /data/SPECS/deptest.spec
 
-runroot rpm -U --nodeps "${TOPDIR}"/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
-runroot rpm -Va
+runroot rpm -U --nodeps /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm
+runroot rpm -Va --nofiles
 ],
 [1],
 [Unsatisfied dependencies for deptest-one-1.0-1.noarch:
@@ -63,6 +63,67 @@ runroot rpm -Vva --nodeps --nouser --nogroup
 [])
 AT_CLEANUP
 
+# Test file verify when no errors expected in verbose mode.
+AT_SETUP([directory replaced with a directory symlink])
+AT_KEYWORDS([verify])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+        --define "filetype datadir" \
+        --define "filedata README1" \
+        --define "user $(id -u -n)" \
+        --define "grp $(id -g -n)" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+mv "${RPMTEST}"/opt/foo "${RPMTEST}"/opt/was
+ln -s was "${RPMTEST}"/opt/foo
+runroot rpm -Vv replacetest
+],
+[0],
+[.........    /opt/foo
+.........    /opt/foo/README1
+.........    /opt/goo
+.........    /opt/zoo
+],
+[])
+AT_CLEANUP
+
+AT_SETUP([directory replaced with an invalid directory symlink])
+AT_KEYWORDS([verify])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+tf="${RPMTEST}"/opt/foo
+rm -rf "${RPMTEST}"/opt/*
+rm -rf "${TOPDIR}"
+
+runroot rpmbuild --quiet -bb \
+        --define "ver 1.0" \
+        --define "filetype datadir" \
+        --define "filedata README1" \
+          /data/SPECS/replacetest.spec
+
+runroot rpm -U /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+mv "${RPMTEST}"/opt/foo "${RPMTEST}"/opt/was
+ln -s was "${RPMTEST}"/opt/foo
+runroot rpm -Vv --nouser --nogroup replacetest
+],
+[1],
+[....L....    /opt/foo
+.........    /opt/foo/README1
+.........    /opt/goo
+.........    /opt/zoo
+],
+[])
+AT_CLEANUP
+
 # Test file verify after mutilating the files a bit.
 AT_SETUP([verify from db, with problems present])
 AT_KEYWORDS([verify])
@@ -107,6 +168,53 @@ missing   d /usr/share/doc/hello-1.0/FAQ
 [])
 AT_CLEANUP
 
+AT_SETUP([verify file attribute filtering])
+AT_KEYWORDS([query])
+AT_CHECK([
+runroot rpmbuild -bb --quiet \
+  /data/SPECS/vattrtest.spec
+
+runroot rpm -U /build/RPMS/noarch/vattrtest-1.0-1.noarch.rpm
+runroot_other touch /opt/vattrtest/g
+runroot_other chmod 644 /opt/vattrtest/g
+
+cmd="rpm -Vv --nouser --nogroup"
+for filter in --noconfig --noghost --noartifact; do
+    echo ${filter}
+    runroot ${cmd} ${filter} vattrtest
+done
+],
+[ignore],
+[--noconfig
+.........    /opt/vattrtest
+.........  a /opt/vattrtest/a
+.........  d /opt/vattrtest/d
+.........  g /opt/vattrtest/g
+.........  l /opt/vattrtest/l
+.........  m /opt/vattrtest/m
+.........  r /opt/vattrtest/r
+--noghost
+.........    /opt/vattrtest
+.........  a /opt/vattrtest/a
+.........  c /opt/vattrtest/c
+.........  c /opt/vattrtest/cn
+.........  d /opt/vattrtest/d
+.........  l /opt/vattrtest/l
+.........  m /opt/vattrtest/m
+.........  r /opt/vattrtest/r
+--noartifact
+.........    /opt/vattrtest
+.........  c /opt/vattrtest/c
+.........  c /opt/vattrtest/cn
+.........  d /opt/vattrtest/d
+.........  g /opt/vattrtest/g
+.........  l /opt/vattrtest/l
+.........  m /opt/vattrtest/m
+.........  r /opt/vattrtest/r
+],
+[])
+AT_CLEANUP
+
 # Test verify script success & failure behavior
 # Ignoring stderr spew for now
 AT_SETUP([verifyscript failure])
@@ -117,7 +225,7 @@ RPMDB_INIT
 
 rm -rf "${TOPDIR}"
 runroot rpmbuild --quiet -bb /data/SPECS/verifyscript.spec
-runroot rpm -U --nodeps "${TOPDIR}"/RPMS/noarch/verifyscript-1.0-1.noarch.rpm
+runroot rpm -U --nodeps /build/RPMS/noarch/verifyscript-1.0-1.noarch.rpm
 rm -f "${RPMTEST}"/var/checkme
 runroot rpm -V --nodeps verifyscript
 ],
@@ -134,7 +242,7 @@ RPMDB_INIT
 
 rm -rf "${TOPDIR}"
 runroot rpmbuild --quiet -bb /data/SPECS/verifyscript.spec
-runroot rpm -U --nodeps "${TOPDIR}"/RPMS/noarch/verifyscript-1.0-1.noarch.rpm
+runroot rpm -U --nodeps /build/RPMS/noarch/verifyscript-1.0-1.noarch.rpm
 touch "${RPMTEST}"/var/checkme
 runroot rpm -V --nodeps verifyscript
 ],
@@ -163,7 +271,7 @@ done
 
 # first instance of a shared file is the one that actually gets created,
 # force the order so we know what to expect as these dont depend on each other
-runroot rpm -U --noorder "${TOPDIR}"/RPMS/noarch/conflictone-1.0-1.noarch.rpm "${TOPDIR}"/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
+runroot rpm -U --noorder /build/RPMS/noarch/conflictone-1.0-1.noarch.rpm /build/RPMS/noarch/conflicttwo-1.0-1.noarch.rpm
 runroot rpm -e conflicttwo
 runroot rpm -Va --nouser --nogroup
 ],
@@ -171,3 +279,297 @@ runroot rpm -Va --nouser --nogroup
 [],
 [])
 AT_CLEANUP
+
+# ------------------------------
+# Upgraded verification with min_writes 1 (files)
+AT_SETUP([Upgraded verification with min_writes 1 (files)])
+AT_KEYWORDS([upgrade verify min_writes])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+tf="${RPMTEST}"/opt/foo
+rm -rf "${tf}" "${tf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+done
+
+for v in "3.0" "4.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype file" \
+       --define "filedata fox" \
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+touch -t 201703171717 ${tf}
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -Va --nouser --nogroup replacetest
+cat "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+cat "${tf}"
+
+echo "xx" > "${tf}"
+cat "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+cat "${tf}"
+
+touch -t 201703171717 ${tf}
+
+runroot rpm -U --oldpackage \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+cat "${tf}"
+],
+[0],
+[foo
+foo
+fox
+xx
+fox
+fox
+],
+[])
+AT_CLEANUP
+
+
+# ------------------------------
+# Upgraded verification with min_writes 2 (files)
+AT_SETUP([Upgraded verification with min_writes 2 (files)])
+AT_KEYWORDS([upgrade verify min_writes])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+tf="${RPMTEST}"/opt/foo
+rm -rf "${tf}" "${tf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype file" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+done
+
+for v in "3.0" "4.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype file" \
+       --define "filedata fox" \
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+cat "${tf}"
+touch -t 201703171717 ${tf}
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm > output.txt 2>&1
+runroot rpm -Va --nouser --nogroup replacetest
+grep -c "touch" output.txt
+cat "${tf}"
+
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c "touch" output.txt
+cat "${tf}"
+echo "xx" > "${tf}"
+cat "${tf}"
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c "touch" output.txt
+cat "${tf}"
+
+touch -t 201703171717 ${tf}
+
+runroot rpm -U -Uvv --fsmdebug  --oldpackage \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c  "touch" output.txt
+cat "${tf}"
+],
+[0],
+[foo
+2
+foo
+1
+fox
+xx
+1
+fox
+2
+fox
+],
+[])
+AT_CLEANUP
+
+# ------------------------------
+# Upgraded verification with min_writes 3 (LINKs)
+AT_SETUP([Upgraded verification with min_writes 3 (LINKs)])
+AT_KEYWORDS([upgrade verify min_writes])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+tf="${RPMTEST}"/opt/foo
+rm -rf "${tf}" "${tf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype link" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+done
+
+for v in "3.0" "4.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype link" \
+       --define "filedata fox" \
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm
+runroot rpm -Va --nouser --nogroup replacetest
+readlink "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+readlink "${tf}"
+
+ln -sf "xx" "${tf}"
+readlink "${tf}"
+
+runroot rpm -U \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+readlink "${tf}"
+
+runroot rpm -U --oldpackage \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm
+runroot rpm -Va  --nouser --nogroup replacetest
+readlink "${tf}"
+],
+[0],
+[foo
+foo
+fox
+xx
+fox
+fox
+],
+[])
+AT_CLEANUP
+# ------------------------------
+# Upgraded verification with min_writes 4 (LINKs)
+AT_SETUP([Upgraded verification with min_writes 4 (LINKs)])
+AT_KEYWORDS([upgrade verify min_writes])
+AT_CHECK([
+RPMDB_CLEAR
+RPMDB_INIT
+tf="${RPMTEST}"/opt/foo
+rm -rf "${tf}" "${tf}".rpm*
+rm -rf "${TOPDIR}"
+
+for v in "1.0" "2.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype link" \
+       --define "filedata foo" \
+          /data/SPECS/replacetest.spec
+done
+
+for v in "3.0" "4.0"; do
+    runroot rpmbuild --quiet -bb \
+        --define "ver $v" \
+       --define "filetype link" \
+       --define "filedata fox" \
+          /data/SPECS/replacetest.spec
+done
+
+runroot rpm -i /build/RPMS/noarch/replacetest-1.0-1.noarch.rpm
+readlink "${tf}"
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+        /build/RPMS/noarch/replacetest-2.0-1.noarch.rpm > output.txt 2>&1
+runroot rpm -Va --nouser --nogroup replacetest
+grep -c "touch" output.txt
+readlink "${tf}"
+
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c "touch" output.txt
+readlink "${tf}"
+ln -sf "xx" "${tf}"
+readlink "${tf}"
+
+runroot rpm -Uvv --fsmdebug \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-4.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c "touch" output.txt
+readlink "${tf}"
+
+runroot rpm -U -Uvv --fsmdebug  --oldpackage \
+       --define "_minimize_writes 1" \
+       /build/RPMS/noarch/replacetest-3.0-1.noarch.rpm  > output.txt 2>&1
+runroot rpm -Va  --nouser --nogroup replacetest
+grep -c  "touch" output.txt
+readlink "${tf}"
+],
+[0],
+[foo
+2
+foo
+1
+fox
+xx
+1
+fox
+2
+fox
+],
+[])
+AT_CLEANUP
index 7f27b47c5573c9aa58f3cf37bbe92fa8990cb35c..6c572ae0972c67d7289422fe9bf923178b8be55c 100644 (file)
@@ -1,6 +1,7 @@
-/* Copyright (C) 2001, 2002, 2003, 2005, 2007, 2009, 2010, 2011 Red Hat, Inc.
+/* Copyright (C) 2001-2003, 2005, 2007, 2009-2011, 2016, 2017 Red Hat, Inc.
    Written by Alexander Larsson <alexl@redhat.com>, 2002
    Based on code by Jakub Jelinek <jakub@redhat.com>, 2001.
+   String/Line table rewriting by Mark Wielaard <mjw@redhat.com>, 2017.
 
    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
@@ -30,6 +31,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <stdint.h>
+#include <inttypes.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #define DW_FORM_ref_udata      0x15
 #define DW_FORM_indirect       0x16
 
+#define DW_MACRO_GNU_define    1
+#define DW_MACRO_GNU_undef     2
+#define DW_MACRO_GNU_start_file        3
+#define DW_MACRO_GNU_end_file  4
+#define DW_MACRO_GNU_define_indirect 5
+#define DW_MACRO_GNU_undef_indirect 6
+#define DW_MACRO_GNU_transparent_include 7
+
+/* Unfortunately strtab manipulation functions were only officially added
+   to elfutils libdw in 0.167.  Before that there were internal unsupported
+   ebl variants.  While libebl.h isn't supported we'll try to use it anyway
+   if the elfutils we build against is too old.  */
+#include <elfutils/version.h>
+#if _ELFUTILS_PREREQ (0, 167)
+#include <elfutils/libdwelf.h>
+typedef Dwelf_Strent           Strent;
+typedef Dwelf_Strtab           Strtab;
+#define strtab_init            dwelf_strtab_init
+#define strtab_add(X,Y)                dwelf_strtab_add(X,Y)
+#define strtab_add_len(X,Y,Z)  dwelf_strtab_add_len(X,Y,Z)
+#define strtab_free            dwelf_strtab_free
+#define strtab_finalize                dwelf_strtab_finalize
+#define strent_offset          dwelf_strent_off
+#else
+#include <elfutils/libebl.h>
+typedef struct Ebl_Strent      Strent;
+typedef struct Ebl_Strtab      Strtab;
+#define strtab_init            ebl_strtabinit
+#define strtab_add(X,Y)                ebl_strtabadd(X,Y,0)
+#define strtab_add_len(X,Y,Z)  ebl_strtabadd(X,Y,Z)
+#define strtab_free            ebl_strtabfree
+#define strtab_finalize                ebl_strtabfinalize
+#define strent_offset          ebl_strtaboffset
+#endif
+
+#include <search.h>
+
 #include <rpm/rpmio.h>
 #include <rpm/rpmpgp.h>
 #include "tools/hashtab.h"
@@ -84,6 +123,101 @@ char *dest_dir = NULL;
 char *list_file = NULL;
 int list_file_fd = -1;
 int do_build_id = 0;
+int no_recompute_build_id = 0;
+char *build_id_seed = NULL;
+
+/* We go over the debug sections in two phases. In phase zero we keep
+   track of any needed changes and collect strings, indexes and
+   sizes. In phase one we do the actual replacements updating the
+   strings, indexes and writing out new debug sections. The following
+   keep track of various changes that might be needed. */
+
+/* Whether we need to do any literal string (DW_FORM_string) replacements
+   in debug_info. */
+static bool need_string_replacement = false;
+/* Whether we need to do any updates of the string indexes (DW_FORM_strp)
+   in debug_info for string indexes. */
+static bool need_strp_update = false;
+/* If the debug_line changes size we will need to update the
+   DW_AT_stmt_list attributes indexes in the debug_info. */
+static bool need_stmt_update = false;
+
+/* Storage for dynamically allocated strings to put into string
+   table. Keep together in memory blocks of 16K. */
+#define STRMEMSIZE (16 * 1024)
+struct strmemblock
+{
+  struct strmemblock *next;
+  char memory[0];
+};
+
+/* We keep track of each index in the original string table and the
+   associated entry in the new table so we don't insert identical
+   strings into the new string table. If constructed correctly the
+   original strtab shouldn't contain duplicate strings anyway. Any
+   actual identical strings could be deduplicated, but searching for
+   and comparing the indexes is much faster than comparing strings
+   (and we don't have to construct replacement strings). */
+struct stridxentry
+{
+  uint32_t idx; /* Original index in the string table. */
+  Strent *entry; /* Entry in the new table. */
+};
+
+/* Storage for new string table entries. Keep together in memory to
+   quickly search through them with tsearch. */
+#define STRIDXENTRIES ((16 * 1024) / sizeof (struct stridxentry))
+struct strentblock
+{
+  struct strentblock *next;
+  struct stridxentry entry[0];
+};
+
+/* All data to keep track of the existing and new string table. */
+struct strings
+{
+  Strtab *str_tab;                     /* The new string table. */
+  char *str_buf;                       /* New Elf_Data d_buf. */
+  struct strmemblock *blocks;          /* The first strmemblock. */
+  struct strmemblock *last_block;      /* The currently used strmemblock. */
+  size_t stridx;                       /* Next free byte in last block. */
+  struct strentblock *entries;         /* The first string index block. */
+  struct strentblock *last_entries;    /* The currently used strentblock. */
+  size_t entryidx;                     /* Next free entry in the last block. */
+  void *strent_root;                   /* strent binary search tree root. */
+};
+
+struct line_table
+{
+  size_t old_idx;     /* Original offset. */
+  size_t new_idx;     /* Offset in new debug_line section. */
+  ssize_t size_diff;  /* Difference in (header) size. */
+  bool replace_dirs;  /* Whether to replace any dir paths.  */
+  bool replace_files; /* Whether to replace any file paths. */
+
+  /* Header fields. */
+  uint32_t unit_length;
+  uint16_t version;
+  uint32_t header_length;
+  uint8_t min_instr_len;
+  uint8_t max_op_per_instr; /* Only if version >= 4 */
+  uint8_t default_is_stmt;
+  int8_t line_base;
+  uint8_t line_range;
+  uint8_t opcode_base;
+};
+
+struct debug_lines
+{
+  struct line_table *table; /* Malloc/Realloced. */
+  size_t size;              /* Total number of line_tables.
+                              Updated by get_line_table. */
+  size_t used;              /* Used number of line_tables.
+                              Updated by get_line_table. */
+  size_t debug_lines_len;   /* Total size of new debug_line section.
+                              updated by edit_dwarf2_line. */
+  char *line_buf;           /* New Elf_Data d_buf. */
+};
 
 typedef struct
 {
@@ -92,15 +226,42 @@ typedef struct
   Elf_Scn **scn;
   const char *filename;
   int lastscn;
+  size_t phnum;
+  struct strings strings;
+  struct debug_lines lines;
   GElf_Shdr shdr[0];
 } DSO;
 
+static void
+setup_lines (struct debug_lines *lines)
+{
+  lines->table = NULL;
+  lines->size = 0;
+  lines->used = 0;
+  lines->debug_lines_len = 0;
+  lines->line_buf = NULL;
+}
+
+static void
+destroy_lines (struct debug_lines *lines)
+{
+  free (lines->table);
+  free (lines->line_buf);
+}
+
 typedef struct
 {
   unsigned char *ptr;
   uint32_t addend;
+  int ndx;
 } REL;
 
+typedef struct
+{
+  Elf64_Addr r_offset;
+  int ndx;
+} LINE_REL;
+
 #define read_uleb128(ptr) ({           \
   unsigned int ret = 0;                        \
   unsigned int c;                      \
@@ -117,9 +278,23 @@ typedef struct
   ret;                                 \
 })
 
+#define write_uleb128(ptr,val) ({      \
+  uint32_t valv = (val);               \
+  do                                   \
+    {                                  \
+      unsigned char c = valv & 0x7f;   \
+      valv >>= 7;                      \
+      if (valv)                                \
+       c |= 0x80;                      \
+      *ptr++ = c;                      \
+    }                                  \
+  while (valv);                                \
+})
+
 static uint16_t (*do_read_16) (unsigned char *ptr);
 static uint32_t (*do_read_32) (unsigned char *ptr);
-static void (*write_32) (unsigned char *ptr, GElf_Addr val);
+static void (*do_write_16) (unsigned char *ptr, uint16_t val);
+static void (*do_write_32) (unsigned char *ptr, uint32_t val);
 
 static int ptr_size;
 static int cu_version;
@@ -158,11 +333,11 @@ strptr (DSO *dso, int sec, off_t offset)
   if (offset >= 0 && (GElf_Addr) offset < dso->shdr[sec].sh_size)
     {
       data = NULL;
-      while ((data = elf_rawdata (scn, data)) != NULL)
+      while ((data = elf_getdata (scn, data)) != NULL)
        {
          if (data->d_buf
              && offset >= data->d_off
-             && offset < data->d_off + (off_t)data->d_size)
+             && offset < data->d_off + data->d_size)
            return (const char *) data->d_buf + (offset - data->d_off);
        }
     }
@@ -171,7 +346,7 @@ strptr (DSO *dso, int sec, off_t offset)
 }
 
 
-#define read_1(ptr) *ptr++
+#define read_8(ptr) *ptr++
 
 #define read_16(ptr) ({                                        \
   uint16_t ret = do_read_16 (ptr);                     \
@@ -212,28 +387,73 @@ int reltype;
 })
 
 static void
-dwarf2_write_le32 (unsigned char *p, GElf_Addr val)
+dwarf2_write_le16 (unsigned char *p, uint16_t v)
 {
-  uint32_t v = (uint32_t) val;
+  p[0] = v;
+  p[1] = v >> 8;
+}
 
+static void
+dwarf2_write_le32 (unsigned char *p, uint32_t v)
+{
   p[0] = v;
   p[1] = v >> 8;
   p[2] = v >> 16;
   p[3] = v >> 24;
 }
 
-
 static void
-dwarf2_write_be32 (unsigned char *p, GElf_Addr val)
+dwarf2_write_be16 (unsigned char *p, uint16_t v)
 {
-  uint32_t v = (uint32_t) val;
+  p[1] = v;
+  p[0] = v >> 8;
+}
 
+static void
+dwarf2_write_be32 (unsigned char *p, uint32_t v)
+{
   p[3] = v;
   p[2] = v >> 8;
   p[1] = v >> 16;
   p[0] = v >> 24;
 }
 
+#define write_8(ptr,val) ({    \
+  *ptr++ = (val);              \
+})
+
+#define write_16(ptr,val) ({   \
+  do_write_16 (ptr,val);       \
+  ptr += 2;                    \
+})
+
+#define write_32(ptr,val) ({   \
+  do_write_32 (ptr,val);       \
+  ptr += 4;                    \
+})
+
+/* relocated writes can only be called immediately after
+   do_read_32_relocated.  ptr must be equal to relptr->ptr (or
+   relend). Might just update the addend. So relocations need to be
+   updated at the end.  */
+
+#define do_write_32_relocated(ptr,val) ({ \
+  if (relptr && relptr < relend && relptr->ptr == ptr) \
+    {                                                  \
+      if (reltype == SHT_REL)                          \
+       do_write_32 (ptr, val - relptr->addend);        \
+      else                                             \
+       relptr->addend = val;                           \
+    }                                                  \
+  else                                                 \
+    do_write_32 (ptr,val);                             \
+})
+
+#define write_32_relocated(ptr,val) ({ \
+  do_write_32_relocated (ptr,val);     \
+  ptr += 4;                           \
+})
+
 static struct
   {
     const char *name;
@@ -256,6 +476,7 @@ static struct
 #define DEBUG_RANGES   10
 #define DEBUG_TYPES    11
 #define DEBUG_MACRO    12
+#define DEBUG_GDB_SCRIPT       13
     { ".debug_info", NULL, NULL, 0, 0, 0 },
     { ".debug_abbrev", NULL, NULL, 0, 0, 0 },
     { ".debug_line", NULL, NULL, 0, 0, 0 },
@@ -269,6 +490,7 @@ static struct
     { ".debug_ranges", NULL, NULL, 0, 0, 0 },
     { ".debug_types", NULL, NULL, 0, 0, 0 },
     { ".debug_macro", NULL, NULL, 0, 0, 0 },
+    { ".debug_gdb_scripts", NULL, NULL, 0, 0, 0 },
     { NULL, NULL, NULL, 0, 0, 0 }
   };
 
@@ -475,99 +697,655 @@ canonicalize_path (const char *s, char *d)
   return rv;
 }
 
+/* Returns the rest of PATH if it starts with DIR_PREFIX, skipping any
+   / path separators, or NULL if PATH doesn't start with
+   DIR_PREFIX. Might return the empty string if PATH equals DIR_PREFIX
+   (modulo trailing slashes). Never returns path starting with '/'.
+   Note that DIR_PREFIX itself should NOT end with a '/'.  */
+static const char *
+skip_dir_prefix (const char *path, const char *dir_prefix)
+{
+  size_t prefix_len = strlen (dir_prefix);
+  if (strncmp (path, dir_prefix, prefix_len) == 0)
+    {
+      path += prefix_len;
+      /* Unless path == dir_prefix there should be at least one '/'
+        in the path (which we will skip).  Otherwise the path has
+        a different (longer) directory prefix.  */
+      if (*path != '\0' && !IS_DIR_SEPARATOR (*path))
+       return NULL;
+      while (IS_DIR_SEPARATOR (path[0]))
+       path++;
+      return path;
+    }
+
+  return NULL;
+}
+
+/* Most strings will be in the existing debug string table. But to
+   replace the base/dest directory prefix we need some new storage.
+   Keep new strings somewhat close together for faster comparison and
+   copying.  SIZE should be at least one (and includes space for the
+   zero terminator). The returned pointer points to uninitialized
+   data.  */
+static char *
+new_string_storage (struct strings *strings, size_t size)
+{
+  assert (size > 0);
+
+  /* If the string is extra long just create a whole block for
+     it. Normally strings are much smaller than STRMEMSIZE. */
+  if (strings->last_block == NULL
+      || size > STRMEMSIZE
+      || strings->stridx > STRMEMSIZE
+      || (STRMEMSIZE - strings->stridx) < size)
+    {
+      struct strmemblock *newblock = malloc (sizeof (struct strmemblock)
+                                            + MAX (STRMEMSIZE, size));
+      if (newblock == NULL)
+       return NULL;
+
+      newblock->next = NULL;
+
+      if (strings->blocks == NULL)
+       strings->blocks = newblock;
+
+      if (strings->last_block != NULL)
+       strings->last_block->next = newblock;
+
+      strings->last_block = newblock;
+      strings->stridx = 0;
+    }
+
+  size_t stridx = strings->stridx;
+  strings->stridx += size + 1;
+  return &strings->last_block->memory[stridx];
+}
+
+/* Comparison function used for tsearch. */
 static int
-has_prefix (const char  *str,
-           const char  *prefix)
+strent_compare (const void *a, const void *b)
 {
-  size_t str_len;
-  size_t prefix_len;
+  struct stridxentry *entry_a = (struct stridxentry *)a;
+  struct stridxentry *entry_b = (struct stridxentry *)b;
+  size_t idx_a = entry_a->idx;
+  size_t idx_b = entry_b->idx;
 
-  str_len = strlen (str);
-  prefix_len = strlen (prefix);
+  if (idx_a < idx_b)
+    return -1;
 
-  if (str_len < prefix_len)
-    return 0;
+  if (idx_a > idx_b)
+    return 1;
 
-  return strncmp (str, prefix, prefix_len) == 0;
+  return 0;
 }
 
-static int dirty_elf;
+/* Allocates and inserts a new entry for the old index if not yet
+   seen.  Returns a stridxentry if the given index has not yet been
+   seen and needs to be filled in with the associated string (either
+   the original string or the replacement string). Returns NULL if the
+   idx is already known. Use in phase 0 to add all strings seen. In
+   phase 1 use string_find_entry instead to get existing entries. */
+static struct stridxentry *
+string_find_new_entry (struct strings *strings, size_t old_idx)
+{
+  /* Use next entry in the pool for lookup so we can use it directly
+     if this is a new index. */
+  struct stridxentry *entry;
+
+  /* Keep entries close together to make key comparison fast. */
+  if (strings->last_entries == NULL || strings->entryidx >= STRIDXENTRIES)
+    {
+      size_t entriessz = (sizeof (struct strentblock)
+                         + (STRIDXENTRIES * sizeof (struct stridxentry)));
+      struct strentblock *newentries = malloc (entriessz);
+      if (newentries == NULL)
+       error (1, errno, "Couldn't allocate new string entries block");
+      else
+       {
+         if (strings->entries == NULL)
+           strings->entries = newentries;
+
+         if (strings->last_entries != NULL)
+           strings->last_entries->next = newentries;
+
+         strings->last_entries = newentries;
+         strings->last_entries->next = NULL;
+         strings->entryidx = 0;
+       }
+    }
+
+  entry = &strings->last_entries->entry[strings->entryidx];
+  entry->idx = old_idx;
+  struct stridxentry **tres = tsearch (entry, &strings->strent_root,
+                                      strent_compare);
+  if (tres == NULL)
+    error (1, ENOMEM, "Couldn't insert new strtab idx");
+  else if (*tres == entry)
+    {
+      /* idx not yet seen, must add actual str.  */
+      strings->entryidx++;
+      return entry;
+    }
+
+  return NULL; /* We already know about this idx, entry already complete. */
+}
+
+static struct stridxentry *
+string_find_entry (struct strings *strings, size_t old_idx)
+{
+  struct stridxentry **ret;
+  struct stridxentry key;
+  key.idx = old_idx;
+  ret = tfind (&key, &strings->strent_root, strent_compare);
+  assert (ret != NULL); /* Can only happen for a bad/non-existing old_idx. */
+  return *ret;
+}
+
+/* Adds a string_idx_entry given an index into the old/existing string
+   table. Should be used in phase 0. Does nothing if the index was
+   already registered. Otherwise it checks the string associated with
+   the index. If the old string doesn't start with base_dir an entry
+   will be recorded for the index with the same string. Otherwise a
+   string will be recorded where the base_dir prefix will be replaced
+   by dest_dir. Returns true if this is a not yet seen index and there
+   a replacement file string has been recorded for it, otherwise
+   returns false.  */
+static bool
+record_file_string_entry_idx (struct strings *strings, size_t old_idx)
+{
+  bool ret = false;
+  struct stridxentry *entry = string_find_new_entry (strings, old_idx);
+  if (entry != NULL)
+    {
+      Strent *strent;
+      const char *old_str = (char *)debug_sections[DEBUG_STR].data + old_idx;
+      const char *file = skip_dir_prefix (old_str, base_dir);
+      if (file == NULL)
+       {
+         /* Just record the existing string.  */
+         strent = strtab_add_len (strings->str_tab, old_str,
+                                  strlen (old_str) + 1);
+       }
+      else
+       {
+         /* Create and record the altered file path. */
+         size_t dest_len = strlen (dest_dir);
+         size_t file_len = strlen (file);
+         size_t nsize = dest_len + 1; /* + '\0' */
+         if (file_len > 0)
+           nsize += 1 + file_len;     /* + '/' */
+         char *nname = new_string_storage (strings, nsize);
+         if (nname == NULL)
+           error (1, ENOMEM, "Couldn't allocate new string storage");
+         memcpy (nname, dest_dir, dest_len);
+         if (file_len > 0)
+           {
+             nname[dest_len] = '/';
+             memcpy (nname + dest_len + 1, file, file_len + 1);
+           }
+         else
+           nname[dest_len] = '\0';
+
+         strent = strtab_add_len (strings->str_tab, nname, nsize);
+         ret = true;
+       }
+      if (strent == NULL)
+       error (1, ENOMEM, "Could not create new string table entry");
+      else
+       entry->entry = strent;
+    }
+
+  return ret;
+}
+
+/* Same as record_new_string_file_string_entry_idx but doesn't replace
+   base_dir with dest_dir, just records the existing string associated
+   with the index. */
 static void
-dirty_section (unsigned int sec)
+record_existing_string_entry_idx (struct strings *strings, size_t old_idx)
 {
-  elf_flagdata (debug_sections[sec].elf_data, ELF_C_SET, ELF_F_DIRTY);
-  dirty_elf = 1;
+  struct stridxentry *entry = string_find_new_entry (strings, old_idx);
+  if (entry != NULL)
+    {
+      const char *str = (char *)debug_sections[DEBUG_STR].data + old_idx;
+      Strent *strent = strtab_add_len (strings->str_tab,
+                                      str, strlen (str) + 1);
+      if (strent == NULL)
+       error (1, ENOMEM, "Could not create new string table entry");
+      else
+       entry->entry = strent;
+    }
 }
 
-static int
-edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
+static void
+setup_strings (struct strings *strings)
 {
-  unsigned char *ptr = debug_sections[DEBUG_LINE].data, *dir;
-  char **dirt;
-  unsigned char *endsec = ptr + debug_sections[DEBUG_LINE].size;
-  unsigned char *endcu, *endprol;
-  char line_base;
-  unsigned char opcode_base;
-  uint32_t value, dirt_cnt;
-  size_t comp_dir_len = strlen (comp_dir);
-  size_t abs_file_cnt = 0, abs_dir_cnt = 0;
+  strings->str_tab = strtab_init (false);
+  strings->str_buf = NULL;
+  strings->blocks = NULL;
+  strings->last_block = NULL;
+  strings->entries = NULL;
+  strings->last_entries = NULL;
+  strings->strent_root = NULL;
+}
+
+/* Noop for tdestroy. */
+static void free_node (void *p __attribute__((__unused__))) { }
+
+static void
+destroy_strings (struct strings *strings)
+{
+  struct strmemblock *smb = strings->blocks;
+  while (smb != NULL)
+    {
+      void *old = smb;
+      smb = smb->next;
+      free (old);
+    }
+
+  struct strentblock *emb = strings->entries;
+  while (emb != NULL)
+    {
+      void *old = emb;
+      emb = emb->next;
+      free (old);
+    }
+
+  strtab_free (strings->str_tab);
+  tdestroy (strings->strent_root, &free_node);
+  free (strings->str_buf);
+}
+
+/* The minimum number of line tables we pre-allocate. */
+#define MIN_LINE_TABLES 64
+
+/* Gets a line_table at offset. Returns true if not yet know and
+   successfully read, false otherwise.  Sets *table to NULL and
+   outputs a warning if there was a problem reading the table at the
+   given offset.  */
+static bool
+get_line_table (DSO *dso, size_t off, struct line_table **table)
+{
+  struct debug_lines *lines = &dso->lines;
+  /* Assume there aren't that many, just do a linear search.  The
+     array is probably already sorted because the stmt_lists are
+     probably inserted in order. But we cannot rely on that (maybe we
+     should check that to make searching quicker if possible?).  Once
+     we have all line tables for phase 1 (rewriting) we do explicitly
+     sort the array.*/
+  for (int i = 0; i < lines->used; i++)
+    if (lines->table[i].old_idx == off)
+      {
+       *table = &lines->table[i];
+       return false;
+      }
+
+  if (lines->size == lines->used)
+    {
+      struct line_table *new_table = realloc (lines->table,
+                                             (sizeof (struct line_table)
+                                              * (lines->size
+                                                 + MIN_LINE_TABLES)));
+      if (new_table == NULL)
+       {
+         error (0, ENOMEM, "Couldn't add more debug_line tables");
+         *table = NULL;
+         return false;
+       }
+      lines->table = new_table;
+      lines->size += MIN_LINE_TABLES;
+    }
+
+  struct line_table *t = &lines->table[lines->used];
+  *table = NULL;
 
-  if (phase != 0)
-    return 0;
+  t->old_idx = off;
+  t->size_diff = 0;
+  t->replace_dirs = false;
+  t->replace_files = false;
+
+  unsigned char *ptr = debug_sections[DEBUG_LINE].data;
+  unsigned char *endsec = ptr + debug_sections[DEBUG_LINE].size;
+  if (ptr == NULL)
+    {
+      error (0, 0, "%s: No .line_table section", dso->filename);
+      return false;
+    }
 
+  if (off > debug_sections[DEBUG_LINE].size)
+    {
+      error (0, 0, "%s: Invalid .line_table offset 0x%zx",
+            dso->filename, off);
+      return false;
+    }
   ptr += off;
 
-  endcu = ptr + 4;
-  endcu += read_32 (ptr);
+  /* unit_length */
+  unsigned char *endcu = ptr + 4;
+  t->unit_length = read_32 (ptr);
+  endcu += t->unit_length;
   if (endcu == ptr + 0xffffffff)
     {
       error (0, 0, "%s: 64-bit DWARF not supported", dso->filename);
-      return 1;
+      return false;
     }
 
   if (endcu > endsec)
     {
       error (0, 0, "%s: .debug_line CU does not fit into section",
             dso->filename);
-      return 1;
+      return false;
     }
 
-  value = read_16 (ptr);
-  if (value != 2 && value != 3 && value != 4)
+  /* version */
+  t->version = read_16 (ptr);
+  if (t->version != 2 && t->version != 3 && t->version != 4)
     {
       error (0, 0, "%s: DWARF version %d unhandled", dso->filename,
-            value);
-      return 1;
+            t->version);
+      return false;
     }
 
-  endprol = ptr + 4;
-  endprol += read_32 (ptr);
+  /* header_length */
+  unsigned char *endprol = ptr + 4;
+  t->header_length = read_32 (ptr);
+  endprol += t->header_length;
   if (endprol > endcu)
     {
       error (0, 0, "%s: .debug_line CU prologue does not fit into CU",
             dso->filename);
-      return 1;
+      return false;
+    }
+
+  /* min instr len */
+  t->min_instr_len = *ptr++;
+
+  /* max op per instr, if version >= 4 */
+  if (t->version >= 4)
+    t->max_op_per_instr = *ptr++;
+
+  /* default is stmt */
+  t->default_is_stmt = *ptr++;
+
+  /* line base */
+  t->line_base = (*(int8_t *)ptr++);
+
+  /* line range */
+  t->line_range = *ptr++;
+
+  /* opcode base */
+  t->opcode_base = *ptr++;
+
+  if (ptr + t->opcode_base - 1 >= endcu)
+    {
+      error (0, 0, "%s: .debug_line opcode table does not fit into CU",
+            dso->filename);
+      return false;
+    }
+  lines->used++;
+  *table = t;
+  return true;
+}
+
+static int dirty_elf;
+static void
+dirty_section (unsigned int sec)
+{
+  elf_flagdata (debug_sections[sec].elf_data, ELF_C_SET, ELF_F_DIRTY);
+  dirty_elf = 1;
+}
+
+static int
+line_table_cmp (const void *a, const void *b)
+{
+  struct line_table *ta = (struct line_table *) a;
+  struct line_table *tb = (struct line_table *) b;
+
+  if (ta->old_idx < tb->old_idx)
+    return -1;
+
+  if (ta->old_idx > tb->old_idx)
+    return 1;
+
+  return 0;
+}
+
+
+/* Called after phase zero (which records all adjustments needed for
+   the line tables referenced from debug_info) and before phase one
+   starts (phase one will adjust the .debug_line section stmt
+   references using the updated data structures). */
+static void
+edit_dwarf2_line (DSO *dso)
+{
+  Elf_Data *linedata = debug_sections[DEBUG_LINE].elf_data;
+  int linendx = debug_sections[DEBUG_LINE].sec;
+  Elf_Scn *linescn = dso->scn[linendx];
+  unsigned char *old_buf = linedata->d_buf;
+
+  /* Out with the old. */
+  linedata->d_size = 0;
+
+  /* In with the new. */
+  linedata = elf_newdata (linescn);
+
+  dso->lines.line_buf = malloc (dso->lines.debug_lines_len);
+  if (dso->lines.line_buf == NULL)
+    error (1, ENOMEM, "No memory for new .debug_line table (0x%zx bytes)",
+          dso->lines.debug_lines_len);
+
+  linedata->d_size = dso->lines.debug_lines_len;
+  linedata->d_buf = dso->lines.line_buf;
+  debug_sections[DEBUG_LINE].size = linedata->d_size;
+
+  /* Make sure the line tables are sorted on the old index. */
+  qsort (dso->lines.table, dso->lines.used, sizeof (struct line_table),
+        line_table_cmp);
+
+  unsigned char *ptr = linedata->d_buf;
+  for (int ldx = 0; ldx < dso->lines.used; ldx++)
+    {
+      struct line_table *t = &dso->lines.table[ldx];
+      unsigned char *optr = old_buf + t->old_idx;
+      t->new_idx = ptr - (unsigned char *) linedata->d_buf;
+
+      /* Just copy the whole table if nothing needs replacing. */
+      if (! t->replace_dirs && ! t->replace_files)
+       {
+         assert (t->size_diff == 0);
+         memcpy (ptr, optr, t->unit_length + 4);
+         ptr += t->unit_length + 4;
+         continue;
+       }
+
+      /* Header fields. */
+      write_32 (ptr, t->unit_length + t->size_diff);
+      write_16 (ptr, t->version);
+      write_32 (ptr, t->header_length + t->size_diff);
+      write_8 (ptr, t->min_instr_len);
+      if (t->version >= 4)
+       write_8 (ptr, t->max_op_per_instr);
+      write_8 (ptr, t->default_is_stmt);
+      write_8 (ptr, t->line_base);
+      write_8 (ptr, t->line_range);
+      write_8 (ptr, t->opcode_base);
+
+      optr += (4 /* unit len */
+              + 2 /* version */
+              + 4 /* header len */
+              + 1 /* min instr len */
+              + (t->version >= 4) /* max op per instr, if version >= 4 */
+              + 1 /* default is stmt */
+              + 1 /* line base */
+              + 1 /* line range */
+              + 1); /* opcode base */
+
+      /* opcode len table. */
+      memcpy (ptr, optr, t->opcode_base - 1);
+      optr += t->opcode_base - 1;
+      ptr += t->opcode_base - 1;
+
+      /* directory table. We need to find the end (start of file
+        table) anyway, so loop over all dirs, even if replace_dirs is
+        false. */
+      while (*optr != 0)
+       {
+         const char *dir = (const char *) optr;
+         const char *file_path = NULL;
+         if (t->replace_dirs)
+           {
+             file_path = skip_dir_prefix (dir, base_dir);
+             if (file_path != NULL)
+               {
+                 size_t dest_len = strlen (dest_dir);
+                 size_t file_len = strlen (file_path);
+                 memcpy (ptr, dest_dir, dest_len);
+                 ptr += dest_len;
+                 if (file_len > 0)
+                   {
+                     *ptr++ = '/';
+                     memcpy (ptr, file_path, file_len);
+                     ptr += file_len;
+                   }
+                 *ptr++ = '\0';
+               }
+           }
+         if (file_path == NULL)
+           {
+             size_t dir_len = strlen (dir);
+             memcpy (ptr, dir, dir_len + 1);
+             ptr += dir_len + 1;
+           }
+
+         optr = (unsigned char *) strchr (dir, 0) + 1;
+       }
+      optr++;
+      *ptr++ = '\0';
+
+      /* file table */
+      if (t->replace_files)
+       {
+         while (*optr != 0)
+           {
+             const char *file = (const char *) optr;
+             const char *file_path = NULL;
+             if (t->replace_files)
+               {
+                 file_path = skip_dir_prefix (file, base_dir);
+                 if (file_path != NULL)
+                   {
+                     size_t dest_len = strlen (dest_dir);
+                     size_t file_len = strlen (file_path);
+                     memcpy (ptr, dest_dir, dest_len);
+                     ptr += dest_len;
+                     if (file_len > 0)
+                       {
+                         *ptr++ = '/';
+                         memcpy (ptr, file_path, file_len);
+                         ptr += file_len;
+                       }
+                     *ptr++ = '\0';
+                   }
+               }
+             if (file_path == NULL)
+               {
+                 size_t file_len = strlen (file);
+                 memcpy (ptr, file, file_len + 1);
+                 ptr += file_len + 1;
+               }
+
+             optr = (unsigned char *) strchr (file, 0) + 1;
+
+             /* dir idx, time, len */
+             uint32_t dir_idx = read_uleb128 (optr);
+             write_uleb128 (ptr, dir_idx);
+             uint32_t time = read_uleb128 (optr);
+             write_uleb128 (ptr, time);
+             uint32_t len = read_uleb128 (optr);
+             write_uleb128 (ptr, len);
+           }
+         optr++;
+         *ptr++ = '\0';
+       }
+
+      /* line number program (and file table if not copied above). */
+      size_t remaining = (t->unit_length + 4
+                         - (optr - (old_buf + t->old_idx)));
+      memcpy (ptr, optr, remaining);
+      ptr += remaining;
     }
+}
+
+/* Called during phase zero for each debug_line table referenced from
+   .debug_info.  Outputs all source files seen and records any
+   adjustments needed in the debug_list data structures. Returns true
+   if line_table needs to be rewrite either the dir or file paths. */
+static bool
+read_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir)
+{
+  unsigned char *ptr, *dir;
+  unsigned char **dirt;
+  uint32_t value, dirt_cnt;
+  size_t comp_dir_len = !comp_dir ? 0 : strlen (comp_dir);
+  struct line_table *table;
 
-  line_base = (char) (ptr[2 + (value >= 4)] & 0xff);
-  opcode_base = ptr[4 + (value >= 4)];
-  ptr = dir = ptr + 4 + (value >= 4) + opcode_base;
+  if (get_line_table (dso, off, &table) == false
+      || table == NULL)
+    {
+      if (table != NULL)
+       error (0, 0, ".debug_line offset 0x%x referenced multiple times",
+              off);
+      return false;
+    }
+
+  /* Skip to the directory table. The rest of the header has already
+     been read and checked by get_line_table. */
+  ptr = debug_sections[DEBUG_LINE].data + off;
+  ptr += (4 /* unit len */
+         + 2 /* version */
+         + 4 /* header len */
+         + 1 /* min instr len */
+         + (table->version >= 4) /* max op per instr, if version >= 4 */
+         + 1 /* default is stmt */
+         + 1 /* line base */
+         + 1 /* line range */
+         + 1 /* opcode base */
+         + table->opcode_base - 1); /* opcode len table */
+  dir = ptr;
 
   /* dir table: */
   value = 1;
   while (*ptr != 0)
     {
+      if (base_dir && dest_dir)
+       {
+         /* Do we need to replace any of the dirs? Calculate new size. */
+         const char *file_path = skip_dir_prefix ((const char *)ptr,
+                                                  base_dir);
+         if (file_path != NULL)
+           {
+             size_t old_size = strlen ((const char *)ptr) + 1;
+             size_t file_len = strlen (file_path);
+             size_t new_size = strlen (dest_dir) + 1;
+             if (file_len > 0)
+               new_size += 1 + file_len;
+             table->size_diff += (new_size - old_size);
+             table->replace_dirs = true;
+           }
+       }
+
       ptr = (unsigned char *) strchr ((char *)ptr, 0) + 1;
       ++value;
     }
 
-  dirt = (char **) alloca (value * sizeof (unsigned char *));
+  dirt = (unsigned char **) alloca (value * sizeof (unsigned char *));
   dirt[0] = (unsigned char *) ".";
   dirt_cnt = 1;
   ptr = dir;
   while (*ptr != 0)
     {
-      dirt[dirt_cnt++] = (char *)ptr;
+      dirt[dirt_cnt++] = ptr;
       ptr = (unsigned char *) strchr ((char *)ptr, 0) + 1;
     }
   ptr++;
@@ -586,21 +1364,34 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
        {
          error (0, 0, "%s: Wrong directory table index %u",
                 dso->filename, value);
-         return 1;
+         return false;
        }
       file_len = strlen (file);
+      if (base_dir && dest_dir)
+       {
+         /* Do we need to replace any of the files? Calculate new size. */
+         const char *file_path = skip_dir_prefix (file, base_dir);
+         if (file_path != NULL)
+           {
+             size_t old_size = file_len + 1;
+             size_t file_len = strlen (file_path);
+             size_t new_size = strlen (dest_dir) + 1;
+             if (file_len > 0)
+               new_size += 1 + file_len;
+             table->size_diff += (new_size - old_size);
+             table->replace_files = true;
+           }
+       }
       dir_len = strlen ((char *)dirt[value]);
       s = malloc (comp_dir_len + 1 + file_len + 1 + dir_len + 1);
       if (s == NULL)
        {
          error (0, ENOMEM, "%s: Reading file table", dso->filename);
-         return 1;
+         return false;
        }
       if (*file == '/')
        {
          memcpy (s, file, file_len + 1);
-         if (dest_dir && has_prefix (file, base_dir))
-           ++abs_file_cnt;
        }
       else if (*dirt[value] == '/')
        {
@@ -624,13 +1415,15 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
       canonicalize_path (s, s);
       if (list_file_fd != -1)
        {
-         char *p = NULL;
+         const char *p = NULL;
          if (base_dir == NULL)
            p = s;
-         else if (has_prefix (s, base_dir))
-           p = s + strlen (base_dir);
-         else if (has_prefix (s, dest_dir))
-           p = s + strlen (dest_dir);
+         else
+           {
+             p = skip_dir_prefix (s, base_dir);
+             if (p == NULL && dest_dir != NULL)
+               p = skip_dir_prefix (s, dest_dir);
+           }
 
          if (p)
            {
@@ -651,123 +1444,28 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
       read_uleb128 (ptr);
       read_uleb128 (ptr);
     }
-  ++ptr;
-
-  if (dest_dir)
-    {
-      char *srcptr, *buf = NULL;
-      size_t base_len = strlen (base_dir);
-      size_t dest_len = strlen (dest_dir);
-      size_t shrank = 0;
-
-      if (dest_len == base_len)
-       abs_file_cnt = 0;
-      if (abs_file_cnt)
-       {
-         srcptr = buf = malloc (ptr - dir);
-         memcpy (srcptr, dir, ptr - dir);
-         ptr = dir;
-       }
-      else
-       {
-         ptr = dir;
-         srcptr = (char *)dir;
-       }
-      while (*srcptr != 0)
-       {
-         size_t len = strlen ((char *)srcptr) + 1;
-         const char *readptr = srcptr;
-
-         char *orig = strdup ((const char *) srcptr);
 
-         if (*srcptr == '/' && has_prefix ((char *)srcptr, base_dir))
-           {
-             if (dest_len < base_len)
-               ++abs_dir_cnt;
-             memcpy (ptr, dest_dir, dest_len);
-             ptr += dest_len;
-             readptr += base_len;
-           }
-         srcptr += len;
-
-         shrank += srcptr - readptr;
-         canonicalize_path ((char *)readptr, (char *)ptr);
-         len = strlen ((char *)ptr) + 1;
-         shrank -= len;
-         ptr += len;
-
-         if (memcmp (orig, ptr - len, len))
-           dirty_section (DEBUG_STR);
-         free (orig);
-       }
-
-      if (shrank > 0)
-       {
-         --shrank;
-#if 0
-         if (shrank == 0)
-           error (EXIT_FAILURE, 0,
-                  "canonicalization unexpectedly shrank by one character");
-         else
-#endif
-           {
-             memset (ptr, 'X', shrank);
-             ptr += shrank;
-             *ptr++ = '\0';
-           }
-       }
-
-      if (abs_dir_cnt + abs_file_cnt != 0)
-       {
-         size_t len = (abs_dir_cnt + abs_file_cnt) * (base_len - dest_len);
-
-         if (len == 1)
-           error (EXIT_FAILURE, 0, "-b arg has to be either the same length as -d arg, or more than 1 char longer");
-         memset (ptr, 'X', len - 1);
-         ptr += len - 1;
-         *ptr++ = '\0';
-       }
-      *ptr++ = '\0';
-      ++srcptr;
-
-      while (*srcptr != 0)
-       {
-         size_t len = strlen ((char *)srcptr) + 1;
-
-         if (*srcptr == '/' && has_prefix ((char *)srcptr, base_dir))
-           {
-             memcpy (ptr, dest_dir, dest_len);
-             if (dest_len < base_len)
-               {
-                 memmove (ptr + dest_len, srcptr + base_len,
-                          len - base_len);
-                 ptr += dest_len - base_len;
-               }
-             dirty_section (DEBUG_STR);
-           }
-         else if ((char *)ptr != srcptr)
-           memmove (ptr, srcptr, len);
-         srcptr += len;
-         ptr += len;
-         dir = (unsigned char *)srcptr;
-         read_uleb128 (srcptr);
-         read_uleb128 (srcptr);
-         read_uleb128 (srcptr);
-         if (ptr != dir)
-           memmove (ptr, dir, (unsigned char *)srcptr - dir);
-         ptr += (unsigned char *)srcptr - dir;
-       }
-      *ptr = '\0';
-      free (buf);
-    }
+  dso->lines.debug_lines_len += 4 + table->unit_length + table->size_diff;
+  return table->replace_dirs || table->replace_files;
+}
 
-  ptr++;
-  /* fill the rest until the line number program starts with NOP opcode */
-  memset(ptr, opcode_base - line_base, endprol - ptr);
-  /* don't touch the line number program */
-  return 0;
+/* Called during phase one, after the table has been sorted. */
+static size_t
+find_new_list_offs (struct debug_lines *lines, size_t idx)
+{
+  struct line_table key;
+  key.old_idx = idx;
+  struct line_table *table = bsearch (&key, lines->table,
+                                     lines->used,
+                                     sizeof (struct line_table),
+                                     line_table_cmp);
+  return table->new_idx;
 }
 
+/* This scans the attributes of one DIE described by the given abbrev_tag.
+   PTR points to the data in the debug_info. It will be advanced till all
+   abbrev data is consumed. In phase zero data is collected, in phase one
+   data might be replaced/updated.  */
 static unsigned char *
 edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
 {
@@ -783,20 +1481,36 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
     {
       uint32_t form = t->attr[i].form;
       size_t len = 0;
-      size_t base_len, dest_len;
-
       while (1)
        {
+         /* Whether we already handled a string as file for this
+            attribute.  If we did then we don't need to handle/record
+            it again when handling the DW_FORM_strp later. */
+         bool handled_strp = false;
+
+         /* A stmt_list points into the .debug_line section.  In
+            phase zero record all offsets. Then in phase one replace
+            them with the new offsets if we rewrote the line
+            tables.  */
          if (t->attr[i].attr == DW_AT_stmt_list)
            {
              if (form == DW_FORM_data4
                  || form == DW_FORM_sec_offset)
                {
                  list_offs = do_read_32_relocated (ptr);
-                 found_list_offs = 1;
+                 if (phase == 0)
+                   found_list_offs = 1;
+                 else if (need_stmt_update) /* phase one */
+                   {
+                     size_t idx, new_idx;
+                     idx = do_read_32_relocated (ptr);
+                     new_idx = find_new_list_offs (&dso->lines, idx);
+                     do_write_32_relocated (ptr, new_idx);
+                   }
                }
            }
 
+         /* DW_AT_comp_dir is the current working directory. */
          if (t->attr[i].attr == DW_AT_comp_dir)
            {
              if (form == DW_FORM_string)
@@ -804,44 +1518,69 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
                  free (comp_dir);
                  comp_dir = strdup ((char *)ptr);
 
-                 if (phase == 1 && dest_dir && has_prefix ((char *)ptr, base_dir))
+                 if (dest_dir)
                    {
-                     base_len = strlen (base_dir);
-                     dest_len = strlen (dest_dir);
-
-                     memcpy (ptr, dest_dir, dest_len);
-                     if (dest_len < base_len)
+                     /* In phase zero we are just collecting dir/file
+                        names and check whether any need to be
+                        adjusted. If so, in phase one we replace
+                        those dir/files.  */
+                     const char *file = skip_dir_prefix (comp_dir, base_dir);
+                     if (file != NULL && phase == 0)
+                       need_string_replacement = true;
+                     else if (file != NULL && phase == 1)
                        {
-                         memset(ptr + dest_len, '/',
-                                base_len - dest_len);
-
+                         size_t orig_len = strlen (comp_dir);
+                         size_t dest_len = strlen (dest_dir);
+                         size_t file_len = strlen (file);
+                         size_t new_len = dest_len;
+                         if (file_len > 0)
+                           new_len += 1 + file_len; /* + '/' */
+
+                         /* We don't want to rewrite the whole
+                            debug_info section, so we only replace
+                            the comp_dir with something equal or
+                            smaller, possibly adding some slashes
+                            at the end of the new compdir.  This
+                            normally doesn't happen since most
+                            producers will use DW_FORM_strp which is
+                            more efficient.  */
+                         if (orig_len < new_len)
+                           fprintf (stderr, "Warning, not replacing comp_dir "
+                                    "'%s' prefix ('%s' -> '%s') encoded as "
+                                    "DW_FORM_string. "
+                                    "Replacement too large.\n",
+                                    comp_dir, base_dir, dest_dir);
+                         else
+                           {
+                             /* Add zero (if no file part), one or more
+                                slashes in between the new dest_dir and the
+                                file name to fill up all space (replacement
+                                DW_FORM_string must be of the same length).
+                                We don't need to copy the old file name (if
+                                any) or the zero terminator, because those
+                                are already at the end of the string.  */
+                             memcpy (ptr, dest_dir, dest_len);
+                             memset (ptr + dest_len, '/',
+                                     orig_len - new_len);
+                           }
                        }
-                     dirty_section (DEBUG_INFO);
                    }
                }
              else if (form == DW_FORM_strp &&
                       debug_sections[DEBUG_STR].data)
                {
-                 char *dir;
-
-                 dir = (char *) debug_sections[DEBUG_STR].data
-                   + do_read_32_relocated (ptr);
+                 const char *dir;
+                 size_t idx = do_read_32_relocated (ptr);
+                 dir = (char *) debug_sections[DEBUG_STR].data + idx;
 
                  free (comp_dir);
                  comp_dir = strdup (dir);
 
-                 if (phase == 1 && dest_dir && has_prefix (dir, base_dir))
+                 if (dest_dir != NULL && phase == 0)
                    {
-                     base_len = strlen (base_dir);
-                     dest_len = strlen (dest_dir);
-
-                     memcpy (dir, dest_dir, dest_len);
-                     if (dest_len < base_len)
-                       {
-                         memmove (dir + dest_len, dir + base_len,
-                                  strlen (dir + base_len) + 1);
-                       }
-                     dirty_section (DEBUG_STR);
+                     if (record_file_string_entry_idx (&dso->strings, idx))
+                       need_strp_update = true;
+                     handled_strp = true;
                    }
                }
            }
@@ -851,10 +1590,13 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
                   && form == DW_FORM_strp
                   && debug_sections[DEBUG_STR].data)
            {
+             /* DW_AT_name is the primary file for this compile
+                unit. If starting with / it is a full path name.
+                Note that we don't handle DW_FORM_string in this
+                case.  */
              char *name;
-
-             name = (char *) debug_sections[DEBUG_STR].data
-               + do_read_32_relocated (ptr);
+             size_t idx = do_read_32_relocated (ptr);
+             name = (char *) debug_sections[DEBUG_STR].data + idx;
              if (*name == '/' && comp_dir == NULL)
                {
                  char *enddir = strrchr (name, '/');
@@ -869,18 +1611,14 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
                    comp_dir = strdup ("/");
                }
 
-             if (phase == 1 && dest_dir && has_prefix (name, base_dir))
+             /* First pass (0) records the new name to be
+                added to the debug string pool, the second
+                pass (1) stores it (the new index). */
+             if (dest_dir && phase == 0)
                {
-                 base_len = strlen (base_dir);
-                 dest_len = strlen (dest_dir);
-
-                 memcpy (name, dest_dir, dest_len);
-                 if (dest_len < base_len)
-                   {
-                     memmove (name + dest_len, name + base_len,
-                              strlen (name + base_len) + 1);
-                   }
-                 dirty_section (DEBUG_STR);
+                 if (record_file_string_entry_idx (&dso->strings, idx))
+                   need_strp_update = true;
+                 handled_strp = true;
                }
            }
 
@@ -922,6 +1660,29 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
              read_uleb128 (ptr);
              break;
            case DW_FORM_strp:
+             /* In the first pass we collect all strings, in the
+                second we put the new references back (if there are
+                any changes).  */
+             if (phase == 0)
+               {
+                 /* handled_strp is set for attributes referring to
+                    files. If it is set the string is already
+                    recorded. */
+                 if (! handled_strp)
+                   {
+                     size_t idx = do_read_32_relocated (ptr);
+                     record_existing_string_entry_idx (&dso->strings, idx);
+                   }
+               }
+             else if (need_strp_update) /* && phase == 1 */
+               {
+                 struct stridxentry *entry;
+                 size_t idx, new_idx;
+                 idx = do_read_32_relocated (ptr);
+                 entry = string_find_entry (&dso->strings, idx);
+                 new_idx = strent_offset (entry->entry);
+                 do_write_32_relocated (ptr, new_idx);
+               }
              ptr += 4;
              break;
            case DW_FORM_string:
@@ -963,32 +1724,33 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
   /* Ensure the CU current directory will exist even if only empty.  Source
      filenames possibly located in its parent directories refer relatively to
      it and the debugger (GDB) cannot safely optimize out the missing
-     CU current dir subdirectories.  */
-  if (comp_dir && list_file_fd != -1)
+     CU current dir subdirectories.  Only do this once in phase one. And
+     only do this for dirs under our build/base_dir.  Don't output the
+     empty string (in case the comp_dir == base_dir).  */
+  if (phase == 0 && base_dir && comp_dir && list_file_fd != -1)
     {
-      char *p;
-      size_t size;
-
-      if (base_dir && has_prefix (comp_dir, base_dir))
-       p = comp_dir + strlen (base_dir);
-      else if (dest_dir && has_prefix (comp_dir, dest_dir))
-       p = comp_dir + strlen (dest_dir);
-      else
-       p = comp_dir;
-
-      size = strlen (p) + 1;
-      while (size > 0)
-       {
-         ssize_t ret = write (list_file_fd, p, size);
-         if (ret == -1)
-           break;
-         size -= ret;
-         p += ret;
+      const char *p = skip_dir_prefix (comp_dir, base_dir);
+      if (p != NULL && p[0] != '\0')
+        {
+         size_t size = strlen (p) + 1;
+         while (size > 0)
+           {
+             ssize_t ret = write (list_file_fd, p, size);
+             if (ret == -1)
+               break;
+             size -= ret;
+             p += ret;
+           }
        }
     }
 
-  if (found_list_offs && comp_dir)
-    edit_dwarf2_line (dso, list_offs, comp_dir, phase);
+  /* In phase zero we collect all file names (we need the comp_dir for
+     that).  Note that calculating the new size and offsets is done
+     separately (at the end of phase zero after all CUs have been
+     scanned in dwarf2_edit). */
+  if (phase == 0 && found_list_offs
+      && read_dwarf2_line (dso, list_offs, comp_dir))
+    need_stmt_update = true;
 
   free (comp_dir);
 
@@ -1009,6 +1771,20 @@ rel_cmp (const void *a, const void *b)
   return 0;
 }
 
+static int
+line_rel_cmp (const void *a, const void *b)
+{
+  LINE_REL *rela = (LINE_REL *) a, *relb = (LINE_REL *) b;
+
+  if (rela->r_offset < relb->r_offset)
+    return -1;
+
+  if (rela->r_offset > relb->r_offset)
+    return 1;
+
+  return 0;
+}
+
 static int
 edit_dwarf2 (DSO *dso)
 {
@@ -1045,9 +1821,9 @@ edit_dwarf2 (DSO *dso)
                    }
 
                  scn = dso->scn[i];
-                 data = elf_rawdata (scn, NULL);
+                 data = elf_getdata (scn, NULL);
                  assert (data != NULL && data->d_buf != NULL);
-                 assert (elf_rawdata (scn, data) == NULL);
+                 assert (elf_getdata (scn, data) == NULL);
                  assert (data->d_off == 0);
                  assert (data->d_size == dso->shdr[i].sh_size);
                  debug_sections[j].data = data->d_buf;
@@ -1086,13 +1862,15 @@ edit_dwarf2 (DSO *dso)
     {
       do_read_16 = buf_read_ule16;
       do_read_32 = buf_read_ule32;
-      write_32 = dwarf2_write_le32;
+      do_write_16 = dwarf2_write_le16;
+      do_write_32 = dwarf2_write_le32;
     }
   else if (dso->ehdr.e_ident[EI_DATA] == ELFDATA2MSB)
     {
       do_read_16 = buf_read_ube16;
       do_read_32 = buf_read_ube32;
-      write_32 = dwarf2_write_be32;
+      do_write_16 = dwarf2_write_be16;
+      do_write_32 = dwarf2_write_be32;
     }
   else
     {
@@ -1197,6 +1975,22 @@ edit_dwarf2 (DSO *dso)
                  if (rtype != R_ALPHA_REFLONG)
                    goto fail;
                  break;
+#if defined(EM_AARCH64) && defined(R_AARCH64_ABS32)
+               case EM_AARCH64:
+                 if (rtype != R_AARCH64_ABS32)
+                   goto fail;
+                 break;
+#endif
+               case EM_68K:
+                 if (rtype != R_68K_32)
+                   goto fail;
+                 break;
+#if defined(EM_RISCV) && defined(R_RISCV_32)
+               case EM_RISCV:
+                 if (rtype != R_RISCV_32)
+                   goto fail;
+                 break;
+#endif
                default:
                fail:
                  error (1, 0, "%s: Unhandled relocation %d in .debug_info section",
@@ -1205,6 +1999,7 @@ edit_dwarf2 (DSO *dso)
              relend->ptr = debug_sections[DEBUG_INFO].data
                            + (rela.r_offset - base);
              relend->addend = rela.r_addend;
+             relend->ndx = ndx;
              ++relend;
            }
          if (relbuf == relend)
@@ -1219,6 +2014,13 @@ edit_dwarf2 (DSO *dso)
 
       for (phase = 0; phase < 2; phase++)
        {
+         /* If we don't need to update anyhing, skip phase 1. */
+         if (phase == 1
+             && !need_strp_update
+             && !need_string_replacement
+             && !need_stmt_update)
+           break;
+
          ptr = debug_sections[DEBUG_INFO].data;
          relptr = relbuf;
          endsec = ptr + debug_sections[DEBUG_INFO].size;
@@ -1266,7 +2068,7 @@ edit_dwarf2 (DSO *dso)
 
              if (ptr_size == 0)
                {
-                 ptr_size = read_1 (ptr);
+                 ptr_size = read_8 (ptr);
                  if (ptr_size != 4 && ptr_size != 8)
                    {
                      error (0, 0, "%s: Invalid DWARF pointer size %d",
@@ -1274,7 +2076,7 @@ edit_dwarf2 (DSO *dso)
                      return 1;
                    }
                }
-             else if (read_1 (ptr) != ptr_size)
+             else if (read_8 (ptr) != ptr_size)
                {
                  error (0, 0, "%s: DWARF pointer size differs between CUs",
                         dso->filename);
@@ -1307,7 +2109,248 @@ edit_dwarf2 (DSO *dso)
 
              htab_delete (abbrev);
            }
+
+         /* We might have to recalculate/rewrite the debug_line
+            section.  We need to do that before going into phase one
+            so we have all new offsets.  We do this separately from
+            scanning the dirs/file names because the DW_AT_stmt_lists
+            might not be in order or skip some padding we might have
+            to (re)move. */
+         if (phase == 0 && need_stmt_update)
+           {
+             edit_dwarf2_line (dso);
+
+             /* The line table programs will be moved
+                forward/backwards a bit in the new data. Update the
+                debug_line relocations to the new offsets. */
+             int rndx = debug_sections[DEBUG_LINE].relsec;
+             if (rndx != 0)
+               {
+                 LINE_REL *rbuf;
+                 size_t rels;
+                 Elf_Data *rdata = elf_getdata (dso->scn[rndx], NULL);
+                 int rtype = dso->shdr[rndx].sh_type;
+                 rels = dso->shdr[rndx].sh_size / dso->shdr[rndx].sh_entsize;
+                 rbuf = malloc (rels * sizeof (LINE_REL));
+                 if (rbuf == NULL)
+                   error (1, errno, "%s: Could not allocate line relocations",
+                          dso->filename);
+
+                 /* Sort them by offset into section. */
+                 for (size_t i = 0; i < rels; i++)
+                   {
+                     if (rtype == SHT_RELA)
+                       {
+                         GElf_Rela rela;
+                         if (gelf_getrela (rdata, i, &rela) == NULL)
+                           error (1, 0, "Couldn't get relocation: %s",
+                                  elf_errmsg (-1));
+                         rbuf[i].r_offset = rela.r_offset;
+                         rbuf[i].ndx = i;
+                       }
+                     else
+                       {
+                         GElf_Rel rel;
+                         if (gelf_getrel (rdata, i, &rel) == NULL)
+                           error (1, 0, "Couldn't get relocation: %s",
+                                  elf_errmsg (-1));
+                         rbuf[i].r_offset = rel.r_offset;
+                         rbuf[i].ndx = i;
+                       }
+                   }
+                 qsort (rbuf, rels, sizeof (LINE_REL), line_rel_cmp);
+
+                 size_t lndx = 0;
+                 for (size_t i = 0; i < rels; i++)
+                   {
+                     /* These relocations only happen in ET_REL files
+                        and are section offsets. */
+                     GElf_Addr r_offset;
+                     size_t ndx = rbuf[i].ndx;
+
+                     GElf_Rel rel;
+                     GElf_Rela rela;
+                     if (rtype == SHT_RELA)
+                       {
+                         if (gelf_getrela (rdata, ndx, &rela) == NULL)
+                           error (1, 0, "Couldn't get relocation: %s",
+                                  elf_errmsg (-1));
+                         r_offset = rela.r_offset;
+                       }
+                     else
+                       {
+                         if (gelf_getrel (rdata, ndx, &rel) == NULL)
+                           error (1, 0, "Couldn't get relocation: %s",
+                                  elf_errmsg (-1));
+                         r_offset = rel.r_offset;
+                       }
+
+                     while (lndx < dso->lines.used
+                            && r_offset > (dso->lines.table[lndx].old_idx
+                                           + 4
+                                           + dso->lines.table[lndx].unit_length))
+                       lndx++;
+
+                     if (lndx >= dso->lines.used)
+                       error (1, 0,
+                              ".debug_line relocation offset out of range");
+
+                     /* Offset (pointing into the line program) moves
+                        from old to new index including the header
+                        size diff. */
+                     r_offset += (ssize_t)((dso->lines.table[lndx].new_idx
+                                            - dso->lines.table[lndx].old_idx)
+                                           + dso->lines.table[lndx].size_diff);
+
+                     if (rtype == SHT_RELA)
+                       {
+                         rela.r_offset = r_offset;
+                         if (gelf_update_rela (rdata, ndx, &rela) == 0)
+                           error (1, 0, "Couldn't update relocation: %s",
+                                  elf_errmsg (-1));
+                       }
+                     else
+                       {
+                         rel.r_offset = r_offset;
+                         if (gelf_update_rel (rdata, ndx, &rel) == 0)
+                           error (1, 0, "Couldn't update relocation: %s",
+                                  elf_errmsg (-1));
+                       }
+                   }
+
+                 elf_flagdata (rdata, ELF_C_SET, ELF_F_DIRTY);
+                 free (rbuf);
+               }
+           }
+
+         /* the macro section also contains offsets into the str section,
+          * so we need to update those as well if we update the strings
+          */
+         if (need_strp_update && debug_sections[DEBUG_MACRO].data)
+           {
+             ptr = debug_sections[DEBUG_MACRO].data;
+             endsec = ptr + debug_sections[DEBUG_MACRO].size;
+             int op = 0, macro_version, macro_flags;
+             
+             while (ptr < endsec)
+               {
+                 if (!op)
+                   {
+                     macro_version = read_16 (ptr);
+                     macro_flags = read_8 (ptr);
+                     if (macro_version != 4 || (macro_flags & ~2) != 0)
+                       error (1, 0, "unhandled .debug_macro version/flags");
+                     if ((macro_flags & 2) != 0)
+                       ptr += 4;
+                   }
+                 op = read_8 (ptr);
+                 if (!op)
+                   continue;
+                 switch(op)
+                   {
+                   case DW_MACRO_GNU_define:
+                   case DW_MACRO_GNU_undef:
+                     read_uleb128 (ptr);
+                     ptr = (unsigned char *) strchr ((char *) ptr, '\0') + 1;
+                     break;
+                   case DW_MACRO_GNU_start_file:
+                     read_uleb128 (ptr);
+                     read_uleb128 (ptr);
+                     break;
+                   case DW_MACRO_GNU_define_indirect:
+                   case DW_MACRO_GNU_undef_indirect:
+                     read_uleb128 (ptr);
+                     if (phase == 0)
+                       {
+                         size_t idx = read_32 (ptr);
+                         record_existing_string_entry_idx (&dso->strings, idx);
+                       }
+                     else
+                       {
+                         struct stridxentry *entry;
+                         size_t idx, new_idx;
+                         idx = do_read_32 (ptr);
+                         entry = string_find_entry (&dso->strings, idx);
+                         new_idx = strent_offset (entry->entry);
+                         write_32 (ptr, new_idx);
+                       }
+                     break;
+                   case DW_MACRO_GNU_transparent_include:
+                     ptr += 4;
+                     break;
+                   default:
+                     break;
+                   }
+               }
+           }
+
+         /* Same for the debug_str section. Make sure everything is
+            in place for phase 1 updating of debug_info
+            references. */
+         if (phase == 0 && need_strp_update)
+           {
+             Strtab *strtab = dso->strings.str_tab;
+             Elf_Data *strdata = debug_sections[DEBUG_STR].elf_data;
+             int strndx = debug_sections[DEBUG_STR].sec;
+             Elf_Scn *strscn = dso->scn[strndx];
+
+             /* Out with the old. */
+             strdata->d_size = 0;
+             /* In with the new. */
+             strdata = elf_newdata (strscn);
+
+             /* We really should check whether we had enough memory,
+                but the old ebl version will just abort on out of
+                memory... */
+             strtab_finalize (strtab, strdata);
+             debug_sections[DEBUG_STR].size = strdata->d_size;
+             dso->strings.str_buf = strdata->d_buf;
+           }
+
+       }
+
+      /* After phase 1 we might have rewritten the debug_info with
+        new strp, strings and/or linep offsets.  */
+      if (need_strp_update || need_string_replacement || need_stmt_update)
+       dirty_section (DEBUG_INFO);
+      if (need_strp_update)
+       dirty_section (DEBUG_MACRO);
+
+      /* Update any debug_info relocations addends we might have touched. */
+      if (relbuf != NULL && reltype == SHT_RELA)
+       {
+         Elf_Data *symdata;
+          int relsec_ndx = debug_sections[DEBUG_INFO].relsec;
+          data = elf_getdata (dso->scn[relsec_ndx], NULL);
+         symdata = elf_getdata (dso->scn[dso->shdr[relsec_ndx].sh_link],
+                                NULL);
+
+         relptr = relbuf;
+         while (relptr < relend)
+           {
+             GElf_Sym sym;
+             GElf_Rela rela;
+             int ndx = relptr->ndx;
+
+             if (gelf_getrela (data, ndx, &rela) == NULL)
+               error (1, 0, "Couldn't get relocation: %s",
+                      elf_errmsg (-1));
+
+             if (gelf_getsym (symdata, GELF_R_SYM (rela.r_info),
+                              &sym) == NULL)
+               error (1, 0, "Couldn't get symbol: %s", elf_errmsg (-1));
+
+             rela.r_addend = relptr->addend - sym.st_value;
+
+             if (gelf_update_rela (data, ndx, &rela) == 0)
+               error (1, 0, "Couldn't update relocations: %s",
+                      elf_errmsg (-1));
+
+             ++relptr;
+           }
+         elf_flagdata (data, ELF_C_SET, ELF_F_DIRTY);
        }
+
       free (relbuf);
     }
 
@@ -1323,6 +2366,10 @@ static struct poptOption optionsTable[] = {
       "file where to put list of source and header file names", NULL },
     { "build-id",  'i', POPT_ARG_NONE, &do_build_id, 0,
       "recompute build ID note and print ID on stdout", NULL },
+    { "build-id-seed", 's', POPT_ARG_STRING, &build_id_seed, 0,
+      "if recomputing the build ID note use this string as hash seed", NULL },
+    { "no-recompute-build-id",  'n', POPT_ARG_NONE, &no_recompute_build_id, 0,
+      "do not recompute build ID note even when -i or -s are given", NULL },
       POPT_AUTOHELP
     { NULL, 0, 0, NULL, 0, NULL, NULL }
 };
@@ -1334,8 +2381,9 @@ fdopen_dso (int fd, const char *name)
   GElf_Ehdr ehdr;
   int i;
   DSO *dso = NULL;
+  size_t phnum;
 
-  elf = elf_begin (fd, ELF_C_RDWR_MMAP, NULL);
+  elf = elf_begin (fd, ELF_C_RDWR, NULL);
   if (elf == NULL)
     {
       error (0, 0, "cannot open ELF file: %s", elf_errmsg (-1));
@@ -1372,10 +2420,20 @@ fdopen_dso (int fd, const char *name)
       goto error_out;
     }
 
-  elf_flagelf (elf, ELF_C_SET, ELF_F_LAYOUT);
+  if (elf_getphdrnum (elf, &phnum) != 0)
+    {
+      error (0, 0, "Couldn't get number of phdrs: %s", elf_errmsg (-1));
+      goto error_out;
+    }
+
+  /* If there are phdrs we want to maintain the layout of the
+     allocated sections in the file.  */
+  if (phnum != 0)
+    elf_flagelf (elf, ELF_C_SET, ELF_F_LAYOUT);
 
   memset (dso, 0, sizeof(DSO));
   dso->elf = elf;
+  dso->phnum = phnum;
   dso->ehdr = ehdr;
   dso->scn = (Elf_Scn **) &dso->shdr[ehdr.e_shnum + 20];
 
@@ -1386,12 +2444,16 @@ fdopen_dso (int fd, const char *name)
     }
 
   dso->filename = (const char *) strdup (name);
+  setup_strings (&dso->strings);
+  setup_lines (&dso->lines);
   return dso;
 
 error_out:
   if (dso)
     {
       free ((char *) dso->filename);
+      destroy_strings (&dso->strings);
+      destroy_lines (&dso->lines);
       free (dso);
     }
   if (elf)
@@ -1427,21 +2489,19 @@ handle_build_id (DSO *dso, Elf_Data *build_id,
       exit (1);
     }
 
-  if (!dirty_elf)
+  if (no_recompute_build_id
+      || (! dirty_elf && build_id_seed == NULL))
     goto print;
 
-  if (elf_update (dso->elf, ELF_C_NULL) < 0)
-    {
-      fprintf (stderr, "Failed to update file: %s\n",
-              elf_errmsg (elf_errno ()));
-      exit (1);
-    }
-
   /* Clear the old bits so they do not affect the new hash.  */
   memset ((char *) build_id->d_buf + build_id_offset, 0, build_id_size);
 
   ctx = rpmDigestInit(algorithm, 0);
 
+  /* If a seed string was given use it to prime the hash.  */
+  if (build_id_seed != NULL)
+    rpmDigestUpdate(ctx, build_id_seed, strlen (build_id_seed));
+
   /* Slurp the relevant header bits and section contents and feed them
      into the hash function.  The only bits we ignore are the offset
      fields in ehdr and shdrs, since the semantically identical ELF file
@@ -1495,7 +2555,7 @@ handle_build_id (DSO *dso, Elf_Data *build_id,
 
          if (u.shdr.sh_type != SHT_NOBITS)
            {
-             Elf_Data *d = elf_rawdata (dso->scn[i], NULL);
+             Elf_Data *d = elf_getdata (dso->scn[i], NULL);
              if (d == NULL)
                goto bad;
              rpmDigestUpdate(ctx, d->d_buf, d->d_size);
@@ -1529,7 +2589,6 @@ main (int argc, char *argv[])
   int nextopt;
   const char **args;
   struct stat stat_buf;
-  char *p;
   Elf_Data *build_id = NULL;
   size_t build_id_offset = 0, build_id_size = 0;
 
@@ -1561,31 +2620,28 @@ main (int argc, char *argv[])
          fprintf (stderr, "You must specify a base dir if you specify a dest dir\n");
          exit (1);
        }
-      if (strlen (dest_dir) > strlen (base_dir))
-       {
-         fprintf (stderr, "Dest dir longer than base dir is not supported\n");
-         exit (1);
-       }
     }
 
-  /* Make sure there are trailing slashes in dirs */
-  if (base_dir != NULL && base_dir[strlen (base_dir)-1] != '/')
+  if (build_id_seed != NULL && do_build_id == 0)
     {
-      p = malloc (strlen (base_dir) + 2);
-      strcpy (p, base_dir);
-      strcat (p, "/");
-      free (base_dir);
-      base_dir = p;
+      fprintf (stderr, "--build-id-seed (-s) needs --build-id (-i)\n");
+      exit (1);
     }
-  if (dest_dir != NULL && dest_dir[strlen (dest_dir)-1] != '/')
+
+  if (build_id_seed != NULL && strlen (build_id_seed) < 1)
     {
-      p = malloc (strlen (dest_dir) + 2);
-      strcpy (p, dest_dir);
-      strcat (p, "/");
-      free (dest_dir);
-      dest_dir = p;
+      fprintf (stderr,
+              "--build-id-seed (-s) string should be at least 1 char\n");
+      exit (1);
     }
 
+  /* Ensure clean paths, users can muck with these. Also removes any
+     trailing '/' from the paths. */
+  if (base_dir)
+    canonicalize_path(base_dir, base_dir);
+  if (dest_dir)
+    canonicalize_path(dest_dir, dest_dir);
+
   if (list_file != NULL)
     {
       list_file_fd = open (list_file, O_WRONLY|O_CREAT|O_APPEND, 0644);
@@ -1639,45 +2695,161 @@ main (int argc, char *argv[])
          break;
        case SHT_NOTE:
          if (do_build_id
-             && build_id == NULL && (dso->shdr[i].sh_flags & SHF_ALLOC))
+             && build_id == 0 && (dso->shdr[i].sh_flags & SHF_ALLOC))
            {
              /* Look for a build-ID note here.  */
-             Elf_Data *data = elf_rawdata (elf_getscn (dso->elf, i), NULL);
-             Elf32_Nhdr nh;
-             Elf_Data dst =
-               {
-                 .d_version = EV_CURRENT, .d_type = ELF_T_NHDR,
-                 .d_buf = &nh, .d_size = sizeof nh
-               };
-             Elf_Data src = dst;
-             src.d_buf = data->d_buf;
-             assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));
-             while ((char *) data->d_buf + data->d_size -
-                    (char *) src.d_buf > (int) sizeof nh
-                    && elf32_xlatetom (&dst, &src, dso->ehdr.e_ident[EI_DATA]))
-               {
-                 Elf32_Word len = sizeof nh + nh.n_namesz;
-                 len = (len + 3) & ~3;
+             size_t off = 0;
+             GElf_Nhdr nhdr;
+             size_t name_off;
+             size_t desc_off;
+             Elf_Data *data = elf_getdata (elf_getscn (dso->elf, i), NULL);
+             while ((off = gelf_getnote (data, off,
+                                         &nhdr, &name_off, &desc_off)) > 0)
+               if (nhdr.n_type == NT_GNU_BUILD_ID
+                   && nhdr.n_namesz == sizeof "GNU"
+                   && (memcmp ((char *)data->d_buf + name_off, "GNU",
+                               sizeof "GNU") == 0))
+                 {
+                   build_id = data;
+                   build_id_offset = desc_off;
+                   build_id_size = nhdr.n_descsz;
+                 }
+           }
+         break;
+       default:
+         break;
+       }
+    }
 
-                 if (nh.n_namesz == sizeof "GNU" && nh.n_type == 3
-                     && !memcmp ((char *) src.d_buf + sizeof nh, "GNU", sizeof "GNU"))
+  /* Normally we only need to explicitly update the section headers
+     and data when any section data changed size. But because of a bug
+     in elfutils before 0.169 we will have to update and write out all
+     section data if any data has changed (when ELF_F_LAYOUT was
+     set). https://sourceware.org/bugzilla/show_bug.cgi?id=21199 */
+  bool need_update = need_strp_update || need_stmt_update;
+
+#if !_ELFUTILS_PREREQ (0, 169)
+  /* string replacements or build_id updates don't change section size. */
+  need_update = (need_update
+                || need_string_replacement
+                || (do_build_id && build_id != NULL));
+#endif
+
+  /* We might have changed the size of some debug sections. If so make
+     sure the section headers are updated and the data offsets are
+     correct. We set ELF_F_LAYOUT above because we don't want libelf
+     to move any allocated sections around itself if there are any
+     phdrs. Which means we are responsible for setting the section size
+     and offset fields. Plus the shdr offsets. We don't want to change
+     anything for the phdrs allocated sections. Keep the offset of
+     allocated sections so they are at the same place in the file. Add
+     unallocated ones after the allocated ones. */
+  if (dso->phnum != 0 && need_update)
+    {
+      Elf *elf = dso->elf;
+      GElf_Off last_offset;
+      /* We position everything after the phdrs (which normally would
+        be at the start of the ELF file after the ELF header. */
+      last_offset = (dso->ehdr.e_phoff + gelf_fsize (elf, ELF_T_PHDR,
+                                                    dso->phnum, EV_CURRENT));
+
+      /* First find the last allocated section.  */
+      Elf_Scn *scn = NULL;
+      while ((scn = elf_nextscn (elf, scn)) != NULL)
+       {
+         GElf_Shdr shdr_mem;
+         GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+         if (shdr == NULL)
+           error (1, 0, "Couldn't get shdr: %s\n", elf_errmsg (-1));
+
+         /* Any sections we have changed aren't allocated sections,
+            so we don't need to lookup any changed section sizes. */
+         if ((shdr->sh_flags & SHF_ALLOC) != 0)
+           {
+             GElf_Off off = shdr->sh_offset + (shdr->sh_type != SHT_NOBITS
+                                               ? shdr->sh_size : 0);
+             if (last_offset < off)
+               last_offset = off;
+           }
+       }
+
+      /* Now adjust any sizes and offsets for the unallocated sections. */
+      scn = NULL;
+      while ((scn = elf_nextscn (elf, scn)) != NULL)
+       {
+         GElf_Shdr shdr_mem;
+         GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+         if (shdr == NULL)
+           error (1, 0, "Couldn't get shdr: %s\n", elf_errmsg (-1));
+
+         /* A bug in elfutils before 0.169 means we have to write out
+            all section data, even when nothing changed.
+            https://sourceware.org/bugzilla/show_bug.cgi?id=21199 */
+#if !_ELFUTILS_PREREQ (0, 169)
+         if (shdr->sh_type != SHT_NOBITS)
+           {
+             Elf_Data *d = elf_getdata (scn, NULL);
+             elf_flagdata (d, ELF_C_SET, ELF_F_DIRTY);
+           }
+#endif
+         if ((shdr->sh_flags & SHF_ALLOC) == 0)
+           {
+             GElf_Off sec_offset = shdr->sh_offset;
+             GElf_Xword sec_size = shdr->sh_size;
+
+             /* We might have changed the size (and content) of the
+                debug_str or debug_line section. */
+             size_t secnum = elf_ndxscn (scn);
+             if (secnum == debug_sections[DEBUG_STR].sec)
+               sec_size = debug_sections[DEBUG_STR].size;
+             if (secnum == debug_sections[DEBUG_LINE].sec)
+               sec_size = debug_sections[DEBUG_LINE].size;
+
+             /* Zero means one.  No alignment constraints.  */
+             size_t addralign = shdr->sh_addralign ?: 1;
+             last_offset = (last_offset + addralign - 1) & ~(addralign - 1);
+             sec_offset = last_offset;
+             if (shdr->sh_type != SHT_NOBITS)
+               last_offset += sec_size;
+
+             if (shdr->sh_size != sec_size
+                 || shdr->sh_offset != sec_offset)
+               {
+                 /* Make sure unchanged section data is written out
+                    at the new location. */
+                 if (shdr->sh_offset != sec_offset
+                     && shdr->sh_type != SHT_NOBITS)
                    {
-                     build_id = data;
-                     build_id_offset = (char *) src.d_buf + len -
-                                       (char *) data->d_buf;
-                     build_id_size = nh.n_descsz;
-                     break;
+                     Elf_Data *d = elf_getdata (scn, NULL);
+                     elf_flagdata (d, ELF_C_SET, ELF_F_DIRTY);
                    }
 
-                 len += nh.n_descsz;
-                 len = (len + 3) & ~3;
-                 src.d_buf = (char *) src.d_buf + len;
+                 shdr->sh_size = sec_size;
+                 shdr->sh_offset = sec_offset;
+                 if (gelf_update_shdr (scn, shdr) == 0)
+                   error (1, 0, "Couldn't update shdr: %s\n",
+                          elf_errmsg (-1));
                }
            }
-         break;
-       default:
-         break;
        }
+
+      /* Position the shdrs after the last (unallocated) section.  */
+      const size_t offsize = gelf_fsize (elf, ELF_T_OFF, 1, EV_CURRENT);
+      GElf_Off new_offset = ((last_offset + offsize - 1)
+                            & ~((GElf_Off) (offsize - 1)));
+      if (dso->ehdr.e_shoff != new_offset)
+       {
+         dso->ehdr.e_shoff = new_offset;
+         if (gelf_update_ehdr (elf, &dso->ehdr) == 0)
+           error (1, 0, "Couldn't update ehdr: %s\n", elf_errmsg (-1));
+       }
+    }
+
+  if (elf_update (dso->elf, ELF_C_NULL) < 0)
+    {
+      fprintf (stderr, "Failed to update file: %s\n",
+              elf_errmsg (elf_errno ()));
+      exit (1);
     }
 
   if (do_build_id && build_id != NULL)
@@ -1698,6 +2870,11 @@ main (int argc, char *argv[])
   /* Restore old access rights */
   chmod (file, stat_buf.st_mode);
 
+  free ((char *) dso->filename);
+  destroy_strings (&dso->strings);
+  destroy_lines (&dso->lines);
+  free (dso);
+
   poptFreeContext (optCon);
 
   return 0;
index 08e581c1427dffd659aeb716ce7aa48751da131b..5eead404c917bb24257e6453b347ec815c0d211c 100644 (file)
@@ -1,3 +1,4 @@
+#include "system.h"
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -15,6 +16,8 @@
 int filter_private = 0;
 int soname_only = 0;
 int fake_soname = 1;
+int filter_soname = 1;
+int require_interp = 0;
 int assume_exec = 0;
 
 typedef struct elfInfo_s {
@@ -26,6 +29,7 @@ typedef struct elfInfo_s {
     int gotHASH;
     int gotGNUHASH;
     char *soname;
+    char *interp;
     const char *marker;                /* elf class marker or NULL */
 
     ARGV_t requires;
@@ -37,6 +41,45 @@ static int skipPrivate(const char *s)
     return (filter_private && rstreq(s, "GLIBC_PRIVATE"));
 }
 
+/*
+ * Rough soname sanity filtering: all sane soname's dependencies need to
+ * contain ".so", and normal linkable libraries start with "lib",
+ * everything else is an exception of some sort. The most notable
+ * and common exception is the dynamic linker itself, which we allow
+ * here, the rest can use --no-filter-soname.
+ */
+static int skipSoname(const char *soname)
+{
+    int sane = 0;
+
+    /* Filter out empty and all-whitespace sonames */
+    for (const char *s = soname; *s != '\0'; s++) {
+       if (!risspace(*s)) {
+           sane = 1;
+           break;
+       }
+    }
+
+    if (!sane)
+       return 1;
+
+    if (filter_soname) {
+       if (!strstr(soname, ".so"))
+           return 1;
+
+       if (rstreqn(soname, "ld.", 3) || rstreqn(soname, "ld-", 3) ||
+           rstreqn(soname, "ld64.", 3) || rstreqn(soname, "ld64-", 3))
+           return 0;
+
+       if (rstreqn(soname, "lib", 3))
+           return 0;
+       else
+           return 1;
+    }
+
+    return 0;
+}
+
 static const char *mkmarker(GElf_Ehdr *ehdr)
 {
     const char *marker = NULL;
@@ -59,6 +102,10 @@ static void addDep(ARGV_t *deps,
                   const char *soname, const char *ver, const char *marker)
 {
     char *dep = NULL;
+
+    if (skipSoname(soname))
+       return;
+
     if (ver || marker) {
        rasprintf(&dep,
                  "%s(%s)%s", soname, ver ? ver : "", marker ? marker : "");
@@ -212,10 +259,28 @@ static void processSections(elfInfo *ei)
     }
 }
 
+static void processProgHeaders(elfInfo *ei, GElf_Ehdr *ehdr)
+{
+    for (size_t i = 0; i < ehdr->e_phnum; i++) {
+       GElf_Phdr mem;
+       GElf_Phdr *phdr = gelf_getphdr(ei->elf, i, &mem);
+
+       if (phdr && phdr->p_type == PT_INTERP) {
+           size_t maxsize;
+           char * filedata = elf_rawfile(ei->elf, &maxsize);
+
+           if (filedata && phdr->p_offset < maxsize) {
+               ei->interp = rstrdup(filedata + phdr->p_offset);
+               break;
+           }
+       }
+    }
+}
+
 static int processFile(const char *fn, int dtype)
 {
     int rc = 1;
-    int fdno = -1;
+    int fdno;
     struct stat st;
     GElf_Ehdr *ehdr, ehdr_mem;
     elfInfo *ei = rcalloc(1, sizeof(*ei));
@@ -238,6 +303,7 @@ static int processFile(const char *fn, int dtype)
        ei->isDSO = (ehdr->e_type == ET_DYN);
        ei->isExec = assume_exec || (st.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH));
 
+       processProgHeaders(ei, ehdr);
        processSections(ei);
     }
 
@@ -263,6 +329,10 @@ static int processFile(const char *fn, int dtype)
            addDep(&ei->provides, ei->soname, NULL, ei->marker);
     }
 
+    /* If requested and present, add dep for interpreter (ie dynamic linker) */
+    if (ei->interp && require_interp)
+       argvAdd(&ei->requires, ei->interp);
+
     rc = 0;
     /* dump the requested dependencies for this file */
     for (ARGV_t dep = dtype ? ei->requires : ei->provides; dep && *dep; dep++) {
@@ -275,6 +345,7 @@ exit:
        argvFree(ei->provides);
        argvFree(ei->requires);
        free(ei->soname);
+       free(ei->interp);
        if (ei->elf) elf_end(ei->elf);
        rfree(ei);
     }
@@ -293,11 +364,15 @@ int main(int argc, char *argv[])
        { "filter-private", 0, POPT_ARG_VAL, &filter_private, -1, NULL, NULL },
        { "soname-only", 0, POPT_ARG_VAL, &soname_only, -1, NULL, NULL },
        { "no-fake-soname", 0, POPT_ARG_VAL, &fake_soname, 0, NULL, NULL },
+       { "no-filter-soname", 0, POPT_ARG_VAL, &filter_soname, 0, NULL, NULL },
+       { "require-interp", 0, POPT_ARG_VAL, &require_interp, -1, NULL, NULL },
        { "assume-exec", 0, POPT_ARG_VAL, &assume_exec, -1, NULL, NULL },
        POPT_AUTOHELP 
        POPT_TABLEEND
     };
 
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
+
     optCon = poptGetContext(argv[0], argc, (const char **) argv, opts, 0);
     if (argc < 2 || poptGetNextOpt(optCon) == 0) {
        poptPrintUsage(optCon, stderr, 0);
index c3112eba58bff54bea1161f097527ba2264ae015..f260a38c4d052bd4840dd5df5542490eca4548c5 100644 (file)
@@ -1,5 +1,4 @@
 #include "system.h"
-const char *__progname;
 
 #include <rpm/rpmbuild.h>
 #include <rpm/argv.h>
@@ -8,12 +7,24 @@ const char *__progname;
 
 #include "debug.h"
 
-char *progname;
-
 static int print_provides;
 
 static int print_requires;
 
+static int print_recommends;
+
+static int print_suggests;
+
+static int print_supplements;
+
+static int print_enhances;
+
+static int print_conflicts;
+
+static int print_obsoletes;
+
+static int print_alldeps;
+
 static void rpmdsPrint(const char * msg, rpmds ds, FILE * fp)
 {
     if (fp == NULL) fp = stderr;
@@ -36,6 +47,20 @@ static struct poptOption optionsTable[] = {
         NULL, NULL },
  { "requires", 'R', POPT_ARG_VAL, &print_requires, -1,
         NULL, NULL },
+ { "recommends", '\0', POPT_ARG_VAL, &print_recommends, -1,
+        NULL, NULL },
+ { "suggests", '\0', POPT_ARG_VAL, &print_suggests, -1,
+        NULL, NULL },
+ { "supplements", '\0', POPT_ARG_VAL, &print_supplements, -1,
+        NULL, NULL },
+ { "enhances", '\0', POPT_ARG_VAL, &print_enhances, -1,
+        NULL, NULL },
+ { "conflicts", '\0', POPT_ARG_VAL, &print_conflicts, -1,
+        NULL, NULL },
+ { "obsoletes", '\0', POPT_ARG_VAL, &print_obsoletes, -1,
+        NULL, NULL },
+ { "alldeps", '\0', POPT_ARG_VAL, &print_alldeps, -1,
+        NULL, NULL },
 
    POPT_AUTOALIAS
    POPT_AUTOHELP
@@ -51,10 +76,7 @@ main(int argc, char *argv[])
     int ec = 1;
     char buf[BUFSIZ];
 
-    if ((progname = strrchr(argv[0], '/')) != NULL)
-       progname++;
-    else
-       progname = argv[0];
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
 
     optCon = rpmcliInit(argc, argv, optionsTable);
     if (optCon == NULL)
@@ -82,13 +104,27 @@ main(int argc, char *argv[])
     if (rpmfcClassify(fc, av, NULL) || rpmfcApply(fc))
        goto exit;
 
-    if (_rpmfc_debug)
-       rpmfcPrint(buf, fc, NULL);
-
-    if (print_provides)
-       rpmdsPrint(NULL, rpmfcProvides(fc), stdout);
-    if (print_requires)
-       rpmdsPrint(NULL, rpmfcRequires(fc), stdout);
+    if (print_alldeps || _rpmfc_debug)
+       rpmfcPrint(NULL, fc, print_alldeps ? stdout : NULL);
+
+    if (!print_alldeps) {
+       if (print_provides)
+           rpmdsPrint(NULL, rpmfcProvides(fc), stdout);
+       if (print_requires)
+           rpmdsPrint(NULL, rpmfcRequires(fc), stdout);
+       if (print_recommends)
+           rpmdsPrint(NULL, rpmfcRecommends(fc), stdout);
+       if (print_suggests)
+           rpmdsPrint(NULL, rpmfcSuggests(fc), stdout);
+       if (print_supplements)
+           rpmdsPrint(NULL, rpmfcSupplements(fc), stdout);
+       if (print_enhances)
+           rpmdsPrint(NULL, rpmfcEnhances(fc), stdout);
+       if (print_conflicts)
+           rpmdsPrint(NULL, rpmfcConflicts(fc), stdout);
+       if (print_obsoletes)
+           rpmdsPrint(NULL, rpmfcObsoletes(fc), stdout);
+    }
 
     ec = 0;
 
index 57d2edad3167316d1470d7e62ba3018670088f02..9ea888b407f3aa11c67c342b615c35fb772af5a3 100644 (file)
@@ -1,5 +1,4 @@
 #include "system.h"
-const char *__progname;
 
 #include <rpm/rpmcli.h>
 #include <rpm/rpmlib.h>                /* rpmReadPackageFile */
@@ -235,6 +234,8 @@ main(int argc, char *argv[])
     poptContext optCon;
     int ec = 0;
 
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
+
     optCon = rpmcliInit(argc, argv, optionsTable);
     if (optCon == NULL)
        exit(EXIT_FAILURE);
diff --git a/tools/sepdebugcrcfix.c b/tools/sepdebugcrcfix.c
new file mode 100644 (file)
index 0000000..b85434e
--- /dev/null
@@ -0,0 +1,366 @@
+/* Copyright (C) 2013 Free Software Foundation, Inc.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/* Version 2013-06-24.  */
+
+#define _GNU_SOURCE
+
+#include "system.h"
+
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <endian.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <error.h>
+#include <libelf.h>
+#include <gelf.h>
+
+#ifndef _
+#define _(x) x
+#endif
+#define static_assert(expr) \
+  extern int never_defined_just_used_for_checking[(expr) ? 1 : -1]
+#ifndef min
+# define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+static_assert (sizeof (unsigned long) >= sizeof (uint32_t));
+
+typedef int bool;
+static const bool false = 0, true = 1;
+
+/* This is bfd_calc_gnu_debuglink_crc32 from bfd/opncls.c.  */
+static unsigned long
+    calc_gnu_debuglink_crc32 (unsigned long crc,
+                             const unsigned char *buf,
+                             size_t len)
+{
+  static const unsigned long crc32_table[256] =
+    {
+      0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
+      0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
+      0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
+      0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
+      0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
+      0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+      0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
+      0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+      0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
+      0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
+      0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
+      0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+      0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
+      0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
+      0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
+      0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+      0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
+      0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+      0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
+      0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
+      0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
+      0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
+      0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
+      0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+      0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
+      0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
+      0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
+      0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
+      0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
+      0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+      0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
+      0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+      0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
+      0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
+      0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
+      0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+      0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
+      0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
+      0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
+      0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+      0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
+      0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+      0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
+      0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
+      0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
+      0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
+      0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
+      0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+      0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
+      0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
+      0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
+      0x2d02ef8d
+    };
+  const unsigned char *end;
+
+  crc = ~crc & 0xffffffff;
+  for (end = buf + len; buf < end; ++ buf)
+    crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
+  return ~crc & 0xffffffff;
+}
+
+static size_t updated_count, matched_count, failed_count;
+
+static const char *usr_lib_debug;
+
+static bool
+crc32 (const char *fname, const char *base_fname, uint32_t *crcp)
+{
+  char *reldir = strdup (base_fname);
+  if (reldir == NULL)
+    error (1, 0, _("out of memory"));
+  char *s = reldir + strlen (reldir);
+  while (s > reldir && s[-1] != '/')
+    *--s = '\0';
+  char *debugname;
+  if (asprintf (&debugname, "%s/%s/%s", usr_lib_debug, reldir, fname) <= 0)
+    error (1, 0, _("out of memory"));
+  free (reldir);
+  int fd = open (debugname, O_RDONLY);
+  if (fd == -1)
+    {
+      error (0, errno, _("cannot open \"%s\""), debugname);
+      return false;
+    }
+  off64_t size = lseek64 (fd, 0, SEEK_END);
+  if (size == -1)
+    {
+      error (0, errno, _("cannot get size of \"%s\""), debugname);
+      return false;
+    }
+  off_t offset = 0;
+  uint32_t crc = 0;
+  void *buf = NULL;
+  while (offset < size)
+    {
+      const size_t maplen = min (0x10000, size - offset);
+      void *map = NULL;
+      if (buf == NULL)
+       {
+         map = mmap (NULL, maplen, PROT_READ, MAP_PRIVATE | MAP_POPULATE,
+                     fd, offset);
+         if (map == MAP_FAILED)
+           {
+             error (0, errno, _("cannot map 0x%llx bytes at offset 0x%llx "
+                                "of file \"%s\""),
+                    (unsigned long long) maplen, (unsigned long long) offset,
+                    debugname);
+             map = NULL;
+           }
+       }
+      if (map == NULL)
+       {
+         if (buf == NULL)
+           {
+             buf = malloc (maplen);
+             if (buf == NULL)
+               error (1, 0, _("out of memory"));
+           }
+         ssize_t got = pread (fd, buf, maplen, offset);
+         if (got != maplen)
+           {
+             error (0, errno, _("cannot read 0x%llx bytes at offset 0x%llx "
+                                "of file \"%s\""),
+                    (unsigned long long) maplen, (unsigned long long) offset,
+                    debugname);
+             free (buf);
+             free (debugname);
+             return false;
+           }
+       }
+      crc = calc_gnu_debuglink_crc32 (crc, map ?: buf, maplen);
+      if (map && munmap (map, maplen) != 0)
+       error (1, errno, _("cannot unmap 0x%llx bytes at offset 0x%llx "
+                          "of file \"%s\""),
+              (unsigned long long) maplen, (unsigned long long) offset,
+              debugname);
+      offset += maplen;
+    }
+  free (buf);
+  if (close (fd) != 0)
+    {
+      error (0, errno, _("cannot close \"%s\""), debugname);
+      free (debugname);
+      return false;
+    }
+  free (debugname);
+  *crcp = crc;
+  return true;
+}
+
+static bool
+process (Elf *elf, int fd, const char *fname)
+{
+  GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem);
+  if (ehdr == NULL)
+    {
+      error (0, 0, _("cannot get ELF header of \"%s\""), fname);
+      return false;
+    }
+  if (ehdr->e_ident[EI_DATA] != ELFDATA2LSB
+      && ehdr->e_ident[EI_DATA] != ELFDATA2MSB)
+    {
+      error (0, 0, _("invalid ELF endianity of \"%s\""), fname);
+      return false;
+    }
+  Elf_Scn *scn = NULL;
+  const char scnname[] = ".gnu_debuglink";
+  while ((scn = elf_nextscn (elf, scn)) != NULL)
+    {
+      GElf_Shdr shdr_mem, *shdr = gelf_getshdr (scn, &shdr_mem);
+      if (shdr == NULL)
+       {
+         error (0, 0, _("cannot get section # %zu in \"%s\""),
+                elf_ndxscn (scn), fname);
+         continue;
+       }
+      const char *sname = elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name);
+      if (sname == NULL)
+       {
+         error (0, 0, _("cannot get name of section # %zu in \"%s\""),
+                elf_ndxscn (scn), fname);
+         continue;
+       }
+      if (strcmp (sname, scnname) != 0)
+       continue;
+      Elf_Data *data = elf_getdata (scn, NULL);
+      if (data == NULL)
+       {
+         error (0, 0, _("cannot get data of section \"%s\" # %zu in \"%s\""),
+                scnname, elf_ndxscn (scn), fname);
+         continue;
+       }
+      if ((data->d_size & 3) != 0)
+       {
+         error (0, 0, _("invalid size of section \"%s\" # %zu in \"%s\""),
+                scnname, elf_ndxscn (scn), fname);
+         continue;
+       }
+      const uint8_t *zerop = memchr (data->d_buf, '\0', data->d_size);
+      const uint8_t *crcp = (zerop == NULL
+                            ? NULL
+                            : (const uint8_t *) ((uintptr_t) (zerop + 1 + 3)
+                                                 & -4));
+      if (crcp + 4 != (uint8_t *) data->d_buf + data->d_size)
+       {
+         error (0, 0, _("invalid format of section \"%s\" # %zu in \"%s\""),
+                scnname, elf_ndxscn (scn), fname);
+         continue;
+       }
+      uint32_t had_crc_targetendian = *(const uint32_t *) crcp;
+      uint32_t had_crc = (ehdr->e_ident[EI_DATA] == ELFDATA2LSB
+                         ? le32toh (had_crc_targetendian)
+                         : be32toh (had_crc_targetendian));
+      uint32_t crc;
+      if (! crc32 (data->d_buf, fname, &crc))
+       return false;
+      if (crc == had_crc)
+       {
+         matched_count++;
+         return true;
+       }
+      updated_count++;
+      off64_t seekto = (shdr->sh_offset + data->d_off
+                       + (crcp - (const uint8_t *) data->d_buf));
+      uint32_t crc_targetendian = (ehdr->e_ident[EI_DATA] == ELFDATA2LSB
+                                  ? htole32 (crc) : htobe32 (crc));
+      ssize_t wrote = pwrite (fd, &crc_targetendian, sizeof (crc_targetendian),
+                             seekto);
+      if (wrote != sizeof (crc_targetendian))
+       {
+         error (0, 0, _("cannot write new CRC to 0x%llx "
+                        "inside section \"%s\" # %zu in \"%s\""),
+                (unsigned long long) seekto, scnname, elf_ndxscn (scn), fname);
+         return false;
+       }
+      return true;
+    }
+  error (0, 0, _("cannot find section \"%s\" in \"%s\""), scnname, fname);
+  return false;
+}
+
+int
+main (int argc, char **argv)
+{
+  if (argc < 2)
+    error (1, 0, _("usr/lib/debug [<relative filenames>...]"));
+  usr_lib_debug = argv[1];
+  if (elf_version (EV_CURRENT) == EV_NONE)
+    error (1, 0, _("error initializing libelf: %s"), elf_errmsg (-1));
+  for (int argi = 2; argi < argc; argi++)
+    {
+      const char *fname = argv[argi];
+      struct stat stat_buf;
+      if (stat(fname, &stat_buf) < 0)
+       {
+         error (0, errno, _("cannot stat input \"%s\""), fname);
+         failed_count++;
+         continue;
+       }
+
+      /* Make sure we can read and write */
+      chmod (fname, stat_buf.st_mode | S_IRUSR | S_IWUSR);
+
+      bool failed = false;
+      int fd = open64 (fname, O_RDWR);
+      if (fd == -1)
+       {
+         error (0, errno, _("cannot open \"%s\""), fname);
+         failed = true;
+       }
+      else
+       {
+         Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
+         if (elf == NULL)
+           {
+             error (0, 0, _("cannot open \"%s\" as ELF: %s"), fname,
+                    elf_errmsg (-1));
+             failed = true;
+           }
+         else
+           {
+             if (! process (elf, fd, fname))
+               failed = true;
+             if (elf_end (elf) != 0)
+               {
+                 error (0, 0, _("cannot close \"%s\" as ELF: %s"), fname,
+                        elf_errmsg (-1));
+                 failed = true;
+               }
+           }
+         if (close (fd) != 0)
+           {
+             error (0, errno, _("cannot close \"%s\""), fname);
+             failed = true;
+           }
+       }
+
+      /* Restore old access rights. Including any suid bits reset. */
+      chmod (fname, stat_buf.st_mode);
+
+      if (failed)
+       failed_count++;
+    }
+  printf ("%s: Updated %zu CRC32s, %zu CRC32s did match.\n", argv[0],
+         updated_count, matched_count);
+  if (failed_count)
+    printf ("%s: Failed for %zu files.\n", argv[0], failed_count);
+  return failed_count == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+}